diff --git a/DEPS b/DEPS
index ab4e433..164a5ed 100644
--- a/DEPS
+++ b/DEPS
@@ -167,11 +167,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': 'a718a61003d1e58c225b600cde9322f1c6ab3998',
+  'skia_revision': '902cf1e12a74e0f4d28ca6089aaecfda63e3b728',
   # 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': '62fdbf47faaec6de6db1867667af75f86f439772',
+  'v8_revision': '79eb4f5c4a72d35033d405fc5f1d539989b5d89c',
   # 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.
@@ -179,7 +179,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '2682b5a02d16d03094e579fea17c802b23999251',
+  'angle_revision': 'a333b87cfcbe26daa7760aa710234c8e999d9ba5',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -230,7 +230,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'cd2fb1efa170f03d4b3185e6537537072b00e3ad',
+  'catapult_revision': '0b1af463167af25923a31dd190b41a32841e05fe',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # 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': '21dfc919547fb3b139b56271d1aa09518bd75801',
+  'dawn_revision': '720988d878a186959e2b799ac8644c82759ef890',
   # 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': 'ef79a5fa1b2c3303dc1dae969482ead934be85a8',
+  'quiche_revision': 'bf0413d8c1d6d56838bc65b8f1f78b3970131d22',
   # 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.
@@ -862,7 +862,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '40324d671c257be329238223356da4e77ab16540',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '5365f6a6b59d846523b9cea87a4b48ea934149c7',
       'condition': 'checkout_linux',
   },
 
@@ -887,7 +887,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '3306bbe476fd4b069aad347afdd5b4e3564234aa',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '1ad5811accaedf0cf6b05747261a6a006d0dc090',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -1280,7 +1280,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '603e7a0e5a97307a45bfe5903be23c6e384393be',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f91a82bb16246437dc6c565b80f13158d142dde6',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1532,7 +1532,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@fa01042385e555b5340e1e732038fba9929bae29',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@482a6e85b16710573a1277cbb655e4be6665bdf2',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/browser/metrics/aw_metrics_service_client.cc b/android_webview/browser/metrics/aw_metrics_service_client.cc
index e117d98..f4078a2 100644
--- a/android_webview/browser/metrics/aw_metrics_service_client.cc
+++ b/android_webview/browser/metrics/aw_metrics_service_client.cc
@@ -26,6 +26,7 @@
 #include "components/metrics/metrics_pref_names.h"
 #include "components/metrics/metrics_service.h"
 #include "components/metrics/metrics_state_manager.h"
+#include "components/metrics/net/cellular_logic_helper.h"
 #include "components/metrics/net/network_metrics_provider.h"
 #include "components/metrics/ui/screen_info_metrics_provider.h"
 #include "components/metrics/version_utils.h"
@@ -251,10 +252,17 @@
 }
 
 base::TimeDelta AwMetricsServiceClient::GetStandardUploadInterval() {
-  // The platform logging mechanism is responsible for upload frequency; this
-  // just specifies how frequently to provide logs to the platform. 30 minutes
-  // was chosen arbitrarily.
-  return base::TimeDelta::FromMinutes(30);
+  // In WebView, metrics collection (when we batch up all logged histograms into
+  // a ChromeUserMetricsExtension proto) and metrics uploading (when the proto
+  // goes to the server) happen separately.
+  //
+  // This interval controls the metrics collection rate, so we choose the
+  // standard upload interval to make sure we're collecting metrics consistently
+  // with Chrome for Android. The metrics uploading rate for WebView is
+  // controlled by the platform logging mechanism. Since this mechanism has its
+  // own logic for rate-limiting on cellular connections, we disable the
+  // component-layer logic.
+  return metrics::GetUploadInterval(false /* use_cellular_upload_interval */);
 }
 
 std::string AwMetricsServiceClient::GetAppPackageName() {
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/SharedWebViewContentsClientAdapter.java b/android_webview/glue/java/src/com/android/webview/chromium/SharedWebViewContentsClientAdapter.java
index 81dd7b2..ef572e5 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/SharedWebViewContentsClientAdapter.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/SharedWebViewContentsClientAdapter.java
@@ -255,13 +255,15 @@
 
     @Override
     public void onRendererUnresponsive(final AwRenderProcess renderProcess) {
-        if (mWebViewRendererClientAdapter != null)
+        if (mWebViewRendererClientAdapter != null) {
             mWebViewRendererClientAdapter.onRendererUnresponsive(mWebView, renderProcess);
+        }
     }
 
     @Override
     public void onRendererResponsive(final AwRenderProcess renderProcess) {
-        if (mWebViewRendererClientAdapter != null)
+        if (mWebViewRendererClientAdapter != null) {
             mWebViewRendererClientAdapter.onRendererResponsive(mWebView, renderProcess);
+        }
     }
 }
diff --git a/android_webview/java/src/org/chromium/android_webview/AwAutofillManager.java b/android_webview/java/src/org/chromium/android_webview/AwAutofillManager.java
index 6aa1165..91299cb4 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwAutofillManager.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwAutofillManager.java
@@ -141,8 +141,9 @@
 
     public void addInputUIObserver(InputUIObserver observer) {
         if (observer == null) return;
-        if (mInputUIObservers == null)
+        if (mInputUIObservers == null) {
             mInputUIObservers = new ArrayList<WeakReference<InputUIObserver>>();
+        }
         mInputUIObservers.add(new WeakReference<InputUIObserver>(observer));
     }
 
diff --git a/android_webview/java/src/org/chromium/android_webview/AwAutofillUMA.java b/android_webview/java/src/org/chromium/android_webview/AwAutofillUMA.java
index 0417902..7f3d6f2 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwAutofillUMA.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwAutofillUMA.java
@@ -123,51 +123,53 @@
         }
 
         private int toUMAAutofillSessionValue() {
-            if (mState == 0)
+            if (mState == 0) {
                 return NO_CALLBACK_FORM_FRAMEWORK;
-            else if (mState == EVENT_VIRTUAL_STRUCTURE_PROVIDED)
+            } else if (mState == EVENT_VIRTUAL_STRUCTURE_PROVIDED) {
                 return NO_SUGGESTION_USER_NOT_CHANGE_FORM_NO_FORM_SUBMITTED;
-            else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_USER_CHANGED_FIELD_VALUE))
+            } else if (mState
+                    == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_USER_CHANGED_FIELD_VALUE)) {
                 return NO_SUGGESTION_USER_CHANGE_FORM_NO_FORM_SUBMITTED;
-            else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_FORM_SUBMITTED))
+            } else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_FORM_SUBMITTED)) {
                 return NO_SUGGESTION_USER_NOT_CHANGE_FORM_FORM_SUBMITTED;
-            else if (mState
+            } else if (mState
                     == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_USER_CHANGED_FIELD_VALUE
-                               | EVENT_FORM_SUBMITTED))
+                            | EVENT_FORM_SUBMITTED)) {
                 return NO_SUGGESTION_USER_CHANGE_FORM_FORM_SUBMITTED;
-            else if (mState
+            } else if (mState
                     == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED
-                               | EVENT_FORM_AUTOFILLED))
+                            | EVENT_FORM_AUTOFILLED)) {
                 return USER_SELECT_SUGGESTION_USER_NOT_CHANGE_FORM_NO_FORM_SUBMITTED;
-            else if (mState
+            } else if (mState
                     == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED
-                               | EVENT_FORM_AUTOFILLED | EVENT_FORM_SUBMITTED))
+                            | EVENT_FORM_AUTOFILLED | EVENT_FORM_SUBMITTED)) {
                 return USER_SELECT_SUGGESTION_USER_NOT_CHANGE_FORM_FORM_SUBMITTED;
-            else if (mState
+            } else if (mState
                     == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED
-                               | EVENT_FORM_AUTOFILLED | EVENT_USER_CHANGED_FIELD_VALUE
-                               | EVENT_FORM_SUBMITTED))
+                            | EVENT_FORM_AUTOFILLED | EVENT_USER_CHANGED_FIELD_VALUE
+                            | EVENT_FORM_SUBMITTED)) {
                 return USER_SELECT_SUGGESTION_USER_CHANGE_FORM_FORM_SUBMITTED;
-            else if (mState
+            } else if (mState
                     == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED
-                               | EVENT_FORM_AUTOFILLED | EVENT_USER_CHANGED_FIELD_VALUE))
+                            | EVENT_FORM_AUTOFILLED | EVENT_USER_CHANGED_FIELD_VALUE)) {
                 return USER_SELECT_SUGGESTION_USER_CHANGE_FORM_NO_FORM_SUBMITTED;
-            else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED))
+            } else if (mState == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED)) {
                 return USER_NOT_SELECT_SUGGESTION_USER_NOT_CHANGE_FORM_NO_FORM_SUBMITTED;
-            else if (mState
+            } else if (mState
                     == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED
-                               | EVENT_FORM_SUBMITTED))
+                            | EVENT_FORM_SUBMITTED)) {
                 return USER_NOT_SELECT_SUGGESTION_USER_NOT_CHANGE_FORM_FORM_SUBMITTED;
-            else if (mState
+            } else if (mState
                     == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED
-                               | EVENT_USER_CHANGED_FIELD_VALUE | EVENT_FORM_SUBMITTED))
+                            | EVENT_USER_CHANGED_FIELD_VALUE | EVENT_FORM_SUBMITTED)) {
                 return USER_NOT_SELECT_SUGGESTION_USER_CHANGE_FORM_FORM_SUBMITTED;
-            else if (mState
+            } else if (mState
                     == (EVENT_VIRTUAL_STRUCTURE_PROVIDED | EVENT_SUGGESTION_DISPLAYED
-                               | EVENT_USER_CHANGED_FIELD_VALUE))
+                            | EVENT_USER_CHANGED_FIELD_VALUE)) {
                 return USER_NOT_SELECT_SUGGESTION_USER_CHANGE_FORM_NO_FORM_SUBMITTED;
-            else
+            } else {
                 return SESSION_UNKNOWN;
+            }
         }
 
         private int mState;
@@ -218,10 +220,11 @@
 
     public void onUserChangeFieldValue(boolean isPreviouslyAutofilled) {
         if (mRecorder == null) return;
-        if (isPreviouslyAutofilled)
+        if (isPreviouslyAutofilled) {
             mRecorder.record(SessionRecorder.EVENT_USER_CHANGED_AUTOFILLED_FIELD);
-        else
+        } else {
             mRecorder.record(SessionRecorder.EVENT_USER_CHANGED_FIELD_VALUE);
+        }
     }
 
     private void recordSession() {
diff --git a/android_webview/java/src/org/chromium/android_webview/common/variations/VariationsUtils.java b/android_webview/java/src/org/chromium/android_webview/common/variations/VariationsUtils.java
index 80548d44..bc630e6 100644
--- a/android_webview/java/src/org/chromium/android_webview/common/variations/VariationsUtils.java
+++ b/android_webview/java/src/org/chromium/android_webview/common/variations/VariationsUtils.java
@@ -104,8 +104,9 @@
             }
 
             if (!proto.hasSignature() || !proto.hasCountry() || !proto.hasDate()
-                    || !proto.hasIsGzipCompressed() || !proto.hasSeedData())
+                    || !proto.hasIsGzipCompressed() || !proto.hasSeedData()) {
                 return null;
+            }
 
             SeedInfo info = new SeedInfo();
             info.signature = proto.getSignature();
diff --git a/ash/app_list/views/assistant/privacy_info_view.cc b/ash/app_list/views/assistant/privacy_info_view.cc
index 4f738210..7154a551 100644
--- a/ash/app_list/views/assistant/privacy_info_view.cc
+++ b/ash/app_list/views/assistant/privacy_info_view.cc
@@ -14,6 +14,7 @@
 #include "ui/views/animation/ink_drop_impl.h"
 #include "ui/views/border.h"
 #include "ui/views/controls/button/image_button.h"
+#include "ui/views/controls/highlight_path_generator.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/controls/styled_label.h"
 #include "ui/views/layout/box_layout.h"
@@ -199,10 +200,7 @@
   close_button_->set_ink_drop_highlight_opacity(kInkDropHighlightOpacity);
   close_button_->set_ink_drop_base_color(kInkDropBaseColor);
   close_button_->set_has_ink_drop_action_on_click(true);
-  auto highlight_path = std::make_unique<SkPath>();
-  highlight_path->addOval(gfx::RectToSkRect(gfx::Rect(close_button_->size())));
-  close_button_->SetProperty(views::kHighlightPathKey,
-                             highlight_path.release());
+  views::InstallCircleHighlightPathGenerator(close_button_);
   row_container_->AddChildView(close_button_);
 }
 
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index 5e3d003..a5e45f6 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -1980,15 +1980,9 @@
       <message name="IDS_ASSISTANT_TIMER_NOTIFICATION_ADD_1_MIN_BUTTON" desc="Label for button to add 1 minute to timer in Assistant timer notification.">
         Add 1 min
       </message>
-      <message name="IDS_ASSISTANT_TIMER_NOTIFICATION_ADD_1_MIN_QUERY" desc="Query to issue to add 1 minute to an Assistant timer.">
-        Add 1 min to timer
-      </message>
       <message name="IDS_ASSISTANT_TIMER_NOTIFICATION_STOP_BUTTON" desc="Label for stop button in Assistant timer notification.">
         Stop
       </message>
-      <message name="IDS_ASSISTANT_TIMER_NOTIFICATION_STOP_QUERY" desc="Query to issue to stop Assistant timer.">
-        Stop timer
-      </message>
       <message name="IDS_ASSISTANT_CREATE_REMINDER_QUERY" desc="Query to issue to create reminder.">
         Create reminder
       </message>
diff --git a/ash/assistant/assistant_alarm_timer_controller.cc b/ash/assistant/assistant_alarm_timer_controller.cc
index 37263a8..54f5b0b 100644
--- a/ash/assistant/assistant_alarm_timer_controller.cc
+++ b/ash/assistant/assistant_alarm_timer_controller.cc
@@ -68,26 +68,17 @@
       l10n_util::GetStringUTF8(IDS_ASSISTANT_TIMER_NOTIFICATION_TITLE);
   const std::string message =
       CreateTimerNotificationMessage(alarm_timer, time_remaining);
-  const GURL action_url = assistant::util::CreateAssistantQueryDeepLink(
-      l10n_util::GetStringUTF8(IDS_ASSISTANT_TIMER_NOTIFICATION_STOP_QUERY));
 
-  base::Optional<GURL> stop_alarm_timer_action_url;
-  base::Optional<GURL> add_time_to_timer_action_url;
-  if (chromeos::assistant::features::IsAlarmTimerManagerEnabled()) {
-    stop_alarm_timer_action_url = assistant::util::CreateAlarmTimerDeepLink(
-        assistant::util::AlarmTimerAction::kStopRinging,
-        /*alarm_timer_id=*/base::nullopt,
-        /*duration=*/base::nullopt);
-    add_time_to_timer_action_url = assistant::util::CreateAlarmTimerDeepLink(
-        assistant::util::AlarmTimerAction::kAddTimeToTimer, alarm_timer.id,
-        kOneMin);
-  } else {
-    stop_alarm_timer_action_url = assistant::util::CreateAssistantQueryDeepLink(
-        l10n_util::GetStringUTF8(IDS_ASSISTANT_TIMER_NOTIFICATION_STOP_QUERY));
-    add_time_to_timer_action_url =
-        assistant::util::CreateAssistantQueryDeepLink(l10n_util::GetStringUTF8(
-            IDS_ASSISTANT_TIMER_NOTIFICATION_ADD_1_MIN_QUERY));
-  }
+  base::Optional<GURL> stop_alarm_timer_action_url =
+      assistant::util::CreateAlarmTimerDeepLink(
+          assistant::util::AlarmTimerAction::kStopRinging,
+          /*alarm_timer_id=*/base::nullopt,
+          /*duration=*/base::nullopt);
+
+  base::Optional<GURL> add_time_to_timer_action_url =
+      assistant::util::CreateAlarmTimerDeepLink(
+          assistant::util::AlarmTimerAction::kAddTimeToTimer, alarm_timer.id,
+          kOneMin);
 
   AssistantNotificationPtr notification = AssistantNotification::New();
 
@@ -152,7 +143,6 @@
 
 void AssistantAlarmTimerController::BindReceiver(
     mojo::PendingReceiver<mojom::AssistantAlarmTimerController> receiver) {
-  DCHECK(chromeos::assistant::features::IsTimerNotificationEnabled());
   receiver_.Bind(std::move(receiver));
 }
 
@@ -166,20 +156,6 @@
   model_.RemoveObserver(observer);
 }
 
-// TODO(dmblack): Remove method when the LibAssistant Alarm/Timer API is ready.
-void AssistantAlarmTimerController::OnTimerSoundingStarted() {
-  AlarmTimer timer;
-  timer.id = std::to_string(next_timer_id_++);
-  timer.type = AlarmTimerType::kTimer;
-  timer.end_time = base::TimeTicks::Now();
-  model_.AddAlarmTimer(timer);
-}
-
-// TODO(dmblack): Remove method when the LibAssistant Alarm/Timer API is ready.
-void AssistantAlarmTimerController::OnTimerSoundingFinished() {
-  model_.RemoveAllAlarmsTimers();
-}
-
 void AssistantAlarmTimerController::OnAlarmTimerStateChanged(
     mojom::AssistantAlarmTimerEventPtr event) {
   if (!event) {
@@ -212,26 +188,18 @@
     const AlarmTimer& alarm_timer,
     const base::TimeDelta& time_remaining) {
   // Schedule a repeating timer to tick the tracked alarms/timers.
-  if (chromeos::assistant::features::IsTimerTicksEnabled() &&
-      !timer_.IsRunning()) {
+  if (!timer_.IsRunning()) {
     timer_.Start(FROM_HERE, kTickInterval, &model_,
                  &AssistantAlarmTimerModel::Tick);
   }
 
   // Create a notification for the added alarm/timer.
-  DCHECK(chromeos::assistant::features::IsTimerNotificationEnabled());
-  if (chromeos::assistant::features::IsTimerNotificationEnabled()) {
-    assistant_controller_->notification_controller()->AddOrUpdateNotification(
-        CreateTimerNotification(alarm_timer, time_remaining));
-  }
+  assistant_controller_->notification_controller()->AddOrUpdateNotification(
+      CreateTimerNotification(alarm_timer, time_remaining));
 }
 
 void AssistantAlarmTimerController::OnAlarmsTimersTicked(
     const std::map<std::string, base::TimeDelta>& times_remaining) {
-  // This code should only be called when timer notifications/ticks are enabled.
-  DCHECK(chromeos::assistant::features::IsTimerNotificationEnabled());
-  DCHECK(chromeos::assistant::features::IsTimerTicksEnabled());
-
   // Update any existing notifications associated w/ our alarms/timers.
   for (auto& pair : times_remaining) {
     auto* notification_controller =
@@ -245,16 +213,13 @@
 }
 
 void AssistantAlarmTimerController::OnAllAlarmsTimersRemoved() {
-  if (chromeos::assistant::features::IsTimerTicksEnabled())
-    timer_.Stop();
+  // We can stop our timer from ticking when all alarms/timers are removed.
+  timer_.Stop();
 
   // Remove any notifications associated w/ alarms/timers.
-  DCHECK(chromeos::assistant::features::IsTimerNotificationEnabled());
-  if (chromeos::assistant::features::IsTimerNotificationEnabled()) {
-    assistant_controller_->notification_controller()
-        ->RemoveNotificationByGroupingKey(kTimerNotificationGroupingKey,
-                                          /*from_server=*/false);
-  }
+  assistant_controller_->notification_controller()
+      ->RemoveNotificationByGroupingKey(kTimerNotificationGroupingKey,
+                                        /*from_server=*/false);
 }
 
 void AssistantAlarmTimerController::SetAssistant(
@@ -306,18 +271,6 @@
   if (old_visibility != AssistantVisibility::kVisible)
     return;
 
-  // We only do this if the AlarmTimerManager is enabled, as otherwise we would
-  // have to issue an Assistant query to stop ringing alarms/timers which would
-  // cause Assistant UI to once again show. This would be a bad user experience.
-  if (!chromeos::assistant::features::IsAlarmTimerManagerEnabled())
-    return;
-
-  // We only do this if timer notifications are enabled, as otherwise the
-  // ringing alarm/timer isn't bound to any particular UI affordance so it can
-  // maintain its own lifecycle.
-  if (!chromeos::assistant::features::IsTimerNotificationEnabled())
-    return;
-
   // We only do this if in-Assistant notifications are enabled, as in-Assistant
   // alarm/timer notifications only live as long the Assistant UI. Per UX
   // requirement, when Assistant UI dismisses with an in-Assistant timer
diff --git a/ash/assistant/assistant_alarm_timer_controller.h b/ash/assistant/assistant_alarm_timer_controller.h
index 4ec45dc..e14dcfc 100644
--- a/ash/assistant/assistant_alarm_timer_controller.h
+++ b/ash/assistant/assistant_alarm_timer_controller.h
@@ -52,8 +52,6 @@
   void RemoveModelObserver(AssistantAlarmTimerModelObserver* observer);
 
   // mojom::AssistantAlarmTimerController:
-  void OnTimerSoundingStarted() override;
-  void OnTimerSoundingFinished() override;
   void OnAlarmTimerStateChanged(
       mojom::AssistantAlarmTimerEventPtr event) override;
 
@@ -98,8 +96,6 @@
   // Owned by AssistantController.
   chromeos::assistant::mojom::Assistant* assistant_;
 
-  int next_timer_id_ = 1;
-
   DISALLOW_COPY_AND_ASSIGN(AssistantAlarmTimerController);
 };
 
diff --git a/ash/host/ash_window_tree_host_platform.cc b/ash/host/ash_window_tree_host_platform.cc
index 4a8147d..c10bfa14 100644
--- a/ash/host/ash_window_tree_host_platform.cc
+++ b/ash/host/ash_window_tree_host_platform.cc
@@ -25,7 +25,7 @@
 #include "ui/gfx/transform.h"
 #include "ui/ozone/public/input_controller.h"
 #include "ui/ozone/public/ozone_platform.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_init_properties.h"
 
 namespace ash {
diff --git a/ash/host/ash_window_tree_host_unified.cc b/ash/host/ash_window_tree_host_unified.cc
index fe31c6c8a..7e46505 100644
--- a/ash/host/ash_window_tree_host_unified.cc
+++ b/ash/host/ash_window_tree_host_unified.cc
@@ -65,7 +65,7 @@
     AshWindowTreeHostMirroringDelegate* delegate)
     : AshWindowTreeHostPlatform(), delegate_(delegate) {
   DCHECK(delegate);
-  std::unique_ptr<ui::PlatformWindow> window(new ui::StubWindow(this));
+  std::unique_ptr<ui::PlatformWindowBase> window(new ui::StubWindow(this));
   window->SetBounds(initial_bounds);
   SetPlatformWindow(std::move(window));
 }
diff --git a/ash/public/mojom/assistant_controller.mojom b/ash/public/mojom/assistant_controller.mojom
index bb7e017..124154e3 100644
--- a/ash/public/mojom/assistant_controller.mojom
+++ b/ash/public/mojom/assistant_controller.mojom
@@ -53,12 +53,6 @@
 // AssistantController. Currently used by the Assistant service to notify Ash
 // of changes to the underlying alarm/timer state in LibAssistant.
 interface AssistantAlarmTimerController {
-  // Invoked when a timer has started sounding.
-  OnTimerSoundingStarted();
-
-  // Invoked when a timer has finished sounding.
-  OnTimerSoundingFinished();
-
   // Invoked when an alarm/timer state changed. No alarm/timer is ringing if
   // |event| is nullptr.
   OnAlarmTimerStateChanged(AssistantAlarmTimerEvent? event);
diff --git a/ash/system/unified/feature_pod_button.cc b/ash/system/unified/feature_pod_button.cc
index 5eef504..b5fc4197 100644
--- a/ash/system/unified/feature_pod_button.cc
+++ b/ash/system/unified/feature_pod_button.cc
@@ -21,6 +21,7 @@
 #include "ui/views/animation/ink_drop_impl.h"
 #include "ui/views/animation/ink_drop_mask.h"
 #include "ui/views/border.h"
+#include "ui/views/controls/highlight_path_generator.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/layout/box_layout.h"
@@ -48,10 +49,7 @@
   SetImageHorizontalAlignment(ALIGN_CENTER);
   SetImageVerticalAlignment(ALIGN_MIDDLE);
   TrayPopupUtils::ConfigureTrayPopupButton(this);
-
-  auto path = std::make_unique<SkPath>();
-  path->addOval(gfx::RectToSkRect(gfx::Rect(kUnifiedFeaturePodIconSize)));
-  SetProperty(views::kHighlightPathKey, path.release());
+  views::InstallCircleHighlightPathGenerator(this);
 }
 
 FeaturePodIconButton::~FeaturePodIconButton() = default;
diff --git a/ash/system/unified/top_shortcut_button.cc b/ash/system/unified/top_shortcut_button.cc
index d8ef80b7..00b74335 100644
--- a/ash/system/unified/top_shortcut_button.cc
+++ b/ash/system/unified/top_shortcut_button.cc
@@ -15,6 +15,7 @@
 #include "ui/views/animation/ink_drop_highlight.h"
 #include "ui/views/animation/ink_drop_impl.h"
 #include "ui/views/animation/ink_drop_mask.h"
+#include "ui/views/controls/highlight_path_generator.h"
 #include "ui/views/view_class_properties.h"
 
 namespace ash {
@@ -57,9 +58,7 @@
 
   TrayPopupUtils::ConfigureTrayPopupButton(this);
 
-  auto path = std::make_unique<SkPath>();
-  path->addOval(gfx::RectToSkRect(gfx::Rect(CalculatePreferredSize())));
-  SetProperty(views::kHighlightPathKey, path.release());
+  views::InstallCircleHighlightPathGenerator(this);
 }
 
 TopShortcutButton::~TopShortcutButton() = default;
@@ -75,7 +74,7 @@
       AshColorProvider::ControlsLayerType::kInactiveControlBackground,
       kUnifiedMenuButtonColor));
   flags.setStyle(cc::PaintFlags::kFill_Style);
-  canvas->DrawPath(*GetProperty(views::kHighlightPathKey), flags);
+  canvas->DrawPath(views::GetHighlightPath(this), flags);
 
   views::ImageButton::PaintButtonContents(canvas);
 }
diff --git a/ash/system/unified/unified_slider_view.cc b/ash/system/unified/unified_slider_view.cc
index 4efb05e..635b575 100644
--- a/ash/system/unified/unified_slider_view.cc
+++ b/ash/system/unified/unified_slider_view.cc
@@ -14,6 +14,7 @@
 #include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/animation/ink_drop_mask.h"
 #include "ui/views/border.h"
+#include "ui/views/controls/highlight_path_generator.h"
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/view_class_properties.h"
 #include "ui/views/widget/widget.h"
@@ -59,9 +60,7 @@
     : TopShortcutButton(listener, accessible_name_id) {
   SetVectorIcon(icon);
   SetBorder(views::CreateEmptyBorder(kUnifiedCircularButtonFocusPadding));
-  auto path = std::make_unique<SkPath>();
-  path->addOval(gfx::RectToSkRect(gfx::Rect(CalculatePreferredSize())));
-  SetProperty(views::kHighlightPathKey, path.release());
+  views::InstallCircleHighlightPathGenerator(this);
 }
 
 UnifiedSliderButton::~UnifiedSliderButton() = default;
diff --git a/base/memory/fake_memory_pressure_monitor.h b/base/memory/fake_memory_pressure_monitor.h
deleted file mode 100644
index d012876..0000000
--- a/base/memory/fake_memory_pressure_monitor.h
+++ /dev/null
@@ -1,34 +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 BASE_MEMORY_FAKE_MEMORY_PRESSURE_MONITOR_H_
-#define BASE_MEMORY_FAKE_MEMORY_PRESSURE_MONITOR_H_
-
-#include "base/macros.h"
-#include "base/memory/memory_pressure_monitor.h"
-
-namespace base {
-namespace test {
-
-class FakeMemoryPressureMonitor : public base::MemoryPressureMonitor {
- public:
-  FakeMemoryPressureMonitor();
-  ~FakeMemoryPressureMonitor() override;
-
-  void SetAndNotifyMemoryPressure(MemoryPressureLevel level);
-
-  // base::MemoryPressureMonitor overrides:
-  MemoryPressureLevel GetCurrentPressureLevel() const override;
-  void SetDispatchCallback(const DispatchCallback& callback) override;
-
- private:
-  MemoryPressureLevel memory_pressure_level_;
-
-  DISALLOW_COPY_AND_ASSIGN(FakeMemoryPressureMonitor);
-};
-
-}  // namespace test
-}  // namespace base
-
-#endif  // BASE_MEMORY_FAKE_MEMORY_PRESSURE_MONITOR_H_
diff --git a/base/strings/string_piece.cc b/base/strings/string_piece.cc
index 278849fa..19e132f 100644
--- a/base/strings/string_piece.cc
+++ b/base/strings/string_piece.cc
@@ -219,8 +219,11 @@
 size_t find_first_of(const StringPiece16& self,
                      const StringPiece16& s,
                      size_t pos) {
+  // Use the faster std::find() if searching for a single character.
   StringPiece16::const_iterator found =
-      std::find_first_of(self.begin() + pos, self.end(), s.begin(), s.end());
+      s.size() == 1 ? std::find(self.begin() + pos, self.end(), s[0])
+                    : std::find_first_of(self.begin() + pos, self.end(),
+                                         s.begin(), s.end());
   if (found == self.end())
     return StringPiece16::npos;
   return found - self.begin();
diff --git a/base/strings/string_split.cc b/base/strings/string_split.cc
index 1456c3d..9a99925 100644
--- a/base/strings/string_split.cc
+++ b/base/strings/string_split.cc
@@ -14,27 +14,15 @@
 
 namespace {
 
-// PieceToOutputType converts a StringPiece as needed to a given output type,
-// which is either the same type of StringPiece (a NOP) or the corresponding
-// non-piece string type.
-//
-// The default converter is a NOP, it works when the OutputType is the
-// correct StringPiece.
-template<typename Str, typename OutputType>
-OutputType PieceToOutputType(BasicStringPiece<Str> piece) {
-  return piece;
-}
-template<>  // Convert StringPiece to std::string
-std::string PieceToOutputType<std::string, std::string>(StringPiece piece) {
-  return piece.as_string();
-}
-template<>  // Convert StringPiece16 to string16.
-string16 PieceToOutputType<string16, string16>(StringPiece16 piece) {
-  return piece.as_string();
-}
-
 // Returns either the ASCII or UTF-16 whitespace.
 template<typename Str> BasicStringPiece<Str> WhitespaceForType();
+#if defined(OS_WIN) && defined(BASE_STRING16_IS_STD_U16STRING)
+template <>
+WStringPiece WhitespaceForType<std::wstring>() {
+  return kWhitespaceWide;
+}
+#endif
+
 template<> StringPiece16 WhitespaceForType<string16>() {
   return kWhitespaceUTF16;
 }
@@ -42,37 +30,12 @@
   return kWhitespaceASCII;
 }
 
-// Optimize the single-character case to call find() on the string instead,
-// since this is the common case and can be made faster. This could have been
-// done with template specialization too, but would have been less clear.
-//
-// There is no corresponding FindFirstNotOf because StringPiece already
-// implements these different versions that do the optimized searching.
-size_t FindFirstOf(StringPiece piece, char c, size_t pos) {
-  return piece.find(c, pos);
-}
-size_t FindFirstOf(StringPiece16 piece, char16 c, size_t pos) {
-  return piece.find(c, pos);
-}
-size_t FindFirstOf(StringPiece piece, StringPiece one_of, size_t pos) {
-  return piece.find_first_of(one_of, pos);
-}
-size_t FindFirstOf(StringPiece16 piece, StringPiece16 one_of, size_t pos) {
-  return piece.find_first_of(one_of, pos);
-}
-
 // General string splitter template. Can take 8- or 16-bit input, can produce
-// the corresponding string or StringPiece output, and can take single- or
-// multiple-character delimiters.
-//
-// DelimiterType is either a character (Str::value_type) or a string piece of
-// multiple characters (BasicStringPiece<Str>). StringPiece has a version of
-// find for both of these cases, and the single-character version is the most
-// common and can be implemented faster, which is why this is a template.
-template<typename Str, typename OutputStringType, typename DelimiterType>
+// the corresponding string or StringPiece output.
+template <typename OutputStringType, typename Str>
 static std::vector<OutputStringType> SplitStringT(
     BasicStringPiece<Str> str,
-    DelimiterType delimiter,
+    BasicStringPiece<Str> delimiter,
     WhitespaceHandling whitespace,
     SplitResult result_type) {
   std::vector<OutputStringType> result;
@@ -81,7 +44,7 @@
 
   size_t start = 0;
   while (start != Str::npos) {
-    size_t end = FindFirstOf(str, delimiter, start);
+    size_t end = str.find_first_of(delimiter, start);
 
     BasicStringPiece<Str> piece;
     if (end == Str::npos) {
@@ -96,7 +59,7 @@
       piece = TrimString(piece, WhitespaceForType<Str>(), TRIM_ALL);
 
     if (result_type == SPLIT_WANT_ALL || !piece.empty())
-      result.push_back(PieceToOutputType<Str, OutputStringType>(piece));
+      result.emplace_back(piece);
   }
   return result;
 }
@@ -130,16 +93,16 @@
   return true;
 }
 
-template <typename Str, typename OutputStringType>
-void SplitStringUsingSubstrT(BasicStringPiece<Str> input,
-                             BasicStringPiece<Str> delimiter,
-                             WhitespaceHandling whitespace,
-                             SplitResult result_type,
-                             std::vector<OutputStringType>* result) {
+template <typename OutputStringType, typename Str>
+std::vector<OutputStringType> SplitStringUsingSubstrT(
+    BasicStringPiece<Str> input,
+    BasicStringPiece<Str> delimiter,
+    WhitespaceHandling whitespace,
+    SplitResult result_type) {
   using Piece = BasicStringPiece<Str>;
   using size_type = typename Piece::size_type;
 
-  result->clear();
+  std::vector<OutputStringType> result;
   for (size_type begin_index = 0, end_index = 0; end_index != Piece::npos;
        begin_index = end_index + delimiter.size()) {
     end_index = input.find(delimiter, begin_index);
@@ -151,8 +114,10 @@
       term = TrimString(term, WhitespaceForType<Str>(), TRIM_ALL);
 
     if (result_type == SPLIT_WANT_ALL || !term.empty())
-      result->push_back(PieceToOutputType<Str, OutputStringType>(term));
+      result.emplace_back(term);
   }
+
+  return result;
 }
 
 }  // namespace
@@ -161,48 +126,29 @@
                                      StringPiece separators,
                                      WhitespaceHandling whitespace,
                                      SplitResult result_type) {
-  if (separators.size() == 1) {
-    return SplitStringT<std::string, std::string, char>(
-        input, separators[0], whitespace, result_type);
-  }
-  return SplitStringT<std::string, std::string, StringPiece>(
-      input, separators, whitespace, result_type);
+  return SplitStringT<std::string>(input, separators, whitespace, result_type);
 }
 
 std::vector<string16> SplitString(StringPiece16 input,
                                   StringPiece16 separators,
                                   WhitespaceHandling whitespace,
                                   SplitResult result_type) {
-  if (separators.size() == 1) {
-    return SplitStringT<string16, string16, char16>(
-        input, separators[0], whitespace, result_type);
-  }
-  return SplitStringT<string16, string16, StringPiece16>(
-      input, separators, whitespace, result_type);
+  return SplitStringT<string16>(input, separators, whitespace, result_type);
 }
 
 std::vector<StringPiece> SplitStringPiece(StringPiece input,
                                           StringPiece separators,
                                           WhitespaceHandling whitespace,
                                           SplitResult result_type) {
-  if (separators.size() == 1) {
-    return SplitStringT<std::string, StringPiece, char>(
-        input, separators[0], whitespace, result_type);
-  }
-  return SplitStringT<std::string, StringPiece, StringPiece>(
-      input, separators, whitespace, result_type);
+  return SplitStringT<StringPiece>(input, separators, whitespace, result_type);
 }
 
 std::vector<StringPiece16> SplitStringPiece(StringPiece16 input,
                                             StringPiece16 separators,
                                             WhitespaceHandling whitespace,
                                             SplitResult result_type) {
-  if (separators.size() == 1) {
-    return SplitStringT<string16, StringPiece16, char16>(
-        input, separators[0], whitespace, result_type);
-  }
-  return SplitStringT<string16, StringPiece16, StringPiece16>(
-      input, separators, whitespace, result_type);
+  return SplitStringT<StringPiece16>(input, separators, whitespace,
+                                     result_type);
 }
 
 bool SplitStringIntoKeyValuePairs(StringPiece input,
@@ -240,18 +186,16 @@
                                              StringPiece16 delimiter,
                                              WhitespaceHandling whitespace,
                                              SplitResult result_type) {
-  std::vector<string16> result;
-  SplitStringUsingSubstrT(input, delimiter, whitespace, result_type, &result);
-  return result;
+  return SplitStringUsingSubstrT<string16>(input, delimiter, whitespace,
+                                           result_type);
 }
 
 std::vector<std::string> SplitStringUsingSubstr(StringPiece input,
                                                 StringPiece delimiter,
                                                 WhitespaceHandling whitespace,
                                                 SplitResult result_type) {
-  std::vector<std::string> result;
-  SplitStringUsingSubstrT(input, delimiter, whitespace, result_type, &result);
-  return result;
+  return SplitStringUsingSubstrT<std::string>(input, delimiter, whitespace,
+                                              result_type);
 }
 
 std::vector<StringPiece16> SplitStringPieceUsingSubstr(
@@ -260,8 +204,8 @@
     WhitespaceHandling whitespace,
     SplitResult result_type) {
   std::vector<StringPiece16> result;
-  SplitStringUsingSubstrT(input, delimiter, whitespace, result_type, &result);
-  return result;
+  return SplitStringUsingSubstrT<StringPiece16>(input, delimiter, whitespace,
+                                                result_type);
 }
 
 std::vector<StringPiece> SplitStringPieceUsingSubstr(
@@ -269,9 +213,41 @@
     StringPiece delimiter,
     WhitespaceHandling whitespace,
     SplitResult result_type) {
-  std::vector<StringPiece> result;
-  SplitStringUsingSubstrT(input, delimiter, whitespace, result_type, &result);
-  return result;
+  return SplitStringUsingSubstrT<StringPiece>(input, delimiter, whitespace,
+                                              result_type);
 }
 
+#if defined(OS_WIN) && defined(BASE_STRING16_IS_STD_U16STRING)
+std::vector<std::wstring> SplitString(WStringPiece input,
+                                      WStringPiece separators,
+                                      WhitespaceHandling whitespace,
+                                      SplitResult result_type) {
+  return SplitStringT<std::wstring>(input, separators, whitespace, result_type);
+}
+
+std::vector<WStringPiece> SplitStringPiece(WStringPiece input,
+                                           WStringPiece separators,
+                                           WhitespaceHandling whitespace,
+                                           SplitResult result_type) {
+  return SplitStringT<WStringPiece>(input, separators, whitespace, result_type);
+}
+
+std::vector<std::wstring> SplitStringUsingSubstr(WStringPiece input,
+                                                 WStringPiece delimiter,
+                                                 WhitespaceHandling whitespace,
+                                                 SplitResult result_type) {
+  return SplitStringUsingSubstrT<std::wstring>(input, delimiter, whitespace,
+                                               result_type);
+}
+
+std::vector<WStringPiece> SplitStringPieceUsingSubstr(
+    WStringPiece input,
+    WStringPiece delimiter,
+    WhitespaceHandling whitespace,
+    SplitResult result_type) {
+  return SplitStringUsingSubstrT<WStringPiece>(input, delimiter, whitespace,
+                                               result_type);
+}
+#endif
+
 }  // namespace base
diff --git a/base/strings/string_split.h b/base/strings/string_split.h
index 406dd2a..d3181a7 100644
--- a/base/strings/string_split.h
+++ b/base/strings/string_split.h
@@ -12,6 +12,7 @@
 #include "base/base_export.h"
 #include "base/strings/string16.h"
 #include "base/strings/string_piece.h"
+#include "build/build_config.h"
 
 namespace base {
 
@@ -132,6 +133,31 @@
     WhitespaceHandling whitespace,
     SplitResult result_type);
 
+#if defined(OS_WIN) && defined(BASE_STRING16_IS_STD_U16STRING)
+BASE_EXPORT std::vector<std::wstring> SplitString(WStringPiece input,
+                                                  WStringPiece separators,
+                                                  WhitespaceHandling whitespace,
+                                                  SplitResult result_type);
+
+BASE_EXPORT std::vector<WStringPiece> SplitStringPiece(
+    WStringPiece input,
+    WStringPiece separators,
+    WhitespaceHandling whitespace,
+    SplitResult result_type);
+
+BASE_EXPORT std::vector<std::wstring> SplitStringUsingSubstr(
+    WStringPiece input,
+    WStringPiece delimiter,
+    WhitespaceHandling whitespace,
+    SplitResult result_type);
+
+BASE_EXPORT std::vector<WStringPiece> SplitStringPieceUsingSubstr(
+    WStringPiece input,
+    WStringPiece delimiter,
+    WhitespaceHandling whitespace,
+    SplitResult result_type);
+#endif
+
 }  // namespace base
 
 #endif  // BASE_STRINGS_STRING_SPLIT_H_
diff --git a/base/strings/string_util.cc b/base/strings/string_util.cc
index 4032621a..03ea3972 100644
--- a/base/strings/string_util.cc
+++ b/base/strings/string_util.cc
@@ -262,8 +262,8 @@
   return ReplaceCharsT(input, remove_chars, StringPiece(), output);
 }
 
-template<typename Str>
-TrimPositions TrimStringT(const Str& input,
+template <typename Str>
+TrimPositions TrimStringT(BasicStringPiece<Str> input,
                           BasicStringPiece<Str> trim_chars,
                           TrimPositions positions,
                           Str* output) {
@@ -271,40 +271,40 @@
   // a StringPiece version of input to be able to call find* on it with the
   // StringPiece version of trim_chars (normally the trim_chars will be a
   // constant so avoid making a copy).
-  BasicStringPiece<Str> input_piece(input);
   const size_t last_char = input.length() - 1;
-  const size_t first_good_char = (positions & TRIM_LEADING) ?
-      input_piece.find_first_not_of(trim_chars) : 0;
-  const size_t last_good_char = (positions & TRIM_TRAILING) ?
-      input_piece.find_last_not_of(trim_chars) : last_char;
+  const size_t first_good_char =
+      (positions & TRIM_LEADING) ? input.find_first_not_of(trim_chars) : 0;
+  const size_t last_good_char = (positions & TRIM_TRAILING)
+                                    ? input.find_last_not_of(trim_chars)
+                                    : last_char;
 
   // When the string was all trimmed, report that we stripped off characters
   // from whichever position the caller was interested in. For empty input, we
   // stripped no characters, but we still need to clear |output|.
-  if (input.empty() ||
-      (first_good_char == Str::npos) || (last_good_char == Str::npos)) {
+  if (input.empty() || first_good_char == Str::npos ||
+      last_good_char == Str::npos) {
     bool input_was_empty = input.empty();  // in case output == &input
     output->clear();
     return input_was_empty ? TRIM_NONE : positions;
   }
 
   // Trim.
-  *output =
-      input.substr(first_good_char, last_good_char - first_good_char + 1);
+  output->assign(input.data() + first_good_char,
+                 last_good_char - first_good_char + 1);
 
   // Return where we trimmed from.
   return static_cast<TrimPositions>(
-      ((first_good_char == 0) ? TRIM_NONE : TRIM_LEADING) |
-      ((last_good_char == last_char) ? TRIM_NONE : TRIM_TRAILING));
+      (first_good_char == 0 ? TRIM_NONE : TRIM_LEADING) |
+      (last_good_char == last_char ? TRIM_NONE : TRIM_TRAILING));
 }
 
-bool TrimString(const string16& input,
+bool TrimString(StringPiece16 input,
                 StringPiece16 trim_chars,
                 string16* output) {
   return TrimStringT(input, trim_chars, TRIM_ALL, output) != TRIM_NONE;
 }
 
-bool TrimString(const std::string& input,
+bool TrimString(StringPiece input,
                 StringPiece trim_chars,
                 std::string* output) {
   return TrimStringT(input, trim_chars, TRIM_ALL, output) != TRIM_NONE;
@@ -370,7 +370,7 @@
     output->clear();
 }
 
-TrimPositions TrimWhitespace(const string16& input,
+TrimPositions TrimWhitespace(StringPiece16 input,
                              TrimPositions positions,
                              string16* output) {
   return TrimStringT(input, StringPiece16(kWhitespaceUTF16), positions, output);
@@ -381,7 +381,7 @@
   return TrimStringPieceT(input, StringPiece16(kWhitespaceUTF16), positions);
 }
 
-TrimPositions TrimWhitespaceASCII(const std::string& input,
+TrimPositions TrimWhitespaceASCII(StringPiece input,
                                   TrimPositions positions,
                                   std::string* output) {
   return TrimStringT(input, StringPiece(kWhitespaceASCII), positions, output);
@@ -1085,6 +1085,32 @@
   return result;
 }
 
+#if defined(OS_WIN) && defined(BASE_STRING16_IS_STD_U16STRING)
+
+TrimPositions TrimWhitespace(WStringPiece input,
+                             TrimPositions positions,
+                             std::wstring* output) {
+  return TrimStringT(input, WStringPiece(kWhitespaceWide), positions, output);
+}
+
+WStringPiece TrimWhitespace(WStringPiece input, TrimPositions positions) {
+  return TrimStringPieceT(input, WStringPiece(kWhitespaceWide), positions);
+}
+
+bool TrimString(WStringPiece input,
+                WStringPiece trim_chars,
+                std::wstring* output) {
+  return TrimStringT(input, trim_chars, TRIM_ALL, output) != TRIM_NONE;
+}
+
+WStringPiece TrimString(WStringPiece input,
+                        WStringPiece trim_chars,
+                        TrimPositions positions) {
+  return TrimStringPieceT(input, trim_chars, positions);
+}
+
+#endif
+
 // The following code is compatible with the OpenBSD lcpy interface.  See:
 //   http://www.gratisoft.us/todd/papers/strlcpy.html
 //   ftp://ftp.openbsd.org/pub/OpenBSD/src/lib/libc/string/{wcs,str}lcpy.c
diff --git a/base/strings/string_util.h b/base/strings/string_util.h
index bddb038..ec0bee3 100644
--- a/base/strings/string_util.h
+++ b/base/strings/string_util.h
@@ -204,10 +204,10 @@
 //
 // It is safe to use the same variable for both |input| and |output| (this is
 // the normal usage to trim in-place).
-BASE_EXPORT bool TrimString(const string16& input,
+BASE_EXPORT bool TrimString(StringPiece16 input,
                             StringPiece16 trim_chars,
                             string16* output);
-BASE_EXPORT bool TrimString(const std::string& input,
+BASE_EXPORT bool TrimString(StringPiece input,
                             StringPiece trim_chars,
                             std::string* output);
 
@@ -296,12 +296,12 @@
 //
 // The std::string versions return where whitespace was found.
 // NOTE: Safe to use the same variable for both input and output.
-BASE_EXPORT TrimPositions TrimWhitespace(const string16& input,
+BASE_EXPORT TrimPositions TrimWhitespace(StringPiece16 input,
                                          TrimPositions positions,
                                          string16* output);
 BASE_EXPORT StringPiece16 TrimWhitespace(StringPiece16 input,
                                          TrimPositions positions);
-BASE_EXPORT TrimPositions TrimWhitespaceASCII(const std::string& input,
+BASE_EXPORT TrimPositions TrimWhitespaceASCII(StringPiece input,
                                               TrimPositions positions,
                                               std::string* output);
 BASE_EXPORT StringPiece TrimWhitespaceASCII(StringPiece input,
@@ -532,6 +532,23 @@
                                                const string16& a,
                                                size_t* offset);
 
+#if defined(OS_WIN) && defined(BASE_STRING16_IS_STD_U16STRING)
+BASE_EXPORT TrimPositions TrimWhitespace(WStringPiece input,
+                                         TrimPositions positions,
+                                         std::wstring* output);
+
+BASE_EXPORT WStringPiece TrimWhitespace(WStringPiece input,
+                                        TrimPositions positions);
+
+BASE_EXPORT bool TrimString(WStringPiece input,
+                            WStringPiece trim_chars,
+                            std::wstring* output);
+
+BASE_EXPORT WStringPiece TrimString(WStringPiece input,
+                                    WStringPiece trim_chars,
+                                    TrimPositions positions);
+#endif
+
 }  // namespace base
 
 #if defined(OS_WIN)
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn
index 53ea803..b71bb86 100644
--- a/base/test/BUILD.gn
+++ b/base/test/BUILD.gn
@@ -27,8 +27,6 @@
 static_library("test_support") {
   testonly = true
   sources = [
-    "../memory/fake_memory_pressure_monitor.cc",
-    "../memory/fake_memory_pressure_monitor.h",
     "../task/sequence_manager/test/fake_task.cc",
     "../task/sequence_manager/test/fake_task.h",
     "../task/sequence_manager/test/mock_time_domain.cc",
diff --git a/base/util/memory_pressure/BUILD.gn b/base/util/memory_pressure/BUILD.gn
index 6065c9a..16bb4784b 100644
--- a/base/util/memory_pressure/BUILD.gn
+++ b/base/util/memory_pressure/BUILD.gn
@@ -41,3 +41,16 @@
     "//testing/gtest",
   ]
 }
+
+static_library("test_support") {
+  testonly = true
+  sources = [
+    "fake_memory_pressure_monitor.cc",
+    "fake_memory_pressure_monitor.h",
+  ]
+
+  public_deps = [
+    ":memory_pressure",
+    "//base",
+  ]
+}
diff --git a/base/memory/fake_memory_pressure_monitor.cc b/base/util/memory_pressure/fake_memory_pressure_monitor.cc
similarity index 85%
rename from base/memory/fake_memory_pressure_monitor.cc
rename to base/util/memory_pressure/fake_memory_pressure_monitor.cc
index 59fd3ef6..b9273c5 100644
--- a/base/memory/fake_memory_pressure_monitor.cc
+++ b/base/util/memory_pressure/fake_memory_pressure_monitor.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/memory/fake_memory_pressure_monitor.h"
+#include "base/util/memory_pressure/fake_memory_pressure_monitor.h"
 
-namespace base {
+namespace util {
 namespace test {
 
 FakeMemoryPressureMonitor::FakeMemoryPressureMonitor()
-    : MemoryPressureMonitor(),
+    : MultiSourceMemoryPressureMonitor(),
       memory_pressure_level_(MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_NONE) {}
 
 FakeMemoryPressureMonitor::~FakeMemoryPressureMonitor() {}
@@ -30,4 +30,4 @@
 }
 
 }  // namespace test
-}  // namespace base
+}  // namespace util
diff --git a/base/util/memory_pressure/fake_memory_pressure_monitor.h b/base/util/memory_pressure/fake_memory_pressure_monitor.h
new file mode 100644
index 0000000..e972d08c
--- /dev/null
+++ b/base/util/memory_pressure/fake_memory_pressure_monitor.h
@@ -0,0 +1,40 @@
+// 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 BASE_UTIL_MEMORY_PRESSURE_FAKE_MEMORY_PRESSURE_MONITOR_H_
+#define BASE_UTIL_MEMORY_PRESSURE_FAKE_MEMORY_PRESSURE_MONITOR_H_
+
+#include "base/macros.h"
+#include "base/util/memory_pressure/multi_source_memory_pressure_monitor.h"
+
+namespace util {
+namespace test {
+
+class FakeMemoryPressureMonitor
+    : public ::util::MultiSourceMemoryPressureMonitor {
+ public:
+  using MemoryPressureLevel =
+      ::util::MultiSourceMemoryPressureMonitor::MemoryPressureLevel;
+  using DispatchCallback =
+      ::util::MultiSourceMemoryPressureMonitor::DispatchCallback;
+
+  FakeMemoryPressureMonitor();
+  ~FakeMemoryPressureMonitor() override;
+
+  void SetAndNotifyMemoryPressure(MemoryPressureLevel level);
+
+  // base::MemoryPressureMonitor overrides:
+  MemoryPressureLevel GetCurrentPressureLevel() const override;
+  void SetDispatchCallback(const DispatchCallback& callback) override;
+
+ private:
+  MemoryPressureLevel memory_pressure_level_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeMemoryPressureMonitor);
+};
+
+}  // namespace test
+}  // namespace util
+
+#endif  // BASE_UTIL_MEMORY_PRESSURE_FAKE_MEMORY_PRESSURE_MONITOR_H_
diff --git a/build/android/gyp/dex.py b/build/android/gyp/dex.py
index a30dcf3..5182691 100755
--- a/build/android/gyp/dex.py
+++ b/build/android/gyp/dex.py
@@ -402,7 +402,8 @@
       output_paths=output_paths,
       input_paths=input_paths,
       input_strings=dex_cmd + [bool(options.incremental_dir)],
-      pass_changes=True)
+      pass_changes=True,
+      track_subpaths_whitelist=options.class_inputs)
 
 
 if __name__ == '__main__':
diff --git a/build/android/gyp/util/build_utils.py b/build/android/gyp/util/build_utils.py
index 18a92dd..7d00afd 100644
--- a/build/android/gyp/util/build_utils.py
+++ b/build/android/gyp/util/build_utils.py
@@ -642,6 +642,7 @@
                                output_paths=None,
                                force=False,
                                pass_changes=False,
+                               track_subpaths_whitelist=None,
                                depfile_deps=None):
   """Wraps md5_check.CallAndRecordIfStale() and writes a depfile if applicable.
 
@@ -669,7 +670,8 @@
       input_strings=input_strings,
       output_paths=output_paths,
       force=force,
-      pass_changes=pass_changes)
+      pass_changes=pass_changes,
+      track_subpaths_whitelist=track_subpaths_whitelist)
 
   # Write depfile even when inputs have not changed to ensure build correctness
   # on bots that build with & without patch, and the patch changes the depfile
diff --git a/build/android/gyp/util/md5_check.py b/build/android/gyp/util/md5_check.py
index cd03e0e0..0ad6f1b 100644
--- a/build/android/gyp/util/md5_check.py
+++ b/build/android/gyp/util/md5_check.py
@@ -20,9 +20,14 @@
 _FORCE_REBUILD = int(os.environ.get('FORCE_REBUILD', 0))
 
 
-def CallAndRecordIfStale(
-    function, record_path=None, input_paths=None, input_strings=None,
-    output_paths=None, force=False, pass_changes=False):
+def CallAndRecordIfStale(function,
+                         record_path=None,
+                         input_paths=None,
+                         input_strings=None,
+                         output_paths=None,
+                         force=False,
+                         pass_changes=False,
+                         track_subpaths_whitelist=None):
   """Calls function if outputs are stale.
 
   Outputs are considered stale if:
@@ -43,6 +48,8 @@
     force: Whether to treat outputs as missing regardless of whether they
       actually are.
     pass_changes: Whether to pass a Changes instance to |function|.
+    track_subpaths_whitelist: Relevant only when pass_changes=True. List of .zip
+      files from |input_paths| to make subpath information available for.
   """
   assert record_path or output_paths
   input_paths = input_paths or []
@@ -57,10 +64,11 @@
   new_metadata = _Metadata(track_entries=pass_changes or PRINT_EXPLANATIONS)
   new_metadata.AddStrings(input_strings)
 
+  zip_whitelist = set(track_subpaths_whitelist or [])
   for path in input_paths:
     # It's faster to md5 an entire zip file than it is to just locate & hash
     # its central directory (which is what this used to do).
-    if pass_changes and _IsZipFile(path):
+    if path in zip_whitelist:
       entries = _ExtractZipEntries(path)
       new_metadata.AddZipFile(path, entries)
     else:
@@ -391,14 +399,6 @@
   return md5.hexdigest()
 
 
-def _IsZipFile(path):
-  """Returns whether to treat the given file as a zip file."""
-  # ijar doesn't set the CRC32 field.
-  if path.endswith('.interface.jar'):
-    return False
-  return path[-4:] in ('.zip', '.apk', '.jar') or path.endswith('.srcjar')
-
-
 def _ExtractZipEntries(path):
   """Returns a list of (path, CRC32) of all files within |path|."""
   entries = []
diff --git a/build/android/gyp/util/md5_check_test.py b/build/android/gyp/util/md5_check_test.py
index 872c30c..cba7a6a 100755
--- a/build/android/gyp/util/md5_check_test.py
+++ b/build/android/gyp/util/md5_check_test.py
@@ -36,12 +36,18 @@
     # Test out empty zip file to start.
     _WriteZipFile(input_file2.name, [])
     input_files = [input_file1.name, input_file2.name]
+    zip_paths = [input_file2.name]
 
     record_path = tempfile.NamedTemporaryFile(suffix='.stamp')
 
-    def CheckCallAndRecord(should_call, message, force=False,
-                           outputs_specified=False, outputs_missing=False,
-                           expected_changes=None, added_or_modified_only=None):
+    def CheckCallAndRecord(should_call,
+                           message,
+                           force=False,
+                           outputs_specified=False,
+                           outputs_missing=False,
+                           expected_changes=None,
+                           added_or_modified_only=None,
+                           track_subentries=False):
       output_paths = None
       if outputs_specified:
         output_file1 = tempfile.NamedTemporaryFile()
@@ -66,7 +72,8 @@
           input_strings=input_strings,
           output_paths=output_paths,
           force=force,
-          pass_changes=(expected_changes or added_or_modified_only) is not None)
+          pass_changes=(expected_changes or added_or_modified_only) is not None,
+          track_subpaths_whitelist=zip_paths if track_subentries else None)
       self.assertEqual(should_call, self.called, message)
       if expected_changes:
         description = self.changes.DescribeDifference()
@@ -80,7 +87,6 @@
     CheckCallAndRecord(True, 'should call when record doesn\'t exist',
                        expected_changes='Previous stamp file not found.',
                        added_or_modified_only=False)
-    CheckCallAndRecord(True, 'pass_changes changed')
     CheckCallAndRecord(False, 'should not call when nothing changed')
     input_files = input_files[::-1]
     CheckCallAndRecord(False, 'reordering of inputs shouldn\'t trigger call')
@@ -130,15 +136,21 @@
         added_or_modified_only=False)
 
     _WriteZipFile(input_file2.name, [('path/1.txt', '1')])
-    CheckCallAndRecord(True, 'added subpath should trigger call',
-                       expected_changes='*Modified: %s*Subpath added: %s' % (
-                                        input_file2.name, 'path/1.txt'),
-                       added_or_modified_only=True)
+    CheckCallAndRecord(
+        True,
+        'added subpath should trigger call',
+        expected_changes='*Modified: %s*Subpath added: %s' % (input_file2.name,
+                                                              'path/1.txt'),
+        added_or_modified_only=True,
+        track_subentries=True)
     _WriteZipFile(input_file2.name, [('path/1.txt', '2')])
-    CheckCallAndRecord(True, 'changed subpath should trigger call',
-                       expected_changes='*Modified: %s*Subpath modified: %s' % (
-                                        input_file2.name, 'path/1.txt'),
-                       added_or_modified_only=True)
+    CheckCallAndRecord(
+        True,
+        'changed subpath should trigger call',
+        expected_changes='*Modified: %s*Subpath modified: %s' %
+        (input_file2.name, 'path/1.txt'),
+        added_or_modified_only=True,
+        track_subentries=True)
 
     _WriteZipFile(input_file2.name, [])
     CheckCallAndRecord(True, 'removed subpath should trigger call',
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index e479d21..49f04eaa 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -1538,6 +1538,13 @@
           # TODO(https://crbug.com/995993): Clean up and enable.
           "-Wno-implicit-fallthrough",
         ]
+
+        if (llvm_force_head_revision) {
+          cflags += [
+            # TODO(https://crbug.com/1011810): Re-enable once fix is in.
+            "-Wno-error=bool-operation",
+          ]
+        }
       }
     }
   }
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 0fc43629..5663300e 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8900242650300651232
\ No newline at end of file
+8900186046979314384
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index a30bcc9..2eecdfc 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-8900242342079817824
\ No newline at end of file
+8900185799248764720
\ No newline at end of file
diff --git a/build/toolchain/cros/BUILD.gn b/build/toolchain/cros/BUILD.gn
index 5a9561f..0740fa2 100644
--- a/build/toolchain/cros/BUILD.gn
+++ b/build/toolchain/cros/BUILD.gn
@@ -125,7 +125,7 @@
     is_clang = cros_host_is_clang
     current_cpu = host_cpu
     current_os = "linux"
-    use_sysroot = false
+    use_sysroot = use_sysroot
   }
 }
 
@@ -168,6 +168,6 @@
     }
     v8_current_cpu = v8_target_cpu
     current_os = "linux"
-    use_sysroot = false
+    use_sysroot = use_sysroot
   }
 }
diff --git a/chrome/VERSION b/chrome/VERSION
index 429addd..3f169043 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=79
 MINOR=0
-BUILD=3936
+BUILD=3937
 PATCH=0
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn
index 806ecfe..750d2b4 100644
--- a/chrome/android/features/tab_ui/BUILD.gn
+++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -102,6 +102,9 @@
     "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelProperties.java",
     "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelToolbarCoordinator.java",
     "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelViewBinder.java",
+    "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewProperties.java",
+    "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardView.java",
+    "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinder.java",
     "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridSheetCoordinator.java",
     "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridSheetMediator.java",
     "java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridSheetContent.java",
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_suggestion_card_item.xml b/chrome/android/features/tab_ui/java/res/layout/tab_suggestion_card_item.xml
new file mode 100644
index 0000000..7d46453
--- /dev/null
+++ b/chrome/android/features/tab_ui/java/res/layout/tab_suggestion_card_item.xml
@@ -0,0 +1,45 @@
+<?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.tasks.tab_management.TabGridMessageCardView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/tab_grid_iph_item"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="horizontal"
+    android:background="@drawable/popup_bg_tinted">
+    <org.chromium.ui.widget.ChromeImageView
+        android:id="@+id/icon"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:minWidth="8dp"
+        android:adjustViewBounds="true"
+        android:importantForAccessibility="no"
+        android:src="@drawable/ic_omnibox_page"/>
+    <org.chromium.chrome.browser.snackbar.TemplatePreservingTextView
+        android:id="@+id/description"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_gravity="start|center_vertical"
+        android:layout_marginTop="14dp"
+        android:layout_marginBottom="14dp"
+        android:layout_weight="4"
+        android:textAlignment="viewStart"
+        android:textAppearance="@style/TextAppearance.BlackBodyDefault" />
+    <org.chromium.ui.widget.ButtonCompat
+        android:id="@+id/action_button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        style="@style/TextButton"
+        android:layout_gravity="center"/>
+    <org.chromium.ui.widget.ChromeImageView
+        android:id="@+id/close_button"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        style="@style/BottomToolbarButton"
+        android:contentDescription="@string/close"
+        android:tint="@color/default_icon_color" />
+</org.chromium.chrome.browser.tasks.tab_management.TabGridMessageCardView>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardView.java
new file mode 100644
index 0000000..4cacd46d
--- /dev/null
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardView.java
@@ -0,0 +1,86 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.tasks.tab_management;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.widget.LinearLayout;
+
+import org.chromium.chrome.browser.snackbar.TemplatePreservingTextView;
+import org.chromium.chrome.tab_ui.R;
+import org.chromium.ui.widget.ButtonCompat;
+import org.chromium.ui.widget.ChromeImageView;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * Represents a secondary card view in Grid Tab Switcher. The view contains an icon, a description,
+ * an action button for acceptance, and a close button for dismissal.
+ */
+class TabGridMessageCardView extends LinearLayout {
+    private static WeakReference<Bitmap> sCloseButtonBitmapWeakRef;
+
+    private ChromeImageView mIcon;
+    private TemplatePreservingTextView mDescription;
+    private ButtonCompat mActionButton;
+    private ChromeImageView mCloseButton;
+
+    public TabGridMessageCardView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+
+        mIcon = findViewById(R.id.icon);
+        mDescription = findViewById(R.id.description);
+        mActionButton = findViewById(R.id.action_button);
+        mCloseButton = findViewById(R.id.close_button);
+
+        if (sCloseButtonBitmapWeakRef == null || sCloseButtonBitmapWeakRef.get() == null) {
+            int closeButtonSize =
+                    (int) getResources().getDimension(R.dimen.tab_grid_close_button_size);
+            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.btn_close);
+            sCloseButtonBitmapWeakRef = new WeakReference<>(
+                    Bitmap.createScaledBitmap(bitmap, closeButtonSize, closeButtonSize, true));
+        }
+        mCloseButton.setImageBitmap(sCloseButtonBitmapWeakRef.get());
+    }
+
+    /**
+     * @see TemplatePreservingTextView#setTemplate(String), setDescriptionText() must be called
+     * after calling this method for the new template text to take effect.
+     */
+    void setDescriptionTextTemplate(String template) {
+        mDescription.setTemplate(template);
+    }
+
+    /**
+     * @see TemplatePreservingTextView#setText(CharSequence).
+     */
+    void setDescriptionText(CharSequence text) {
+        mDescription.setText(text);
+    }
+
+    /**
+     * Set action text for the action button.
+     * @param actionText Text to be displayed.
+     */
+    void setAction(String actionText) {
+        mActionButton.setText(actionText);
+    }
+
+    /**
+     * Set icon drawable.
+     * @param iconDrawable Drawable to be shown.
+     */
+    void setIcon(Drawable iconDrawable) {
+        mIcon.setImageDrawable(iconDrawable);
+    }
+}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinder.java
new file mode 100644
index 0000000..b875633
--- /dev/null
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinder.java
@@ -0,0 +1,30 @@
+// 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.tasks.tab_management;
+
+import android.view.ViewGroup;
+
+import org.chromium.ui.modelutil.PropertyKey;
+import org.chromium.ui.modelutil.PropertyModel;
+
+/**
+ * ViewBinder for TabGridSecondaryItem.
+ */
+class TabGridMessageCardViewBinder {
+    public static void bind(PropertyModel model, ViewGroup view, PropertyKey propertyKey) {
+        assert view instanceof TabGridMessageCardView;
+
+        TabGridMessageCardView itemView = (TabGridMessageCardView) view;
+        if (TabGridMessageCardViewProperties.ACTION_TEXT == propertyKey) {
+            itemView.setAction(model.get(TabGridMessageCardViewProperties.ACTION_TEXT));
+        } else if (TabGridMessageCardViewProperties.DESCRIPTION_TEXT == propertyKey) {
+            itemView.setDescriptionText(
+                    model.get(TabGridMessageCardViewProperties.DESCRIPTION_TEXT));
+        } else if (TabGridMessageCardViewProperties.DESCRIPTION_TEXT_TEMPLATE == propertyKey) {
+            itemView.setDescriptionTextTemplate(
+                    model.get(TabGridMessageCardViewProperties.DESCRIPTION_TEXT_TEMPLATE));
+        }
+    }
+}
\ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewProperties.java
new file mode 100644
index 0000000..b33dc66
--- /dev/null
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewProperties.java
@@ -0,0 +1,23 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.tasks.tab_management;
+
+import org.chromium.ui.modelutil.PropertyKey;
+import org.chromium.ui.modelutil.PropertyModel;
+
+/**
+ * List of properties used by TabGridSecondaryItem.
+ */
+class TabGridMessageCardViewProperties {
+    public static final PropertyModel.WritableObjectPropertyKey<String> ACTION_TEXT =
+            new PropertyModel.WritableObjectPropertyKey<>();
+    public static final PropertyModel.WritableObjectPropertyKey<String> DESCRIPTION_TEXT =
+            new PropertyModel.WritableObjectPropertyKey<>();
+    public static final PropertyModel.WritableObjectPropertyKey<String> DESCRIPTION_TEXT_TEMPLATE =
+            new PropertyModel.WritableObjectPropertyKey<>();
+
+    public static final PropertyKey[] ALL_KEYS =
+            new PropertyKey[] {ACTION_TEXT, DESCRIPTION_TEXT, DESCRIPTION_TEXT_TEMPLATE};
+}
\ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
index b5aebf94..d3c839a9 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
@@ -11,6 +11,7 @@
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.helper.ItemTouchHelper;
 import android.view.LayoutInflater;
+import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ImageView;
 
@@ -26,6 +27,10 @@
 import org.chromium.chrome.browser.tasks.tab_management.TabProperties.UiType;
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.components.feature_engagement.FeatureConstants;
+import org.chromium.ui.modelutil.MVCListAdapter;
+import org.chromium.ui.modelutil.PropertyKey;
+import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
 import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter;
 import org.chromium.ui.resources.dynamics.DynamicResourceLoader;
 import org.chromium.ui.widget.ViewLookupCachingFrameLayout;
@@ -59,6 +64,7 @@
     static final int GRID_LAYOUT_SPAN_COUNT_LANDSCAPE = 3;
     private final TabListMediator mMediator;
     private final TabListRecyclerView mRecyclerView;
+    private final SimpleRecyclerViewAdapter mAdapter;
     private final @TabListMode int mMode;
     private final Rect mThumbnailLocationOfCurrentTab = new Rect();
 
@@ -100,15 +106,15 @@
             boolean attachToParent, String componentName) {
         mMode = mode;
         TabListModel modelList = new TabListModel();
-        SimpleRecyclerViewAdapter adapter = new SimpleRecyclerViewAdapter(modelList);
+        mAdapter = new SimpleRecyclerViewAdapter(modelList);
         RecyclerView.RecyclerListener recyclerListener = null;
         if (mMode == TabListMode.GRID || mMode == TabListMode.CAROUSEL) {
-            adapter.registerType(UiType.SELECTABLE, () -> {
+            mAdapter.registerType(UiType.SELECTABLE, () -> {
                 return (ViewGroup) LayoutInflater.from(context).inflate(
                         R.layout.selectable_tab_grid_card_item, parentView, false);
             }, TabGridViewBinder::bindSelectableTab);
 
-            adapter.registerType(UiType.CLOSABLE, () -> {
+            mAdapter.registerType(UiType.CLOSABLE, () -> {
                 ViewGroup group = (ViewGroup) LayoutInflater.from(context).inflate(
                         R.layout.closable_tab_grid_card_item, parentView, false);
                 if (mMode == TabListMode.CAROUSEL) {
@@ -126,7 +132,7 @@
                 thumbnail.setMinimumHeight(thumbnail.getWidth());
             };
         } else if (mMode == TabListMode.STRIP) {
-            adapter.registerType(UiType.STRIP, () -> {
+            mAdapter.registerType(UiType.STRIP, () -> {
                 return (ViewGroup) LayoutInflater.from(context).inflate(
                         R.layout.tab_strip_item, parentView, false);
             }, TabStripViewBinder::bind);
@@ -153,7 +159,7 @@
                     context.getResources().getDimensionPixelSize(R.dimen.tab_carousel_height);
         }
 
-        mRecyclerView.setAdapter(adapter);
+        mRecyclerView.setAdapter(mAdapter);
         mRecyclerView.setHasFixedSize(true);
         if (recyclerListener != null) mRecyclerView.setRecyclerListener(recyclerListener);
 
@@ -277,4 +283,15 @@
     long getLastDirtyTimeForTesting() {
         return mRecyclerView.getLastDirtyTimeForTesting();
     }
+
+    /**
+     * Register a new view type for the component.
+     * @see MVCListAdapter#registerType(int, MVCListAdapter.ViewBuilder,
+     *         PropertyModelChangeProcessor.ViewBinder).
+     */
+    <T extends View> void registerItemType(@UiType int typeId,
+            MVCListAdapter.ViewBuilder<T> builder,
+            PropertyModelChangeProcessor.ViewBinder<PropertyModel, T, PropertyKey> binder) {
+        mAdapter.registerType(typeId, builder, binder);
+    }
 }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java
index 81a3e7d..fe95695 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java
@@ -23,12 +23,13 @@
  */
 public class TabProperties {
     /** IDs for possible types of UI in the tab list. */
-    @IntDef({UiType.SELECTABLE, UiType.CLOSABLE, UiType.STRIP})
+    @IntDef({UiType.SELECTABLE, UiType.CLOSABLE, UiType.STRIP, UiType.SUGGESTION})
     @Retention(RetentionPolicy.SOURCE)
     public @interface UiType {
         int SELECTABLE = 0;
         int CLOSABLE = 1;
         int STRIP = 2;
+        int SUGGESTION = 3;
     }
 
     public static final PropertyModel.WritableIntPropertyKey TAB_ID =
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
index 2e70e78..4012109e 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
@@ -7,7 +7,9 @@
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Rect;
+import android.support.v7.widget.GridLayoutManager;
 import android.support.v7.widget.RecyclerView.ViewHolder;
+import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
@@ -17,6 +19,7 @@
 import org.chromium.base.Callback;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.metrics.RecordUserAction;
+import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.MenuOrKeyboardActionController;
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
@@ -134,6 +137,32 @@
             mMediator.setIphProvider(mTabGridIphItemCoordinator.getIphProvider());
         }
 
+        if (mode == TabListCoordinator.TabListMode.GRID) {
+            if (ChromeFeatureList.isEnabled(ChromeFeatureList.CLOSE_TAB_SUGGESTIONS)) {
+                mTabListCoordinator.registerItemType(TabProperties.UiType.SUGGESTION, () -> {
+                    return (ViewGroup) LayoutInflater.from(context).inflate(
+                            R.layout.tab_suggestion_card_item, container, false);
+                }, TabGridMessageCardViewBinder::bind);
+            }
+
+            assert mTabListCoordinator.getContainerView().getLayoutManager()
+                            instanceof GridLayoutManager;
+
+            // TODO(1004570): Have a flexible approach for span size look up for each UiType.
+            ((GridLayoutManager) mTabListCoordinator.getContainerView().getLayoutManager())
+                    .setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
+                        @Override
+                        public int getSpanSize(int position) {
+                            int itemType = mTabListCoordinator.getContainerView()
+                                                   .getAdapter()
+                                                   .getItemViewType(position);
+
+                            if (itemType == TabProperties.UiType.SUGGESTION) return 2;
+                            return 1;
+                        }
+                    });
+        }
+
         mMenuOrKeyboardActionController = menuOrKeyboardActionController;
         mMenuOrKeyboardActionController.registerMenuOrKeyboardActionHandler(
                 mTabSwitcherMenuActionHandler);
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinderTest.java
new file mode 100644
index 0000000..cac53f8f
--- /dev/null
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinderTest.java
@@ -0,0 +1,97 @@
+// 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.tasks.tab_management;
+
+import static org.junit.Assert.assertEquals;
+
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.SmallTest;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.chrome.tab_ui.R;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.ui.DummyUiActivityTestCase;
+import org.chromium.content_public.browser.test.util.TestThreadUtils;
+import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
+
+/**
+ * Tests for {@link TabGridMessageCardViewBinder}.
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+public class TabGridMessageCardViewBinderTest extends DummyUiActivityTestCase {
+    private static final String ACTION_TEXT = "actionText";
+    private static final String DESCRIPTION_TEXT = "descriptionText";
+
+    private ViewGroup mItemView;
+    private PropertyModel mItemViewModel;
+    private PropertyModelChangeProcessor mItemMCP;
+
+    @Override
+    public void setUpTest() throws Exception {
+        super.setUpTest();
+
+        ViewGroup view = new LinearLayout(getActivity());
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            getActivity().setContentView(view);
+
+            mItemView = (ViewGroup) getActivity().getLayoutInflater().inflate(
+                    R.layout.tab_suggestion_card_item, null);
+            view.addView(mItemView);
+        });
+
+        mItemViewModel =
+                new PropertyModel.Builder(TabGridMessageCardViewProperties.ALL_KEYS)
+                        .with(TabGridMessageCardViewProperties.ACTION_TEXT, ACTION_TEXT)
+                        .with(TabGridMessageCardViewProperties.DESCRIPTION_TEXT, DESCRIPTION_TEXT)
+                        .build();
+
+        mItemMCP = PropertyModelChangeProcessor.create(
+                mItemViewModel, mItemView, TabGridMessageCardViewBinder::bind);
+    }
+
+    private String getDescriptionText() {
+        return ((TextView) mItemView.findViewById(R.id.description)).getText().toString();
+    }
+
+    @Test
+    @UiThreadTest
+    @SmallTest
+    public void testInitialBinding() {
+        assertEquals(ACTION_TEXT,
+                ((TextView) mItemView.findViewById(R.id.action_button)).getText().toString());
+        assertEquals(DESCRIPTION_TEXT, getDescriptionText());
+    }
+
+    @Test
+    @UiThreadTest
+    @SmallTest
+    public void testBindingDescription_WithoutTemplate() {
+        mItemViewModel.set(TabGridMessageCardViewProperties.DESCRIPTION_TEXT, "test");
+        assertEquals("test", getDescriptionText());
+    }
+
+    @Test
+    @UiThreadTest
+    @SmallTest
+    public void testBindingDescription_WithTemplate() {
+        mItemViewModel.set(
+                TabGridMessageCardViewProperties.DESCRIPTION_TEXT_TEMPLATE, "%s template");
+        mItemViewModel.set(TabGridMessageCardViewProperties.DESCRIPTION_TEXT, "test");
+        assertEquals("test template", getDescriptionText());
+    }
+
+    @Override
+    public void tearDownTest() throws Exception {
+        mItemMCP.destroy();
+        super.tearDownTest();
+    }
+}
diff --git a/chrome/android/features/tab_ui/tab_management_java_sources.gni b/chrome/android/features/tab_ui/tab_management_java_sources.gni
index e63a27e..ed30730 100644
--- a/chrome/android/features/tab_ui/tab_management_java_sources.gni
+++ b/chrome/android/features/tab_ui/tab_management_java_sources.gni
@@ -25,6 +25,7 @@
 tab_management_test_java_sources = [
   "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/AssertsTest.java",
   "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParentTest.java",
+  "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridMessageCardViewBinderTest.java",
   "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridPanelViewBinderTest.java",
   "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinderTest.java",
   "//chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java",
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 7415213..0de8387 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -972,6 +972,8 @@
     "optimization_guide/optimization_guide_web_contents_observer.h",
     "optimization_guide/prediction/decision_tree_prediction_model.cc",
     "optimization_guide/prediction/decision_tree_prediction_model.h",
+    "optimization_guide/prediction/prediction_manager.cc",
+    "optimization_guide/prediction/prediction_manager.h",
     "optimization_guide/prediction/prediction_model.cc",
     "optimization_guide/prediction/prediction_model.h",
     "optimization_guide/prediction/prediction_model_fetcher.cc",
diff --git a/chrome/browser/android/autofill_assistant/assistant_collect_user_data_delegate.cc b/chrome/browser/android/autofill_assistant/assistant_collect_user_data_delegate.cc
index f0b98385..c1e0837f 100644
--- a/chrome/browser/android/autofill_assistant/assistant_collect_user_data_delegate.cc
+++ b/chrome/browser/android/autofill_assistant/assistant_collect_user_data_delegate.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/android/jni_string.h"
+#include "base/strings/utf_string_conversions.h"
 #include "chrome/android/features/autofill_assistant/jni_headers/AssistantCollectUserDataNativeDelegate_jni.h"
 #include "chrome/browser/android/autofill_assistant/ui_controller_android.h"
 #include "chrome/browser/autofill/android/personal_data_manager_android.h"
diff --git a/chrome/browser/android/document/document_web_contents_delegate.cc b/chrome/browser/android/document/document_web_contents_delegate.cc
index 3b75d30..915de7aa 100644
--- a/chrome/browser/android/document/document_web_contents_delegate.cc
+++ b/chrome/browser/android/document/document_web_contents_delegate.cc
@@ -41,21 +41,14 @@
   NOTREACHED();
 }
 
-bool DocumentWebContentsDelegate::ShouldCreateWebContents(
-    content::WebContents* web_contents,
-    content::RenderFrameHost* opener,
+bool DocumentWebContentsDelegate::IsWebContentsCreationOverridden(
     content::SiteInstance* source_site_instance,
-    int32_t route_id,
-    int32_t main_frame_route_id,
-    int32_t main_frame_widget_route_id,
     content::mojom::WindowContainerType window_container_type,
     const GURL& opener_url,
     const std::string& frame_name,
-    const GURL& target_url,
-    const std::string& partition_id,
-    content::SessionStorageNamespace* session_storage_namespace) {
+    const GURL& target_url) {
   NOTREACHED();
-  return false;
+  return true;
 }
 
 static jlong JNI_DocumentWebContentsDelegate_Initialize(
diff --git a/chrome/browser/android/document/document_web_contents_delegate.h b/chrome/browser/android/document/document_web_contents_delegate.h
index 2c3e345..e9b3d4ab9 100644
--- a/chrome/browser/android/document/document_web_contents_delegate.h
+++ b/chrome/browser/android/document/document_web_contents_delegate.h
@@ -36,19 +36,12 @@
                       bool user_gesture,
                       bool* was_blocked) override;
   void CloseContents(content::WebContents* source) override;
-  bool ShouldCreateWebContents(
-      content::WebContents* web_contents,
-      content::RenderFrameHost* opener,
+  bool IsWebContentsCreationOverridden(
       content::SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
       content::mojom::WindowContainerType window_container_type,
       const GURL& opener_url,
       const std::string& frame_name,
-      const GURL& target_url,
-      const std::string& partition_id,
-      content::SessionStorageNamespace* session_storage_namespace) override;
+      const GURL& target_url) override;
 };
 
 #endif  // CHROME_BROWSER_ANDROID_DOCUMENT_DOCUMENT_WEB_CONTENTS_DELEGATE_H_
diff --git a/chrome/browser/background/background_contents.cc b/chrome/browser/background/background_contents.cc
index 76359b0..a4d5fcd8 100644
--- a/chrome/browser/background/background_contents.cc
+++ b/chrome/browser/background/background_contents.cc
@@ -32,9 +32,7 @@
 BackgroundContents::BackgroundContents(
     scoped_refptr<SiteInstance> site_instance,
     content::RenderFrameHost* opener,
-    int32_t routing_id,
-    int32_t main_frame_routing_id,
-    int32_t main_frame_widget_routing_id,
+    bool is_new_browsing_instance,
     Delegate* delegate,
     const std::string& partition_id,
     content::SessionStorageNamespace* session_storage_namespace)
@@ -49,11 +47,12 @@
       opener ? opener->GetProcess()->GetID() : MSG_ROUTING_NONE;
   create_params.opener_render_frame_id =
       opener ? opener->GetRoutingID() : MSG_ROUTING_NONE;
-  create_params.routing_id = routing_id;
-  create_params.main_frame_routing_id = main_frame_routing_id;
-  create_params.main_frame_widget_routing_id = main_frame_widget_routing_id;
-  create_params.renderer_initiated_creation = routing_id != MSG_ROUTING_NONE;
   create_params.is_never_visible = true;
+
+  // This isn't semantically sensible, but it is what the old code implicitly
+  // did.
+  create_params.renderer_initiated_creation = !is_new_browsing_instance;
+
   if (session_storage_namespace) {
     content::SessionStorageNamespaceMap session_storage_namespace_map;
     session_storage_namespace_map.insert(
diff --git a/chrome/browser/background/background_contents.h b/chrome/browser/background/background_contents.h
index 552f9a25..c661e6e 100644
--- a/chrome/browser/background/background_contents.h
+++ b/chrome/browser/background/background_contents.h
@@ -62,9 +62,7 @@
   BackgroundContents(
       scoped_refptr<content::SiteInstance> site_instance,
       content::RenderFrameHost* opener,
-      int32_t routing_id,
-      int32_t main_frame_routing_id,
-      int32_t main_frame_widget_routing_id,
+      bool is_new_browsing_instance,
       Delegate* delegate,
       const std::string& partition_id,
       content::SessionStorageNamespace* session_storage_namespace);
diff --git a/chrome/browser/background/background_contents_service.cc b/chrome/browser/background/background_contents_service.cc
index eb11a0b..0689f2f 100644
--- a/chrome/browser/background/background_contents_service.cc
+++ b/chrome/browser/background/background_contents_service.cc
@@ -578,9 +578,8 @@
   DVLOG(1) << "Loading background content url: " << url;
 
   BackgroundContents* contents = CreateBackgroundContents(
-      SiteInstance::CreateForURL(profile_, url), nullptr, MSG_ROUTING_NONE,
-      MSG_ROUTING_NONE, MSG_ROUTING_NONE, frame_name, application_id,
-      std::string(), nullptr);
+      SiteInstance::CreateForURL(profile_, url), nullptr, true, frame_name,
+      application_id, std::string(), nullptr);
 
   contents->CreateRenderViewSoon(url);
 }
@@ -588,16 +587,13 @@
 BackgroundContents* BackgroundContentsService::CreateBackgroundContents(
     scoped_refptr<SiteInstance> site,
     content::RenderFrameHost* opener,
-    int32_t routing_id,
-    int32_t main_frame_route_id,
-    int32_t main_frame_widget_route_id,
+    bool is_new_browsing_instance,
     const std::string& frame_name,
     const std::string& application_id,
     const std::string& partition_id,
     content::SessionStorageNamespace* session_storage_namespace) {
   auto contents = std::make_unique<BackgroundContents>(
-      std::move(site), opener, routing_id, main_frame_route_id,
-      main_frame_widget_route_id, this, partition_id,
+      std::move(site), opener, is_new_browsing_instance, this, partition_id,
       session_storage_namespace);
   BackgroundContents* contents_ptr = contents.get();
   AddBackgroundContents(std::move(contents), application_id, frame_name);
diff --git a/chrome/browser/background/background_contents_service.h b/chrome/browser/background/background_contents_service.h
index bde2fc61..5fcfe86 100644
--- a/chrome/browser/background/background_contents_service.h
+++ b/chrome/browser/background/background_contents_service.h
@@ -117,15 +117,13 @@
   const std::string& GetParentApplicationId(BackgroundContents* contents) const;
 
   // Creates a new BackgroundContents using the passed |site| and
-  // the |route_id| and begins tracking the object internally so it can be
-  // shutdown if the parent application is uninstalled.
+  // begins tracking the object internally so it can be shutdown if the parent
+  // application is uninstalled.
   // Observers will receive a OnBackgroundContentsOpened call.
   BackgroundContents* CreateBackgroundContents(
       scoped_refptr<content::SiteInstance> site,
       content::RenderFrameHost* opener,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
+      bool is_new_browsing_instance,
       const std::string& frame_name,
       const std::string& application_id,
       const std::string& partition_id,
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 625d868..051fa09 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -550,6 +550,8 @@
     "arc/input_method_manager/input_connection_impl.h",
     "arc/instance_throttle/arc_active_window_throttle_observer.cc",
     "arc/instance_throttle/arc_active_window_throttle_observer.h",
+    "arc/instance_throttle/arc_app_launch_throttle_observer.cc",
+    "arc/instance_throttle/arc_app_launch_throttle_observer.h",
     "arc/instance_throttle/arc_boot_phase_throttle_observer.cc",
     "arc/instance_throttle/arc_boot_phase_throttle_observer.h",
     "arc/instance_throttle/arc_instance_throttle.cc",
@@ -2462,6 +2464,7 @@
     "arc/input_method_manager/test_input_method_manager_bridge.cc",
     "arc/input_method_manager/test_input_method_manager_bridge.h",
     "arc/instance_throttle/arc_active_window_throttle_observer_unittest.cc",
+    "arc/instance_throttle/arc_app_launch_throttle_observer_unittest.cc",
     "arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc",
     "arc/instance_throttle/arc_instance_throttle_unittest.cc",
     "arc/intent_helper/arc_external_protocol_dialog_unittest.cc",
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.cc b/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.cc
new file mode 100644
index 0000000..55713abe
--- /dev/null
+++ b/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.cc
@@ -0,0 +1,72 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.h"
+
+#include "base/location.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
+#include "base/time/time.h"
+
+namespace arc {
+
+namespace {
+
+constexpr base::TimeDelta kAppLaunchTimeout = base::TimeDelta::FromSeconds(20);
+
+}  // namespace
+
+ArcAppLaunchThrottleObserver::ArcAppLaunchThrottleObserver()
+    : ThrottleObserver(ThrottleObserver::PriorityLevel::CRITICAL,
+                       "ArcAppLaunchRequested") {}
+
+ArcAppLaunchThrottleObserver::~ArcAppLaunchThrottleObserver() = default;
+
+void ArcAppLaunchThrottleObserver::StartObserving(
+    content::BrowserContext* context,
+    const ObserverStateChangedCallback& callback) {
+  ThrottleObserver::StartObserving(context, callback);
+  auto* app_list_prefs = ArcAppListPrefs::Get(context);
+  if (app_list_prefs)  // for unit testing
+    app_list_prefs->AddObserver(this);
+  AddAppLaunchObserver(context, this);
+}
+
+void ArcAppLaunchThrottleObserver::StopObserving() {
+  RemoveAppLaunchObserver(context(), this);
+  auto* app_list_prefs = ArcAppListPrefs::Get(context());
+  if (app_list_prefs)  // for unit testing
+    app_list_prefs->RemoveObserver(this);
+  ThrottleObserver::StopObserving();
+}
+
+void ArcAppLaunchThrottleObserver::OnAppLaunchRequested(
+    const ArcAppListPrefs::AppInfo& app_info) {
+  SetActive(true);
+  current_requests_.insert(app_info.package_name);
+  base::PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(&ArcAppLaunchThrottleObserver::OnLaunchedOrRequestExpired,
+                     weak_ptr_factory_.GetWeakPtr(), app_info.package_name),
+      kAppLaunchTimeout);
+}
+
+void ArcAppLaunchThrottleObserver::OnTaskCreated(
+    int32_t task_id,
+    const std::string& package_name,
+    const std::string& activity,
+    const std::string& intent) {
+  OnLaunchedOrRequestExpired(package_name);
+}
+
+void ArcAppLaunchThrottleObserver::OnLaunchedOrRequestExpired(
+    const std::string& name) {
+  // This request has already expired or there are outstanding requests,
+  // do not deactivate the observer.
+  if (!current_requests_.erase(name) || current_requests_.size())
+    return;
+  SetActive(false);
+}
+
+}  // namespace arc
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.h b/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.h
new file mode 100644
index 0000000..39cd84b
--- /dev/null
+++ b/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.h
@@ -0,0 +1,58 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_ARC_INSTANCE_THROTTLE_ARC_APP_LAUNCH_THROTTLE_OBSERVER_H_
+#define CHROME_BROWSER_CHROMEOS_ARC_INSTANCE_THROTTLE_ARC_APP_LAUNCH_THROTTLE_OBSERVER_H_
+
+#include <set>
+#include <string>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "chrome/browser/chromeos/throttle_observer.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
+
+namespace content {
+class BrowserContext;
+}
+
+namespace arc {
+
+// This class observes ARC app launches and sets its state to active while an
+// app is being launched.
+class ArcAppLaunchThrottleObserver : public chromeos::ThrottleObserver,
+                                     public ArcAppListPrefs::Observer,
+                                     public AppLaunchObserver {
+ public:
+  ArcAppLaunchThrottleObserver();
+  ~ArcAppLaunchThrottleObserver() override;
+
+  // chromeos::ThrottleObserver:
+  void StartObserving(content::BrowserContext* context,
+                      const ObserverStateChangedCallback& callback) override;
+  void StopObserving() override;
+
+  // AppLaunchObserver:
+  void OnAppLaunchRequested(const ArcAppListPrefs::AppInfo& app_info) override;
+
+  // ArcAppListPrefs::Observer:
+  void OnTaskCreated(int32_t task_id,
+                     const std::string& package_name,
+                     const std::string& activity,
+                     const std::string& intent) override;
+
+ private:
+  void OnLaunchedOrRequestExpired(const std::string& name);
+
+  std::set<std::string> current_requests_;
+  // Must go last.
+  base::WeakPtrFactory<ArcAppLaunchThrottleObserver> weak_ptr_factory_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(ArcAppLaunchThrottleObserver);
+};
+
+}  // namespace arc
+
+#endif  // CHROME_BROWSER_CHROMEOS_ARC_INSTANCE_THROTTLE_ARC_APP_LAUNCH_THROTTLE_OBSERVER_H_
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer_unittest.cc b/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer_unittest.cc
new file mode 100644
index 0000000..5f4b793d
--- /dev/null
+++ b/chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer_unittest.cc
@@ -0,0 +1,87 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.h"
+
+#include <memory>
+#include <string>
+
+#include "base/macros.h"
+#include "base/test/task_environment.h"
+#include "base/time/time.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
+#include "content/public/test/browser_task_environment.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace arc {
+namespace {
+
+ArcAppListPrefs::AppInfo CreateAppInfoForPackage(
+    const std::string package_name) {
+  return ArcAppListPrefs::AppInfo(package_name, package_name, "", "", "",
+                                  base::Time(), base::Time(), true, true, true,
+                                  true, true, true, true);
+}
+
+class ArcAppLaunchThrottleObserverTest : public testing::Test {
+ public:
+  using testing::Test::Test;
+
+ protected:
+  ArcAppLaunchThrottleObserver* observer() { return &app_launch_observer_; }
+
+  content::BrowserTaskEnvironment* environment() { return &task_environment_; }
+
+ private:
+  content::BrowserTaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
+  ArcAppLaunchThrottleObserver app_launch_observer_;
+
+  DISALLOW_COPY_AND_ASSIGN(ArcAppLaunchThrottleObserverTest);
+};
+
+TEST_F(ArcAppLaunchThrottleObserverTest, TestConstructDestruct) {}
+
+TEST_F(ArcAppLaunchThrottleObserverTest, TestOnAppLaunchRequested) {
+  const ArcAppListPrefs::AppInfo app1 =
+      CreateAppInfoForPackage("com.android.app1");
+  const ArcAppListPrefs::AppInfo app2 =
+      CreateAppInfoForPackage("com.android.app2");
+  const ArcAppListPrefs::AppInfo app3 =
+      CreateAppInfoForPackage("com.android.app3");
+  EXPECT_FALSE(observer()->active());
+
+  // App1 launch requested, observer is active.
+  observer()->OnAppLaunchRequested(app1);
+  EXPECT_TRUE(observer()->active());
+
+  // App2 launch requested but finishes before App1, observer is still active.
+  observer()->OnAppLaunchRequested(app2);
+  observer()->OnTaskCreated(0, app2.package_name, "", "");
+  EXPECT_TRUE(observer()->active());
+
+  // App3 finishes launch but observer is not waiting for app3, so it is still
+  // active.
+  observer()->OnTaskCreated(0, app3.package_name, "", "");
+
+  // App1 finishes launch, observer is inactive.
+  observer()->OnTaskCreated(0, app1.package_name, "", "");
+}
+
+// Check that a launch request expires.
+TEST_F(ArcAppLaunchThrottleObserverTest, TestLaunchRequestExpires) {
+  const ArcAppListPrefs::AppInfo app =
+      CreateAppInfoForPackage("com.android.app");
+  EXPECT_FALSE(observer()->active());
+
+  observer()->OnAppLaunchRequested(app);
+  EXPECT_TRUE(observer()->active());
+
+  environment()->FastForwardUntilNoTasksRemain();
+
+  EXPECT_FALSE(observer()->active());
+}
+
+}  // namespace
+}  // namespace arc
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.cc b/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.cc
index 1488f96d..0441e5e3 100644
--- a/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.cc
+++ b/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle.cc
@@ -9,6 +9,7 @@
 #include "base/no_destructor.h"
 #include "chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h"
 #include "chrome/browser/chromeos/arc/instance_throttle/arc_active_window_throttle_observer.h"
+#include "chrome/browser/chromeos/arc/instance_throttle/arc_app_launch_throttle_observer.h"
 #include "chrome/browser/chromeos/arc/instance_throttle/arc_boot_phase_throttle_observer.h"
 #include "components/arc/arc_browser_context_keyed_service_factory_base.h"
 #include "components/arc/arc_util.h"
@@ -78,6 +79,7 @@
       delegate_(std::make_unique<DefaultDelegateImpl>()) {
   AddObserver(std::make_unique<ArcActiveWindowThrottleObserver>());
   AddObserver(std::make_unique<ArcBootPhaseThrottleObserver>());
+  AddObserver(std::make_unique<ArcAppLaunchThrottleObserver>());
   StartObservers();
 }
 
diff --git a/chrome/browser/chromeos/crostini/ansible/ansible_management_service.cc b/chrome/browser/chromeos/crostini/ansible/ansible_management_service.cc
index d735d040..d159d77 100644
--- a/chrome/browser/chromeos/crostini/ansible/ansible_management_service.cc
+++ b/chrome/browser/chromeos/crostini/ansible/ansible_management_service.cc
@@ -99,12 +99,11 @@
 }
 
 void AnsibleManagementService::OnInstallLinuxPackageProgress(
-    const std::string& vm_name,
-    const std::string& container_name,
+    const ContainerId& container_id,
     InstallLinuxPackageProgressStatus status,
     int progress_percent) {
-  DCHECK_EQ(vm_name, kCrostiniDefaultVmName);
-  DCHECK_EQ(container_name, kCrostiniDefaultContainerName);
+  DCHECK_EQ(container_id.first, kCrostiniDefaultVmName);
+  DCHECK_EQ(container_id.second, kCrostiniDefaultContainerName);
 
   switch (status) {
     case InstallLinuxPackageProgressStatus::SUCCEEDED:
@@ -129,8 +128,7 @@
 }
 
 void AnsibleManagementService::OnUninstallPackageProgress(
-    const std::string& vm_name,
-    const std::string& container_name,
+    const ContainerId& container_id,
     UninstallPackageProgressStatus status,
     int progress_percent) {
   NOTIMPLEMENTED();
diff --git a/chrome/browser/chromeos/crostini/ansible/ansible_management_service.h b/chrome/browser/chromeos/crostini/ansible/ansible_management_service.h
index 8077e7d..6d32c6b5 100644
--- a/chrome/browser/chromeos/crostini/ansible/ansible_management_service.h
+++ b/chrome/browser/chromeos/crostini/ansible/ansible_management_service.h
@@ -48,12 +48,10 @@
       base::OnceCallback<void(bool success)> callback);
 
   // LinuxPackageOperationProgressObserver:
-  void OnInstallLinuxPackageProgress(const std::string& vm_name,
-                                     const std::string& container_name,
+  void OnInstallLinuxPackageProgress(const ContainerId& container_id,
                                      InstallLinuxPackageProgressStatus status,
                                      int progress_percent) override;
-  void OnUninstallPackageProgress(const std::string& vm_name,
-                                  const std::string& container_name,
+  void OnUninstallPackageProgress(const ContainerId& container_id,
                                   UninstallPackageProgressStatus status,
                                   int progress_percent) override;
 
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.cc b/chrome/browser/chromeos/crostini/crostini_manager.cc
index 586e750..f371d3e 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager.cc
+++ b/chrome/browser/chromeos/crostini/crostini_manager.cc
@@ -2069,9 +2069,9 @@
       NOTREACHED();
   }
 
+  ContainerId container_id(signal.vm_name(), signal.container_name());
   for (auto& observer : linux_package_operation_progress_observers_) {
-    observer.OnInstallLinuxPackageProgress(signal.vm_name(),
-                                           signal.container_name(), status,
+    observer.OnInstallLinuxPackageProgress(container_id, status,
                                            signal.progress_percent());
   }
 }
@@ -2103,9 +2103,9 @@
       NOTREACHED();
   }
 
+  ContainerId container_id(signal.vm_name(), signal.container_name());
   for (auto& observer : linux_package_operation_progress_observers_) {
-    observer.OnUninstallPackageProgress(signal.vm_name(),
-                                        signal.container_name(), status,
+    observer.OnUninstallPackageProgress(container_id, status,
                                         signal.progress_percent());
   }
 }
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.h b/chrome/browser/chromeos/crostini/crostini_manager.h
index ad5381a..e0d7448 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager.h
+++ b/chrome/browser/chromeos/crostini/crostini_manager.h
@@ -39,15 +39,13 @@
   // |progress_percent| field is given as a percentage of the given step,
   // DOWNLOADING or INSTALLING.
   virtual void OnInstallLinuxPackageProgress(
-      const std::string& vm_name,
-      const std::string& container_name,
+      const ContainerId& container_id,
       InstallLinuxPackageProgressStatus status,
       int progress_percent) = 0;
 
   // A successfully started package uninstall will continually fire progress
   // events until it returns a status of SUCCEEDED or FAILED.
-  virtual void OnUninstallPackageProgress(const std::string& vm_name,
-                                          const std::string& container_name,
+  virtual void OnUninstallPackageProgress(const ContainerId& container_id,
                                           UninstallPackageProgressStatus status,
                                           int progress_percent) = 0;
 };
diff --git a/chrome/browser/chromeos/crostini/crostini_package_service.cc b/chrome/browser/chromeos/crostini/crostini_package_service.cc
index 1a7173aa..b7eb5b4f 100644
--- a/chrome/browser/chromeos/crostini/crostini_package_service.cc
+++ b/chrome/browser/chromeos/crostini/crostini_package_service.cc
@@ -249,8 +249,7 @@
 }
 
 void CrostiniPackageService::OnInstallLinuxPackageProgress(
-    const std::string& vm_name,
-    const std::string& container_name,
+    const ContainerId& container_id,
     InstallLinuxPackageProgressStatus status,
     int progress_percent) {
   // Linux package install has two phases, downloading and installing, which we
@@ -260,19 +259,16 @@
   if (status == InstallLinuxPackageProgressStatus::INSTALLING)
     display_progress += 50;  // Second phase
 
-  UpdatePackageOperationStatus(ContainerId(vm_name, container_name),
-                               InstallStatusToOperationStatus(status),
-                               display_progress);
+  UpdatePackageOperationStatus(
+      container_id, InstallStatusToOperationStatus(status), display_progress);
 }
 
 void CrostiniPackageService::OnUninstallPackageProgress(
-    const std::string& vm_name,
-    const std::string& container_name,
+    const ContainerId& container_id,
     UninstallPackageProgressStatus status,
     int progress_percent) {
-  UpdatePackageOperationStatus(ContainerId(vm_name, container_name),
-                               UninstallStatusToOperationStatus(status),
-                               progress_percent);
+  UpdatePackageOperationStatus(
+      container_id, UninstallStatusToOperationStatus(status), progress_percent);
 }
 
 void CrostiniPackageService::OnVmShutdown(const std::string& vm_name) {
diff --git a/chrome/browser/chromeos/crostini/crostini_package_service.h b/chrome/browser/chromeos/crostini/crostini_package_service.h
index ef76b98..e3f6f6c7 100644
--- a/chrome/browser/chromeos/crostini/crostini_package_service.h
+++ b/chrome/browser/chromeos/crostini/crostini_package_service.h
@@ -58,13 +58,11 @@
       CrostiniManager::GetLinuxPackageInfoCallback callback);
 
   // LinuxPackageOperationProgressObserver:
-  void OnInstallLinuxPackageProgress(const std::string& vm_name,
-                                     const std::string& container_name,
+  void OnInstallLinuxPackageProgress(const ContainerId& container_id,
                                      InstallLinuxPackageProgressStatus status,
                                      int progress_percent) override;
 
-  void OnUninstallPackageProgress(const std::string& vm_name,
-                                  const std::string& container_name,
+  void OnUninstallPackageProgress(const ContainerId& container_id,
                                   UninstallPackageProgressStatus status,
                                   int progress_percent) override;
 
diff --git a/chrome/browser/chromeos/crostini/crostini_util.cc b/chrome/browser/chromeos/crostini/crostini_util.cc
index 9ddae222..cbb5247 100644
--- a/chrome/browser/chromeos/crostini/crostini_util.cc
+++ b/chrome/browser/chromeos/crostini/crostini_util.cc
@@ -470,6 +470,9 @@
 std::string DefaultContainerUserNameForProfile(Profile* profile) {
   // Get rid of the @domain.name in the profile user name (an email address).
   std::string container_username = profile->GetProfileUserName();
+  if (container_username.empty()) {
+    return kCrostiniDefaultUsername;
+  }
   if (container_username.find('@') != std::string::npos) {
     // gaia::CanonicalizeEmail CHECKs its argument contains'@'.
     container_username = gaia::CanonicalizeEmail(container_username);
diff --git a/chrome/browser/chromeos/crostini/crostini_util.h b/chrome/browser/chromeos/crostini/crostini_util.h
index 872521c2..a3844dd5 100644
--- a/chrome/browser/chromeos/crostini/crostini_util.h
+++ b/chrome/browser/chromeos/crostini/crostini_util.h
@@ -164,6 +164,7 @@
 
 constexpr char kCrostiniDefaultVmName[] = "termina";
 constexpr char kCrostiniDefaultContainerName[] = "penguin";
+constexpr char kCrostiniDefaultUsername[] = "emperor";
 constexpr char kCrostiniCroshBuiltinAppId[] =
     "nkoccljplnhpfnfiajclkommnmllphnl";
 // In order to be compatible with sync folder id must match standard.
diff --git a/chrome/browser/chromeos/first_run/drive_first_run_controller.cc b/chrome/browser/chromeos/first_run/drive_first_run_controller.cc
index 5162378..cb30bba 100644
--- a/chrome/browser/chromeos/first_run/drive_first_run_controller.cc
+++ b/chrome/browser/chromeos/first_run/drive_first_run_controller.cc
@@ -120,14 +120,16 @@
                    const base::string16& error_description) override;
 
   // content::WebContentsDelegate overrides:
-  bool ShouldCreateWebContents(
-      content::WebContents* web_contents,
+  bool IsWebContentsCreationOverridden(
+      content::SiteInstance* source_site_instance,
+      content::mojom::WindowContainerType window_container_type,
+      const GURL& opener_url,
+      const std::string& frame_name,
+      const GURL& target_url) override;
+  content::WebContents* CreateCustomWebContents(
       content::RenderFrameHost* opener,
       content::SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
-      content::mojom::WindowContainerType window_container_type,
+      bool is_new_browsing_instance,
       const GURL& opener_url,
       const std::string& frame_name,
       const GURL& target_url,
@@ -230,54 +232,54 @@
   }
 }
 
-bool DriveWebContentsManager::ShouldCreateWebContents(
-    content::WebContents* web_contents,
-    content::RenderFrameHost* opener,
+bool DriveWebContentsManager::IsWebContentsCreationOverridden(
     content::SiteInstance* source_site_instance,
-    int32_t route_id,
-    int32_t main_frame_route_id,
-    int32_t main_frame_widget_route_id,
     content::mojom::WindowContainerType window_container_type,
     const GURL& opener_url,
     const std::string& frame_name,
-    const GURL& target_url,
-    const std::string& partition_id,
-    content::SessionStorageNamespace* session_storage_namespace) {
+    const GURL& target_url) {
   if (window_container_type == content::mojom::WindowContainerType::NORMAL)
-    return true;
+    return false;
 
   // Check that the target URL is for the Drive app.
   const extensions::Extension* extension =
       extensions::ExtensionRegistry::Get(profile_)
           ->enabled_extensions().GetAppByURL(target_url);
-  if (!extension || extension->id() != app_id_)
-    return true;
 
+  return extension && extension->id() == app_id_;
+}
+
+content::WebContents* DriveWebContentsManager::CreateCustomWebContents(
+    content::RenderFrameHost* opener,
+    content::SiteInstance* source_site_instance,
+    bool is_new_browsing_instance,
+    const GURL& opener_url,
+    const std::string& frame_name,
+    const GURL& target_url,
+    const std::string& partition_id,
+    content::SessionStorageNamespace* session_storage_namespace) {
   // The background contents creation is normally done in Browser, but
   // because we're using a detached WebContents, we need to do it ourselves.
   BackgroundContentsService* background_contents_service =
       BackgroundContentsServiceFactory::GetForProfile(profile_);
 
-  // Prevent redirection if background contents already exists.
-  if (background_contents_service->GetAppBackgroundContents(app_id_)) {
-    return false;
+  // Only redirect if background contents does not yet exists.
+  if (!background_contents_service->GetAppBackgroundContents(app_id_)) {
+    // drive_first_run/app/manifest.json sets allow_js_access to false and
+    // therefore we are creating a new SiteInstance (and thus a new renderer
+    // process) here, so we must use MSG_ROUTING_NONE and we cannot pass the
+    // opener (similarly to how allow_js_access:false is handled in
+    // Browser::MaybeCreateBackgroundContents).
+    BackgroundContents* contents =
+        background_contents_service->CreateBackgroundContents(
+            content::SiteInstance::Create(profile_), nullptr, true, frame_name,
+            app_id_, partition_id, session_storage_namespace);
+    contents->web_contents()->GetController().LoadURL(
+        target_url, content::Referrer(), ui::PAGE_TRANSITION_LINK,
+        std::string());
   }
-  // drive_first_run/app/manifest.json sets allow_js_access to false and
-  // therefore we are creating a new SiteInstance (and thus a new renderer
-  // process) here, so we must use MSG_ROUTING_NONE and we cannot pass the
-  // opener (similarily to how allow_js_access:false is handled in
-  // Browser::MaybeCreateBackgroundContents).
-  BackgroundContents* contents =
-      background_contents_service->CreateBackgroundContents(
-          content::SiteInstance::Create(profile_), nullptr, MSG_ROUTING_NONE,
-          MSG_ROUTING_NONE, MSG_ROUTING_NONE, frame_name, app_id_, partition_id,
-          session_storage_namespace);
 
-  contents->web_contents()->GetController().LoadURL(
-      target_url, content::Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
-
-  // Return false as we already created the WebContents here.
-  return false;
+  return nullptr;
 }
 
 void DriveWebContentsManager::OnBackgroundContentsOpened(
diff --git a/chrome/browser/chromeos/login/ui/login_web_dialog.cc b/chrome/browser/chromeos/login/ui/login_web_dialog.cc
index 406554f9..86bdbd0 100644
--- a/chrome/browser/chromeos/login/ui/login_web_dialog.cc
+++ b/chrome/browser/chromeos/login/ui/login_web_dialog.cc
@@ -164,8 +164,8 @@
   return (source && !chrome::FindBrowserWithWebContents(source));
 }
 
-bool LoginWebDialog::HandleShouldCreateWebContents() {
-  return false;
+bool LoginWebDialog::HandleShouldOverrideWebContentsCreation() {
+  return true;
 }
 
 std::vector<ui::Accelerator> LoginWebDialog::GetAccelerators() {
diff --git a/chrome/browser/chromeos/login/ui/login_web_dialog.h b/chrome/browser/chromeos/login/ui/login_web_dialog.h
index 571ba7c..245cb63 100644
--- a/chrome/browser/chromeos/login/ui/login_web_dialog.h
+++ b/chrome/browser/chromeos/login/ui/login_web_dialog.h
@@ -81,7 +81,7 @@
   bool HandleOpenURLFromTab(content::WebContents* source,
                             const content::OpenURLParams& params,
                             content::WebContents** out_new_contents) override;
-  bool HandleShouldCreateWebContents() override;
+  bool HandleShouldOverrideWebContentsCreation() override;
   std::vector<ui::Accelerator> GetAccelerators() override;
   bool AcceleratorPressed(const ui::Accelerator& accelerator) override;
 
diff --git a/chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc b/chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc
index d0b10f9d..45b8231 100644
--- a/chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc
+++ b/chrome/browser/chromeos/resource_reporter/resource_reporter_unittest.cc
@@ -10,12 +10,12 @@
 #include <string>
 #include <vector>
 
-#include "base/memory/fake_memory_pressure_monitor.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/system/sys_info.h"
 #include "base/timer/mock_timer.h"
+#include "base/util/memory_pressure/fake_memory_pressure_monitor.h"
 #include "chrome/browser/chromeos/resource_reporter/resource_reporter.h"
 #include "chrome/browser/task_manager/test_task_manager.h"
 #include "content/public/test/browser_task_environment.h"
@@ -140,12 +140,12 @@
     return ResourceReporter::GetInstance();
   }
 
-  base::test::FakeMemoryPressureMonitor* monitor() { return &monitor_; }
+  util::test::FakeMemoryPressureMonitor* monitor() { return &monitor_; }
 
  private:
   content::BrowserTaskEnvironment task_environment_;
 
-  base::test::FakeMemoryPressureMonitor monitor_;
+  util::test::FakeMemoryPressureMonitor monitor_;
 
   DummyTaskManager task_manager_;
 
diff --git a/chrome/browser/chromeos/smb_client/discovery/netbios_client.cc b/chrome/browser/chromeos/smb_client/discovery/netbios_client.cc
index 28b64b8..270ffa8 100644
--- a/chrome/browser/chromeos/smb_client/discovery/netbios_client.cc
+++ b/chrome/browser/chromeos/smb_client/discovery/netbios_client.cc
@@ -48,15 +48,12 @@
 }  // namespace
 
 NetBiosClient::NetBiosClient(network::mojom::NetworkContext* network_context)
-    : bind_address_(net::IPAddress::IPv4AllZeros(), 0 /* port */),
-      listener_binding_(this) {
+    : bind_address_(net::IPAddress::IPv4AllZeros(), 0 /* port */) {
   DCHECK(network_context);
 
-  network::mojom::UDPSocketListenerPtr rec_int_ptr;
-  listener_binding_.Bind(mojo::MakeRequest(&rec_int_ptr));
-
-  network_context->CreateUDPSocket(server_socket_.BindNewPipeAndPassReceiver(),
-                                   std::move(rec_int_ptr));
+  network_context->CreateUDPSocket(
+      server_socket_.BindNewPipeAndPassReceiver(),
+      listener_receiver_.BindNewPipeAndPassRemote());
 }
 
 NetBiosClient::~NetBiosClient() = default;
diff --git a/chrome/browser/chromeos/smb_client/discovery/netbios_client.h b/chrome/browser/chromeos/smb_client/discovery/netbios_client.h
index cfc66f6..314f62c 100644
--- a/chrome/browser/chromeos/smb_client/discovery/netbios_client.h
+++ b/chrome/browser/chromeos/smb_client/discovery/netbios_client.h
@@ -11,7 +11,7 @@
 
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/chromeos/smb_client/discovery/netbios_client_interface.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "services/network/public/mojom/udp_socket.mojom.h"
@@ -108,7 +108,7 @@
   NetBiosResponseCallback callback_;
   std::unique_ptr<FirewallHole> firewall_hole_;
   mojo::Remote<network::mojom::UDPSocket> server_socket_;
-  mojo::Binding<network::mojom::UDPSocketListener> listener_binding_;
+  mojo::Receiver<network::mojom::UDPSocketListener> listener_receiver_{this};
 
   DISALLOW_COPY_AND_ASSIGN(NetBiosClient);
 };
diff --git a/chrome/browser/dom_distiller/dom_distiller_service_factory.cc b/chrome/browser/dom_distiller/dom_distiller_service_factory.cc
index 970f8db..8ed88c0 100644
--- a/chrome/browser/dom_distiller/dom_distiller_service_factory.cc
+++ b/chrome/browser/dom_distiller/dom_distiller_service_factory.cc
@@ -15,8 +15,6 @@
 #include "components/dom_distiller/core/distiller.h"
 #include "components/dom_distiller/core/dom_distiller_store.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
-#include "components/leveldb_proto/public/proto_database.h"
-#include "components/leveldb_proto/public/proto_database_provider.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/storage_partition.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -64,16 +62,7 @@
   base::FilePath database_dir(
       context->GetPath().Append(FILE_PATH_LITERAL("Articles")));
 
-  leveldb_proto::ProtoDatabaseProvider* db_provider =
-      content::BrowserContext::GetDefaultStoragePartition(profile)
-          ->GetProtoDatabaseProvider();
-
-  auto db = db_provider->GetDB<ArticleEntry>(
-      leveldb_proto::ProtoDbType::DOM_DISTILLER_STORE, database_dir,
-      background_task_runner);
-
-  std::unique_ptr<DomDistillerStore> dom_distiller_store(
-      new DomDistillerStore(std::move(db)));
+  auto dom_distiller_store = std::make_unique<DomDistillerStore>();
 
   std::unique_ptr<DistillerPageFactory> distiller_page_factory(
       new DistillerPageWebContentsFactory(context));
diff --git a/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc b/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc
index 2e610d7..4e35444 100644
--- a/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc
+++ b/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc
@@ -30,13 +30,11 @@
 #include "components/dom_distiller/core/dom_distiller_service.h"
 #include "components/dom_distiller/core/dom_distiller_store.h"
 #include "components/dom_distiller/core/dom_distiller_switches.h"
-#include "components/dom_distiller/core/dom_distiller_test_util.h"
 #include "components/dom_distiller/core/fake_distiller.h"
 #include "components/dom_distiller/core/fake_distiller_page.h"
 #include "components/dom_distiller/core/task_tracker.h"
 #include "components/dom_distiller/core/url_constants.h"
 #include "components/dom_distiller/core/url_utils.h"
-#include "components/leveldb_proto/testing/fake_db.h"
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/url_data_source.h"
@@ -51,12 +49,10 @@
 
 namespace dom_distiller {
 
-using leveldb_proto::test::FakeDB;
 using test::FakeDistiller;
 using test::MockDistillerFactory;
 using test::MockDistillerPage;
 using test::MockDistillerPageFactory;
-using test::util::CreateStoreWithFakeDB;
 using testing::HasSubstr;
 using testing::Not;
 
@@ -88,10 +84,6 @@
     "window.domAutomationController.send("
     "typeof distiller == 'object')";
 
-void AddEntry(const ArticleEntry& e, FakeDB<ArticleEntry>::EntryMap* map) {
-  (*map)[e.entry_id()] = e;
-}
-
 ArticleEntry CreateEntry(const std::string& entry_id,
                          const std::string& page_url) {
   ArticleEntry entry;
@@ -124,30 +116,22 @@
     if (!DistillerJavaScriptWorldIdIsSet()) {
       SetDistillerJavaScriptWorldId(content::ISOLATED_WORLD_ID_CONTENT_END);
     }
-    database_model_ = new FakeDB<ArticleEntry>::EntryMap;
   }
 
-  void TearDownOnMainThread() override { delete database_model_; }
-
   void SetUpCommandLine(base::CommandLine* command_line) override {
     command_line->AppendSwitch(switches::kEnableDomDistiller);
   }
 
-  static std::unique_ptr<KeyedService> Build(content::BrowserContext* context) {
-    FakeDB<ArticleEntry>* fake_db = new FakeDB<ArticleEntry>(database_model_);
-    distiller_factory_ = new MockDistillerFactory();
-    MockDistillerPageFactory* distiller_page_factory_ =
-        new MockDistillerPageFactory();
-    std::unique_ptr<DomDistillerContextKeyedService> service(
-        new DomDistillerContextKeyedService(
-            std::unique_ptr<DomDistillerStoreInterface>(CreateStoreWithFakeDB(
-                fake_db, FakeDB<ArticleEntry>::EntryMap())),
-            std::unique_ptr<DistillerFactory>(distiller_factory_),
-            std::unique_ptr<DistillerPageFactory>(distiller_page_factory_),
-            std::unique_ptr<DistilledPagePrefs>(new DistilledPagePrefs(
-                Profile::FromBrowserContext(context)->GetPrefs()))));
-    fake_db->InitStatusCallback(leveldb_proto::Enums::InitStatus::kOK);
-    fake_db->LoadCallback(true);
+  std::unique_ptr<KeyedService> Build(content::BrowserContext* context) {
+    auto distiller_factory = std::make_unique<MockDistillerFactory>();
+    distiller_factory_ = distiller_factory.get();
+    auto distiller_page_factory = std::make_unique<MockDistillerPageFactory>();
+    auto* distiller_page_factory_raw = distiller_page_factory.get();
+    auto service = std::make_unique<DomDistillerContextKeyedService>(
+        std::make_unique<DomDistillerStore>(store_model_),
+        std::move(distiller_factory), std::move(distiller_page_factory),
+        std::make_unique<DistilledPagePrefs>(
+            Profile::FromBrowserContext(context)->GetPrefs()));
     if (expect_distillation_) {
       // There will only be destillation of an article if the database contains
       // the article.
@@ -157,7 +141,7 @@
     }
     if (expect_distiller_page_) {
       MockDistillerPage* distiller_page = new MockDistillerPage();
-      EXPECT_CALL(*distiller_page_factory_, CreateDistillerPageImpl())
+      EXPECT_CALL(*distiller_page_factory_raw, CreateDistillerPageImpl())
           .WillOnce(testing::Return(distiller_page));
     }
     return std::move(service);
@@ -167,19 +151,13 @@
                                const std::string& expected_mime_type);
   void ViewSingleDistilledPageAndExpectErrorPage(const GURL& url);
   void PrefTest(bool is_error_page);
-  // Database entries.
-  static FakeDB<ArticleEntry>::EntryMap* database_model_;
-  static bool expect_distillation_;
-  static bool expect_distiller_page_;
-  static MockDistillerFactory* distiller_factory_;
-};
 
-FakeDB<ArticleEntry>::EntryMap*
-    DomDistillerViewerSourceBrowserTest::database_model_;
-bool DomDistillerViewerSourceBrowserTest::expect_distillation_ = false;
-bool DomDistillerViewerSourceBrowserTest::expect_distiller_page_ = false;
-MockDistillerFactory* DomDistillerViewerSourceBrowserTest::distiller_factory_ =
-    NULL;
+  // Database entries.
+  std::vector<ArticleEntry> store_model_;
+  bool expect_distillation_ = false;
+  bool expect_distiller_page_ = false;
+  MockDistillerFactory* distiller_factory_ = nullptr;
+};
 
 // The DomDistillerViewerSource renders untrusted content, so ensure no bindings
 // are enabled when the article exists in the database.
@@ -187,7 +165,7 @@
                        NoWebUIBindingsArticleExists) {
   // Ensure there is one item in the database, which will trigger distillation.
   const ArticleEntry entry = CreateEntry("DISTILLED", "http://example.com/1");
-  AddEntry(entry, database_model_);
+  store_model_.push_back(entry);
   expect_distillation_ = true;
   expect_distiller_page_ = true;
   const GURL url = url_utils::GetDistillerViewUrlFromEntryId(
@@ -225,8 +203,10 @@
     const std::string& expected_mime_type) {
   // Ensure the correct factory is used for the DomDistillerService.
   dom_distiller::DomDistillerServiceFactory::GetInstance()
-      ->SetTestingFactoryAndUse(browser()->profile(),
-                                base::BindRepeating(&Build));
+      ->SetTestingFactoryAndUse(
+          browser()->profile(),
+          base::BindRepeating(&DomDistillerViewerSourceBrowserTest::Build,
+                              base::Unretained(this)));
 
   // Navigate to a URL which the source should respond to.
   ui_test_utils::NavigateToURL(browser(), url);
@@ -321,8 +301,10 @@
 
 IN_PROC_BROWSER_TEST_F(DomDistillerViewerSourceBrowserTest, EarlyTemplateLoad) {
   dom_distiller::DomDistillerServiceFactory::GetInstance()
-      ->SetTestingFactoryAndUse(browser()->profile(),
-                                base::BindRepeating(&Build));
+      ->SetTestingFactoryAndUse(
+          browser()->profile(),
+          base::BindRepeating(&DomDistillerViewerSourceBrowserTest::Build,
+                              base::Unretained(this)));
 
   scoped_refptr<content::MessageLoopRunner> distillation_done_runner =
       new content::MessageLoopRunner;
@@ -439,8 +421,10 @@
   expect_distillation_ = false;
   expect_distiller_page_ = true;
   dom_distiller::DomDistillerServiceFactory::GetInstance()
-      ->SetTestingFactoryAndUse(browser()->profile(),
-                                base::BindRepeating(&Build));
+      ->SetTestingFactoryAndUse(
+          browser()->profile(),
+          base::BindRepeating(&DomDistillerViewerSourceBrowserTest::Build,
+                              base::Unretained(this)));
 
   scoped_refptr<content::MessageLoopRunner> distillation_done_runner =
       new content::MessageLoopRunner;
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
index 8277212..b18d3db 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -94,11 +94,6 @@
 #include "chrome/browser/ui/browser_finder.h"
 #endif
 
-#if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/drive/download_handler.h"
-#include "chrome/browser/chromeos/drive/file_system_util.h"
-#endif
-
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 #include "chrome/browser/extensions/api/downloads/downloads_api.h"
 #include "chrome/browser/extensions/crx_installer.h"
@@ -161,24 +156,10 @@
 // Returns a path in the form that that is expected by platform_util::OpenItem /
 // platform_util::ShowItemInFolder / DownloadTargetDeterminer.
 //
-// DownloadItems corresponding to Drive downloads use a temporary file as the
-// target path. The paths returned by DownloadItem::GetFullPath() /
-// GetTargetFilePath() refer to this temporary file. This function looks up the
-// corresponding path in Drive for these downloads.
-//
 // How the platform path is determined is based on PlatformDownloadPathType.
 base::FilePath GetPlatformDownloadPath(Profile* profile,
                                        const DownloadItem* download,
                                        PlatformDownloadPathType path_type) {
-#if defined(OS_CHROMEOS)
-  // Drive downloads always return the target path for all types.
-  drive::DownloadHandler* drive_download_handler =
-      drive::DownloadHandler::GetForProfile(profile);
-  if (drive_download_handler &&
-      drive_download_handler->IsDriveDownload(download))
-    return drive_download_handler->GetTargetPath(download);
-#endif
-
   if (path_type == PLATFORM_TARGET_PATH)
     return download->GetTargetFilePath();
   return download->GetFullPath();
@@ -624,15 +605,10 @@
 void ChromeDownloadManagerDelegate::GetSaveDir(
     content::BrowserContext* browser_context,
     base::FilePath* website_save_dir,
-    base::FilePath* download_save_dir,
-    bool* skip_dir_check) {
+    base::FilePath* download_save_dir) {
   *website_save_dir = download_prefs_->SaveFilePath();
   DCHECK(!website_save_dir->empty());
   *download_save_dir = download_prefs_->DownloadPath();
-  *skip_dir_check = false;
-#if defined(OS_CHROMEOS)
-  *skip_dir_check = drive::util::IsUnderDriveMountPoint(*website_save_dir);
-#endif
 }
 
 void ChromeDownloadManagerDelegate::ChooseSavePath(
@@ -775,16 +751,6 @@
 void ChromeDownloadManagerDelegate::CheckForFileExistence(
     DownloadItem* download,
     content::CheckForFileExistenceCallback callback) {
-#if defined(OS_CHROMEOS)
-  drive::DownloadHandler* drive_download_handler =
-      drive::DownloadHandler::GetForProfile(profile_);
-  if (drive_download_handler &&
-      drive_download_handler->IsDriveDownload(download)) {
-    drive_download_handler->CheckForFileExistence(download,
-                                                  std::move(callback));
-    return;
-  }
-#endif
   base::PostTaskAndReplyWithResult(
       disk_access_task_runner_.get(), FROM_HERE,
       base::BindOnce(&base::PathExists, download->GetTargetFilePath()),
@@ -850,12 +816,7 @@
     const DownloadTargetDeterminerDelegate::ReservedPathCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(!virtual_path.empty());
-#if defined(OS_CHROMEOS)
-  if (drive::util::IsUnderDriveMountPoint(virtual_path)) {
-    callback.Run(PathValidationResult::SUCCESS, virtual_path);
-    return;
-  }
-#endif
+
   base::FilePath document_dir;
   base::PathService::Get(chrome::DIR_USER_DOCUMENTS, &document_dir);
   DownloadPathReservationTracker::GetReservedPath(
@@ -1095,15 +1056,6 @@
     const base::FilePath& virtual_path,
     const DownloadTargetDeterminerDelegate::LocalPathCallback& callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-#if defined(OS_CHROMEOS)
-  drive::DownloadHandler* drive_download_handler =
-      drive::DownloadHandler::GetForProfile(profile_);
-  if (drive_download_handler) {
-    drive_download_handler->SubstituteDriveDownloadPath(
-        virtual_path, download, callback);
-    return;
-  }
-#endif
   callback.Run(virtual_path);
 }
 
diff --git a/chrome/browser/download/chrome_download_manager_delegate.h b/chrome/browser/download/chrome_download_manager_delegate.h
index b3fd28d..23eabf48 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.h
+++ b/chrome/browser/download/chrome_download_manager_delegate.h
@@ -101,8 +101,7 @@
       content::WebContents* web_contents) override;
   void GetSaveDir(content::BrowserContext* browser_context,
                   base::FilePath* website_save_dir,
-                  base::FilePath* download_save_dir,
-                  bool* skip_dir_check) override;
+                  base::FilePath* download_save_dir) override;
   void ChooseSavePath(
       content::WebContents* web_contents,
       const base::FilePath& suggested_path,
diff --git a/chrome/browser/download/drag_download_item_aura.cc b/chrome/browser/download/drag_download_item_aura.cc
index d88c068..8b26fda 100644
--- a/chrome/browser/download/drag_download_item_aura.cc
+++ b/chrome/browser/download/drag_download_item_aura.cc
@@ -25,7 +25,6 @@
 #include "url/gurl.h"
 
 #if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/drive/download_handler.h"
 #include "content/public/browser/download_item_utils.h"
 #endif
 
@@ -48,16 +47,6 @@
       *views::Widget::GetTopLevelWidgetForNativeView(view), data.get());
 
   base::FilePath full_path = download->GetTargetFilePath();
-#if defined(OS_CHROMEOS)
-  // Overwrite |full_path| with drive cache file path when appropriate.
-  Profile* profile = Profile::FromBrowserContext(
-      content::DownloadItemUtils::GetBrowserContext(download));
-  drive::DownloadHandler* drive_download_handler =
-      drive::DownloadHandler::GetForProfile(profile);
-  if (drive_download_handler &&
-      drive_download_handler->IsDriveDownload(download))
-    full_path = drive_download_handler->GetCacheFilePath(download);
-#endif
   std::vector<ui::FileInfo> file_infos;
   file_infos.push_back(
       ui::FileInfo(full_path, download->GetFileNameToReportUser()));
diff --git a/chrome/browser/download/save_package_file_picker.cc b/chrome/browser/download/save_package_file_picker.cc
index 3ece211..7a2612f8 100644
--- a/chrome/browser/download/save_package_file_picker.cc
+++ b/chrome/browser/download/save_package_file_picker.cc
@@ -32,11 +32,6 @@
 #include "content/public/browser/web_contents.h"
 #include "ui/base/l10n/l10n_util.h"
 
-#if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/drive/download_handler.h"
-#include "chrome/browser/chromeos/drive/file_system_util.h"
-#endif
-
 using content::RenderProcessHost;
 using content::SavePageType;
 using content::WebContents;
@@ -51,29 +46,6 @@
   ChromeDownloadManagerDelegate::DisableSafeBrowsing(download);
 }
 
-#if defined(OS_CHROMEOS)
-void OnSavePackageDownloadCreatedChromeOS(Profile* profile,
-                                          const base::FilePath& drive_path,
-                                          download::DownloadItem* download) {
-  drive::DownloadHandler::GetForProfile(profile)->SetDownloadParams(
-      drive_path, download);
-  OnSavePackageDownloadCreated(download);
-}
-
-// Trampoline callback between SubstituteDriveDownloadPath() and |callback|.
-void ContinueSettingUpDriveDownload(
-    const content::SavePackagePathPickedCallback& callback,
-    content::SavePageType save_type,
-    Profile* profile,
-    const base::FilePath& drive_path,
-    const base::FilePath& drive_tmp_download_path) {
-  if (drive_tmp_download_path.empty())  // Substitution failed.
-    return;
-  callback.Run(drive_tmp_download_path, save_type, base::Bind(
-      &OnSavePackageDownloadCreatedChromeOS, profile, drive_path));
-}
-#endif
-
 // Adds "Webpage, HTML Only" type to FileTypeInfo.
 void AddHtmlOnlyFileTypeInfo(
     ui::SelectFileDialog::FileTypeInfo* file_type_info,
@@ -291,27 +263,6 @@
 
   download_prefs_->SetSaveFilePath(path_copy.DirName());
 
-#if defined(OS_CHROMEOS)
-  if (drive::util::IsUnderDriveMountPoint(path_copy)) {
-    // Here's a map to the callback chain:
-    // SubstituteDriveDownloadPath ->
-    //   ContinueSettingUpDriveDownload ->
-    //     callback_ = SavePackage::OnPathPicked ->
-    //       download_created_callback = OnSavePackageDownloadCreatedChromeOS
-    Profile* profile = Profile::FromBrowserContext(
-        process->GetBrowserContext());
-    drive::DownloadHandler* drive_download_handler =
-        drive::DownloadHandler::GetForProfile(profile);
-    drive_download_handler->SubstituteDriveDownloadPath(
-        path_copy, NULL, base::Bind(&ContinueSettingUpDriveDownload,
-                                    callback_,
-                                    save_type,
-                                    profile,
-                                    path_copy));
-    return;
-  }
-#endif
-
   callback_.Run(path_copy, save_type,
                 base::Bind(&OnSavePackageDownloadCreated));
 }
diff --git a/chrome/browser/extensions/api/socket/udp_socket_unittest.cc b/chrome/browser/extensions/api/socket/udp_socket_unittest.cc
index 6a81aa8..e25c6ddb 100644
--- a/chrome/browser/extensions/api/socket/udp_socket_unittest.cc
+++ b/chrome/browser/extensions/api/socket/udp_socket_unittest.cc
@@ -19,6 +19,7 @@
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "content/public/browser/storage_partition.h"
 #include "extensions/browser/api/socket/udp_socket.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "net/base/io_buffer.h"
 #include "net/base/ip_address.h"
@@ -39,13 +40,14 @@
         content::BrowserContext::GetDefaultStoragePartition(profile())
             ->GetNetworkContext();
     mojo::PendingRemote<network::mojom::UDPSocket> socket;
-    network::mojom::UDPSocketListenerPtr listener_ptr;
-    network::mojom::UDPSocketListenerRequest listener_request =
-        mojo::MakeRequest(&listener_ptr);
+    mojo::PendingRemote<network::mojom::UDPSocketListener> listener_remote;
+    mojo::PendingReceiver<network::mojom::UDPSocketListener> listener_receiver =
+        listener_remote.InitWithNewPipeAndPassReceiver();
     network_context->CreateUDPSocket(socket.InitWithNewPipeAndPassReceiver(),
-                                     std::move(listener_ptr));
-    return std::make_unique<UDPSocket>(
-        std::move(socket), std::move(listener_request), "abcdefghijklmnopqrst");
+                                     std::move(listener_remote));
+    return std::make_unique<UDPSocket>(std::move(socket),
+                                       std::move(listener_receiver),
+                                       "abcdefghijklmnopqrst");
   }
 };
 
diff --git a/chrome/browser/media/offscreen_tab.cc b/chrome/browser/media/offscreen_tab.cc
index dd0e28e9..ea8024c 100644
--- a/chrome/browser/media/offscreen_tab.cc
+++ b/chrome/browser/media/offscreen_tab.cc
@@ -280,24 +280,16 @@
   return false;
 }
 
-bool OffscreenTab::ShouldCreateWebContents(
-    content::WebContents* web_contents,
-    content::RenderFrameHost* opener,
+bool OffscreenTab::IsWebContentsCreationOverridden(
     content::SiteInstance* source_site_instance,
-    int32_t route_id,
-    int32_t main_frame_route_id,
-    int32_t main_frame_widget_route_id,
     content::mojom::WindowContainerType window_container_type,
     const GURL& opener_url,
     const std::string& frame_name,
-    const GURL& target_url,
-    const std::string& partition_id,
-    content::SessionStorageNamespace* session_storage_namespace) {
-  DCHECK_EQ(offscreen_tab_web_contents_.get(), web_contents);
+    const GURL& target_url) {
   // Disallow creating separate WebContentses.  The WebContents implementation
   // uses this to spawn new windows/tabs, which is also not allowed for
   // offscreen tabs.
-  return false;
+  return true;
 }
 
 bool OffscreenTab::EmbedsFullscreenWidget() {
diff --git a/chrome/browser/media/offscreen_tab.h b/chrome/browser/media/offscreen_tab.h
index 77991a3..e3d8a35 100644
--- a/chrome/browser/media/offscreen_tab.h
+++ b/chrome/browser/media/offscreen_tab.h
@@ -101,19 +101,12 @@
   bool CanDragEnter(content::WebContents* source,
                     const content::DropData& data,
                     blink::WebDragOperationsMask operations_allowed) final;
-  bool ShouldCreateWebContents(
-      content::WebContents* web_contents,
-      content::RenderFrameHost* opener,
+  bool IsWebContentsCreationOverridden(
       content::SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
       content::mojom::WindowContainerType window_container_type,
       const GURL& opener_url,
       const std::string& frame_name,
-      const GURL& target_url,
-      const std::string& partition_id,
-      content::SessionStorageNamespace* session_storage_namespace) final;
+      const GURL& target_url) final;
   bool EmbedsFullscreenWidget() final;
   void EnterFullscreenModeForTab(
       content::WebContents* contents,
diff --git a/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.cc b/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.cc
index 21f0fac7..2594366 100644
--- a/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.cc
+++ b/chrome/browser/media/router/providers/openscreen/network_service_async_packet_sender.cc
@@ -6,16 +6,15 @@
 
 #include <utility>
 
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "net/base/completion_once_callback.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 
-#include "mojo/public/cpp/bindings/interface_request.h"
-
 namespace media_router {
 NetworkServiceAsyncPacketSender::NetworkServiceAsyncPacketSender(
     network::mojom::NetworkContext* network_context) {
   network_context->CreateUDPSocket(socket_.BindNewPipeAndPassReceiver(),
-                                   nullptr);
+                                   mojo::NullRemote());
 }
 
 NetworkServiceAsyncPacketSender::NetworkServiceAsyncPacketSender(
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc
index fd85cbb..59281c0 100644
--- a/chrome/browser/metrics/chrome_metrics_service_client.cc
+++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -557,7 +557,7 @@
 }
 
 base::TimeDelta ChromeMetricsServiceClient::GetStandardUploadInterval() {
-  return metrics::GetUploadInterval();
+  return metrics::GetUploadInterval(metrics::ShouldUseCellularUploadInterval());
 }
 
 void ChromeMetricsServiceClient::OnPluginLoadingError(
@@ -999,7 +999,7 @@
 }
 
 bool ChromeMetricsServiceClient::IsUMACellularUploadLogicEnabled() {
-  return metrics::IsCellularLogicEnabled();
+  return metrics::ShouldUseCellularUploadInterval();
 }
 
 void ChromeMetricsServiceClient::OnHistoryDeleted() {
diff --git a/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc b/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
index b43fa8e..49e35c1 100644
--- a/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
+++ b/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
@@ -102,12 +102,16 @@
     case optimization_guide::OptimizationTargetDecision::kPageLoadMatches:
       return GetOptimizationGuideDecisionFromOptimizationTypeDecision(
           optimization_type_decision);
+    case optimization_guide::OptimizationTargetDecision::
+        kModelNotAvailableOnClient:
+      return optimization_guide::OptimizationGuideDecision::kFalse;
     default:
       return optimization_guide::OptimizationGuideDecision::kUnknown;
   }
   static_assert(
       optimization_guide::OptimizationTargetDecision::kMaxValue ==
-          optimization_guide::OptimizationTargetDecision::kPageLoadMatches,
+          optimization_guide::OptimizationTargetDecision::
+              kModelNotAvailableOnClient,
       "This function should be updated when a new OptimizationTargetDecision "
       "is added");
 }
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager.cc b/chrome/browser/optimization_guide/prediction/prediction_manager.cc
new file mode 100644
index 0000000..57a9690
--- /dev/null
+++ b/chrome/browser/optimization_guide/prediction/prediction_manager.cc
@@ -0,0 +1,199 @@
+// 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/optimization_guide/prediction/prediction_manager.h"
+
+#include <memory>
+#include <vector>
+
+#include "base/containers/flat_map.h"
+#include "base/containers/flat_set.h"
+#include "base/metrics/histogram_macros.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/engagement/site_engagement_service.h"
+#include "chrome/browser/optimization_guide/optimization_guide_session_statistic.h"
+#include "chrome/browser/optimization_guide/prediction/prediction_model.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/optimization_guide/optimization_guide_decider.h"
+#include "components/optimization_guide/optimization_guide_enums.h"
+#include "content/public/browser/navigation_handle.h"
+
+namespace optimization_guide {
+
+PredictionManager::PredictionManager() : session_fcp_() {
+  g_browser_process->network_quality_tracker()
+      ->AddEffectiveConnectionTypeObserver(this);
+}
+
+PredictionManager::~PredictionManager() {
+  g_browser_process->network_quality_tracker()
+      ->RemoveEffectiveConnectionTypeObserver(this);
+}
+
+void PredictionManager::UpdateFCPSessionStatistics(base::TimeDelta fcp) {
+  previous_load_fcp_ms_ = static_cast<float>(fcp.InMilliseconds());
+  session_fcp_.AddSample(*previous_load_fcp_ms_);
+}
+
+void PredictionManager::RegisterOptimizationTargets(
+    const std::vector<proto::OptimizationTarget>& optimization_targets) {
+  SEQUENCE_CHECKER(sequence_checker_);
+
+  for (const auto& optimization_target : optimization_targets) {
+    if (optimization_target == proto::OPTIMIZATION_TARGET_UNKNOWN)
+      continue;
+    if (registered_optimization_targets_.find(optimization_target) !=
+        registered_optimization_targets_.end()) {
+      continue;
+    }
+    registered_optimization_targets_.insert(optimization_target);
+  }
+  // TODO(crbug/1001194): If the HintCacheStore is available/ready, ask it to
+  // start loading the registered models.
+}
+
+base::Optional<float> PredictionManager::GetValueForClientFeature(
+    const std::string& model_feature,
+    content::NavigationHandle* navigation_handle) const {
+  SEQUENCE_CHECKER(sequence_checker_);
+
+  proto::ClientModelFeature client_model_feature;
+  if (!proto::ClientModelFeature_Parse(model_feature, &client_model_feature))
+    return base::nullopt;
+
+  switch (client_model_feature) {
+    case proto::CLIENT_MODEL_FEATURE_UNKNOWN: {
+      return base::nullopt;
+    }
+    case proto::CLIENT_MODEL_FEATURE_EFFECTIVE_CONNECTION_TYPE: {
+      return static_cast<float>(current_effective_connection_type_);
+    }
+    case proto::CLIENT_MODEL_FEATURE_PAGE_TRANSITION: {
+      return static_cast<float>(navigation_handle->GetPageTransition());
+    }
+    case proto::CLIENT_MODEL_FEATURE_SITE_ENGAGEMENT_SCORE: {
+      Profile* profile = Profile::FromBrowserContext(
+          navigation_handle->GetWebContents()->GetBrowserContext());
+      SiteEngagementService* engagement_service =
+          SiteEngagementService::Get(profile);
+      // Precision loss is acceptable/expected for prediction models.
+      return static_cast<float>(
+          engagement_service->GetScore(navigation_handle->GetURL()));
+    }
+    case proto::CLIENT_MODEL_FEATURE_SAME_ORIGIN_NAVIGATION: {
+      return static_cast<float>(url::IsSameOriginWith(
+          navigation_handle->GetURL(), navigation_handle->GetPreviousURL()));
+    }
+    case proto::CLIENT_MODEL_FEATURE_FIRST_CONTENTFUL_PAINT_SESSION_MEAN: {
+      return session_fcp_.GetMean();
+    }
+    case proto::
+        CLIENT_MODEL_FEATURE_FIRST_CONTENTFUL_PAINT_SESSION_STANDARD_DEVIATION: {
+      return session_fcp_.GetStdDev();
+    }
+    case proto::
+        CLIENT_MODEL_FEATURE_FIRST_CONTENTFUL_PAINT_PREVIOUS_PAGE_LOAD: {
+      return previous_load_fcp_ms_.value_or(0.0);
+    }
+    default: {
+      return base::nullopt;
+    }
+  }
+}
+
+base::flat_map<std::string, float> PredictionManager::BuildFeatureMap(
+    content::NavigationHandle* navigation_handle,
+    const base::flat_set<std::string>& model_features) const {
+  SEQUENCE_CHECKER(sequence_checker_);
+  base::flat_map<std::string, float> feature_map;
+  if (model_features.size() == 0)
+    return feature_map;
+
+  const base::flat_map<std::string, float>* host_model_features = nullptr;
+
+  std::string host = navigation_handle->GetURL().host();
+  auto it = host_model_features_map_.find(host);
+  if (it != host_model_features_map_.end())
+    host_model_features = &(it->second);
+
+  UMA_HISTOGRAM_BOOLEAN(
+      "OptimizationGuide.PredictionManager.HasHostModelFeaturesForHost",
+      host_model_features != nullptr);
+
+  // If the feature is not implemented by the client, it is assumed that it is a
+  // host model feature we have in the map. If it is not in either, a default is
+  // created for it. This ensures that the prediction model will have values for
+  // every feature that it requires to be evaluated.
+  for (const auto& model_feature : model_features) {
+    base::Optional<float> value =
+        GetValueForClientFeature(model_feature, navigation_handle);
+    if (value) {
+      feature_map[model_feature] = *value;
+      continue;
+    }
+    if (!host_model_features || !host_model_features->contains(model_feature)) {
+      feature_map[model_feature] = 0.0;
+      continue;
+    }
+    feature_map[model_feature] =
+        host_model_features->find(model_feature)->second;
+  }
+  return feature_map;
+}
+
+OptimizationTargetDecision PredictionManager::ShouldTargetNavigation(
+    content::NavigationHandle* navigation_handle,
+    proto::OptimizationTarget optimization_target) const {
+  SEQUENCE_CHECKER(sequence_checker_);
+  DCHECK(navigation_handle->GetURL().SchemeIsHTTPOrHTTPS());
+
+  // TODO(crbug/1001194): Add histogram to record that the optimization target
+  // was not registered but was requested.
+  if (!registered_optimization_targets_.contains(optimization_target))
+    return OptimizationTargetDecision::kUnknown;
+
+  auto it = optimization_target_prediction_model_map_.find(optimization_target);
+  if (it == optimization_target_prediction_model_map_.end()) {
+    // TODO(crbug/1001194): Check the store to see if there is a model
+    // available. There will also be a check with metrics on if the model was
+    // available in the but not loaded.
+    return OptimizationTargetDecision::kModelNotAvailableOnClient;
+  }
+  PredictionModel* prediction_model = it->second.get();
+
+  base::flat_map<std::string, float> feature_map =
+      BuildFeatureMap(navigation_handle, prediction_model->GetModelFeatures());
+
+  return prediction_model->Predict(feature_map);
+}
+
+void PredictionManager::OnEffectiveConnectionTypeChanged(
+    net::EffectiveConnectionType effective_connection_type) {
+  SEQUENCE_CHECKER(sequence_checker_);
+  current_effective_connection_type_ = effective_connection_type;
+}
+
+void PredictionManager::SeedPredictionModelForTesting(
+    proto::OptimizationTarget optimization_target,
+    std::unique_ptr<PredictionModel> prediction_model) {
+  registered_optimization_targets_.insert(optimization_target);
+  optimization_target_prediction_model_map_[optimization_target] =
+      std::move(prediction_model);
+}
+
+void PredictionManager::SeedHostModelFeaturesMapForTesting(
+    const std::string& host,
+    base::flat_map<std::string, float> host_model_features) {
+  host_model_features_map_[host] = host_model_features;
+}
+
+PredictionModel* PredictionManager::GetPredictionModelForTesting(
+    proto::OptimizationTarget optimization_target) const {
+  auto it = optimization_target_prediction_model_map_.find(optimization_target);
+  if (it != optimization_target_prediction_model_map_.end())
+    return it->second.get();
+  return nullptr;
+}
+
+}  // namespace optimization_guide
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager.h b/chrome/browser/optimization_guide/prediction/prediction_manager.h
new file mode 100644
index 0000000..d51bb60
--- /dev/null
+++ b/chrome/browser/optimization_guide/prediction/prediction_manager.h
@@ -0,0 +1,127 @@
+// 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_OPTIMIZATION_GUIDE_PREDICTION_PREDICTION_MANAGER_H_
+#define CHROME_BROWSER_OPTIMIZATION_GUIDE_PREDICTION_PREDICTION_MANAGER_H_
+
+#include <memory>
+#include <vector>
+
+#include "base/containers/flat_map.h"
+#include "base/containers/flat_set.h"
+#include "base/macros.h"
+#include "base/sequence_checker.h"
+#include "chrome/browser/optimization_guide/optimization_guide_session_statistic.h"
+#include "components/optimization_guide/optimization_guide_enums.h"
+#include "components/optimization_guide/proto/models.pb.h"
+#include "services/network/public/cpp/network_quality_tracker.h"
+#include "url/origin.h"
+
+namespace content {
+class NavigationHandle;
+}  // namespace content
+
+namespace optimization_guide {
+
+enum class OptimizationGuideDecision;
+class PredictionModel;
+
+// A PredictionManager supported by the optimization guide that makes an
+// OptimizationTargetDecision by evaluating the corresponding prediction model
+// for an OptimizationTarget.
+class PredictionManager
+    : public network::NetworkQualityTracker::EffectiveConnectionTypeObserver {
+ public:
+  PredictionManager();
+  ~PredictionManager() override;
+
+  // Registers the optimization targets that may have ShouldTargetNavigtation
+  // requested by consumers of the Optimization Guide.
+  void RegisterOptimizationTargets(
+      const std::vector<proto::OptimizationTarget>& optimization_targets);
+
+  // Determines if the navigation matches the critieria for
+  // |optimization_target|. Returns kUnknown if a PredictionModel for the
+  // optimization target is not registered and kModelNotAvailableOnClient if the
+  // if model for the optimization target is not currently on the client.
+  OptimizationTargetDecision ShouldTargetNavigation(
+      content::NavigationHandle* navigation_handle,
+      proto::OptimizationTarget optimization_target) const;
+
+  // Updates |session_fcp_| and |previous_fcp_| with |fcp|.
+  void UpdateFCPSessionStatistics(base::TimeDelta fcp);
+
+  // network::NetworkQualityTracker::EffectiveConnectionTypeObserver
+  // implementation:
+  void OnEffectiveConnectionTypeChanged(
+      net::EffectiveConnectionType type) override;
+
+ protected:
+  // Adds a prediction model for an optimization target into
+  // |optimization_target_prediction_model_map_| for testing.
+  void SeedPredictionModelForTesting(
+      proto::OptimizationTarget optimization_target,
+      std::unique_ptr<PredictionModel> prediction_model);
+
+  // Adds host model features for a host into the |host_model_features_map_|
+  // for testing.
+  void SeedHostModelFeaturesMapForTesting(
+      const std::string& host,
+      base::flat_map<std::string, float> host_model_features);
+
+  // Returns the prediction model for the optimization target used by this
+  // PredictionManager for testing.
+  PredictionModel* GetPredictionModelForTesting(
+      proto::OptimizationTarget optimization_target) const;
+
+ private:
+  // Constructs and returns  a map containing the current feature values for the
+  // requested set of model features.
+  base::flat_map<std::string, float> BuildFeatureMap(
+      content::NavigationHandle* navigation_handle,
+      const base::flat_set<std::string>& model_features) const;
+
+  // Calculates and returns the current value for the client feature specified
+  // by |model_feature|. Returns nullopt if the client does not support the
+  // model feature.
+  base::Optional<float> GetValueForClientFeature(
+      const std::string& model_feature,
+      content::NavigationHandle* navigation_handle) const;
+
+  // A map of optimization target to the prediction model capable of making
+  // an optimization target decision for it.
+  base::flat_map<proto::OptimizationTarget, std::unique_ptr<PredictionModel>>
+      optimization_target_prediction_model_map_;
+
+  // The set of optimization targets that have been registered with the
+  // prediction manager.
+  base::flat_set<proto::OptimizationTarget> registered_optimization_targets_;
+
+  // A map of host to host model features known to the prediction manager.
+  //
+  // TODO(crbug/1001194): When loading features for the map, the size should be
+  // restricted.
+  base::flat_map<std::string, base::flat_map<std::string, float>>
+      host_model_features_map_;
+
+  // The current session's FCP statistics for HTTP/HTTPS navigations.
+  OptimizationGuideSessionStatistic session_fcp_;
+
+  // A float representation of the time to FCP of the previous HTTP/HTTPS page
+  // load. This is nullopt when no previous page load exists (the first page
+  // load of a session).
+  base::Optional<float> previous_load_fcp_ms_;
+
+  // The current estimate of the EffectiveConnectionType.
+  net::EffectiveConnectionType current_effective_connection_type_ =
+      net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
+
+  SEQUENCE_CHECKER(sequence_checker_);
+
+  DISALLOW_COPY_AND_ASSIGN(PredictionManager);
+};
+
+}  // namespace optimization_guide
+
+#endif  // CHROME_BROWSER_OPTIMIZATION_GUIDE_PREDICTION_PREDICTION_MANAGER_H_
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager_unittest.cc b/chrome/browser/optimization_guide/prediction/prediction_manager_unittest.cc
new file mode 100644
index 0000000..2184c60a
--- /dev/null
+++ b/chrome/browser/optimization_guide/prediction/prediction_manager_unittest.cc
@@ -0,0 +1,271 @@
+// 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/optimization_guide/prediction/prediction_manager.h"
+
+#include <memory>
+
+#include "base/test/metrics/histogram_tester.h"
+#include "base/time/time.h"
+#include "chrome/browser/optimization_guide/prediction/prediction_model.h"
+#include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "components/optimization_guide/proto/models.pb.h"
+#include "content/public/test/mock_navigation_handle.h"
+#include "content/public/test/web_contents_tester.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/page_transition_types.h"
+
+namespace optimization_guide {
+
+std::unique_ptr<proto::PredictionModel> CreateTestPredictionModel() {
+  std::unique_ptr<optimization_guide::proto::PredictionModel> prediction_model =
+      std::make_unique<optimization_guide::proto::PredictionModel>();
+
+  optimization_guide::proto::ModelInfo* model_info =
+      prediction_model->mutable_model_info();
+  model_info->set_version(1);
+  model_info->add_supported_model_features(
+      proto::CLIENT_MODEL_FEATURE_EFFECTIVE_CONNECTION_TYPE);
+  return prediction_model;
+}
+
+class TestPredictionModel : public PredictionModel {
+ public:
+  TestPredictionModel(std::unique_ptr<proto::PredictionModel> prediction_model,
+                      const base::flat_set<std::string>& host_model_features)
+      : PredictionModel(std::move(prediction_model), host_model_features) {}
+  ~TestPredictionModel() override = default;
+
+  optimization_guide::OptimizationTargetDecision Predict(
+      const base::flat_map<std::string, float>& model_features) override {
+    // Check to make sure the all model_features were provided.
+    for (const auto& model_feature : GetModelFeatures()) {
+      if (!model_features.contains(model_feature))
+        return OptimizationTargetDecision::kUnknown;
+    }
+    model_evaluated_ = true;
+    return OptimizationTargetDecision::kPageLoadMatches;
+  }
+
+  bool WasModelEvaluated() { return model_evaluated_; }
+
+  void ResetModelEvaluationState() { model_evaluated_ = false; }
+
+ private:
+  bool ValidatePredictionModel() const override { return true; }
+
+  bool model_evaluated_ = false;
+};
+
+class TestPredictionManager : public PredictionManager {
+ public:
+  TestPredictionManager() = default;
+  ~TestPredictionManager() override = default;
+
+  void SetPredictionModel(proto::OptimizationTarget optimization_target,
+                          std::unique_ptr<PredictionModel> prediction_model) {
+    SeedPredictionModelForTesting(optimization_target,
+                                  std::move(prediction_model));
+  }
+
+  void SetHostModelFeatures(
+      const std::string& host,
+      base::flat_map<std::string, float> host_model_features) {
+    SeedHostModelFeaturesMapForTesting(host, host_model_features);
+  }
+
+  PredictionModel* GetPredictionModel(
+      proto::OptimizationTarget optimization_target) const {
+    return GetPredictionModelForTesting(optimization_target);
+  }
+};
+
+class PredictionManagerTest
+    : public ChromeRenderViewHostTestHarness,
+      public testing::WithParamInterface<proto::ClientModelFeature> {
+ public:
+  PredictionManagerTest() = default;
+  ~PredictionManagerTest() override = default;
+
+  void SetUp() override {
+    ChromeRenderViewHostTestHarness::SetUp();
+    prediction_manager_ = std::make_unique<TestPredictionManager>();
+  }
+
+  TestPredictionManager* prediction_manager() {
+    return prediction_manager_.get();
+  }
+
+  bool IsSameOriginNavigationFeature() {
+    return GetParam() == proto::CLIENT_MODEL_FEATURE_SAME_ORIGIN_NAVIGATION;
+  }
+
+  void TearDown() override { ChromeRenderViewHostTestHarness::TearDown(); }
+
+ private:
+  std::unique_ptr<TestPredictionManager> prediction_manager_;
+  DISALLOW_COPY_AND_ASSIGN(PredictionManagerTest);
+};
+
+TEST_F(PredictionManagerTest, OptimizationTargetNotRegisteredForNavigation) {
+  content::MockNavigationHandle navigation_handle;
+  navigation_handle.set_url(GURL("https://foo.com"));
+
+  prediction_manager()->RegisterOptimizationTargets(
+      {proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD});
+  EXPECT_EQ(OptimizationTargetDecision::kUnknown,
+            prediction_manager()->ShouldTargetNavigation(
+                &navigation_handle, proto::OPTIMIZATION_TARGET_UNKNOWN));
+}
+
+TEST_F(PredictionManagerTest,
+       NoPredictionModelForRegisteredOptimizationTarget) {
+  content::MockNavigationHandle navigation_handle;
+  navigation_handle.set_url(GURL("https://foo.com"));
+
+  prediction_manager()->RegisterOptimizationTargets(
+      {proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD});
+  EXPECT_EQ(
+      OptimizationTargetDecision::kModelNotAvailableOnClient,
+      prediction_manager()->ShouldTargetNavigation(
+          &navigation_handle, proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD));
+}
+
+TEST_F(PredictionManagerTest, EvaluatePredictionModel) {
+  content::MockNavigationHandle navigation_handle;
+  navigation_handle.set_url(GURL("https://foo.com"));
+
+  std::unique_ptr<TestPredictionModel> prediction_model =
+      std::make_unique<TestPredictionModel>(CreateTestPredictionModel(),
+                                            base::flat_set<std::string>());
+  prediction_manager()->SetPredictionModel(
+      proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD,
+      std::move(prediction_model));
+
+  EXPECT_EQ(
+      OptimizationTargetDecision::kPageLoadMatches,
+      prediction_manager()->ShouldTargetNavigation(
+          &navigation_handle, proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD));
+
+  TestPredictionModel* test_prediction_model =
+      static_cast<TestPredictionModel*>(
+          prediction_manager()->GetPredictionModel(
+              proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD));
+  EXPECT_TRUE(test_prediction_model);
+  EXPECT_TRUE(test_prediction_model->WasModelEvaluated());
+}
+
+TEST_F(PredictionManagerTest, HasHostModelFeaturesForHost) {
+  base::HistogramTester histogram_tester;
+  content::MockNavigationHandle navigation_handle;
+  navigation_handle.set_url(GURL("https://foo.com"));
+
+  std::unique_ptr<TestPredictionModel> prediction_model =
+      std::make_unique<TestPredictionModel>(
+          CreateTestPredictionModel(),
+          base::flat_set<std::string>({{"host_feat1"}}));
+  prediction_manager()->SetPredictionModel(
+      proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD,
+      std::move(prediction_model));
+
+  prediction_manager()->SetHostModelFeatures(navigation_handle.GetURL().host(),
+                                             {{"host_feat1", 1.0}});
+
+  EXPECT_EQ(
+      OptimizationTargetDecision::kPageLoadMatches,
+      prediction_manager()->ShouldTargetNavigation(
+          &navigation_handle, proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD));
+
+  TestPredictionModel* test_prediction_model =
+      static_cast<TestPredictionModel*>(
+          prediction_manager()->GetPredictionModel(
+              proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD));
+
+  EXPECT_TRUE(test_prediction_model);
+  EXPECT_TRUE(test_prediction_model->WasModelEvaluated());
+  histogram_tester.ExpectUniqueSample(
+      "OptimizationGuide.PredictionManager."
+      "HasHostModelFeaturesForHost",
+      true, 1);
+}
+
+TEST_F(PredictionManagerTest, NoHostModelFeaturesForHost) {
+  base::HistogramTester histogram_tester;
+  content::MockNavigationHandle navigation_handle;
+  navigation_handle.set_url(GURL("https://foo.com"));
+
+  std::unique_ptr<TestPredictionModel> prediction_model =
+      std::make_unique<TestPredictionModel>(
+          CreateTestPredictionModel(),
+          base::flat_set<std::string>({{"host_feat1"}}));
+  prediction_manager()->SetPredictionModel(
+      proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD,
+      std::move(prediction_model));
+
+  prediction_manager()->UpdateFCPSessionStatistics(
+      base::TimeDelta::FromMilliseconds(1000.0));
+  EXPECT_EQ(
+      OptimizationTargetDecision::kPageLoadMatches,
+      prediction_manager()->ShouldTargetNavigation(
+          &navigation_handle, proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD));
+
+  TestPredictionModel* test_prediction_model =
+      static_cast<TestPredictionModel*>(
+          prediction_manager()->GetPredictionModel(
+              proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD));
+
+  EXPECT_TRUE(test_prediction_model);
+  EXPECT_TRUE(test_prediction_model->WasModelEvaluated());
+  histogram_tester.ExpectUniqueSample(
+      "OptimizationGuide.PredictionManager."
+      "HasHostModelFeaturesForHost",
+      false, 1);
+}
+
+TEST_P(PredictionManagerTest, ClientFeature) {
+  base::HistogramTester histogram_tester;
+  content::MockNavigationHandle navigation_handle(web_contents());
+  GURL previous_url = GURL("https://foo.com");
+  navigation_handle.set_url(previous_url);
+  navigation_handle.set_page_transition(
+      ui::PageTransition::PAGE_TRANSITION_RELOAD);
+  ON_CALL(navigation_handle, GetPreviousURL())
+      .WillByDefault(testing::ReturnRef(previous_url));
+
+  if (IsSameOriginNavigationFeature()) {
+    EXPECT_CALL(navigation_handle, GetPreviousURL()).Times(1);
+  }
+
+  std::unique_ptr<proto::PredictionModel> model = CreateTestPredictionModel();
+  model->mutable_model_info()->clear_supported_model_features();
+  model->mutable_model_info()->add_supported_model_features(GetParam());
+
+  std::unique_ptr<TestPredictionModel> prediction_model =
+      std::make_unique<TestPredictionModel>(std::move(model),
+                                            base::flat_set<std::string>({{}}));
+
+  prediction_manager()->SetPredictionModel(
+      proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD,
+      std::move(prediction_model));
+
+  EXPECT_EQ(
+      OptimizationTargetDecision::kPageLoadMatches,
+      prediction_manager()->ShouldTargetNavigation(
+          &navigation_handle, proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD));
+
+  TestPredictionModel* test_prediction_model =
+      static_cast<TestPredictionModel*>(
+          prediction_manager()->GetPredictionModel(
+              proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD));
+
+  EXPECT_TRUE(test_prediction_model);
+  EXPECT_TRUE(test_prediction_model->WasModelEvaluated());
+}
+
+INSTANTIATE_TEST_SUITE_P(ClientFeature,
+                         PredictionManagerTest,
+                         testing::Range(proto::ClientModelFeature_MIN,
+                                        proto::ClientModelFeature_MAX));
+
+}  // namespace optimization_guide
diff --git a/chrome/browser/permissions/permission_request_manager.cc b/chrome/browser/permissions/permission_request_manager.cc
index 39a76ab..2418f97 100644
--- a/chrome/browser/permissions/permission_request_manager.cc
+++ b/chrome/browser/permissions/permission_request_manager.cc
@@ -375,8 +375,14 @@
   if (!view_)
     return;
 
-  if (!is_reshow)
+  if (!is_reshow) {
     PermissionUmaUtil::PermissionPromptShown(requests_);
+
+    if (ShouldShowQuietPermissionPrompt()) {
+      base::RecordAction(base::UserMetricsAction(
+          "Notifications.Quiet.PermissionRequestShown"));
+    }
+  }
   NotifyBubbleAdded();
 
   // If in testing mode, automatically respond to the bubble that was shown.
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index bf5a1e4..8a90ffb 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -112,24 +112,17 @@
     std::move(callback).Run(false);
   }
 
-  bool ShouldCreateWebContents(
-      content::WebContents* web_contents,
-      content::RenderFrameHost* opener,
+  bool IsWebContentsCreationOverridden(
       content::SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
       content::mojom::WindowContainerType window_container_type,
       const GURL& opener_url,
       const std::string& frame_name,
-      const GURL& target_url,
-      const std::string& partition_id,
-      SessionStorageNamespace* session_storage_namespace) override {
+      const GURL& target_url) override {
     // Since we don't want to permit child windows that would have a
     // window.opener property, terminate prerendering.
     prerender_contents_->Destroy(FINAL_STATUS_CREATE_NEW_WINDOW);
     // Cancel the popup.
-    return false;
+    return true;
   }
 
   bool OnGoToEntryOffset(int offset) override {
diff --git a/chrome/browser/printing/cloud_print/privet_traffic_detector.cc b/chrome/browser/printing/cloud_print/privet_traffic_detector.cc
index ff119f5a..79a7799 100644
--- a/chrome/browser/printing/cloud_print/privet_traffic_detector.cc
+++ b/chrome/browser/printing/cloud_print/privet_traffic_detector.cc
@@ -18,6 +18,7 @@
 #include "content/public/browser/network_service_instance.h"
 #include "content/public/browser/storage_partition.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "net/base/address_family.h"
 #include "net/base/ip_address.h"
 #include "net/base/network_interfaces.h"
@@ -65,13 +66,13 @@
 void CreateUDPSocketOnUIThread(
     content::BrowserContext* profile,
     mojo::PendingReceiver<network::mojom::UDPSocket> receiver,
-    network::mojom::UDPSocketListenerPtr listener_ptr) {
+    mojo::PendingRemote<network::mojom::UDPSocketListener> listener_remote) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   network::mojom::NetworkContext* network_context =
       content::BrowserContext::GetDefaultStoragePartition(profile)
           ->GetNetworkContext();
   network_context->CreateUDPSocket(std::move(receiver),
-                                   std::move(listener_ptr));
+                                   std::move(listener_remote));
 }
 
 }  // namespace
@@ -110,8 +111,7 @@
     base::RepeatingClosure on_traffic_detected)
     : profile_(profile),
       on_traffic_detected_(on_traffic_detected),
-      restart_attempts_(kMaxRestartAttempts),
-      listener_binding_(this) {
+      restart_attempts_(kMaxRestartAttempts) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 }
 
@@ -150,14 +150,10 @@
 void PrivetTrafficDetector::Helper::Bind() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
 
-  network::mojom::UDPSocketListenerPtr listener_ptr;
-  network::mojom::UDPSocketListenerRequest listener_request =
-      mojo::MakeRequest(&listener_ptr);
-  listener_binding_.Bind(std::move(listener_request));
   base::PostTask(FROM_HERE, {content::BrowserThread::UI},
                  base::BindOnce(&CreateUDPSocketOnUIThread, profile_,
                                 socket_.BindNewPipeAndPassReceiver(),
-                                std::move(listener_ptr)));
+                                listener_receiver_.BindNewPipeAndPassRemote()));
 
   network::mojom::UDPSocketOptionsPtr socket_options =
       network::mojom::UDPSocketOptions::New();
@@ -240,7 +236,7 @@
 void PrivetTrafficDetector::Helper::ResetConnection() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
   socket_.reset();
-  listener_binding_.Close();
+  listener_receiver_.reset();
 }
 
 void PrivetTrafficDetector::Helper::OnReceived(
diff --git a/chrome/browser/printing/cloud_print/privet_traffic_detector.h b/chrome/browser/printing/cloud_print/privet_traffic_detector.h
index 56e3f9c..65c613f 100644
--- a/chrome/browser/printing/cloud_print/privet_traffic_detector.h
+++ b/chrome/browser/printing/cloud_print/privet_traffic_detector.h
@@ -9,7 +9,7 @@
 
 #include "base/callback.h"
 #include "base/macros.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/ip_endpoint.h"
 #include "net/base/network_interfaces.h"
@@ -84,7 +84,7 @@
 
     // Implementation of socket listener callback.
     // Initialized on the UI thread, but only accessed on the IO thread.
-    mojo::Binding<network::mojom::UDPSocketListener> listener_binding_;
+    mojo::Receiver<network::mojom::UDPSocketListener> listener_receiver_{this};
 
     base::WeakPtrFactory<Helper> weak_ptr_factory_{this};
 
diff --git a/chrome/browser/resource_coordinator/tab_manager_browsertest.cc b/chrome/browser/resource_coordinator/tab_manager_browsertest.cc
index c01fcfc..162b40f 100644
--- a/chrome/browser/resource_coordinator/tab_manager_browsertest.cc
+++ b/chrome/browser/resource_coordinator/tab_manager_browsertest.cc
@@ -6,12 +6,12 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/feature_list.h"
-#include "base/memory/fake_memory_pressure_monitor.h"
 #include "base/memory/memory_pressure_listener.h"
 #include "base/run_loop.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_tick_clock.h"
+#include "base/util/memory_pressure/fake_memory_pressure_monitor.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/devtools/devtools_window_testing.h"
@@ -315,7 +315,7 @@
         GetWebContentsAt(index));
   }
 
-  base::test::FakeMemoryPressureMonitor fake_memory_pressure_monitor_;
+  util::test::FakeMemoryPressureMonitor fake_memory_pressure_monitor_;
   base::SimpleTestTickClock test_clock_;
   ScopedSetTickClockForTesting scoped_set_tick_clock_for_testing_;
   base::test::ScopedFeatureList scoped_feature_list_;
diff --git a/chrome/browser/resources/pdf/controller.js b/chrome/browser/resources/pdf/controller.js
index 943ec96..ea790f3 100644
--- a/chrome/browser/resources/pdf/controller.js
+++ b/chrome/browser/resources/pdf/controller.js
@@ -223,7 +223,7 @@
    * @param {!HTMLEmbedElement} plugin
    * @param {!Viewport} viewport
    * @param {function():boolean} getIsUserInitiatedCallback
-   * @param {function():!Promise} getLoadedCallback
+   * @param {function():?Promise} getLoadedCallback
    */
   constructor(plugin, viewport, getIsUserInitiatedCallback, getLoadedCallback) {
     super();
@@ -237,7 +237,7 @@
     /** @private {!function():boolean} */
     this.getIsUserInitiatedCallback_ = getIsUserInitiatedCallback;
 
-    /** @private {!function():!Promise} */
+    /** @private {!function():?Promise} */
     this.getLoadedCallback_ = getLoadedCallback;
 
     /** @private {!Map<string, PromiseResolver>} */
diff --git a/chrome/browser/resources/pdf/pdf_viewer.js b/chrome/browser/resources/pdf/pdf_viewer.js
index 5e53a46e..4c990dd 100644
--- a/chrome/browser/resources/pdf/pdf_viewer.js
+++ b/chrome/browser/resources/pdf/pdf_viewer.js
@@ -152,7 +152,10 @@
     this.delayedScriptingMessages_ = [];
 
     /** @private {!PromiseResolver} */
-    this.loaded_ = new PromiseResolver();
+    this.loaded_;
+
+    /** @private {boolean} */
+    this.initialLoadComplete_ = false;
 
     /** @private {boolean} */
     this.isPrintPreview_ = location.origin === 'chrome://print';
@@ -775,11 +778,12 @@
   }
 
   /**
-   * @return {!Promise} Resolved when the load state reaches LOADED, rejects on
-   *     FAILED.
+   * @return {?Promise} Resolved when the load state reaches LOADED,
+   * rejects on FAILED. Returns null if no promise has been created, which
+   * is the case for initial load of the PDF.
    */
   get loaded() {
-    return this.loaded_.promise;
+    return this.loaded_ ? this.loaded_.promise : null;
   }
 
   /** @return {!Viewport} The viewport. Used for testing. */
@@ -802,17 +806,20 @@
     if (this.loadState_ == loadState) {
       return;
     }
+    assert(
+        loadState == LoadState.LOADING || this.loadState_ == LoadState.LOADING);
+    this.loadState_ = loadState;
+    if (!this.initialLoadComplete_) {
+      this.initialLoadComplete_ = true;
+      return;
+    }
     if (loadState == LoadState.SUCCESS) {
-      assert(this.loadState_ == LoadState.LOADING);
       this.loaded_.resolve();
     } else if (loadState == LoadState.FAILED) {
-      assert(this.loadState_ == LoadState.LOADING);
       this.loaded_.reject();
     } else {
-      assert(loadState == LoadState.LOADING);
       this.loaded_ = new PromiseResolver();
     }
-    this.loadState_ = loadState;
   }
 
   /**
diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc
index d22da162..8ce24d1 100644
--- a/chrome/browser/sessions/session_restore_browsertest.cc
+++ b/chrome/browser/sessions/session_restore_browsertest.cc
@@ -13,13 +13,13 @@
 #include "base/files/file_path.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/macros.h"
-#include "base/memory/fake_memory_pressure_monitor.h"
 #include "base/process/launch.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
+#include "base/util/memory_pressure/fake_memory_pressure_monitor.h"
 #include "build/build_config.h"
 #include "chrome/browser/defaults.h"
 #include "chrome/browser/first_run/first_run.h"
@@ -234,7 +234,7 @@
   const BrowserList* active_browser_list_ = nullptr;
 
  private:
-  base::test::FakeMemoryPressureMonitor fake_memory_pressure_monitor_;
+  util::test::FakeMemoryPressureMonitor fake_memory_pressure_monitor_;
 };
 
 // Activates the smart restore behaviour and tracks the loading of tabs.
diff --git a/chrome/browser/signin/signin_ui_util.cc b/chrome/browser/signin/signin_ui_util.cc
index 45f75c1..b92d70963 100644
--- a/chrome/browser/signin/signin_ui_util.cc
+++ b/chrome/browser/signin/signin_ui_util.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/callback.h"
+#include "base/feature_list.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
 #include "base/strings/sys_string_conversions.h"
@@ -14,11 +15,13 @@
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_attributes_storage.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_navigator.h"
 #include "chrome/browser/ui/browser_navigator_params.h"
 #include "chrome/browser/ui/chrome_pages.h"
+#include "chrome/browser/ui/ui_features.h"
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "components/signin/public/base/signin_pref_names.h"
@@ -233,6 +236,30 @@
 
 #endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
 
+base::string16 GetShortProfileIdentityToDisplay(
+    const ProfileAttributesEntry& profile_attributes_entry,
+    Profile* profile) {
+  DCHECK(profile);
+  signin::IdentityManager* identity_manager =
+      IdentityManagerFactory::GetForProfile(profile);
+  CoreAccountInfo core_info =
+      identity_manager->GetUnconsentedPrimaryAccountInfo();
+  // If there's no unconsented primary account, simply return the name of the
+  // profile according to profile attributes.
+  if (core_info.IsEmpty())
+    return profile_attributes_entry.GetName();
+
+  base::Optional<AccountInfo> extended_info =
+      identity_manager
+          ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
+              core_info.account_id);
+  // If there's no given name available, return the user email.
+  if (!extended_info.has_value() || extended_info->given_name.empty())
+    return base::UTF8ToUTF16(core_info.email);
+
+  return base::UTF8ToUTF16(extended_info->given_name);
+}
+
 std::string GetAllowedDomain(std::string signin_pattern) {
   std::vector<std::string> splitted_signin_pattern = base::SplitString(
       signin_pattern, "@", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
@@ -260,4 +287,30 @@
   return domain;
 }
 
+bool ShouldShowIdentityOnOpeningProfile(
+    const ProfileAttributesStorage& profile_attributes_storage,
+    Profile* profile) {
+  DCHECK(profile);
+  signin::IdentityManager* identity_manager =
+      IdentityManagerFactory::GetForProfile(profile);
+  DCHECK(identity_manager->AreRefreshTokensLoaded());
+  // Wait with the potential positive response until refresh tokens are loaded
+  // so that we never show it twice on startup.
+  // TODO(crbug.com/1009441): Make it only appear once per profile
+  // instantiation (currently it appears for every new window which have their
+  // own instance of AvatarToolbarButton).
+  if (!base::FeatureList::IsEnabled(
+          features::kAnimatedAvatarButtonOnOpeningProfile)) {
+    return false;
+  }
+
+  // Show the user identity for users with multiple profiles.
+  if (profile_attributes_storage.GetNumberOfProfiles() > 1) {
+    return true;
+  }
+
+  // Show the user identity for users with multiple signed-in accounts.
+  return identity_manager->GetAccountsWithRefreshTokens().size() > 1;
+}
+
 }  // namespace signin_ui_util
diff --git a/chrome/browser/signin/signin_ui_util.h b/chrome/browser/signin/signin_ui_util.h
index 993ea52b..156f0b1 100644
--- a/chrome/browser/signin/signin_ui_util.h
+++ b/chrome/browser/signin/signin_ui_util.h
@@ -18,6 +18,8 @@
 struct AccountInfo;
 class Browser;
 class Profile;
+class ProfileAttributesEntry;
+class ProfileAttributesStorage;
 
 // Utility functions to gather status information from the various signed in
 // services and construct messages suitable for showing in UI.
@@ -63,6 +65,15 @@
 
 #endif
 
+// Returns the short user identity to display for |profile|. It is based on the
+// current unconsented primary account (if exists).
+// TODO(crbug.com/1012179): Move this logic into ProfileAttributesEntry once
+// AvatarToolbarButton becomes an observer of ProfileAttributesStorage and thus
+// ProfileAttributesEntry is up-to-date when AvatarToolbarButton needs it.
+base::string16 GetShortProfileIdentityToDisplay(
+    const ProfileAttributesEntry& profile_attributes_entry,
+    Profile* profile);
+
 // Returns the domain of the policy value of RestrictSigninToPattern. Returns
 // an empty string if the policy is not set or can not be parsed. The parser
 // only supports the policy value that matches [^@]+@[a-zA-Z0-9\-.]+(\\E)?\$?$.
@@ -90,6 +101,13 @@
 }  // namespace internal
 #endif
 
+// Returns whether Chrome should show the identity of the user (using a brief
+// animation) on opening a profile. IdentityManager's refresh tokens must be
+// loaded when this function gets called.
+bool ShouldShowIdentityOnOpeningProfile(
+    const ProfileAttributesStorage& profile_attributes_storage,
+    Profile* profile);
+
 }  // namespace signin_ui_util
 
 #endif  // CHROME_BROWSER_SIGNIN_SIGNIN_UI_UTIL_H_
diff --git a/chrome/browser/signin/signin_ui_util_unittest.cc b/chrome/browser/signin/signin_ui_util_unittest.cc
index ca97561f..8a42342 100644
--- a/chrome/browser/signin/signin_ui_util_unittest.cc
+++ b/chrome/browser/signin/signin_ui_util_unittest.cc
@@ -9,11 +9,15 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/metrics/user_action_tester.h"
 #include "build/buildflag.h"
+#include "chrome/browser/profiles/profile_attributes_storage.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
 #include "chrome/browser/signin/scoped_account_consistency.h"
 #include "chrome/browser/signin/signin_promo.h"
+#include "chrome/browser/ui/ui_features.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
+#include "chrome/test/base/testing_profile_manager.h"
+#include "components/account_id/account_id.h"
 #include "components/google/core/common/google_util.h"
 #include "components/signin/public/base/signin_buildflags.h"
 #include "components/signin/public/identity_manager/account_info.h"
@@ -52,8 +56,12 @@
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
 
 namespace {
+
 const char kMainEmail[] = "main_email@example.com";
 const char kMainGaiaID[] = "main_gaia_id";
+const char kSecondaryEmail[] = "secondary_email@example.com";
+const char kSecondaryGaiaID[] = "secondary_gaia_id";
+
 class SigninUiUtilTestBrowserWindow : public TestBrowserWindow {
  public:
   SigninUiUtilTestBrowserWindow() = default;
@@ -76,6 +84,7 @@
 
   DISALLOW_COPY_AND_ASSIGN(SigninUiUtilTestBrowserWindow);
 };
+
 }  // namespace
 
 class DiceSigninUiUtilTest : public BrowserWithTestWindowTest {
@@ -498,4 +507,59 @@
 }
 #endif  // BUILDFLAG(ENABLE_DICE_SUPPORT)
 
+TEST_F(DiceSigninUiUtilTest,
+       ShouldShowIdentityOnOpeningProfile_ReturnsTrueForMultiProfiles) {
+  const char kSecondProfile[] = "SecondProfile";
+  const base::FilePath profile_path =
+      profile_manager()->profiles_dir().AppendASCII(kSecondProfile);
+  profile_manager()->profile_attributes_storage()->AddProfile(
+      profile_path, base::ASCIIToUTF16(kSecondProfile), std::string(),
+      base::string16(), false, 0, std::string(), EmptyAccountId());
+
+  EXPECT_TRUE(ShouldShowIdentityOnOpeningProfile(
+      *profile_manager()->profile_attributes_storage(), profile()));
+}
+
+TEST_F(DiceSigninUiUtilTest,
+       ShouldShowIdentityOnOpeningProfile_ReturnsTrueForMultiSignin) {
+  GetIdentityManager()->GetAccountsMutator()->AddOrUpdateAccount(
+      kMainGaiaID, kMainEmail, "refresh_token", false,
+      signin_metrics::SourceForRefreshTokenOperation::kUnknown);
+  GetIdentityManager()->GetAccountsMutator()->AddOrUpdateAccount(
+      kSecondaryEmail, kSecondaryGaiaID, "refresh_token", false,
+      signin_metrics::SourceForRefreshTokenOperation::kUnknown);
+
+  EXPECT_TRUE(ShouldShowIdentityOnOpeningProfile(
+      *profile_manager()->profile_attributes_storage(), profile()));
+}
+
+TEST_F(
+    DiceSigninUiUtilTest,
+    ShouldShowIdentityOnOpeningProfile_ReturnsFalseForSingleProfileSingleSignin) {
+  GetIdentityManager()->GetAccountsMutator()->AddOrUpdateAccount(
+      kMainGaiaID, kMainEmail, "refresh_token", false,
+      signin_metrics::SourceForRefreshTokenOperation::kUnknown);
+
+  EXPECT_FALSE(ShouldShowIdentityOnOpeningProfile(
+      *profile_manager()->profile_attributes_storage(), profile()));
+}
+
+TEST_F(DiceSigninUiUtilTest,
+       ShouldShowIdentityOnOpeningProfile_ReturnsFalseForFeatureDisabled) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndDisableFeature(
+      features::kAnimatedAvatarButtonOnOpeningProfile);
+
+  // Do the same setup that makes the previous test return true.
+  GetIdentityManager()->GetAccountsMutator()->AddOrUpdateAccount(
+      kMainGaiaID, kMainEmail, "refresh_token", false,
+      signin_metrics::SourceForRefreshTokenOperation::kUnknown);
+  GetIdentityManager()->GetAccountsMutator()->AddOrUpdateAccount(
+      kSecondaryEmail, kSecondaryGaiaID, "refresh_token", false,
+      signin_metrics::SourceForRefreshTokenOperation::kUnknown);
+
+  EXPECT_FALSE(ShouldShowIdentityOnOpeningProfile(
+      *profile_manager()->profile_attributes_storage(), profile()));
+}
+
 }  // namespace signin_ui_util
diff --git a/chrome/browser/task_manager/providers/service_worker_task_provider.cc b/chrome/browser/task_manager/providers/service_worker_task_provider.cc
index ad8afe5..19ac0c0 100644
--- a/chrome/browser/task_manager/providers/service_worker_task_provider.cc
+++ b/chrome/browser/task_manager/providers/service_worker_task_provider.cc
@@ -46,45 +46,47 @@
   }
 }
 
-void ServiceWorkerTaskProvider::OnVersionRunningStatusChanged(
+void ServiceWorkerTaskProvider::OnVersionStartedRunning(
     content::ServiceWorkerContext* context,
     int64_t version_id,
-    bool is_running) {
+    const GURL& scope,
+    int process_id,
+    const GURL& script_url) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   const ServiceWorkerTaskKey key(context, version_id);
 
-#if DCHECK_IS_ON()
-  if (is_running) {
-    DCHECK(!base::Contains(service_worker_task_map_, key) &&
-           !base::Contains(tasks_to_be_created_, key));
-  } else {
-    DCHECK(base::Contains(service_worker_task_map_, key) ||
-           base::Contains(tasks_to_be_created_, key));
+  DCHECK(!base::Contains(service_worker_task_map_, key) &&
+         !base::Contains(tasks_to_be_created_, key));
+
+  tasks_to_be_created_.emplace(key);
+
+  // Create a new task since the service worker is running now.
+  context->GetServiceWorkerRunningInfo(
+      version_id,
+      base::BindOnce(
+          &ServiceWorkerTaskProvider::OnDidGetServiceWorkerRunningInfo,
+          weak_ptr_factory_.GetWeakPtr()));
+}
+void ServiceWorkerTaskProvider::OnVersionStoppedRunning(
+    content::ServiceWorkerContext* context,
+    int64_t version_id) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  const ServiceWorkerTaskKey key(context, version_id);
+
+  DCHECK(base::Contains(service_worker_task_map_, key) ||
+         base::Contains(tasks_to_be_created_, key));
+
+  auto iter = tasks_to_be_created_.find(key);
+
+  // If the task is not created yet, erase it from |tasks_to_be_created_|.
+  if (iter != tasks_to_be_created_.end()) {
+    tasks_to_be_created_.erase(iter);
+    return;
   }
-#endif  // DCHECK_IS_ON()
 
-  if (is_running) {
-    tasks_to_be_created_.emplace(key);
-
-    // Create a new task since the service worker is running now.
-    context->GetServiceWorkerRunningInfo(
-        version_id,
-        base::BindOnce(
-            &ServiceWorkerTaskProvider::OnDidGetServiceWorkerRunningInfo,
-            weak_ptr_factory_.GetWeakPtr()));
-  } else {
-    auto iter = tasks_to_be_created_.find(key);
-
-    // If the task is not created yet, erase it from |tasks_to_be_created_|.
-    if (iter != tasks_to_be_created_.end()) {
-      tasks_to_be_created_.erase(iter);
-      return;
-    }
-
-    // Since the task has been created and the service worker is not running
-    // any longer, delete it.
-    DeleteTask(context, version_id);
-  }
+  // Since the task has been created and the service worker is not running
+  // any longer, delete it.
+  DeleteTask(context, version_id);
 }
 
 void ServiceWorkerTaskProvider::OnDestruct(
diff --git a/chrome/browser/task_manager/providers/service_worker_task_provider.h b/chrome/browser/task_manager/providers/service_worker_task_provider.h
index f9032ad..bf2d3dd5b 100644
--- a/chrome/browser/task_manager/providers/service_worker_task_provider.h
+++ b/chrome/browser/task_manager/providers/service_worker_task_provider.h
@@ -44,9 +44,13 @@
                const content::NotificationDetails& details) override;
 
   // content::ServiceWorkerContextObserver:
-  void OnVersionRunningStatusChanged(content::ServiceWorkerContext* context,
-                                     int64_t version_id,
-                                     bool is_running) override;
+  void OnVersionStartedRunning(content::ServiceWorkerContext* context,
+                               int64_t version_id,
+                               const GURL& scope,
+                               int process_id,
+                               const GURL& script_url) override;
+  void OnVersionStoppedRunning(content::ServiceWorkerContext* context,
+                               int64_t version_id) override;
   void OnDestruct(content::ServiceWorkerContext* context) override;
 
  private:
diff --git a/chrome/browser/ui/app_list/arc/arc_app_utils.cc b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
index bded51ff..996b6f3 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_utils.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
@@ -4,12 +4,16 @@
 
 #include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
 
+#include <map>
 #include <memory>
 #include <string>
+#include <tuple>
 #include <utility>
 
 #include "base/json/json_writer.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/no_destructor.h"
+#include "base/observer_list.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
@@ -18,13 +22,13 @@
 #include "base/synchronization/waitable_event.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/arc/arc_migration_guide_notification.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
 #include "chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h"
 #include "chrome/browser/chromeos/arc/notification/arc_supervision_transition_notification.h"
 #include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "chrome/browser/ui/ash/launcher/arc_app_shelf_id.h"
 #include "chrome/browser/ui/ash/launcher/arc_shelf_spinner_item_controller.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
@@ -38,6 +42,11 @@
 #include "components/arc/session/arc_bridge_service.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/prefs/pref_service.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/notification_observer.h"
+#include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/notification_service.h"
+#include "content/public/browser/notification_source.h"
 #include "ui/aura/window.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
@@ -100,6 +109,52 @@
                          ui::EF_FORWARD_MOUSE_BUTTON | ui::EF_FROM_TOUCH)) != 0;
 }
 
+using AppLaunchObserverMap =
+    std::map<content::BrowserContext*, base::ObserverList<AppLaunchObserver>>;
+
+AppLaunchObserverMap* GetAppLaunchObserverMap();
+
+content::NotificationObserver* GetNotificationObserver() {
+  class ProfileDestroyedObserver : public content::NotificationObserver {
+   public:
+    void Observe(int type,
+                 const content::NotificationSource& source,
+                 const content::NotificationDetails& details) override {
+      if (type == chrome::NOTIFICATION_PROFILE_DESTROYED) {
+        GetAppLaunchObserverMap()->erase(
+            content::Source<Profile>(source).ptr());
+      }
+    }
+  };
+  static base::NoDestructor<ProfileDestroyedObserver> observer;
+  return observer.get();
+}
+
+AppLaunchObserverMap* GetAppLaunchObserverMap() {
+  static base::NoDestructor<
+      std::map<content::BrowserContext*, base::ObserverList<AppLaunchObserver>>>
+      instance;
+  static base::NoDestructor<content::NotificationRegistrar> registrar;
+  if (!registrar->IsRegistered(
+          GetNotificationObserver(), chrome::NOTIFICATION_PROFILE_DESTROYED,
+          content::NotificationService::AllBrowserContextsAndSources())) {
+    registrar->Add(
+        GetNotificationObserver(), chrome::NOTIFICATION_PROFILE_DESTROYED,
+        content::NotificationService::AllBrowserContextsAndSources());
+  }
+  return instance.get();
+}
+
+void NotifyAppLaunchObservers(content::BrowserContext* context,
+                              const ArcAppListPrefs::AppInfo& app_info) {
+  AppLaunchObserverMap* const map = GetAppLaunchObserverMap();
+  auto it = map->find(context);
+  if (it != map->end()) {
+    for (auto& observer : it->second)
+      observer.OnAppLaunchRequested(app_info);
+  }
+}
+
 bool Launch(content::BrowserContext* context,
             const std::string& app_id,
             const base::Optional<std::string>& intent,
@@ -144,7 +199,7 @@
 
   // Unthrottle the ARC instance before launching an ARC app. This is done
   // to minimize lag on an app launch.
-  SetArcCpuRestriction(false /* do_restrict */);
+  NotifyAppLaunchObservers(context, *app_info);
 
   if (app_info->shortcut || intent.has_value()) {
     const std::string intent_uri = intent.value_or(app_info->intent_uri);
@@ -331,7 +386,7 @@
       // default to avoid slowing down Chrome's user session restoration.
       // However, the restriction should be lifted once the user explicitly
       // tries to launch an ARC app.
-      SetArcCpuRestriction(false /* do_restrict */);
+      NotifyAppLaunchObservers(context, *app_info);
     }
     prefs->SetLastLaunchTime(app_id);
     return true;
@@ -655,6 +710,23 @@
   return app_info->sticky;
 }
 
+void AddAppLaunchObserver(content::BrowserContext* context,
+                          AppLaunchObserver* observer) {
+  AppLaunchObserverMap* const map = GetAppLaunchObserverMap();
+  auto result =
+      map->emplace(std::piecewise_construct, std::forward_as_tuple(context),
+                   std::forward_as_tuple());
+  result.first->second.AddObserver(observer);
+}
+
+void RemoveAppLaunchObserver(content::BrowserContext* context,
+                             AppLaunchObserver* observer) {
+  AppLaunchObserverMap* const map = GetAppLaunchObserverMap();
+  auto it = map->find(context);
+  if (it != map->end())
+    it->second.RemoveObserver(observer);
+}
+
 Intent::Intent() = default;
 
 Intent::~Intent() = default;
diff --git a/chrome/browser/ui/app_list/arc/arc_app_utils.h b/chrome/browser/ui/app_list/arc/arc_app_utils.h
index 90ae13e..88b1662e 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_utils.h
+++ b/chrome/browser/ui/app_list/arc/arc_app_utils.h
@@ -11,7 +11,9 @@
 #include <vector>
 
 #include "base/macros.h"
+#include "base/observer_list_types.h"
 #include "base/optional.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "components/arc/metrics/arc_metrics_constants.h"
 #include "components/arc/mojom/app.mojom.h"
 
@@ -86,6 +88,13 @@
   DISALLOW_COPY_AND_ASSIGN(Intent);
 };
 
+// Observes ARC app launches.
+class AppLaunchObserver : public base::CheckedObserver {
+ public:
+  // Called when an app launch is requested
+  virtual void OnAppLaunchRequested(const ArcAppListPrefs::AppInfo& app_info) {}
+};
+
 // Checks if a given app should be hidden in launcher.
 bool ShouldShowInLauncher(const std::string& app_id);
 
@@ -199,6 +208,11 @@
 // move to the App Service: (https://crbug.com/948408).
 bool IsArcAppSticky(const std::string& app_id, Profile* profile);
 
+// Add/remove an observer to be notified of app launches.
+void AddAppLaunchObserver(content::BrowserContext* context,
+                          AppLaunchObserver* observer);
+void RemoveAppLaunchObserver(content::BrowserContext* context,
+                             AppLaunchObserver* observer);
 }  // namespace arc
 
 #endif  // CHROME_BROWSER_UI_APP_LIST_ARC_ARC_APP_UTILS_H_
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc b/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc
index cd826d9d..4af64d7 100644
--- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc
+++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_web_contents.cc
@@ -59,20 +59,13 @@
     return false;
   }
 
-  bool ShouldCreateWebContents(
-      content::WebContents* web_contents,
-      content::RenderFrameHost* opener,
+  bool IsWebContentsCreationOverridden(
       content::SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
       content::mojom::WindowContainerType window_container_type,
       const GURL& opener_url,
       const std::string& frame_name,
-      const GURL& target_url,
-      const std::string& partition_id,
-      content::SessionStorageNamespace* session_storage_namespace) override {
-    return false;
+      const GURL& target_url) override {
+    return true;
   }
 
   void SetContentsBounds(content::WebContents* source,
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index a86a546f..3cdada94 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -1608,30 +1608,34 @@
       std::make_unique<RepostFormWarningController>(source), source);
 }
 
-bool Browser::ShouldCreateWebContents(
-    content::WebContents* web_contents,
+bool Browser::IsWebContentsCreationOverridden(
+    content::SiteInstance* source_site_instance,
+    content::mojom::WindowContainerType window_container_type,
+    const GURL& opener_url,
+    const std::string& frame_name,
+    const GURL& target_url) {
+  return window_container_type ==
+             content::mojom::WindowContainerType::BACKGROUND &&
+         ShouldCreateBackgroundContents(source_site_instance, opener_url,
+                                        frame_name);
+}
+
+WebContents* Browser::CreateCustomWebContents(
     content::RenderFrameHost* opener,
     content::SiteInstance* source_site_instance,
-    int32_t route_id,
-    int32_t main_frame_route_id,
-    int32_t main_frame_widget_route_id,
-    content::mojom::WindowContainerType window_container_type,
+    bool is_new_browsing_instance,
     const GURL& opener_url,
     const std::string& frame_name,
     const GURL& target_url,
     const std::string& partition_id,
     content::SessionStorageNamespace* session_storage_namespace) {
-  if ((window_container_type !=
-       content::mojom::WindowContainerType::BACKGROUND) ||
-      !ShouldCreateBackgroundContents(source_site_instance, opener_url,
-                                      frame_name))
-    return true;
-
-  CreateBackgroundContents(source_site_instance, opener, opener_url, route_id,
-                           main_frame_route_id, main_frame_widget_route_id,
-                           frame_name, target_url, partition_id,
-                           session_storage_namespace);
-  return false;
+  BackgroundContents* background_contents = CreateBackgroundContents(
+      source_site_instance, opener, opener_url, is_new_browsing_instance,
+      frame_name, target_url, partition_id, session_storage_namespace);
+  if (background_contents) {
+    return background_contents->web_contents();
+  }
+  return nullptr;
 }
 
 void Browser::WebContentsCreated(WebContents* source_contents,
@@ -2853,9 +2857,7 @@
     content::SiteInstance* source_site_instance,
     content::RenderFrameHost* opener,
     const GURL& opener_url,
-    int32_t route_id,
-    int32_t main_frame_route_id,
-    int32_t main_frame_widget_route_id,
+    bool is_new_browsing_instance,
     const std::string& frame_name,
     const GURL& target_url,
     const std::string& partition_id,
@@ -2883,9 +2885,8 @@
   // Passed all the checks, so this should be created as a BackgroundContents.
   if (allow_js_access) {
     return service->CreateBackgroundContents(
-        source_site_instance, opener, route_id, main_frame_route_id,
-        main_frame_widget_route_id, frame_name, extension->id(), partition_id,
-        session_storage_namespace);
+        source_site_instance, opener, is_new_browsing_instance, frame_name,
+        extension->id(), partition_id, session_storage_namespace);
   }
 
   // If script access is not allowed, create the the background contents in a
@@ -2894,8 +2895,8 @@
   // process.
   BackgroundContents* contents = service->CreateBackgroundContents(
       content::SiteInstance::Create(source_site_instance->GetBrowserContext()),
-      nullptr, MSG_ROUTING_NONE, MSG_ROUTING_NONE, MSG_ROUTING_NONE, frame_name,
-      extension->id(), partition_id, session_storage_namespace);
+      nullptr, is_new_browsing_instance, frame_name, extension->id(),
+      partition_id, session_storage_namespace);
 
   // When a separate process is used, the original renderer cannot access the
   // new window later, thus we need to navigate the window now.
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h
index 3f131a82..9c57ba6e 100644
--- a/chrome/browser/ui/browser.h
+++ b/chrome/browser/ui/browser.h
@@ -707,14 +707,16 @@
                          bool* proceed_to_fire_unload) override;
   bool ShouldFocusLocationBarByDefault(content::WebContents* source) override;
   void ShowRepostFormWarningDialog(content::WebContents* source) override;
-  bool ShouldCreateWebContents(
-      content::WebContents* web_contents,
+  bool IsWebContentsCreationOverridden(
+      content::SiteInstance* source_site_instance,
+      content::mojom::WindowContainerType window_container_type,
+      const GURL& opener_url,
+      const std::string& frame_name,
+      const GURL& target_url) override;
+  content::WebContents* CreateCustomWebContents(
       content::RenderFrameHost* opener,
       content::SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
-      content::mojom::WindowContainerType window_container_type,
+      bool is_new_browsing_instance,
       const GURL& opener_url,
       const std::string& frame_name,
       const GURL& target_url,
@@ -1002,9 +1004,7 @@
       content::SiteInstance* source_site_instance,
       content::RenderFrameHost* opener,
       const GURL& opener_url,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
+      bool is_new_browsing_instance,
       const std::string& frame_name,
       const GURL& target_url,
       const std::string& partition_id,
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
index ab10db3e1..4639f10 100644
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
@@ -29,6 +29,7 @@
 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
 #include "chrome/browser/media/webrtc/permission_bubble_media_access_handler.h"
 #include "chrome/browser/media/webrtc/system_media_capture_permissions_mac.h"
+#include "chrome/browser/permissions/permission_features.h"
 #include "chrome/browser/permissions/permission_request_manager.h"
 #include "chrome/browser/permissions/permission_uma_util.h"
 #include "chrome/browser/permissions/permission_util.h"
@@ -1629,6 +1630,16 @@
   set_done_button_text(l10n_util::GetStringUTF16(
       IDS_NOTIFICATIONS_QUIET_PERMISSION_BUBBLE_ALLOW_BUTTON));
   set_show_learn_more(false);
+
+  if (QuietNotificationsPromptConfig::UIFlavorToUse() ==
+      QuietNotificationsPromptConfig::UIFlavor::ANIMATED_ICON) {
+    base::RecordAction(
+        base::UserMetricsAction("Notifications.Quiet.AnimatedIconClicked"));
+  } else if (QuietNotificationsPromptConfig::UIFlavorToUse() ==
+             QuietNotificationsPromptConfig::UIFlavor::STATIC_ICON) {
+    base::RecordAction(
+        base::UserMetricsAction("Notifications.Quiet.StaticIconClicked"));
+  }
 }
 
 ContentSettingNotificationsBubbleModel::
@@ -1642,12 +1653,18 @@
 void ContentSettingNotificationsBubbleModel::OnManageButtonClicked() {
   if (delegate())
     delegate()->ShowContentSettingsPage(CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
+
+  base::RecordAction(
+      base::UserMetricsAction("Notifications.Quiet.ManageClicked"));
 }
 
 void ContentSettingNotificationsBubbleModel::OnDoneButtonClicked() {
   PermissionRequestManager* manager =
       PermissionRequestManager::FromWebContents(web_contents());
   manager->Accept();
+
+  base::RecordAction(
+      base::UserMetricsAction("Notifications.Quiet.ShowForSiteClicked"));
 }
 
 // ContentSettingBubbleModel ---------------------------------------------------
diff --git a/chrome/browser/ui/media_router/presentation_receiver_window_controller.cc b/chrome/browser/ui/media_router/presentation_receiver_window_controller.cc
index 1a5ce1d..03ae005 100644
--- a/chrome/browser/ui/media_router/presentation_receiver_window_controller.cc
+++ b/chrome/browser/ui/media_router/presentation_receiver_window_controller.cc
@@ -195,22 +195,14 @@
   std::move(callback).Run(false);
 }
 
-bool PresentationReceiverWindowController::ShouldCreateWebContents(
-    content::WebContents* web_contents,
-    content::RenderFrameHost* opener,
+bool PresentationReceiverWindowController::IsWebContentsCreationOverridden(
     content::SiteInstance* source_site_instance,
-    int32_t route_id,
-    int32_t main_frame_route_id,
-    int32_t main_frame_widget_route_id,
     content::mojom::WindowContainerType window_container_type,
     const GURL& opener_url,
     const std::string& frame_name,
-    const GURL& target_url,
-    const std::string& partition_id,
-    content::SessionStorageNamespace* session_storage_namespace) {
-  DCHECK_EQ(web_contents_.get(), web_contents);
+    const GURL& target_url) {
   // Disallow creating separate WebContentses.  The WebContents implementation
   // uses this to spawn new windows/tabs, which is also not allowed for
   // local presentations.
-  return false;
+  return true;
 }
diff --git a/chrome/browser/ui/media_router/presentation_receiver_window_controller.h b/chrome/browser/ui/media_router/presentation_receiver_window_controller.h
index 039725f..611c041 100644
--- a/chrome/browser/ui/media_router/presentation_receiver_window_controller.h
+++ b/chrome/browser/ui/media_router/presentation_receiver_window_controller.h
@@ -93,19 +93,12 @@
   void CanDownload(const GURL& url,
                    const std::string& request_method,
                    base::OnceCallback<void(bool)> callback) final;
-  bool ShouldCreateWebContents(
-      content::WebContents* web_contents,
-      content::RenderFrameHost* opener,
+  bool IsWebContentsCreationOverridden(
       content::SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
       content::mojom::WindowContainerType window_container_type,
       const GURL& opener_url,
       const std::string& frame_name,
-      const GURL& target_url,
-      const std::string& partition_id,
-      content::SessionStorageNamespace* session_storage_namespace) final;
+      const GURL& target_url) override;
 
   // The profile used for the presentation.
   std::unique_ptr<IndependentOTRProfileManager::OTRProfileRegistration>
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc
index 711e6d5..682f1e59 100644
--- a/chrome/browser/ui/ui_features.cc
+++ b/chrome/browser/ui/ui_features.cc
@@ -10,6 +10,16 @@
 // https://crbug.com/967317
 const base::Feature kAnimatedAvatarButton{"AnimatedAvatarButton",
                                           base::FEATURE_DISABLED_BY_DEFAULT};
+// Enables an animated avatar button on the sign-in trigger. This feature is
+// guarded by kAnimatedAvatarButton and serves as a kill-switch. See
+// https://crbug.com/967317
+const base::Feature kAnimatedAvatarButtonOnSignIn{
+    "AnimatedAvatarButtonOnSignIn", base::FEATURE_ENABLED_BY_DEFAULT};
+// Enables an animated avatar button on the open-profile/startup trigger. This
+// feature is guarded by kAnimatedAvatarButton and serves as a kill-switch. See
+// https://crbug.com/967317
+const base::Feature kAnimatedAvatarButtonOnOpeningProfile{
+    "AnimatedAvatarButtonOnOpeningProfile", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Enables showing the EV certificate details in the Page Info bubble.
 const base::Feature kEvDetailsInPageInfo{"EvDetailsInPageInfo",
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h
index 0f8c0ff9..f31445a 100644
--- a/chrome/browser/ui/ui_features.h
+++ b/chrome/browser/ui/ui_features.h
@@ -18,6 +18,8 @@
 // alongside the definition of their values in the .cc file.
 
 extern const base::Feature kAnimatedAvatarButton;
+extern const base::Feature kAnimatedAvatarButtonOnSignIn;
+extern const base::Feature kAnimatedAvatarButtonOnOpeningProfile;
 
 extern const base::Feature kEvDetailsInPageInfo;
 
diff --git a/chrome/browser/ui/views/frame/browser_root_view.cc b/chrome/browser/ui/views/frame/browser_root_view.cc
index 000ce05..e7f241e 100644
--- a/chrome/browser/ui/views/frame/browser_root_view.cc
+++ b/chrome/browser/ui/views/frame/browser_root_view.cc
@@ -106,14 +106,7 @@
                                  views::Widget* widget)
     : views::internal::RootView(widget), browser_view_(browser_view) {}
 
-BrowserRootView::~BrowserRootView() {
-  // It's possible to destroy the browser while a drop is active.  In this case,
-  // |drop_info_| will be non-null, but its |target| likely points to an
-  // already-deleted child.  Clear the target so ~DropInfo() will not try and
-  // notify it of the drag ending. http://crbug.com/1001942
-  if (drop_info_)
-    drop_info_->target = nullptr;
-}
+BrowserRootView::~BrowserRootView() = default;
 
 bool BrowserRootView::GetDropFormats(
     int* formats,
diff --git a/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc b/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc
index 455a659..1446241 100644
--- a/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc
+++ b/chrome/browser/ui/views/frame/browser_root_view_browsertest.cc
@@ -49,19 +49,3 @@
   EXPECT_NE(ui::DragDropTypes::DRAG_NONE, root_view->OnDragUpdated(event));
   EXPECT_NE(ui::DragDropTypes::DRAG_NONE, root_view->OnPerformDrop(event));
 }
-
-// Clear drop target when the widget is being destroyed.
-// http://crbug.com/1001942
-IN_PROC_BROWSER_TEST_F(BrowserRootViewBrowserTest, ClearDropTarget) {
-  ui::OSExchangeData data;
-  data.SetURL(GURL("http://www.chromium.org/"), base::string16());
-  ui::DropTargetEvent event(data, gfx::PointF(), gfx::PointF(),
-                            ui::DragDropTypes::DRAG_COPY);
-
-  BrowserRootView* root_view = browser_root_view();
-  root_view->OnDragUpdated(event);
-
-  // Calling this will cause segmentation fault if |root_view| doesn't clear
-  // the target.
-  root_view->GetWidget()->Close();
-}
diff --git a/chrome/browser/ui/views/hover_button.cc b/chrome/browser/ui/views/hover_button.cc
index 66f7540..ce6288c 100644
--- a/chrome/browser/ui/views/hover_button.cc
+++ b/chrome/browser/ui/views/hover_button.cc
@@ -282,11 +282,10 @@
 views::Button::KeyClickAction HoverButton::GetKeyClickActionForEvent(
     const ui::KeyEvent& event) {
   if (event.key_code() == ui::VKEY_RETURN) {
-    // As the hover button is presented in the user menu, it triggers an
-    // |CLICK_ON_KEY_PRESS| action every time the user clicks on enter on all
-    // platforms (it ignores the value of
-    // |PlatformStyle::kReturnClicksFocusedControl|.
-    return CLICK_ON_KEY_PRESS;
+    // As the hover button is presented in the user menu, it triggers a
+    // kOnKeyPress action every time the user clicks on enter on all platforms.
+    // (it ignores the value of PlatformStyle::kReturnClicksFocusedControl)
+    return KeyClickAction::kOnKeyPress;
   }
   return LabelButton::GetKeyClickActionForEvent(event);
 }
diff --git a/chrome/browser/ui/views/location_bar/content_setting_image_view.cc b/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
index 1229da5..df6eacd9 100644
--- a/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
+++ b/chrome/browser/ui/views/location_bar/content_setting_image_view.cc
@@ -146,7 +146,7 @@
 bool ContentSettingImageView::OnKeyPressed(const ui::KeyEvent& event) {
   // Pause animation so that the icon does not shrink and deselect while the
   // user is attempting to press it using key commands.
-  if (GetKeyClickActionForEvent(event) == KeyClickAction::CLICK_ON_KEY_RELEASE)
+  if (GetKeyClickActionForEvent(event) == KeyClickAction::kOnKeyRelease)
     PauseAnimation();
   return Button::OnKeyPressed(event);
 }
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
index 6c925bf..adddf255 100644
--- a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
+++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
@@ -42,17 +42,20 @@
 
 namespace {
 
-constexpr base::TimeDelta kEmailExpansionDuration =
+constexpr base::TimeDelta kIdentityAnimationDuration =
     base::TimeDelta::FromSeconds(3);
 
 constexpr base::TimeDelta kAvatarHighlightAnimationDuration =
     base::TimeDelta::FromSeconds(2);
 
+ProfileAttributesStorage& GetProfileAttributesStorage() {
+  return g_browser_process->profile_manager()->GetProfileAttributesStorage();
+}
+
 ProfileAttributesEntry* GetProfileAttributesEntry(Profile* profile) {
   ProfileAttributesEntry* entry;
-  if (!g_browser_process->profile_manager()
-           ->GetProfileAttributesStorage()
-           .GetProfileAttributesWithPath(profile->GetPath(), &entry)) {
+  if (!GetProfileAttributesStorage().GetProfileAttributesWithPath(
+          profile->GetPath(), &entry)) {
     return nullptr;
   }
   return entry;
@@ -65,9 +68,7 @@
     return true;
 
   return entry.GetAvatarIconIndex() == 0 &&
-         g_browser_process->profile_manager()
-                 ->GetProfileAttributesStorage()
-                 .GetNumberOfProfiles() == 1;
+         GetProfileAttributesStorage().GetNumberOfProfiles() == 1;
 }
 
 int GetIconSizeForNonTouchUi() {
@@ -88,8 +89,7 @@
 #endif  // !defined(OS_CHROMEOS)
       browser_(browser),
       profile_(browser_->profile()) {
-  profile_observer_.Add(
-      &g_browser_process->profile_manager()->GetProfileAttributesStorage());
+  profile_observer_.Add(&GetProfileAttributesStorage());
 
   State state = GetState();
   if (state == State::kIncognitoProfile) {
@@ -98,7 +98,9 @@
     signin::IdentityManager* identity_manager =
         IdentityManagerFactory::GetForProfile(profile_);
     identity_manager_observer_.Add(identity_manager);
-    SetUserEmail(identity_manager->GetUnconsentedPrimaryAccountInfo().email);
+
+    if (identity_manager->AreRefreshTokensLoaded())
+      OnRefreshTokensLoaded();
   }
 
   // Activate on press for left-mouse-button only to mimic other MenuButtons
@@ -127,7 +129,7 @@
 
   if (base::FeatureList::IsEnabled(features::kAnimatedAvatarButton)) {
     // For consistency with identity representation, we need to have the avatar
-    // on the left and the (potential) user-name / email on the right.
+    // on the left and the (potential) user name on the right.
     SetHorizontalAlignment(gfx::ALIGN_LEFT);
   }
 
@@ -149,8 +151,8 @@
 void AvatarToolbarButton::UpdateIcon() {
   // If widget isn't set, the button doesn't have access to the theme provider
   // to set colors. Defer updating until AddedToWidget(). This may get called as
-  // a result of SetUserEmail() called from the constructor when the button is
-  // not yet added to the ToolbarView's hierarchy.
+  // a result of OnUserIdentityChanged() called from the constructor when the
+  // button is not yet added to the ToolbarView's hierarchy.
   if (!GetWidget())
     return;
   gfx::Image gaia_image = GetGaiaImage();
@@ -158,9 +160,9 @@
 
   // TODO(crbug.com/990286): Get rid of this logic completely when we cache the
   // Google account image in the profile cache and thus it is always available.
-  if (waiting_for_image_to_show_user_email_ && !gaia_image.IsEmpty()) {
-    waiting_for_image_to_show_user_email_ = false;
-    ExpandToShowEmail();
+  if (identity_animation_state_ == IdentityAnimationState::kWaitingForImage &&
+      !gaia_image.IsEmpty()) {
+    ShowIdentityAnimation();
   }
 }
 
@@ -187,8 +189,9 @@
       }
       break;
     }
-    case State::kAnimatedSignIn: {
-      text = base::UTF8ToUTF16(*user_email_);
+    case State::kAnimatedUserIdentity: {
+      text = signin_ui_util::GetShortProfileIdentityToDisplay(
+          *GetProfileAttributesEntry(profile_), profile_);
       break;
     }
     case State::kHighlightAnimation:
@@ -248,8 +251,10 @@
 
 void AvatarToolbarButton::NotifyClick(const ui::Event& event) {
   Button::NotifyClick(event);
-  if (should_reset_user_email_when_no_longer_hovered_or_focused_)
-    ResetUserEmailWhenNotHoveredOrFocused();
+  if (identity_animation_state_ ==
+      IdentityAnimationState::kShowingUntilNoLongerHoveredOrFocused) {
+    HideIdentityAnimationWhenNotHoveredOrFocused();
+  }
   // TODO(bsep): Other toolbar buttons have ToolbarView as a listener and let it
   // call ExecuteCommandWithDisposition on their behalf. Unfortunately, it's not
   // possible to plumb IsKeyEvent through, so this has to be a special case.
@@ -260,14 +265,18 @@
 }
 
 void AvatarToolbarButton::OnMouseExited(const ui::MouseEvent& event) {
-  if (should_reset_user_email_when_no_longer_hovered_or_focused_)
-    ResetUserEmailWhenNotHoveredOrFocused();
+  if (identity_animation_state_ ==
+      IdentityAnimationState::kShowingUntilNoLongerHoveredOrFocused) {
+    HideIdentityAnimationWhenNotHoveredOrFocused();
+  }
   ToolbarButton::OnMouseExited(event);
 }
 
 void AvatarToolbarButton::OnBlur() {
-  if (should_reset_user_email_when_no_longer_hovered_or_focused_)
-    ResetUserEmailWhenNotHoveredOrFocused();
+  if (identity_animation_state_ ==
+      IdentityAnimationState::kShowingUntilNoLongerHoveredOrFocused) {
+    HideIdentityAnimationWhenNotHoveredOrFocused();
+  }
   ToolbarButton::OnBlur();
 }
 
@@ -328,7 +337,18 @@
 
 void AvatarToolbarButton::OnUnconsentedPrimaryAccountChanged(
     const CoreAccountInfo& unconsented_primary_account_info) {
-  SetUserEmail(unconsented_primary_account_info.email);
+  if (!base::FeatureList::IsEnabled(features::kAnimatedAvatarButtonOnSignIn))
+    return;
+  OnUserIdentityChanged(unconsented_primary_account_info);
+}
+
+void AvatarToolbarButton::OnRefreshTokensLoaded() {
+  if (!signin_ui_util::ShouldShowIdentityOnOpeningProfile(
+          GetProfileAttributesStorage(), profile_)) {
+    return;
+  }
+  OnUserIdentityChanged(IdentityManagerFactory::GetForProfile(profile_)
+                            ->GetUnconsentedPrimaryAccountInfo());
 }
 
 void AvatarToolbarButton::OnAccountsInCookieUpdated(
@@ -356,9 +376,10 @@
   ShowAvatarHighlightAnimation();
 }
 
-void AvatarToolbarButton::ExpandToShowEmail() {
-  DCHECK(user_email_.has_value());
-  DCHECK(!waiting_for_image_to_show_user_email_);
+void AvatarToolbarButton::ShowIdentityAnimation() {
+  DCHECK_EQ(identity_animation_state_,
+            IdentityAnimationState::kWaitingForImage);
+  identity_animation_state_ = IdentityAnimationState::kShowing;
 
   UpdateText();
 
@@ -366,30 +387,30 @@
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE,
       base::BindOnce(
-          &AvatarToolbarButton::ResetUserEmailWhenNotHoveredOrFocused,
+          &AvatarToolbarButton::HideIdentityAnimationWhenNotHoveredOrFocused,
           weak_ptr_factory_.GetWeakPtr()),
-      kEmailExpansionDuration);
+      kIdentityAnimationDuration);
 }
 
-void AvatarToolbarButton::ResetUserEmailWhenNotHoveredOrFocused() {
+void AvatarToolbarButton::HideIdentityAnimationWhenNotHoveredOrFocused() {
   // No-op if it has been reset already.
-  if (!user_email_)
+  if (identity_animation_state_ == IdentityAnimationState::kNotShowing)
     return;
 
   // Keep email visible while hovering or being focused.
   if (IsMouseHovered() || HasFocus()) {
     // TODO(crbug.com/967317): Include also the case when some other button from
     // the parent container is shown and hovered / focused.
-    should_reset_user_email_when_no_longer_hovered_or_focused_ = true;
+    identity_animation_state_ =
+        IdentityAnimationState::kShowingUntilNoLongerHoveredOrFocused;
     return;
   }
-  should_reset_user_email_when_no_longer_hovered_or_focused_ = false;
-  ResetUserEmail();
+  HideIdentityAnimation();
 }
 
-void AvatarToolbarButton::ResetUserEmail() {
-  DCHECK(user_email_.has_value());
-  user_email_ = base::nullopt;
+void AvatarToolbarButton::HideIdentityAnimation() {
+  DCHECK_NE(identity_animation_state_, IdentityAnimationState::kNotShowing);
+  identity_animation_state_ = IdentityAnimationState::kNotShowing;
 
   // Update the text to the pre-shown state. This also makes sure that we now
   // reflect changes that happened while the identity pill was shown.
@@ -404,8 +425,9 @@
       return l10n_util::GetStringUTF16(IDS_GUEST_PROFILE_NAME);
     case State::kGenericProfile:
       return l10n_util::GetStringUTF16(IDS_GENERIC_USER_AVATAR_LABEL);
-    case State::kAnimatedSignIn:
-      return base::UTF8ToUTF16(*user_email_);
+    case State::kAnimatedUserIdentity:
+      return signin_ui_util::GetShortProfileIdentityToDisplay(
+          *GetProfileAttributesEntry(profile_), profile_);
     case State::kSyncError:
       return l10n_util::GetStringFUTF16(IDS_AVATAR_BUTTON_SYNC_ERROR_TOOLTIP,
                                         GetProfileName());
@@ -445,7 +467,7 @@
     case State::kGenericProfile:
       return gfx::CreateVectorIcon(kUserAccountAvatarIcon, icon_size,
                                    icon_color);
-    case State::kAnimatedSignIn:
+    case State::kAnimatedUserIdentity:
     case State::kHighlightAnimation:
     case State::kSyncError:
     case State::kSyncPaused:
@@ -520,8 +542,11 @@
     return State::kGenericProfile;
   }
 
-  if (user_email_.has_value() && !waiting_for_image_to_show_user_email_)
-    return State::kAnimatedSignIn;
+  if (identity_animation_state_ == IdentityAnimationState::kShowing ||
+      identity_animation_state_ ==
+          IdentityAnimationState::kShowingUntilNoLongerHoveredOrFocused) {
+    return State::kAnimatedUserIdentity;
+  }
 
   if (highlight_animation_visible_)
     return State::kHighlightAnimation;
@@ -553,16 +578,16 @@
   SetLayoutInsetDelta(layout_insets);
 }
 
-void AvatarToolbarButton::SetUserEmail(const std::string& user_email) {
+void AvatarToolbarButton::OnUserIdentityChanged(
+    const CoreAccountInfo& user_identity) {
   if (!base::FeatureList::IsEnabled(features::kAnimatedAvatarButton) ||
-      user_email.empty()) {
+      user_identity.IsEmpty()) {
     return;
   }
 
-  user_email_ = user_email;
   // If we already have a gaia image, the pill will be immediately
   // displayed by UpdateIcon().
-  waiting_for_image_to_show_user_email_ = true;
+  identity_animation_state_ = IdentityAnimationState::kWaitingForImage;
   UpdateIcon();
 }
 
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button.h b/chrome/browser/ui/views/profiles/avatar_toolbar_button.h
index 6b156d26..308d550 100644
--- a/chrome/browser/ui/views/profiles/avatar_toolbar_button.h
+++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button.h
@@ -49,12 +49,19 @@
     kGuestSession,
     kGenericProfile,
     kHighlightAnimation,
-    kAnimatedSignIn,
+    kAnimatedUserIdentity,
     kSyncPaused,
     kSyncError,
     kNormal
   };
 
+  enum class IdentityAnimationState {
+    kNotShowing,
+    kWaitingForImage,
+    kShowing,
+    kShowingUntilNoLongerHoveredOrFocused
+  };
+
   // ToolbarButton:
   void NotifyClick(const ui::Event& event) override;
   void OnMouseExited(const ui::MouseEvent& event) override;
@@ -83,6 +90,7 @@
   // Needed if the first sync promo account should be displayed.
   void OnUnconsentedPrimaryAccountChanged(
       const CoreAccountInfo& unconsented_primary_account_info) override;
+  void OnRefreshTokensLoaded() override;
   void OnAccountsInCookieUpdated(
       const signin::AccountsInCookieJarInfo& accounts_in_cookie_jar_info,
       const GoogleServiceAuthError& error) override;
@@ -95,9 +103,9 @@
   // autofill::PersonalDataManagerObserver:
   void OnCreditCardSaved() override;
 
-  void ExpandToShowEmail();
-  void ResetUserEmailWhenNotHoveredOrFocused();
-  void ResetUserEmail();
+  void ShowIdentityAnimation();
+  void HideIdentityAnimationWhenNotHoveredOrFocused();
+  void HideIdentityAnimation();
 
   base::string16 GetAvatarTooltipText() const;
   base::string16 GetProfileName() const;
@@ -107,8 +115,8 @@
 
   void SetInsets();
 
-  // Sets |user_email_| and initiates showing the email (if non-empty).
-  void SetUserEmail(const std::string& user_email);
+  // Initiates showing the identity |user_identity| (if non-empty).
+  void OnUserIdentityChanged(const CoreAccountInfo& user_identity);
 
   void ShowHighlightAnimation();
   void HideHighlightAnimation();
@@ -129,13 +137,8 @@
   // paused/error state.
   bool autofill_icon_visible_ = false;
 
-  // The user email that we're currently showing in an animation or empty if no
-  // animation is in progress.
-  base::Optional<std::string> user_email_;
-  // We cannot show the animation before we fetch the new avatar.
-  bool waiting_for_image_to_show_user_email_ = false;
-  // We cannot hide the animation when the button is hovered or focused.
-  bool should_reset_user_email_when_no_longer_hovered_or_focused_ = false;
+  IdentityAnimationState identity_animation_state_ =
+      IdentityAnimationState::kNotShowing;
 
   ScopedObserver<ProfileAttributesStorage, ProfileAttributesStorage::Observer>
       profile_observer_{this};
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
index 0190235..440dd30 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.cc
@@ -318,7 +318,7 @@
 }
 
 void ProfileMenuViewBase::SetSyncInfo(const base::string16& description,
-                                      const base::string16& link_text,
+                                      const base::string16& clickable_text,
                                       base::RepeatingClosure action) {
   constexpr int kVerticalPadding = 8;
 
@@ -340,15 +340,14 @@
     label->SetBorder(views::CreateEmptyBorder(gfx::Insets(0, kMenuEdgeMargin)));
   }
 
-  views::Link* link = sync_info_container_->AddChildView(
-      std::make_unique<views::Link>(link_text));
-  link->SetHorizontalAlignment(gfx::ALIGN_CENTER);
-  link->set_listener(this);
-  link->SetBorder(views::CreateEmptyBorder(/*top=*/0, /*left=*/kMenuEdgeMargin,
-                                           /*bottom=*/kVerticalPadding,
-                                           /*right=*/kMenuEdgeMargin));
+  views::Button* button = sync_info_container_->AddChildView(
+      views::MdTextButton::CreateSecondaryUiBlueButton(this, clickable_text));
+  button->SetProperty(
+      views::kMarginsKey,
+      gfx::Insets(/*top=*/0, /*left=*/kMenuEdgeMargin,
+                  /*bottom=*/kVerticalPadding, /*right=*/kMenuEdgeMargin));
 
-  RegisterClickAction(link, std::move(action));
+  RegisterClickAction(button, std::move(action));
 }
 
 void ProfileMenuViewBase::AddShortcutFeatureButton(
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_base.h b/chrome/browser/ui/views/profiles/profile_menu_view_base.h
index b2321d7..a24a098 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view_base.h
+++ b/chrome/browser/ui/views/profiles/profile_menu_view_base.h
@@ -100,7 +100,7 @@
                        const base::string16& title,
                        const base::string16& subtitle = base::string16());
   void SetSyncInfo(const base::string16& description,
-                   const base::string16& link_text,
+                   const base::string16& clickable_text,
                    base::RepeatingClosure action);
   void AddShortcutFeatureButton(const gfx::ImageSkia& icon,
                                 const base::string16& text,
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
index 493e9e50..496e453 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
@@ -874,8 +874,9 @@
     ProfileMenuClickTest_WithUnconsentedPrimaryAccount::kOrderedActionableItems
         [];
 
+// TODO(crbug.com/1012167): Flaky.
 IN_PROC_BROWSER_TEST_P(ProfileMenuClickTest_WithUnconsentedPrimaryAccount,
-                       SetupAndRunTest) {
+                       DISABLED_SetupAndRunTest) {
   signin::MakeAccountAvailableWithCookies(identity_manager(),
                                           &test_url_loader_factory_,
                                           "user@example.com", "gaia_id");
@@ -927,7 +928,9 @@
 constexpr ProfileMenuView::ActionableItem
     ProfileMenuClickTest_GuestProfile::kOrderedActionableItems[];
 
-IN_PROC_BROWSER_TEST_P(ProfileMenuClickTest_GuestProfile, SetupAndRunTest) {
+// TODO(crbug.com/1012167): Flaky.
+IN_PROC_BROWSER_TEST_P(ProfileMenuClickTest_GuestProfile,
+                       DISABLED_SetupAndRunTest) {
   profiles::SwitchToGuestProfile(ProfileManager::CreateCallback());
   ui_test_utils::WaitForBrowserToOpen();
   Profile* guest = g_browser_process->profile_manager()->GetProfileByPath(
@@ -972,7 +975,9 @@
 constexpr ProfileMenuView::ActionableItem
     ProfileMenuClickTest_IncognitoProfile::kOrderedActionableItems[];
 
-IN_PROC_BROWSER_TEST_P(ProfileMenuClickTest_IncognitoProfile, SetupAndRunTest) {
+// TODO(crbug.com/1012167): Flaky.
+IN_PROC_BROWSER_TEST_P(ProfileMenuClickTest_IncognitoProfile,
+                       DISABLED_SetupAndRunTest) {
   SetTargetBrowser(CreateIncognitoBrowser(browser()->profile()));
 
   RunTest();
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
index 91d51116..15e6ac4 100644
--- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
+++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
@@ -292,6 +292,10 @@
                              TabStripModel::CLOSE_CREATE_HISTORICAL_TAB);
 }
 
+void BrowserTabStripController::MoveTab(int start_index, int final_index) {
+  model_->MoveWebContentsAt(start_index, final_index, false);
+}
+
 void BrowserTabStripController::ShowContextMenuForTab(
     Tab* tab,
     const gfx::Point& p,
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
index 2118a35..2937577 100644
--- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
+++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
@@ -61,6 +61,7 @@
   void AddSelectionFromAnchorTo(int model_index) override;
   bool BeforeCloseTab(int model_index, CloseTabSource source) override;
   void CloseTab(int model_index, CloseTabSource source) override;
+  void MoveTab(int start_index, int final_index) override;
   void ShowContextMenuForTab(Tab* tab,
                              const gfx::Point& p,
                              ui::MenuSourceType source_type) override;
diff --git a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h
index 86e3c56..6761bbd 100644
--- a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h
+++ b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h
@@ -23,7 +23,6 @@
 
   void AddTab(int index, bool is_active);
   void AddPinnedTab(int index, bool is_active);
-  void MoveTab(int from_index, int to_index);
   void RemoveTab(int index);
 
   void MoveTabIntoGroup(int index, base::Optional<TabGroupId> new_group);
@@ -46,6 +45,7 @@
   void AddSelectionFromAnchorTo(int index) override;
   bool BeforeCloseTab(int index, CloseTabSource source) override;
   void CloseTab(int index, CloseTabSource source) override;
+  void MoveTab(int from_index, int to_index) override;
   void ShowContextMenuForTab(Tab* tab,
                              const gfx::Point& p,
                              ui::MenuSourceType source_type) override;
diff --git a/chrome/browser/ui/views/tabs/tab.cc b/chrome/browser/ui/views/tabs/tab.cc
index 3e46226d..7c649aa 100644
--- a/chrome/browser/ui/views/tabs/tab.cc
+++ b/chrome/browser/ui/views/tabs/tab.cc
@@ -412,6 +412,29 @@
     return true;
   }
 
+  if (event.type() == ui::ET_KEY_PRESSED &&
+      (event.flags() & ui::EF_CONTROL_DOWN)) {
+    if (event.flags() & ui::EF_SHIFT_DOWN) {
+      if (event.key_code() == ui::VKEY_RIGHT) {
+        controller()->MoveTabLast(this);
+        return true;
+      }
+      if (event.key_code() == ui::VKEY_LEFT) {
+        controller()->MoveTabFirst(this);
+        return true;
+      }
+    } else {
+      if (event.key_code() == ui::VKEY_RIGHT) {
+        controller()->MoveTabRight(this);
+        return true;
+      }
+      if (event.key_code() == ui::VKEY_LEFT) {
+        controller()->MoveTabLeft(this);
+        return true;
+      }
+    }
+  }
+
   return false;
 }
 
diff --git a/chrome/browser/ui/views/tabs/tab_controller.h b/chrome/browser/ui/views/tabs/tab_controller.h
index f342729..8fbea38 100644
--- a/chrome/browser/ui/views/tabs/tab_controller.h
+++ b/chrome/browser/ui/views/tabs/tab_controller.h
@@ -55,6 +55,25 @@
   // Closes the tab.
   virtual void CloseTab(Tab* tab, CloseTabSource source) = 0;
 
+  // Attempts to move the specified tab to the right.
+  virtual void MoveTabRight(Tab* tab) = 0;
+
+  // Attempts to move the specified tab to the left.
+  virtual void MoveTabLeft(Tab* tab) = 0;
+
+  // Attempts to move the specified tab to the beginning of the tabstrip (or the
+  // beginning of the unpinned tab region if the tab is not pinned).
+  virtual void MoveTabFirst(Tab* tab) = 0;
+
+  // Attempts to move the specified tab to the end of the tabstrip (or the end
+  // of the pinned tab region if the tab is pinned).
+  virtual void MoveTabLast(Tab* tab) = 0;
+
+  // Shows a context menu for the tab at the specified point in screen coords.
+  virtual void ShowContextMenuForTab(Tab* tab,
+                                     const gfx::Point& p,
+                                     ui::MenuSourceType source_type) = 0;
+
   // Returns whether |tab| is the active tab. The active tab is the one whose
   // content is shown in the browser.
   virtual bool IsActiveTab(const Tab* tab) const = 0;
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc
index e4129e70..d8ab19a 100644
--- a/chrome/browser/ui/views/tabs/tab_strip.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -1471,6 +1471,64 @@
   controller_->CloseTab(model_index, source);
 }
 
+void TabStrip::MoveTabLeft(Tab* tab) {
+  MoveTabRelative(tab, -1);
+}
+
+void TabStrip::MoveTabRight(Tab* tab) {
+  MoveTabRelative(tab, 1);
+}
+
+void TabStrip::MoveTabFirst(Tab* tab) {
+  if (tab->closing())
+    return;
+
+  const int start_index = GetModelIndexOfTab(tab);
+  if (!IsValidModelIndex(start_index))
+    return;
+
+  int target_index = 0;
+  if (!controller_->IsTabPinned(start_index)) {
+    while (target_index < start_index && controller_->IsTabPinned(target_index))
+      ++target_index;
+  }
+
+  if (target_index == start_index || !IsValidModelIndex(target_index))
+    return;
+
+  controller_->MoveTab(start_index, target_index);
+}
+
+void TabStrip::MoveTabLast(Tab* tab) {
+  if (tab->closing())
+    return;
+
+  const int start_index = GetModelIndexOfTab(tab);
+  if (!IsValidModelIndex(start_index))
+    return;
+
+  int target_index;
+  if (controller_->IsTabPinned(start_index)) {
+    int temp_index = start_index + 1;
+    while (temp_index < tab_count() && controller_->IsTabPinned(temp_index))
+      ++temp_index;
+    target_index = temp_index - 1;
+  } else {
+    target_index = tab_count() - 1;
+  }
+
+  if (target_index == start_index || !IsValidModelIndex(target_index))
+    return;
+
+  controller_->MoveTab(start_index, target_index);
+}
+
+void TabStrip::ShowContextMenuForTab(Tab* tab,
+                                     const gfx::Point& p,
+                                     ui::MenuSourceType source_type) {
+  controller_->ShowContextMenuForTab(tab, p, source_type);
+}
+
 bool TabStrip::IsActiveTab(const Tab* tab) const {
   int model_index = GetModelIndexOfTab(tab);
   return IsValidModelIndex(model_index) &&
@@ -2573,6 +2631,24 @@
   separator_color_ = get_blend(inactive_fg, kTabSeparatorContrast).color;
 }
 
+void TabStrip::MoveTabRelative(Tab* tab, int offset) {
+  DCHECK_NE(offset, 0);
+  const int start_index = GetModelIndexOfTab(tab);
+  const int target_index = start_index + offset;
+
+  if (tab->closing())
+    return;
+
+  if (!IsValidModelIndex(start_index) || !IsValidModelIndex(target_index))
+    return;
+
+  if (controller_->IsTabPinned(start_index) !=
+      controller_->IsTabPinned(target_index))
+    return;
+
+  controller_->MoveTab(start_index, target_index);
+}
+
 void TabStrip::ResizeLayoutTabs() {
   // We've been called back after the TabStrip has been emptied out (probably
   // just prior to the window being destroyed). We need to do nothing here or
diff --git a/chrome/browser/ui/views/tabs/tab_strip.h b/chrome/browser/ui/views/tabs/tab_strip.h
index a09afc05..c78603a5 100644
--- a/chrome/browser/ui/views/tabs/tab_strip.h
+++ b/chrome/browser/ui/views/tabs/tab_strip.h
@@ -243,6 +243,13 @@
   void ToggleSelected(Tab* tab) override;
   void AddSelectionFromAnchorTo(Tab* tab) override;
   void CloseTab(Tab* tab, CloseTabSource source) override;
+  void MoveTabLeft(Tab* tab) override;
+  void MoveTabRight(Tab* tab) override;
+  void MoveTabFirst(Tab* tab) override;
+  void MoveTabLast(Tab* tab) override;
+  void ShowContextMenuForTab(Tab* tab,
+                             const gfx::Point& p,
+                             ui::MenuSourceType source_type) override;
   bool IsActiveTab(const Tab* tab) const override;
   bool IsTabSelected(const Tab* tab) const override;
   bool IsTabPinned(const Tab* tab) const override;
@@ -463,6 +470,10 @@
   // Computes and stores values derived from contrast ratios.
   void UpdateContrastRatioValues();
 
+  // Determines whether a tab can be moved by |offset| positions and moves it if
+  // possible.
+  void MoveTabRelative(Tab* tab, int offset);
+
   // -- Tab Resize Layout -----------------------------------------------------
 
   // Perform an animated resize-relayout of the TabStrip immediately.
diff --git a/chrome/browser/ui/views/tabs/tab_strip_browsertest.cc b/chrome/browser/ui/views/tabs/tab_strip_browsertest.cc
index e0d82e6..b486ace 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_browsertest.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip_browsertest.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
 
+#include <vector>
+
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_tabstrip.h"
 #include "chrome/browser/ui/tabs/tab_group_id.h"
@@ -27,6 +29,21 @@
     tab_strip_model()->AddToNewGroup({tab_index});
     return tab_strip_model()->GetTabGroupForTab(tab_index).value();
   }
+
+  std::vector<content::WebContents*> GetWebContentses() {
+    std::vector<content::WebContents*> contentses;
+    for (int i = 0; i < tab_strip()->tab_count(); ++i)
+      contentses.push_back(tab_strip_model()->GetWebContentsAt(i));
+    return contentses;
+  }
+
+  std::vector<content::WebContents*> GetWebContentsesInOrder(
+      const std::vector<int>& order) {
+    std::vector<content::WebContents*> contentses;
+    for (int i = 0; i < tab_strip()->tab_count(); ++i)
+      contentses.push_back(tab_strip_model()->GetWebContentsAt(order[i]));
+    return contentses;
+  }
 };
 
 // Regression test for crbug.com/983961.
@@ -53,3 +70,192 @@
   EXPECT_EQ(groups.size(), 1U);
   EXPECT_EQ(groups[0], group);
 }
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLeft_Success) {
+  AppendTab();
+  AppendTab();
+
+  const auto expected = GetWebContentsesInOrder({1, 0, 2});
+  tab_strip()->MoveTabLeft(tab_strip()->tab_at(1));
+  EXPECT_EQ(expected, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
+                       MoveTabLeft_Failure_EdgeOfTabstrip) {
+  AppendTab();
+  AppendTab();
+
+  const auto contentses = GetWebContentses();
+  tab_strip()->MoveTabLeft(tab_strip()->tab_at(0));
+  // No change expected.
+  EXPECT_EQ(contentses, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLeft_Failure_Pinned) {
+  AppendTab();
+  AppendTab();
+  tab_strip_model()->SetTabPinned(0, true);
+
+  const auto contentses = GetWebContentses();
+  tab_strip()->MoveTabLeft(tab_strip()->tab_at(1));
+  // No change expected.
+  EXPECT_EQ(contentses, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabRight_Success) {
+  AppendTab();
+  AppendTab();
+
+  const auto expected = GetWebContentsesInOrder({1, 0, 2});
+  tab_strip()->MoveTabRight(tab_strip()->tab_at(0));
+  EXPECT_EQ(expected, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
+                       MoveTabRight_Failure_EdgeOfTabstrip) {
+  AppendTab();
+  AppendTab();
+
+  const auto contentses = GetWebContentses();
+  tab_strip()->MoveTabRight(tab_strip()->tab_at(2));
+  // No change expected.
+  EXPECT_EQ(contentses, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabRight_Failure_Pinned) {
+  AppendTab();
+  AppendTab();
+  tab_strip_model()->SetTabPinned(0, true);
+
+  const auto contentses = GetWebContentses();
+  tab_strip()->MoveTabRight(tab_strip()->tab_at(0));
+  // No change expected.
+  EXPECT_EQ(contentses, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabFirst_NoPinnedTabs_Success) {
+  AppendTab();
+  AppendTab();
+  AppendTab();
+
+  const auto expected = GetWebContentsesInOrder({2, 0, 1, 3});
+  tab_strip()->MoveTabFirst(tab_strip()->tab_at(2));
+  EXPECT_EQ(expected, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabFirst_PinnedTabs_Success) {
+  AppendTab();
+  AppendTab();
+  AppendTab();
+  tab_strip_model()->SetTabPinned(0, true);
+
+  const auto expected = GetWebContentsesInOrder({0, 2, 1, 3});
+  tab_strip()->MoveTabFirst(tab_strip()->tab_at(2));
+  EXPECT_EQ(expected, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabFirst_NoPinnedTabs_Failure) {
+  AppendTab();
+  AppendTab();
+  AppendTab();
+
+  const auto contentses = GetWebContentses();
+  tab_strip()->MoveTabFirst(tab_strip()->tab_at(0));
+  // No changes expected.
+  EXPECT_EQ(contentses, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabFirst_PinnedTabs_Failure) {
+  AppendTab();
+  AppendTab();
+  AppendTab();
+  tab_strip_model()->SetTabPinned(0, true);
+
+  const auto contentses = GetWebContentses();
+  tab_strip()->MoveTabFirst(tab_strip()->tab_at(1));
+  // No changes expected.
+  EXPECT_EQ(contentses, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest,
+                       MoveTabFirst_MovePinnedTab_Success) {
+  AppendTab();
+  AppendTab();
+  AppendTab();
+  tab_strip_model()->SetTabPinned(0, true);
+  tab_strip_model()->SetTabPinned(1, true);
+  tab_strip_model()->SetTabPinned(2, true);
+
+  const auto expected = GetWebContentsesInOrder({2, 0, 1, 3});
+  tab_strip()->MoveTabFirst(tab_strip()->tab_at(2));
+  EXPECT_EQ(expected, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_NoPinnedTabs_Success) {
+  AppendTab();
+  AppendTab();
+
+  const auto expected = GetWebContentsesInOrder({1, 2, 0});
+  tab_strip()->MoveTabLast(tab_strip()->tab_at(0));
+  EXPECT_EQ(expected, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_MovePinnedTab_Success) {
+  AppendTab();
+  AppendTab();
+  AppendTab();
+  tab_strip_model()->SetTabPinned(0, true);
+  tab_strip_model()->SetTabPinned(1, true);
+  tab_strip_model()->SetTabPinned(2, true);
+
+  const auto expected = GetWebContentsesInOrder({0, 2, 1, 3});
+  tab_strip()->MoveTabLast(tab_strip()->tab_at(1));
+  EXPECT_EQ(expected, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_AllPinnedTabs_Success) {
+  AppendTab();
+  AppendTab();
+  tab_strip_model()->SetTabPinned(0, true);
+  tab_strip_model()->SetTabPinned(1, true);
+  tab_strip_model()->SetTabPinned(2, true);
+
+  const auto expected = GetWebContentsesInOrder({0, 2, 1});
+  tab_strip()->MoveTabLast(tab_strip()->tab_at(1));
+  EXPECT_EQ(expected, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_NoPinnedTabs_Failure) {
+  AppendTab();
+  AppendTab();
+
+  const auto contentses = GetWebContentses();
+  tab_strip()->MoveTabLast(tab_strip()->tab_at(2));
+  // No changes expected.
+  EXPECT_EQ(contentses, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_PinnedTabs_Failure) {
+  AppendTab();
+  AppendTab();
+  tab_strip_model()->SetTabPinned(0, true);
+  tab_strip_model()->SetTabPinned(1, true);
+
+  const auto contentses = GetWebContentses();
+  tab_strip()->MoveTabLast(tab_strip()->tab_at(1));
+  // No changes expected.
+  EXPECT_EQ(contentses, GetWebContentses());
+}
+
+IN_PROC_BROWSER_TEST_F(TabStripBrowsertest, MoveTabLast_AllPinnedTabs_Failure) {
+  AppendTab();
+  AppendTab();
+  tab_strip_model()->SetTabPinned(0, true);
+  tab_strip_model()->SetTabPinned(1, true);
+  tab_strip_model()->SetTabPinned(2, true);
+
+  const auto contentses = GetWebContentses();
+  tab_strip()->MoveTabLast(tab_strip()->tab_at(2));
+  // No changes expected.
+  EXPECT_EQ(contentses, GetWebContentses());
+}
diff --git a/chrome/browser/ui/views/tabs/tab_strip_controller.h b/chrome/browser/ui/views/tabs/tab_strip_controller.h
index 7d424a3..1dc2b5c3 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_controller.h
+++ b/chrome/browser/ui/views/tabs/tab_strip_controller.h
@@ -78,6 +78,10 @@
   // Closes the tab at the specified index in the model.
   virtual void CloseTab(int index, CloseTabSource source) = 0;
 
+  // Moves the tab at |start_index| so that it is now at |final_index|, sliding
+  // any tabs in between left or right as appropriate.
+  virtual void MoveTab(int start_index, int final_index) = 0;
+
   // Shows a context menu for the tab at the specified point in screen coords.
   virtual void ShowContextMenuForTab(Tab* tab,
                                      const gfx::Point& p,
diff --git a/chrome/browser/ui/views/tabs/tab_unittest.cc b/chrome/browser/ui/views/tabs/tab_unittest.cc
index 525400c2..5c50c26 100644
--- a/chrome/browser/ui/views/tabs/tab_unittest.cc
+++ b/chrome/browser/ui/views/tabs/tab_unittest.cc
@@ -56,6 +56,13 @@
   void ToggleSelected(Tab* tab) override {}
   void AddSelectionFromAnchorTo(Tab* tab) override {}
   void CloseTab(Tab* tab, CloseTabSource source) override {}
+  void MoveTabRight(Tab* tab) override {}
+  void MoveTabLeft(Tab* tab) override {}
+  void MoveTabFirst(Tab* tab) override {}
+  void MoveTabLast(Tab* tab) override {}
+  void ShowContextMenuForTab(Tab* tab,
+                             const gfx::Point& p,
+                             ui::MenuSourceType source_type) override {}
   bool IsActiveTab(const Tab* tab) const override { return active_tab_; }
   bool IsTabSelected(const Tab* tab) const override { return false; }
   bool IsTabPinned(const Tab* tab) const override { return false; }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_button.cc b/chrome/browser/ui/views/toolbar/toolbar_button.cc
index a1601c4..9747a962 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_button.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_button.cc
@@ -394,6 +394,12 @@
       .color;
 }
 
+// static
+SkColor ToolbarButton::GetDefaultBorderColor(views::View* host_view) {
+  return SkColorSetA(GetToolbarInkDropBaseColor(host_view),
+                     kToolbarButtonBackgroundAlpha);
+}
+
 bool ToolbarButton::ShouldShowMenu() {
   return model_ != nullptr;
 }
@@ -552,11 +558,7 @@
   if (highlight_color_) {
     border_color = *highlight_color_;
   } else {
-    // TODO(crbug.com/967317): Update to match mocks. If
-    // !color_utils::IsDark(..COLOR_TOOLBAR), return black with 30% alpha.
-    // Otherwise, consider returning GetDefaultTextColor(), instead.
-    border_color = parent_->GetThemeProvider()->GetColor(
-        ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON);
+    border_color = ToolbarButton::GetDefaultBorderColor(parent_);
   }
   return FadeWithAnimation(border_color, highlight_color_animation_);
 }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_button.h b/chrome/browser/ui/views/toolbar/toolbar_button.h
index 0ec14781..db507c8 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_button.h
+++ b/chrome/browser/ui/views/toolbar/toolbar_button.h
@@ -114,6 +114,10 @@
       SkColor dark_extreme,
       SkColor light_extreme);
 
+  // Returns the default border color used for toolbar buttons (when having a
+  // highlight text, see SetHighlight()).
+  static SkColor GetDefaultBorderColor(views::View* host_view);
+
  protected:
   // Returns if menu should be shown. Override this to change default behavior.
   virtual bool ShouldShowMenu();
diff --git a/chrome/browser/ui/views/toolbar/toolbar_icon_container_view.cc b/chrome/browser/ui/views/toolbar/toolbar_icon_container_view.cc
index 42d9fd02d5..26fa472 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_icon_container_view.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_icon_container_view.cc
@@ -8,6 +8,7 @@
 
 #include "chrome/browser/ui/layout_constants.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
+#include "chrome/browser/ui/views/toolbar/toolbar_button.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_ink_drop_util.h"
 #include "ui/native_theme/native_theme.h"
 #include "ui/views/background.h"
@@ -124,12 +125,13 @@
 void ToolbarIconContainerView::SetHighlightBorder() {
   const float highlight_value = highlight_animation_.GetCurrentValue();
   if (highlight_value > 0.0f) {
+    SkColor border_color = ToolbarButton::GetDefaultBorderColor(this);
     SetBorder(views::CreateRoundedRectBorder(
         1,
         ChromeLayoutProvider::Get()->GetCornerRadiusMetric(
             views::EMPHASIS_MAXIMUM, size()),
-        SkColorSetA(GetToolbarInkDropBaseColor(this),
-                    highlight_value * kToolbarButtonBackgroundAlpha)));
+        SkColorSetA(border_color,
+                    SkColorGetA(border_color) * highlight_value)));
   } else {
     SetBorder(nullptr);
   }
diff --git a/chrome/browser/ui/web_applications/web_app_dialog_manager.h b/chrome/browser/ui/web_applications/web_app_dialog_manager.h
index caa4ac4..f3f5c9b 100644
--- a/chrome/browser/ui/web_applications/web_app_dialog_manager.h
+++ b/chrome/browser/ui/web_applications/web_app_dialog_manager.h
@@ -50,7 +50,7 @@
   base::flat_set<std::unique_ptr<DialogInstance>, base::UniquePtrComparator>
       dialogs_;
 
-  Profile* profile_;
+  Profile* const profile_;
 
   DISALLOW_COPY_AND_ASSIGN(WebAppDialogManager);
 };
diff --git a/chrome/browser/ui/web_applications/web_app_metrics.h b/chrome/browser/ui/web_applications/web_app_metrics.h
index 30646298..fbbd0947 100644
--- a/chrome/browser/ui/web_applications/web_app_metrics.h
+++ b/chrome/browser/ui/web_applications/web_app_metrics.h
@@ -45,7 +45,7 @@
   static constexpr int kNumUserInstalledAppsNotCounted = -1;
   int num_user_installed_apps_ = kNumUserInstalledAppsNotCounted;
 
-  Profile* profile_;
+  Profile* const profile_;
 
   base::WeakPtrFactory<WebAppMetrics> weak_ptr_factory_{this};
 
diff --git a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h
index ce0baa1..72d3071b 100644
--- a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h
+++ b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h
@@ -61,7 +61,7 @@
 
   std::unique_ptr<WebAppDialogManager> dialog_manager_;
 
-  Profile* profile_;
+  Profile* const profile_;
 
   std::map<AppId, std::vector<base::OnceClosure>> windows_closed_requests_map_;
   std::map<AppId, size_t> num_windows_for_apps_map_;
diff --git a/chrome/browser/vr/testapp/vr_testapp.cc b/chrome/browser/vr/testapp/vr_testapp.cc
index f4929f5..0a6209b0 100644
--- a/chrome/browser/vr/testapp/vr_testapp.cc
+++ b/chrome/browser/vr/testapp/vr_testapp.cc
@@ -32,7 +32,7 @@
 #include "ui/ozone/public/cursor_factory_ozone.h"
 #include "ui/ozone/public/ozone_gpu_test_helper.h"
 #include "ui/ozone/public/ozone_platform.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_delegate.h"
 #include "ui/platform_window/platform_window_init_properties.h"
 
@@ -166,7 +166,7 @@
   std::unique_ptr<vr::GlRenderer> renderer_;
 
   // Window-related state.
-  std::unique_ptr<ui::PlatformWindow> platform_window_;
+  std::unique_ptr<ui::PlatformWindowBase> platform_window_;
   gfx::AcceleratedWidget widget_ = gfx::kNullAcceleratedWidget;
 
   base::WeakPtrFactory<AppWindow> weak_ptr_factory_;
diff --git a/chrome/browser/web_applications/components/app_registrar.h b/chrome/browser/web_applications/components/app_registrar.h
index 6a7c5c18..e07758d 100644
--- a/chrome/browser/web_applications/components/app_registrar.h
+++ b/chrome/browser/web_applications/components/app_registrar.h
@@ -112,7 +112,7 @@
   void NotifyAppRegistrarShutdown();
 
  private:
-  Profile* profile_;
+  Profile* const profile_;
 
   base::ObserverList<AppRegistrarObserver, /*check_empty=*/true> observers_;
 };
diff --git a/chrome/browser/web_applications/components/app_registry_controller.h b/chrome/browser/web_applications/components/app_registry_controller.h
index feeb536..7f61c94 100644
--- a/chrome/browser/web_applications/components/app_registry_controller.h
+++ b/chrome/browser/web_applications/components/app_registry_controller.h
@@ -47,7 +47,7 @@
   Profile* profile() const { return profile_; }
 
  private:
-  Profile* profile_;
+  Profile* const profile_;
 };
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/components/externally_installed_web_app_prefs.h b/chrome/browser/web_applications/components/externally_installed_web_app_prefs.h
index c871a08..b85a2f2 100644
--- a/chrome/browser/web_applications/components/externally_installed_web_app_prefs.h
+++ b/chrome/browser/web_applications/components/externally_installed_web_app_prefs.h
@@ -60,7 +60,7 @@
   bool IsPlaceholderApp(const AppId& app_id) const;
 
  private:
-  PrefService* pref_service_;
+  PrefService* const pref_service_;
 
   DISALLOW_COPY_AND_ASSIGN(ExternallyInstalledWebAppPrefs);
 };
diff --git a/chrome/browser/web_applications/components/install_manager.h b/chrome/browser/web_applications/components/install_manager.h
index 4a760f0..f1d60d8 100644
--- a/chrome/browser/web_applications/components/install_manager.h
+++ b/chrome/browser/web_applications/components/install_manager.h
@@ -136,7 +136,7 @@
   InstallFinalizer* finalizer() { return finalizer_; }
 
  private:
-  Profile* profile_;
+  Profile* const profile_;
   WebAppUrlLoader url_loader_;
 
   AppRegistrar* registrar_ = nullptr;
diff --git a/chrome/browser/web_applications/components/web_app_icon_downloader.h b/chrome/browser/web_applications/components/web_app_icon_downloader.h
index a02c0b1..95234d0 100644
--- a/chrome/browser/web_applications/components/web_app_icon_downloader.h
+++ b/chrome/browser/web_applications/components/web_app_icon_downloader.h
@@ -103,7 +103,7 @@
   WebAppIconDownloaderCallback callback_;
 
   // The histogram name to log individual fetch results under.
-  std::string https_status_code_class_histogram_name_;
+  const std::string https_status_code_class_histogram_name_;
 
   base::WeakPtrFactory<WebAppIconDownloader> weak_ptr_factory_{this};
 
diff --git a/chrome/browser/web_applications/components/web_app_shortcut_mac.h b/chrome/browser/web_applications/components/web_app_shortcut_mac.h
index 7f888b0..e51de625 100644
--- a/chrome/browser/web_applications/components/web_app_shortcut_mac.h
+++ b/chrome/browser/web_applications/components/web_app_shortcut_mac.h
@@ -148,10 +148,10 @@
 
   // Path to the data directory for this app. For example:
   // ~/Library/Application Support/Chromium/Default/Web Applications/_crx_abc/
-  base::FilePath app_data_dir_;
+  const base::FilePath app_data_dir_;
 
   // Information about the app. Owned by the caller of the constructor.
-  const ShortcutInfo* info_;
+  const ShortcutInfo* const info_;
 
   DISALLOW_COPY_AND_ASSIGN(WebAppShortcutCreator);
 };
diff --git a/chrome/browser/web_applications/pending_app_install_task.h b/chrome/browser/web_applications/pending_app_install_task.h
index 385fb7a9..9441c93 100644
--- a/chrome/browser/web_applications/pending_app_install_task.h
+++ b/chrome/browser/web_applications/pending_app_install_task.h
@@ -86,10 +86,10 @@
                          const AppId& app_id,
                          InstallResultCode code);
 
-  Profile* profile_;
-  AppRegistrar* registrar_;
-  InstallFinalizer* install_finalizer_;
-  WebAppUiManager* ui_manager_;
+  Profile* const profile_;
+  AppRegistrar* const registrar_;
+  InstallFinalizer* const install_finalizer_;
+  WebAppUiManager* const ui_manager_;
 
   ExternallyInstalledWebAppPrefs externally_installed_app_prefs_;
 
diff --git a/chrome/browser/web_applications/system_web_app_manager.h b/chrome/browser/web_applications/system_web_app_manager.h
index 8256343..1609222 100644
--- a/chrome/browser/web_applications/system_web_app_manager.h
+++ b/chrome/browser/web_applications/system_web_app_manager.h
@@ -139,7 +139,7 @@
 
   base::flat_map<AppId, SystemAppType> app_id_to_app_type_;
 
-  PrefService* pref_service_;
+  PrefService* const pref_service_;
 
   // Used to install, uninstall, and update apps. Should outlive this class.
   PendingAppManager* pending_app_manager_ = nullptr;
diff --git a/chrome/browser/web_applications/web_app_database.h b/chrome/browser/web_applications/web_app_database.h
index 26c5291..b86c7c1 100644
--- a/chrome/browser/web_applications/web_app_database.h
+++ b/chrome/browser/web_applications/web_app_database.h
@@ -79,7 +79,7 @@
 
   std::unique_ptr<syncer::ModelTypeStore> store_;
   std::unique_ptr<syncer::ModelTypeStore::WriteBatch> write_batch_;
-  AbstractWebAppDatabaseFactory* database_factory_;
+  AbstractWebAppDatabaseFactory* const database_factory_;
   ReportErrorCallback error_callback_;
 
   // Database is opened if store is created and all data read.
diff --git a/chrome/browser/web_applications/web_app_install_finalizer.h b/chrome/browser/web_applications/web_app_install_finalizer.h
index 1dd26c7..206b38a 100644
--- a/chrome/browser/web_applications/web_app_install_finalizer.h
+++ b/chrome/browser/web_applications/web_app_install_finalizer.h
@@ -51,7 +51,7 @@
                                  const AppId& app_id,
                                  bool success);
 
-  WebAppSyncBridge* sync_bridge_;
+  WebAppSyncBridge* const sync_bridge_;
   WebAppIconManager* const icon_manager_;
 
   base::WeakPtrFactory<WebAppInstallFinalizer> weak_ptr_factory_{this};
diff --git a/chrome/browser/web_applications/web_app_install_task.h b/chrome/browser/web_applications/web_app_install_task.h
index c6713d5..8045411d 100644
--- a/chrome/browser/web_applications/web_app_install_task.h
+++ b/chrome/browser/web_applications/web_app_install_task.h
@@ -171,7 +171,7 @@
   std::unique_ptr<WebAppDataRetriever> data_retriever_;
 
   InstallFinalizer* install_finalizer_;
-  Profile* profile_;
+  Profile* const profile_;
 
   base::WeakPtrFactory<WebAppInstallTask> weak_ptr_factory_{this};
 
diff --git a/chrome/browser/web_applications/web_app_provider.h b/chrome/browser/web_applications/web_app_provider.h
index dc9cf986..99bc02a 100644
--- a/chrome/browser/web_applications/web_app_provider.h
+++ b/chrome/browser/web_applications/web_app_provider.h
@@ -129,7 +129,7 @@
 
   base::OneShotEvent on_registry_ready_;
 
-  Profile* profile_;
+  Profile* const profile_;
 
   // Ensures that ConnectSubsystems() is not called after Start().
   bool started_ = false;
diff --git a/chrome/browser/web_applications/web_app_registrar.h b/chrome/browser/web_applications/web_app_registrar.h
index d10dbaf..bf3f0993 100644
--- a/chrome/browser/web_applications/web_app_registrar.h
+++ b/chrome/browser/web_applications/web_app_registrar.h
@@ -86,7 +86,7 @@
     const_iterator end() const;
 
    private:
-    const WebAppRegistrar* registrar_;
+    const WebAppRegistrar* const registrar_;
 #if DCHECK_IS_ON()
     const size_t mutations_count_;
 #endif
diff --git a/chrome/browser/web_applications/web_app_registry_update.h b/chrome/browser/web_applications/web_app_registry_update.h
index 423e6c8f..41d379bb 100644
--- a/chrome/browser/web_applications/web_app_registry_update.h
+++ b/chrome/browser/web_applications/web_app_registry_update.h
@@ -58,7 +58,7 @@
 
  private:
   std::unique_ptr<RegistryUpdateData> update_data_;
-  WebAppRegistrarMutable* mutable_registrar_;
+  WebAppRegistrarMutable* const mutable_registrar_;
 
   DISALLOW_COPY_AND_ASSIGN(WebAppRegistryUpdate);
 };
@@ -74,7 +74,7 @@
 
  private:
   std::unique_ptr<WebAppRegistryUpdate> update_;
-  WebAppSyncBridge* sync_bridge_;
+  WebAppSyncBridge* const sync_bridge_;
 
   DISALLOW_COPY_AND_ASSIGN(ScopedRegistryUpdate);
 };
diff --git a/chrome/browser/web_applications/web_app_sync_bridge.h b/chrome/browser/web_applications/web_app_sync_bridge.h
index 8464151..d150e1b 100644
--- a/chrome/browser/web_applications/web_app_sync_bridge.h
+++ b/chrome/browser/web_applications/web_app_sync_bridge.h
@@ -89,7 +89,7 @@
   std::string GetStorageKey(const syncer::EntityData& entity_data) override;
 
   std::unique_ptr<WebAppDatabase> database_;
-  WebAppRegistrarMutable* registrar_;
+  WebAppRegistrarMutable* const registrar_;
 
   bool is_in_update_ = false;
 
diff --git a/chrome/common/apps/platform_apps/chrome_apps_messages.h b/chrome/common/apps/platform_apps/chrome_apps_messages.h
index 3169f24c9..f8138b4 100644
--- a/chrome/common/apps/platform_apps/chrome_apps_messages.h
+++ b/chrome/common/apps/platform_apps/chrome_apps_messages.h
@@ -8,8 +8,6 @@
 #include "chrome/common/apps/platform_apps/media_galleries_permission_data.h"
 #include "ipc/ipc_message_macros.h"
 
-#define IPC_MESSAGE_START ChromeAppsMsgStart
-
 IPC_STRUCT_TRAITS_BEGIN(chrome_apps::MediaGalleriesPermissionData)
   IPC_STRUCT_TRAITS_MEMBER(permission())
 IPC_STRUCT_TRAITS_END()
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index e37561a..5614ae1 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -653,6 +653,7 @@
       "//base",
       "//base:i18n",
       "//base/test:test_support",
+      "//base/util/memory_pressure:test_support",
       "//build:branding_buildflags",
       "//chrome:browser_tests_pak",
       "//chrome:packed_resources",
@@ -3052,6 +3053,7 @@
     "../browser/optimization_guide/optimization_guide_session_statistic_unittest.cc",
     "../browser/optimization_guide/optimization_guide_top_host_provider_unittest.cc",
     "../browser/optimization_guide/prediction/decision_tree_prediction_model_unittest.cc",
+    "../browser/optimization_guide/prediction/prediction_manager_unittest.cc",
     "../browser/optimization_guide/prediction/prediction_model_fetcher_unittest.cc",
     "../browser/optimization_guide/prediction/prediction_model_unittest.cc",
     "../browser/page_load_metrics/metrics_web_contents_observer_unittest.cc",
@@ -3444,6 +3446,7 @@
     ":test_support_unit",
     "//base:base_stack_sampling_profiler_test_util",
     "//base/test:test_support",
+    "//base/util/memory_pressure:test_support",
     "//chrome:browser_dependencies",
     "//chrome:child_dependencies",
     "//chrome:resources",
diff --git a/chrome/test/data/pdf/annotations_feature_disabled_test.js b/chrome/test/data/pdf/annotations_feature_disabled_test.js
index 82851ed..422e574 100644
--- a/chrome/test/data/pdf/annotations_feature_disabled_test.js
+++ b/chrome/test/data/pdf/annotations_feature_disabled_test.js
@@ -12,4 +12,8 @@
     }
     chrome.test.succeed();
   },
+  function testPromiseNotCreated() {
+    chrome.test.assertEq(null, viewer.loaded);
+    chrome.test.succeed();
+  },
 ]);
diff --git a/chrome/test/ppapi/ppapi_browsertest.cc b/chrome/test/ppapi/ppapi_browsertest.cc
index 71782c3..3f418f3 100644
--- a/chrome/test/ppapi/ppapi_browsertest.cc
+++ b/chrome/test/ppapi/ppapi_browsertest.cc
@@ -1058,14 +1058,15 @@
       FailureType failure_type,
       network::mojom::NetworkContext* network_context,
       mojo::PendingReceiver<network::mojom::UDPSocket> socket_receiver,
-      network::mojom::UDPSocketListenerPtr socket_listener)
+      mojo::PendingRemote<network::mojom::UDPSocketListener> socket_listener)
       : failure_type_(failure_type),
         receiver_(this, std::move(socket_receiver)) {
     if (failure_type == FailureType::kDropListenerPipeOnConstruction)
       socket_listener.reset();
-    socket_listener_ = std::move(socket_listener);
+    else
+      socket_listener_.Bind(std::move(socket_listener));
     network_context->CreateUDPSocket(
-        wrapped_socket_.BindNewPipeAndPassReceiver(), nullptr);
+        wrapped_socket_.BindNewPipeAndPassReceiver(), mojo::NullRemote());
     receiver_.set_disconnect_handler(
         base::BindOnce(&WrappedUDPSocket::Close, base::Unretained(this)));
     wrapped_socket_.set_disconnect_handler(
@@ -1173,7 +1174,7 @@
   mojo::Remote<network::mojom::UDPSocket> wrapped_socket_;
 
   // Only populated on certain read FailureTypes.
-  network::mojom::UDPSocketListenerPtr socket_listener_;
+  mojo::Remote<network::mojom::UDPSocketListener> socket_listener_;
 
   DISALLOW_COPY_AND_ASSIGN(WrappedUDPSocket);
 };
@@ -1182,7 +1183,7 @@
     WrappedUDPSocket::FailureType failure_type,
     network::mojom::NetworkContext* network_context,
     mojo::PendingReceiver<network::mojom::UDPSocket> socket_receiver,
-    network::mojom::UDPSocketListenerPtr socket_listener) {
+    mojo::PendingRemote<network::mojom::UDPSocketListener> socket_listener) {
   // This will delete itself when one of its Mojo pipes is closed.
   new WrappedUDPSocket(failure_type, network_context,
                        std::move(socket_receiver), std::move(socket_listener));
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastSysInfoAndroid.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastSysInfoAndroid.java
index d0b1c0c8..45f3829 100644
--- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastSysInfoAndroid.java
+++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastSysInfoAndroid.java
@@ -19,7 +19,7 @@
 
     @SuppressLint("HardwareIds")
     @CalledByNative
-    private static String getSerialNumber() {
+    public static String getSerialNumber() {
         if (!Build.SERIAL.equals(Build.UNKNOWN)) return Build.SERIAL;
         return CastSerialGenerator.getGeneratedSerial();
     }
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 72356e04..13aa39a3 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-12574.0.0
\ No newline at end of file
+12575.0.0
\ No newline at end of file
diff --git a/chromeos/components/sync_wifi/BUILD.gn b/chromeos/components/sync_wifi/BUILD.gn
index f8072c0..73071af6 100644
--- a/chromeos/components/sync_wifi/BUILD.gn
+++ b/chromeos/components/sync_wifi/BUILD.gn
@@ -27,18 +27,32 @@
   ]
 }
 
+source_set("test_support") {
+  testonly = true
+  sources = [
+    "test_data_generator.cc",
+    "test_data_generator.h",
+  ]
+  deps = [
+    ":sync_wifi",
+    "//base/test:test_support",
+    "//components/sync:test_support",
+  ]
+}
+
 source_set("unit_tests") {
   testonly = true
   sources = [
     "network_identifier_unittest.cc",
     "pending_network_configuration_tracker_impl_unittest.cc",
-    "test_specifics_generator.h",
     "wifi_configuration_bridge_unittest.cc",
   ]
   deps = [
     ":sync_wifi",
+    ":test_support",
     "//base/test:test_support",
-    "//chromeos/network:network",
+    "//chromeos/dbus/shill:test_support",
+    "//chromeos/network:test_support",
     "//components/sync:test_support",
     "//components/sync_preferences:test_support",
     "//testing/gtest",
diff --git a/chromeos/components/sync_wifi/network_identifier_unittest.cc b/chromeos/components/sync_wifi/network_identifier_unittest.cc
index d43d4422..5cd9411 100644
--- a/chromeos/components/sync_wifi/network_identifier_unittest.cc
+++ b/chromeos/components/sync_wifi/network_identifier_unittest.cc
@@ -8,7 +8,7 @@
 
 #include "base/strings/string_number_conversions.h"
 #include "chromeos/components/sync_wifi/network_identifier.h"
-#include "chromeos/components/sync_wifi/test_specifics_generator.h"
+#include "chromeos/components/sync_wifi/test_data_generator.h"
 #include "chromeos/network/network_state.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
@@ -28,10 +28,12 @@
 };
 
 TEST_F(NetworkIdentifierTest, FromProto) {
+  NetworkIdentifier expected_id(kHexSsid, shill::kSecurityPsk);
   NetworkIdentifier id =
-      NetworkIdentifier::FromProto(CreateSpecifics(kHexSsid));
+      NetworkIdentifier::FromProto(GenerateTestWifiSpecifics(expected_id));
   EXPECT_EQ(kHexSsid, id.hex_ssid());
   EXPECT_EQ(shill::kSecurityPsk, id.security_type());
+  EXPECT_EQ(expected_id, id);
 }
 
 TEST_F(NetworkIdentifierTest, FromNetwork) {
diff --git a/chromeos/components/sync_wifi/pending_network_configuration_tracker_impl_unittest.cc b/chromeos/components/sync_wifi/pending_network_configuration_tracker_impl_unittest.cc
index 0a4fa4c..5fc1f68 100644
--- a/chromeos/components/sync_wifi/pending_network_configuration_tracker_impl_unittest.cc
+++ b/chromeos/components/sync_wifi/pending_network_configuration_tracker_impl_unittest.cc
@@ -9,7 +9,7 @@
 #include "base/macros.h"
 #include "base/optional.h"
 #include "chromeos/components/sync_wifi/pending_network_configuration_tracker_impl.h"
-#include "chromeos/components/sync_wifi/test_specifics_generator.h"
+#include "chromeos/components/sync_wifi/test_data_generator.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
@@ -80,115 +80,121 @@
     ASSERT_EQ(serialized_specifics_wants, serialized_specifics_has);
   }
 
+  const NetworkIdentifier& fred_network_id() const { return fred_network_id_; }
+
+  const NetworkIdentifier& mango_network_id() const {
+    return mango_network_id_;
+  }
+
  private:
   std::unique_ptr<sync_preferences::TestingPrefServiceSyncable>
       test_pref_service_;
   std::unique_ptr<PendingNetworkConfigurationTrackerImpl> tracker_;
+
+  const NetworkIdentifier fred_network_id_ = GeneratePskNetworkId(kFredSsid);
+  const NetworkIdentifier mango_network_id_ = GeneratePskNetworkId(kMangoSsid);
+
   DISALLOW_COPY_AND_ASSIGN(PendingNetworkConfigurationTrackerImplTest);
 };
 
 TEST_F(PendingNetworkConfigurationTrackerImplTest, TestMarkComplete) {
-  NetworkIdentifier id(kFredSsid, shill::kSecurityPsk);
-  tracker()->TrackPendingUpdate(kChangeGuid1, id,
+  tracker()->TrackPendingUpdate(kChangeGuid1, fred_network_id(),
                                 /*specifics=*/base::nullopt);
-  AssertTrackerHasMatchingUpdate(kChangeGuid1, id);
+  AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_network_id());
   EXPECT_EQ(1u, GetPref()->DictSize());
-  EXPECT_TRUE(DoesPrefContainPendingUpdate(id, kChangeGuid1));
-  tracker()->MarkComplete(kChangeGuid1, id);
-  EXPECT_FALSE(tracker()->GetPendingUpdate(kChangeGuid1, id));
+  EXPECT_TRUE(DoesPrefContainPendingUpdate(fred_network_id(), kChangeGuid1));
+  tracker()->MarkComplete(kChangeGuid1, fred_network_id());
+  EXPECT_FALSE(tracker()->GetPendingUpdate(kChangeGuid1, fred_network_id()));
   EXPECT_EQ(0u, GetPref()->DictSize());
 }
 
 TEST_F(PendingNetworkConfigurationTrackerImplTest, TestTwoChangesSameNetwork) {
-  NetworkIdentifier id(kFredSsid, shill::kSecurityPsk);
-  tracker()->TrackPendingUpdate(kChangeGuid1, id,
+  tracker()->TrackPendingUpdate(kChangeGuid1, fred_network_id(),
                                 /*specifics=*/base::nullopt);
-  tracker()->IncrementCompletedAttempts(kChangeGuid1, id);
-  AssertTrackerHasMatchingUpdate(kChangeGuid1, id,
+  tracker()->IncrementCompletedAttempts(kChangeGuid1, fred_network_id());
+  AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_network_id(),
                                  /*completed_attempts=*/1);
   EXPECT_EQ(1u, GetPref()->DictSize());
-  EXPECT_EQ(
-      1, tracker()->GetPendingUpdate(kChangeGuid1, id)->completed_attempts());
+  EXPECT_EQ(1, tracker()
+                   ->GetPendingUpdate(kChangeGuid1, fred_network_id())
+                   ->completed_attempts());
 
-  tracker()->TrackPendingUpdate(kChangeGuid2, id,
+  tracker()->TrackPendingUpdate(kChangeGuid2, fred_network_id(),
                                 /*specifics=*/base::nullopt);
-  EXPECT_FALSE(tracker()->GetPendingUpdate(kChangeGuid1, id));
-  AssertTrackerHasMatchingUpdate(kChangeGuid2, id);
-  EXPECT_EQ(
-      0, tracker()->GetPendingUpdate(kChangeGuid2, id)->completed_attempts());
+  EXPECT_FALSE(tracker()->GetPendingUpdate(kChangeGuid1, fred_network_id()));
+  AssertTrackerHasMatchingUpdate(kChangeGuid2, fred_network_id());
+  EXPECT_EQ(0, tracker()
+                   ->GetPendingUpdate(kChangeGuid2, fred_network_id())
+                   ->completed_attempts());
   EXPECT_EQ(1u, GetPref()->DictSize());
 }
 
 TEST_F(PendingNetworkConfigurationTrackerImplTest,
        TestTwoChangesDifferentNetworks) {
-  NetworkIdentifier fred_id(kFredSsid, shill::kSecurityPsk);
-  NetworkIdentifier mango_id(kMangoSsid, shill::kSecurityPsk);
-  tracker()->TrackPendingUpdate(kChangeGuid1, fred_id,
+  tracker()->TrackPendingUpdate(kChangeGuid1, fred_network_id(),
                                 /*specifics=*/base::nullopt);
-  AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_id);
-  EXPECT_TRUE(DoesPrefContainPendingUpdate(fred_id, kChangeGuid1));
+  AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_network_id());
+  EXPECT_TRUE(DoesPrefContainPendingUpdate(fred_network_id(), kChangeGuid1));
   EXPECT_EQ(1u, GetPref()->DictSize());
-  tracker()->TrackPendingUpdate(kChangeGuid2, mango_id,
+  tracker()->TrackPendingUpdate(kChangeGuid2, mango_network_id(),
                                 /*specifics=*/base::nullopt);
-  AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_id);
-  AssertTrackerHasMatchingUpdate(kChangeGuid2, mango_id);
-  EXPECT_TRUE(DoesPrefContainPendingUpdate(fred_id, kChangeGuid1));
-  EXPECT_TRUE(DoesPrefContainPendingUpdate(mango_id, kChangeGuid2));
+  AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_network_id());
+  AssertTrackerHasMatchingUpdate(kChangeGuid2, mango_network_id());
+  EXPECT_TRUE(DoesPrefContainPendingUpdate(fred_network_id(), kChangeGuid1));
+  EXPECT_TRUE(DoesPrefContainPendingUpdate(mango_network_id(), kChangeGuid2));
   EXPECT_EQ(2u, GetPref()->DictSize());
 }
 
 TEST_F(PendingNetworkConfigurationTrackerImplTest, TestGetPendingUpdates) {
-  NetworkIdentifier fred_id(kFredSsid, shill::kSecurityPsk);
-  NetworkIdentifier mango_id(kMangoSsid, shill::kSecurityPsk);
-  tracker()->TrackPendingUpdate(kChangeGuid1, fred_id,
+  tracker()->TrackPendingUpdate(kChangeGuid1, fred_network_id(),
                                 /*specifics=*/base::nullopt);
-  tracker()->TrackPendingUpdate(kChangeGuid2, mango_id,
+  tracker()->TrackPendingUpdate(kChangeGuid2, mango_network_id(),
                                 /*specifics=*/base::nullopt);
   std::vector<PendingNetworkConfigurationUpdate> list =
       tracker()->GetPendingUpdates();
   EXPECT_EQ(2u, list.size());
   EXPECT_EQ(kChangeGuid1, list[0].change_guid());
-  EXPECT_EQ(fred_id, list[0].id());
+  EXPECT_EQ(fred_network_id(), list[0].id());
   EXPECT_EQ(kChangeGuid2, list[1].change_guid());
-  EXPECT_EQ(mango_id, list[1].id());
+  EXPECT_EQ(mango_network_id(), list[1].id());
 
-  tracker()->MarkComplete(kChangeGuid1, fred_id);
+  tracker()->MarkComplete(kChangeGuid1, fred_network_id());
   list = tracker()->GetPendingUpdates();
   EXPECT_EQ(1u, list.size());
   EXPECT_EQ(kChangeGuid2, list[0].change_guid());
-  EXPECT_EQ(mango_id, list[0].id());
+  EXPECT_EQ(mango_network_id(), list[0].id());
 }
 
 TEST_F(PendingNetworkConfigurationTrackerImplTest, TestGetPendingUpdate) {
   sync_pb::WifiConfigurationSpecificsData specifics =
-      CreateSpecifics(kFredSsid);
-  NetworkIdentifier fred_id(kFredSsid, shill::kSecurityPsk);
-  NetworkIdentifier mango_id(kMangoSsid, shill::kSecurityPsk);
-  tracker()->TrackPendingUpdate(kChangeGuid1, fred_id, specifics);
+      GenerateTestWifiSpecifics(fred_network_id());
+  tracker()->TrackPendingUpdate(kChangeGuid1, fred_network_id(), specifics);
 
-  AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_id,
+  AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_network_id(),
                                  /*completed_attempts=*/0, specifics);
 
-  EXPECT_FALSE(tracker()->GetPendingUpdate(kChangeGuid2, mango_id));
+  EXPECT_FALSE(tracker()->GetPendingUpdate(kChangeGuid2, mango_network_id()));
 }
 
 TEST_F(PendingNetworkConfigurationTrackerImplTest, TestRetryCounting) {
-  NetworkIdentifier id(kFredSsid, shill::kSecurityPsk);
-  tracker()->TrackPendingUpdate(kChangeGuid1, id,
+  tracker()->TrackPendingUpdate(kChangeGuid1, fred_network_id(),
                                 /*specifics=*/base::nullopt);
-  AssertTrackerHasMatchingUpdate(kChangeGuid1, id);
+  AssertTrackerHasMatchingUpdate(kChangeGuid1, fred_network_id());
   EXPECT_EQ(1u, GetPref()->DictSize());
-  EXPECT_EQ(
-      0, tracker()->GetPendingUpdate(kChangeGuid1, id)->completed_attempts());
-  tracker()->IncrementCompletedAttempts(kChangeGuid1, id);
-  tracker()->IncrementCompletedAttempts(kChangeGuid1, id);
-  tracker()->IncrementCompletedAttempts(kChangeGuid1, id);
-  EXPECT_EQ(
-      3, tracker()->GetPendingUpdate(kChangeGuid1, id)->completed_attempts());
-  tracker()->IncrementCompletedAttempts(kChangeGuid1, id);
-  tracker()->IncrementCompletedAttempts(kChangeGuid1, id);
-  EXPECT_EQ(
-      5, tracker()->GetPendingUpdate(kChangeGuid1, id)->completed_attempts());
+  EXPECT_EQ(0, tracker()
+                   ->GetPendingUpdate(kChangeGuid1, fred_network_id())
+                   ->completed_attempts());
+  tracker()->IncrementCompletedAttempts(kChangeGuid1, fred_network_id());
+  tracker()->IncrementCompletedAttempts(kChangeGuid1, fred_network_id());
+  tracker()->IncrementCompletedAttempts(kChangeGuid1, fred_network_id());
+  EXPECT_EQ(3, tracker()
+                   ->GetPendingUpdate(kChangeGuid1, fred_network_id())
+                   ->completed_attempts());
+  tracker()->IncrementCompletedAttempts(kChangeGuid1, fred_network_id());
+  tracker()->IncrementCompletedAttempts(kChangeGuid1, fred_network_id());
+  EXPECT_EQ(5, tracker()
+                   ->GetPendingUpdate(kChangeGuid1, fred_network_id())
+                   ->completed_attempts());
 }
 
 }  // namespace sync_wifi
diff --git a/chromeos/components/sync_wifi/test_data_generator.cc b/chromeos/components/sync_wifi/test_data_generator.cc
new file mode 100644
index 0000000..5ef91b8
--- /dev/null
+++ b/chromeos/components/sync_wifi/test_data_generator.cc
@@ -0,0 +1,44 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/strings/string_number_conversions.h"
+#include "chromeos/components/sync_wifi/network_identifier.h"
+#include "components/sync/protocol/wifi_configuration_specifics.pb.h"
+#include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
+
+namespace sync_wifi {
+
+NetworkIdentifier GeneratePskNetworkId(const std::string& ssid) {
+  return NetworkIdentifier(base::HexEncode(ssid.data(), ssid.size()),
+                           shill::kSecurityPsk);
+}
+
+sync_pb::WifiConfigurationSpecificsData GenerateTestWifiSpecifics(
+    const NetworkIdentifier& id) {
+  sync_pb::WifiConfigurationSpecificsData specifics;
+  specifics.set_hex_ssid(id.hex_ssid());
+
+  if (id.security_type() == shill::kSecurityPsk) {
+    specifics.set_security_type(
+        sync_pb::WifiConfigurationSpecificsData::SECURITY_TYPE_PSK);
+  } else if (id.security_type() == shill::kSecurityWep) {
+    specifics.set_security_type(
+        sync_pb::WifiConfigurationSpecificsData::SECURITY_TYPE_WEP);
+  } else {
+    NOTREACHED();
+  }
+  specifics.set_passphrase("password");
+  specifics.set_automatically_connect(
+      sync_pb::WifiConfigurationSpecificsData::AUTOMATICALLY_CONNECT_ENABLED);
+  specifics.set_is_preferred(
+      sync_pb::WifiConfigurationSpecificsData::IS_PREFERRED_ENABLED);
+  specifics.set_metered(
+      sync_pb::WifiConfigurationSpecificsData::METERED_OPTION_AUTO);
+  specifics.mutable_proxy_configuration()->set_proxy_option(
+      sync_pb::WifiConfigurationSpecificsData::ProxyConfiguration::
+          PROXY_OPTION_DISABLED);
+  return specifics;
+}
+
+}  // namespace sync_wifi
diff --git a/chromeos/components/sync_wifi/test_data_generator.h b/chromeos/components/sync_wifi/test_data_generator.h
new file mode 100644
index 0000000..328c2d24
--- /dev/null
+++ b/chromeos/components/sync_wifi/test_data_generator.h
@@ -0,0 +1,24 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_COMPONENTS_SYNC_WIFI_TEST_DATA_GENERATOR_H_
+#define CHROMEOS_COMPONENTS_SYNC_WIFI_TEST_DATA_GENERATOR_H_
+
+#include "components/sync/protocol/wifi_configuration_specifics.pb.h"
+
+namespace sync_wifi {
+
+class NetworkIdentifier;
+
+//  Creates a NetworkIdentifier with PSK security for the given |ssid|.
+NetworkIdentifier GeneratePskNetworkId(const std::string& ssid);
+
+// Creates a proto with default values and sets the hex_ssid and security_type
+// based on the input |id|.
+sync_pb::WifiConfigurationSpecificsData GenerateTestWifiSpecifics(
+    const NetworkIdentifier& id);
+
+}  // namespace sync_wifi
+
+#endif  // CHROMEOS_COMPONENTS_SYNC_WIFI_TEST_DATA_GENERATOR_H_
diff --git a/chromeos/components/sync_wifi/test_specifics_generator.h b/chromeos/components/sync_wifi/test_specifics_generator.h
deleted file mode 100644
index 4823931..0000000
--- a/chromeos/components/sync_wifi/test_specifics_generator.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/sync/protocol/wifi_configuration_specifics.pb.h"
-
-#ifndef CHROMEOS_COMPONENTS_SYNC_WIFI_TEST_SPECIFICS_GENERATOR_H_
-#define CHROMEOS_COMPONENTS_SYNC_WIFI_TEST_SPECIFICS_GENERATOR_H_
-
-namespace sync_wifi {
-
-namespace {
-
-sync_pb::WifiConfigurationSpecificsData CreateSpecifics(
-    const std::string& ssid) {
-  sync_pb::WifiConfigurationSpecificsData specifics;
-  specifics.set_hex_ssid(ssid);
-  specifics.set_security_type(
-      sync_pb::WifiConfigurationSpecificsData::SECURITY_TYPE_PSK);
-  specifics.set_passphrase("password");
-  specifics.set_automatically_connect(
-      sync_pb::WifiConfigurationSpecificsData::AUTOMATICALLY_CONNECT_ENABLED);
-  specifics.set_is_preferred(
-      sync_pb::WifiConfigurationSpecificsData::IS_PREFERRED_ENABLED);
-  specifics.set_metered(
-      sync_pb::WifiConfigurationSpecificsData::METERED_OPTION_AUTO);
-  sync_pb::WifiConfigurationSpecificsData_ProxyConfiguration proxy_config;
-  proxy_config.set_proxy_option(sync_pb::WifiConfigurationSpecificsData::
-                                    ProxyConfiguration::PROXY_OPTION_DISABLED);
-  specifics.mutable_proxy_configuration()->CopyFrom(proxy_config);
-  return specifics;
-}
-
-}  // namespace
-
-}  // namespace sync_wifi
-
-#endif  // CHROMEOS_COMPONENTS_SYNC_WIFI_TEST_SPECIFICS_GENERATOR_H_
diff --git a/chromeos/components/sync_wifi/wifi_configuration_bridge.cc b/chromeos/components/sync_wifi/wifi_configuration_bridge.cc
index 99e872c..35adc7a 100644
--- a/chromeos/components/sync_wifi/wifi_configuration_bridge.cc
+++ b/chromeos/components/sync_wifi/wifi_configuration_bridge.cc
@@ -189,12 +189,12 @@
                                           weak_ptr_factory_.GetWeakPtr()));
 }
 
-std::vector<std::string> WifiConfigurationBridge::GetAllSsidsForTesting() {
-  std::vector<std::string> ssids;
+std::vector<NetworkIdentifier> WifiConfigurationBridge::GetAllIdsForTesting() {
+  std::vector<NetworkIdentifier> ids;
   for (const auto& entry : entries_)
-    ssids.push_back(entry.second.hex_ssid());
+    ids.push_back(NetworkIdentifier::FromProto(entry.second));
 
-  return ssids;
+  return ids;
 }
 
 }  // namespace sync_wifi
diff --git a/chromeos/components/sync_wifi/wifi_configuration_bridge.h b/chromeos/components/sync_wifi/wifi_configuration_bridge.h
index f7fe8d95..0877aec9 100644
--- a/chromeos/components/sync_wifi/wifi_configuration_bridge.h
+++ b/chromeos/components/sync_wifi/wifi_configuration_bridge.h
@@ -50,7 +50,7 @@
   std::string GetStorageKey(const syncer::EntityData& entity_data) override;
 
   // Comes from |entries_| the in-memory map.
-  std::vector<std::string> GetAllSsidsForTesting();
+  std::vector<NetworkIdentifier> GetAllIdsForTesting();
 
  private:
   void Commit(std::unique_ptr<syncer::ModelTypeStore::WriteBatch> batch);
diff --git a/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc b/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc
index bc59519..6f6d707 100644
--- a/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc
+++ b/chromeos/components/sync_wifi/wifi_configuration_bridge_unittest.cc
@@ -13,7 +13,7 @@
 #include "base/test/task_environment.h"
 #include "chromeos/components/sync_wifi/network_identifier.h"
 #include "chromeos/components/sync_wifi/synced_network_updater.h"
-#include "chromeos/components/sync_wifi/test_specifics_generator.h"
+#include "chromeos/components/sync_wifi/test_data_generator.h"
 #include "components/sync/model/entity_change.h"
 #include "components/sync/model/metadata_batch.h"
 #include "components/sync/model/mock_model_type_change_processor.h"
@@ -51,20 +51,19 @@
   return entity_data;
 }
 
-bool VectorContainsString(std::vector<std::string> v, std::string s) {
-  return std::find(v.begin(), v.end(), s) != v.end();
+bool ProtoVectorContainsId(
+    const std::vector<sync_pb::WifiConfigurationSpecificsData>& protos,
+    NetworkIdentifier id) {
+  return std::find_if(
+             protos.begin(), protos.end(),
+             [&id](const sync_pb::WifiConfigurationSpecificsData& specifics) {
+               return NetworkIdentifier::FromProto(specifics) == id;
+             }) != protos.end();
 }
 
-bool VectorContainsSsid(
-    const std::vector<sync_pb::WifiConfigurationSpecificsData>& v,
-    std::string s) {
-  for (sync_pb::WifiConfigurationSpecificsData specifics : v) {
-    if (specifics.hex_ssid() == s)
-      return true;
-  }
-  return false;
-}
-
+// Implementation of SyncedNetworkUpdater. This class takes add/update/delete
+// network requests and stores them in its internal data structures without
+// actually updating anything external.
 class TestSyncedNetworkUpdater : public SyncedNetworkUpdater {
  public:
   TestSyncedNetworkUpdater() = default;
@@ -134,6 +133,10 @@
     return synced_network_updater_.get();
   }
 
+  const NetworkIdentifier& woof_network_id() const { return woof_network_id_; }
+
+  const NetworkIdentifier& meow_network_id() const { return meow_network_id_; }
+
  private:
   base::test::TaskEnvironment task_environment_;
 
@@ -145,79 +148,89 @@
 
   std::unique_ptr<TestSyncedNetworkUpdater> synced_network_updater_;
 
+  const NetworkIdentifier woof_network_id_ = GeneratePskNetworkId(kSsidWoof);
+
+  const NetworkIdentifier meow_network_id_ = GeneratePskNetworkId(kSsidMeow);
+
   DISALLOW_COPY_AND_ASSIGN(WifiConfigurationBridgeTest);
 };
 
 TEST_F(WifiConfigurationBridgeTest, InitWithTwoNetworksFromServer) {
   syncer::EntityChangeList remote_input;
 
-  WifiConfigurationSpecificsData entry1 = CreateSpecifics(kSsidMeow);
-  WifiConfigurationSpecificsData entry2 = CreateSpecifics(kSsidWoof);
+  WifiConfigurationSpecificsData entry1 =
+      GenerateTestWifiSpecifics(meow_network_id());
+  WifiConfigurationSpecificsData entry2 =
+      GenerateTestWifiSpecifics(woof_network_id());
 
   remote_input.push_back(syncer::EntityChange::CreateAdd(
-      kSsidMeow, GenerateWifiEntityData(entry1)));
+      meow_network_id().SerializeToString(), GenerateWifiEntityData(entry1)));
   remote_input.push_back(syncer::EntityChange::CreateAdd(
-      kSsidWoof, GenerateWifiEntityData(entry2)));
+      woof_network_id().SerializeToString(), GenerateWifiEntityData(entry2)));
 
   bridge()->MergeSyncData(
       std::make_unique<syncer::InMemoryMetadataChangeList>(),
       std::move(remote_input));
 
-  std::vector<std::string> ssids = bridge()->GetAllSsidsForTesting();
-  EXPECT_EQ(2u, ssids.size());
-  EXPECT_TRUE(VectorContainsString(ssids, kSsidMeow));
-  EXPECT_TRUE(VectorContainsString(ssids, kSsidWoof));
+  std::vector<NetworkIdentifier> ids = bridge()->GetAllIdsForTesting();
+  EXPECT_EQ(2u, ids.size());
+  EXPECT_TRUE(base::Contains(ids, meow_network_id()));
+  EXPECT_TRUE(base::Contains(ids, woof_network_id()));
 
   const std::vector<sync_pb::WifiConfigurationSpecificsData>& networks =
       synced_network_updater()->add_or_update_calls();
   EXPECT_EQ(2u, networks.size());
-  EXPECT_TRUE(VectorContainsSsid(networks, kSsidMeow));
-  EXPECT_TRUE(VectorContainsSsid(networks, kSsidWoof));
+  EXPECT_TRUE(ProtoVectorContainsId(networks, meow_network_id()));
+  EXPECT_TRUE(ProtoVectorContainsId(networks, woof_network_id()));
 }
 
 TEST_F(WifiConfigurationBridgeTest, ApplySyncChangesAddTwoSpecifics) {
-  const WifiConfigurationSpecificsData specifics1 = CreateSpecifics(kSsidMeow);
-  const WifiConfigurationSpecificsData specifics2 = CreateSpecifics(kSsidWoof);
+  const WifiConfigurationSpecificsData specifics1 =
+      GenerateTestWifiSpecifics(meow_network_id());
+  const WifiConfigurationSpecificsData specifics2 =
+      GenerateTestWifiSpecifics(woof_network_id());
 
   base::Optional<syncer::ModelError> error =
       bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(),
                                  CreateEntityAddList({specifics1, specifics2}));
   EXPECT_FALSE(error);
-  std::vector<std::string> ssids = bridge()->GetAllSsidsForTesting();
-  EXPECT_EQ(2u, ssids.size());
-  EXPECT_TRUE(VectorContainsString(ssids, kSsidMeow));
-  EXPECT_TRUE(VectorContainsString(ssids, kSsidWoof));
+  std::vector<NetworkIdentifier> ids = bridge()->GetAllIdsForTesting();
+  EXPECT_EQ(2u, ids.size());
+  EXPECT_TRUE(base::Contains(ids, meow_network_id()));
+  EXPECT_TRUE(base::Contains(ids, woof_network_id()));
 
   const std::vector<sync_pb::WifiConfigurationSpecificsData>& networks =
       synced_network_updater()->add_or_update_calls();
   EXPECT_EQ(2u, networks.size());
-  EXPECT_TRUE(VectorContainsSsid(networks, kSsidMeow));
-  EXPECT_TRUE(VectorContainsSsid(networks, kSsidWoof));
+  EXPECT_TRUE(ProtoVectorContainsId(networks, meow_network_id()));
+  EXPECT_TRUE(ProtoVectorContainsId(networks, woof_network_id()));
 }
 
 TEST_F(WifiConfigurationBridgeTest, ApplySyncChangesOneAdd) {
-  WifiConfigurationSpecificsData entry = CreateSpecifics(kSsidMeow);
+  WifiConfigurationSpecificsData entry =
+      GenerateTestWifiSpecifics(meow_network_id());
 
   syncer::EntityChangeList add_changes;
 
   add_changes.push_back(syncer::EntityChange::CreateAdd(
-      kSsidMeow, GenerateWifiEntityData(entry)));
+      meow_network_id().SerializeToString(), GenerateWifiEntityData(entry)));
 
   bridge()->ApplySyncChanges(
       std::make_unique<syncer::InMemoryMetadataChangeList>(),
       std::move(add_changes));
-  std::vector<std::string> ssids = bridge()->GetAllSsidsForTesting();
-  EXPECT_EQ(1u, ssids.size());
-  EXPECT_TRUE(VectorContainsString(ssids, kSsidMeow));
+  std::vector<NetworkIdentifier> ids = bridge()->GetAllIdsForTesting();
+  EXPECT_EQ(1u, ids.size());
+  EXPECT_TRUE(base::Contains(ids, meow_network_id()));
 
   const std::vector<sync_pb::WifiConfigurationSpecificsData>& networks =
       synced_network_updater()->add_or_update_calls();
   EXPECT_EQ(1u, networks.size());
-  EXPECT_TRUE(VectorContainsSsid(networks, kSsidMeow));
+  EXPECT_TRUE(ProtoVectorContainsId(networks, meow_network_id()));
 }
 
 TEST_F(WifiConfigurationBridgeTest, ApplySyncChangesOneDeletion) {
-  WifiConfigurationSpecificsData entry = CreateSpecifics(kSsidMeow);
+  WifiConfigurationSpecificsData entry =
+      GenerateTestWifiSpecifics(meow_network_id());
   NetworkIdentifier id = NetworkIdentifier::FromProto(entry);
 
   syncer::EntityChangeList add_changes;
@@ -227,14 +240,14 @@
 
   bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(),
                              std::move(add_changes));
-  std::vector<std::string> ssids = bridge()->GetAllSsidsForTesting();
-  EXPECT_EQ(1u, ssids.size());
-  EXPECT_TRUE(VectorContainsString(ssids, kSsidMeow));
+  std::vector<NetworkIdentifier> ids = bridge()->GetAllIdsForTesting();
+  EXPECT_EQ(1u, ids.size());
+  EXPECT_TRUE(base::Contains(ids, meow_network_id()));
 
   const std::vector<sync_pb::WifiConfigurationSpecificsData>& networks =
       synced_network_updater()->add_or_update_calls();
   EXPECT_EQ(1u, networks.size());
-  EXPECT_TRUE(VectorContainsSsid(networks, kSsidMeow));
+  EXPECT_TRUE(ProtoVectorContainsId(networks, meow_network_id()));
 
   syncer::EntityChangeList delete_changes;
   delete_changes.push_back(
@@ -242,7 +255,7 @@
 
   bridge()->ApplySyncChanges(bridge()->CreateMetadataChangeList(),
                              std::move(delete_changes));
-  EXPECT_TRUE(bridge()->GetAllSsidsForTesting().empty());
+  EXPECT_TRUE(bridge()->GetAllIdsForTesting().empty());
 
   const std::vector<NetworkIdentifier>& removed_networks =
       synced_network_updater()->remove_calls();
diff --git a/chromeos/dbus/concierge_client.cc b/chromeos/dbus/concierge_client.cc
index 5220b44..13a37a87 100644
--- a/chromeos/dbus/concierge_client.cc
+++ b/chromeos/dbus/concierge_client.cc
@@ -9,7 +9,6 @@
 
 #include "base/bind.h"
 #include "base/location.h"
-#include "base/observer_list.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "dbus/bus.h"
 #include "dbus/message.h"
@@ -26,6 +25,14 @@
 
   ~ConciergeClientImpl() override = default;
 
+  void AddObserver(Observer* observer) override {
+    observer_list_.AddObserver(observer);
+  }
+
+  void RemoveObserver(Observer* observer) override {
+    observer_list_.RemoveObserver(observer);
+  }
+
   void AddVmObserver(VmObserver* observer) override {
     vm_observer_list_.AddObserver(observer);
   }
@@ -224,6 +231,9 @@
       LOG(ERROR) << "Unable to get dbus proxy for "
                  << concierge::kVmConciergeServiceName;
     }
+    concierge_proxy_->SetNameOwnerChangedCallback(
+        base::BindRepeating(&ConciergeClientImpl::NameOwnerChangedReceived,
+                            weak_ptr_factory_.GetWeakPtr()));
     concierge_proxy_->ConnectToSignal(
         concierge::kVmConciergeInterface, concierge::kVmStartedSignal,
         base::BindRepeating(&ConciergeClientImpl::OnVmStartedSignal,
@@ -291,6 +301,17 @@
     std::move(callback).Run(std::move(reponse_proto));
   }
 
+  void NameOwnerChangedReceived(const std::string& old_owner,
+                                const std::string& new_owner) {
+    const bool restarted = !new_owner.empty();
+    for (auto& observer : observer_list_) {
+      if (restarted)
+        observer.ConciergeServiceRestarted();
+      else
+        observer.ConciergeServiceStopped();
+    }
+  }
+
   void OnVmStartedSignal(dbus::Signal* signal) {
     DCHECK_EQ(signal->GetInterface(), concierge::kVmConciergeInterface);
     DCHECK_EQ(signal->GetMember(), concierge::kVmStartedSignal);
@@ -375,6 +396,7 @@
 
   dbus::ObjectProxy* concierge_proxy_ = nullptr;
 
+  base::ObserverList<Observer> observer_list_;
   base::ObserverList<VmObserver>::Unchecked vm_observer_list_;
   base::ObserverList<ContainerObserver>::Unchecked container_observer_list_;
   base::ObserverList<DiskImageObserver>::Unchecked disk_image_observer_list_;
diff --git a/chromeos/dbus/concierge_client.h b/chromeos/dbus/concierge_client.h
index 7982e4f6..3c1e2f84 100644
--- a/chromeos/dbus/concierge_client.h
+++ b/chromeos/dbus/concierge_client.h
@@ -9,6 +9,7 @@
 
 #include "base/component_export.h"
 #include "base/files/scoped_file.h"
+#include "base/observer_list.h"
 #include "chromeos/dbus/concierge/service.pb.h"
 #include "chromeos/dbus/dbus_client.h"
 #include "chromeos/dbus/dbus_method_call_status.h"
@@ -20,6 +21,15 @@
 // start and stop VMs, as well as for disk image management.
 class COMPONENT_EXPORT(CHROMEOS_DBUS) ConciergeClient : public DBusClient {
  public:
+  // Used for observing Concierge service itself.
+  class Observer : public base::CheckedObserver {
+   public:
+    // Called when Concierge service exits.
+    virtual void ConciergeServiceStopped() = 0;
+    // Called when Concierge service is either started or restarted.
+    virtual void ConciergeServiceRestarted() = 0;
+  };
+
   // Used for observing VMs starting and stopping.
   class VmObserver {
    public:
@@ -63,6 +73,11 @@
     virtual ~DiskImageObserver() = default;
   };
 
+  // Adds an observer for monitoring Concierge service.
+  virtual void AddObserver(Observer* observer) = 0;
+  // Removes an observer if added.
+  virtual void RemoveObserver(Observer* observer) = 0;
+
   // Adds an observer for VM start and stop.
   virtual void AddVmObserver(VmObserver* observer) = 0;
   // Removes an observer if added.
diff --git a/chromeos/dbus/fake_concierge_client.cc b/chromeos/dbus/fake_concierge_client.cc
index 6adf915..9f1da684 100644
--- a/chromeos/dbus/fake_concierge_client.cc
+++ b/chromeos/dbus/fake_concierge_client.cc
@@ -18,6 +18,14 @@
 }
 FakeConciergeClient::~FakeConciergeClient() = default;
 
+void FakeConciergeClient::AddObserver(Observer* observer) {
+  observer_list_.AddObserver(observer);
+}
+
+void FakeConciergeClient::RemoveObserver(Observer* observer) {
+  observer_list_.RemoveObserver(observer);
+}
+
 void FakeConciergeClient::AddVmObserver(VmObserver* observer) {
   vm_observer_list_.AddObserver(observer);
 }
diff --git a/chromeos/dbus/fake_concierge_client.h b/chromeos/dbus/fake_concierge_client.h
index 5baf99e..8a169f6 100644
--- a/chromeos/dbus/fake_concierge_client.h
+++ b/chromeos/dbus/fake_concierge_client.h
@@ -22,6 +22,8 @@
   ~FakeConciergeClient() override;
 
   // ConciergeClient:
+  void AddObserver(Observer* observer) override;
+  void RemoveObserver(Observer* observer) override;
   void AddVmObserver(VmObserver* observer) override;
   void RemoveVmObserver(VmObserver* observer) override;
   void AddContainerObserver(ContainerObserver* observer) override;
@@ -277,6 +279,8 @@
   std::vector<vm_tools::concierge::DiskImageStatusResponse>
       disk_image_status_signals_;
 
+  base::ObserverList<Observer> observer_list_;
+
   base::ObserverList<VmObserver>::Unchecked vm_observer_list_;
 
   base::ObserverList<ContainerObserver>::Unchecked container_observer_list_;
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc
index 4d18717..5738c94 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.cc
+++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -1168,27 +1168,7 @@
   if (assistant_state()->arc_play_store_enabled().has_value())
     SetArcPlayStoreEnabled(assistant_state()->arc_play_store_enabled().value());
 
-  if (assistant::features::IsAlarmTimerManagerEnabled()) {
-    RegisterAlarmsTimersListener();
-  }
-}
-
-void AssistantManagerServiceImpl::OnTimerSoundingStarted() {
-  if (assistant::features::IsAlarmTimerManagerEnabled())
-    return;
-
-  ENSURE_MAIN_THREAD(&AssistantManagerServiceImpl::OnTimerSoundingStarted);
-  if (assistant_alarm_timer_controller())
-    assistant_alarm_timer_controller()->OnTimerSoundingStarted();
-}
-
-void AssistantManagerServiceImpl::OnTimerSoundingFinished() {
-  if (assistant::features::IsAlarmTimerManagerEnabled())
-    return;
-
-  ENSURE_MAIN_THREAD(&AssistantManagerServiceImpl::OnTimerSoundingFinished);
-  if (assistant_alarm_timer_controller())
-    assistant_alarm_timer_controller()->OnTimerSoundingFinished();
+  RegisterAlarmsTimersListener();
 }
 
 void AssistantManagerServiceImpl::OnAndroidAppListRefreshed(
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.h b/chromeos/services/assistant/assistant_manager_service_impl.h
index dd0747c..3aa5c20 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.h
+++ b/chromeos/services/assistant/assistant_manager_service_impl.h
@@ -190,8 +190,6 @@
 
   // assistant_client::DeviceStateListener overrides:
   void OnStartFinished() override;
-  void OnTimerSoundingStarted() override;
-  void OnTimerSoundingFinished() override;
 
   // mojom::AppListEventSubscriber overrides:
   void OnAndroidAppListRefreshed(
diff --git a/chromeos/services/assistant/public/features.cc b/chromeos/services/assistant/public/features.cc
index feb43c5..588eee7a 100644
--- a/chromeos/services/assistant/public/features.cc
+++ b/chromeos/services/assistant/public/features.cc
@@ -55,19 +55,10 @@
 const base::Feature kEnableStereoAudioInput{"AssistantEnableStereoAudioInput",
                                             base::FEATURE_DISABLED_BY_DEFAULT};
 
-const base::Feature kTimerNotification{"ChromeOSAssistantTimerNotification",
-                                       base::FEATURE_ENABLED_BY_DEFAULT};
-
 const base::Feature kEnableTextQueriesWithClientDiscourseContext{
     "AssistantEnableTextQueriesWithClientDiscourseContext",
     base::FEATURE_DISABLED_BY_DEFAULT};
 
-const base::Feature kTimerTicks{"ChromeOSAssistantTimerTicks",
-                                base::FEATURE_ENABLED_BY_DEFAULT};
-
-const base::Feature kEnableAssistantAlarmTimerManager{
-    "EnableAssistantAlarmTimerManager", base::FEATURE_ENABLED_BY_DEFAULT};
-
 const base::Feature kEnablePowerManager{"ChromeOSAssistantEnablePowerManager",
                                         base::FEATURE_DISABLED_BY_DEFAULT};
 
@@ -94,10 +85,6 @@
       kAssistantProactiveSuggestionsTimeoutThresholdMillis.Get());
 }
 
-bool IsAlarmTimerManagerEnabled() {
-  return base::FeatureList::IsEnabled(kEnableAssistantAlarmTimerManager);
-}
-
 bool IsAppSupportEnabled() {
   return base::FeatureList::IsEnabled(
       assistant::features::kAssistantAppSupport);
@@ -153,17 +140,6 @@
          base::FeatureList::IsEnabled(kAssistantAudioEraser);
 }
 
-bool IsTimerNotificationEnabled() {
-  return base::FeatureList::IsEnabled(kTimerNotification);
-}
-
-bool IsTimerTicksEnabled() {
-  // The timer ticks feature is dependent on new notification add/remove logic
-  // that is tied to new events delivered from the AlarmTimerManager API.
-  return IsAlarmTimerManagerEnabled() &&
-         base::FeatureList::IsEnabled(kTimerTicks);
-}
-
 bool IsWarmerWelcomeEnabled() {
   return base::FeatureList::IsEnabled(kAssistantWarmerWelcomeFeature);
 }
diff --git a/chromeos/services/assistant/public/features.h b/chromeos/services/assistant/public/features.h
index 60cc77f..5a37623 100644
--- a/chromeos/services/assistant/public/features.h
+++ b/chromeos/services/assistant/public/features.h
@@ -77,14 +77,6 @@
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
 extern const base::Feature kEnableStereoAudioInput;
 
-// Enables timer notifications.
-COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
-extern const base::Feature kTimerNotification;
-
-// Enables Assistant alarm timer manager integration.
-COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
-extern const base::Feature kEnableAssistantAlarmTimerManager;
-
 // Enables power management features i.e. Wake locks and wake up alarms.
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
 extern const base::Feature kEnablePowerManager;
@@ -93,14 +85,6 @@
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
 extern const base::Feature kEnableTextQueriesWithClientDiscourseContext;
 
-// Enables timer ticks. This feature causes alarms/timers tracked by the
-// AssistantAlarmTimerController to tick at a fixed interval, delivering updates
-// to AssistantAlarmTimerModelObservers of time remaining/elapsed since expiry.
-// When enabled in conjunction with |kTimerNotification|, Assistant alarm/timer
-// notifications will be updated at each tick.
-COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
-extern const base::Feature kTimerTicks;
-
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
 int GetProactiveSuggestionsMaxWidth();
 
@@ -110,8 +94,6 @@
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
 base::TimeDelta GetProactiveSuggestionsTimeoutThreshold();
 
-COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsAlarmTimerManagerEnabled();
-
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsAppSupportEnabled();
 
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsAudioEraserEnabled();
@@ -143,10 +125,6 @@
 
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsStereoAudioInputEnabled();
 
-COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsTimerNotificationEnabled();
-
-COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsTimerTicksEnabled();
-
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsWarmerWelcomeEnabled();
 
 }  // namespace features
diff --git a/chromeos/services/assistant/service.cc b/chromeos/services/assistant/service.cc
index 3468381..38d6fb9 100644
--- a/chromeos/services/assistant/service.cc
+++ b/chromeos/services/assistant/service.cc
@@ -476,11 +476,9 @@
     BindAssistant(remote_for_controller.InitWithNewPipeAndPassReceiver());
     assistant_controller_->SetAssistant(std::move(remote_for_controller));
 
-    if (features::IsTimerNotificationEnabled()) {
-      // Bind to the AssistantAlarmTimerController in ash.
-      client_->RequestAssistantAlarmTimerController(
-          assistant_alarm_timer_controller_.BindNewPipeAndPassReceiver());
-    }
+    // Bind to the AssistantAlarmTimerController in ash.
+    client_->RequestAssistantAlarmTimerController(
+        assistant_alarm_timer_controller_.BindNewPipeAndPassReceiver());
 
     // Bind to the AssistantNotificationController in ash.
     client_->RequestAssistantNotificationController(
diff --git a/components/arc/video_accelerator/arc_video_accelerator_util.cc b/components/arc/video_accelerator/arc_video_accelerator_util.cc
index 3e463f3d..0faa20a 100644
--- a/components/arc/video_accelerator/arc_video_accelerator_util.cc
+++ b/components/arc/video_accelerator/arc_video_accelerator_util.cc
@@ -4,82 +4,17 @@
 
 #include "components/arc/video_accelerator/arc_video_accelerator_util.h"
 
-#include <sys/types.h>
-#include <unistd.h>
-
 #include "base/files/file_util.h"
 #include "base/files/platform_file.h"
 #include "base/numerics/checked_math.h"
 #include "base/numerics/safe_conversions.h"
 #include "media/base/video_frame.h"
+#include "media/gpu/buffer_validation.h"
 #include "media/gpu/macros.h"
 #include "mojo/public/cpp/system/platform_handle.h"
 
 namespace arc {
 
-namespace {
-
-bool VerifyGpuMemoryBufferHandle(media::VideoPixelFormat pixel_format,
-                                 const gfx::Size& coded_size,
-                                 const gfx::GpuMemoryBufferHandle& gmb_handle) {
-  if (gmb_handle.type != gfx::NATIVE_PIXMAP) {
-    VLOGF(1) << "Unexpected GpuMemoryBufferType: " << gmb_handle.type;
-    return false;
-  }
-
-  const size_t num_planes = media::VideoFrame::NumPlanes(pixel_format);
-  if (num_planes != gmb_handle.native_pixmap_handle.planes.size() ||
-      num_planes == 0) {
-    VLOGF(1) << "Invalid number of dmabuf planes passed: "
-             << gmb_handle.native_pixmap_handle.planes.size()
-             << ", expected: " << num_planes;
-    return false;
-  }
-
-  // Strides monotonically decrease.
-  for (size_t i = 1; i < num_planes; i++) {
-    if (gmb_handle.native_pixmap_handle.planes[i - 1].stride <
-        gmb_handle.native_pixmap_handle.planes[i].stride) {
-      return false;
-    }
-  }
-
-  for (size_t i = 0; i < num_planes; i++) {
-    const auto& plane = gmb_handle.native_pixmap_handle.planes[i];
-    DVLOGF(4) << "Plane " << i << ", offset: " << plane.offset
-              << ", stride: " << plane.stride;
-
-    size_t file_size_in_bytes;
-    if (!plane.fd.is_valid() ||
-        !GetFileSize(plane.fd.get(), &file_size_in_bytes))
-      return false;
-
-    size_t plane_height =
-        media::VideoFrame::Rows(i, pixel_format, coded_size.height());
-    base::CheckedNumeric<size_t> min_plane_size =
-        base::CheckMul(plane.stride, plane_height);
-    if (!min_plane_size.IsValid() || min_plane_size.ValueOrDie() > plane.size) {
-      VLOGF(1) << "Invalid strides/sizes";
-      return false;
-    }
-
-    // Check |offset| + (the size of a plane) on each plane is not larger than
-    // |file_size_in_bytes|. This ensures we don't access out of a buffer
-    // referred by |fd|.
-    base::CheckedNumeric<size_t> min_buffer_size =
-        base::CheckAdd(plane.offset, plane.size);
-    if (!min_buffer_size.IsValid() ||
-        min_buffer_size.ValueOrDie() > file_size_in_bytes) {
-      VLOGF(1) << "Invalid strides/offsets";
-      return false;
-    }
-  }
-
-  return true;
-}
-
-}  // namespace
-
 base::ScopedFD UnwrapFdFromMojoHandle(mojo::ScopedHandle handle) {
   if (!handle.is_valid()) {
     VLOGF(1) << "Handle is invalid";
@@ -97,31 +32,6 @@
   return base::ScopedFD(platform_file);
 }
 
-bool GetFileSize(const int fd, size_t* size) {
-  if (fd < 0) {
-    VLOGF(1) << "Invalid file descriptor";
-    return false;
-  }
-
-  off_t fd_size = lseek(fd, 0, SEEK_END);
-  lseek(fd, 0, SEEK_SET);
-  if (fd_size < 0u) {
-    VPLOGF(1) << "Fail to find the size of fd";
-    return false;
-  }
-
-  if (!base::IsValueInRangeForNumericType<size_t>(fd_size)) {
-    VLOGF(1) << "fd_size is out of range of size_t"
-             << ", size=" << size
-             << ", size_t max=" << std::numeric_limits<size_t>::max()
-             << ", size_t min=" << std::numeric_limits<size_t>::min();
-    return false;
-  }
-
-  *size = static_cast<size_t>(fd_size);
-  return true;
-}
-
 std::vector<base::ScopedFD> DuplicateFD(base::ScopedFD fd, size_t num_fds) {
   if (!fd.is_valid()) {
     VLOGF(1) << "Input fd is not valid";
@@ -204,8 +114,9 @@
         stride, offset, size, std::move(scoped_fds[i]));
   }
 
-  if (!VerifyGpuMemoryBufferHandle(pixel_format, coded_size, gmb_handle))
+  if (!media::VerifyGpuMemoryBufferHandle(pixel_format, coded_size, gmb_handle))
     return base::nullopt;
+
   return gmb_handle;
 }
 
diff --git a/components/arc/video_accelerator/arc_video_accelerator_util.h b/components/arc/video_accelerator/arc_video_accelerator_util.h
index d832c08..28d6730f 100644
--- a/components/arc/video_accelerator/arc_video_accelerator_util.h
+++ b/components/arc/video_accelerator/arc_video_accelerator_util.h
@@ -23,9 +23,6 @@
 // Returns invalid ScopedFD on failure.
 base::ScopedFD UnwrapFdFromMojoHandle(mojo::ScopedHandle handle);
 
-// Return the file size of |fd| in bytes.
-bool GetFileSize(const int fd, size_t* size);
-
 // Return a list of duplicated |fd|. The size of list is |num_fds|. Return an
 // empty list if duplicatation fails.
 std::vector<base::ScopedFD> DuplicateFD(base::ScopedFD fd, size_t num_fds);
diff --git a/components/arc/video_accelerator/decoder_buffer.cc b/components/arc/video_accelerator/decoder_buffer.cc
index e06bd23c..9ad9a72 100644
--- a/components/arc/video_accelerator/decoder_buffer.cc
+++ b/components/arc/video_accelerator/decoder_buffer.cc
@@ -11,6 +11,7 @@
 #include "base/unguessable_token.h"
 #include "components/arc/video_accelerator/arc_video_accelerator_util.h"
 #include "media/base/decoder_buffer.h"
+#include "media/gpu/buffer_validation.h"
 
 namespace arc {
 
@@ -52,7 +53,8 @@
   }
 
   size_t file_size = 0;
-  if (!GetFileSize(handle_fd.get(), &file_size) || file_size < required_size) {
+  if (!media::GetFileSize(handle_fd.get(), &file_size) ||
+      file_size < required_size) {
     VLOG(1) << "File size(" << file_size << ") is smaller than required size("
             << required_size << ").";
     return nullptr;
diff --git a/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc b/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc
index ba07a3dc..fdb58e3 100644
--- a/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc
+++ b/components/arc/video_accelerator/gpu_arc_video_decode_accelerator.cc
@@ -13,6 +13,7 @@
 #include "components/arc/video_accelerator/protected_buffer_manager.h"
 #include "media/base/video_frame.h"
 #include "media/base/video_types.h"
+#include "media/gpu/buffer_validation.h"
 #include "media/gpu/gpu_video_decode_accelerator_factory.h"
 #include "media/gpu/macros.h"
 #include "mojo/public/cpp/system/platform_handle.h"
@@ -370,7 +371,7 @@
     }
   } else {
     size_t handle_size;
-    if (!GetFileSize(handle_fd.get(), &handle_size)) {
+    if (!media::GetFileSize(handle_fd.get(), &handle_size)) {
       client_->NotifyError(
           mojom::VideoDecodeAccelerator::Result::INVALID_ARGUMENT);
       return;
diff --git a/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc b/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc
index 1e51c700..8641d543 100644
--- a/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc
+++ b/components/arc/video_accelerator/gpu_arc_video_encode_accelerator.cc
@@ -17,6 +17,7 @@
 #include "media/base/color_plane_layout.h"
 #include "media/base/format_utils.h"
 #include "media/base/video_types.h"
+#include "media/gpu/buffer_validation.h"
 #include "media/gpu/gpu_video_encode_accelerator_factory.h"
 #include "media/gpu/macros.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
@@ -330,7 +331,7 @@
   }
 
   size_t shmem_size;
-  if (!GetFileSize(fd.get(), &shmem_size)) {
+  if (!media::GetFileSize(fd.get(), &shmem_size)) {
     client_->NotifyError(Error::kInvalidArgumentError);
     return;
   }
diff --git a/components/autofill/core/common/form_data.cc b/components/autofill/core/common/form_data.cc
index 4df9e97..8f7ab442 100644
--- a/components/autofill/core/common/form_data.cc
+++ b/components/autofill/core/common/form_data.cc
@@ -70,15 +70,21 @@
 }  // namespace
 
 FormData::FormData() = default;
+
 FormData::FormData(const FormData&) = default;
+
 FormData& FormData::operator=(const FormData&) = default;
+
 FormData::FormData(FormData&&) = default;
+
 FormData& FormData::operator=(FormData&&) = default;
+
 FormData::~FormData() = default;
 
 bool FormData::SameFormAs(const FormData& form) const {
-  if (name != form.name || url != form.url || action != form.action ||
-      is_form_tag != form.is_form_tag ||
+  if (name != form.name || id_attribute != form.id_attribute ||
+      name_attribute != form.name_attribute || url != form.url ||
+      action != form.action || is_form_tag != form.is_form_tag ||
       is_formless_checkout != form.is_formless_checkout ||
       fields.size() != form.fields.size())
     return false;
@@ -90,8 +96,9 @@
 }
 
 bool FormData::SimilarFormAs(const FormData& form) const {
-  if (name != form.name || url != form.url || action != form.action ||
-      is_form_tag != form.is_form_tag ||
+  if (name != form.name || id_attribute != form.id_attribute ||
+      name_attribute != form.name_attribute || url != form.url ||
+      action != form.action || is_form_tag != form.is_form_tag ||
       is_formless_checkout != form.is_formless_checkout ||
       fields.size() != form.fields.size())
     return false;
@@ -103,7 +110,9 @@
 }
 
 bool FormData::DynamicallySameFormAs(const FormData& form) const {
-  if (name != form.name || fields.size() != form.fields.size())
+  if (name != form.name || id_attribute != form.id_attribute ||
+      name_attribute != form.name_attribute ||
+      fields.size() != form.fields.size())
     return false;
   for (size_t i = 0; i < fields.size(); ++i) {
     if (!fields[i].DynamicallySameFieldAs(form.fields[i]))
@@ -113,7 +122,9 @@
 }
 
 bool FormData::operator==(const FormData& form) const {
-  return name == form.name && url == form.url && action == form.action &&
+  return name == form.name && id_attribute == form.id_attribute &&
+         name_attribute == form.name_attribute && url == form.url &&
+         action == form.action &&
          unique_renderer_id == form.unique_renderer_id &&
          submission_event == form.submission_event &&
          is_form_tag == form.is_form_tag &&
@@ -127,10 +138,11 @@
 }
 
 bool FormData::operator<(const FormData& form) const {
-  return std::tie(name, url, action, is_form_tag, is_formless_checkout,
-                  fields) < std::tie(form.name, form.url, form.action,
-                                     form.is_form_tag,
-                                     form.is_formless_checkout, form.fields);
+  return std::tie(name, id_attribute, name_attribute, url, action, is_form_tag,
+                  is_formless_checkout, fields) <
+         std::tie(form.name, form.id_attribute, form.name_attribute, form.url,
+                  form.action, form.is_form_tag, form.is_formless_checkout,
+                  form.fields);
 }
 
 std::ostream& operator<<(std::ostream& os, const FormData& form) {
diff --git a/components/autofill/core/common/form_data_predictions.cc b/components/autofill/core/common/form_data_predictions.cc
index 9c71a97..bc97e87 100644
--- a/components/autofill/core/common/form_data_predictions.cc
+++ b/components/autofill/core/common/form_data_predictions.cc
@@ -6,23 +6,24 @@
 
 namespace autofill {
 
-FormDataPredictions::FormDataPredictions() {
-}
+FormDataPredictions::FormDataPredictions() = default;
 
-FormDataPredictions::FormDataPredictions(const FormDataPredictions& other)
-    : data(other.data),
-      signature(other.signature),
-      fields(other.fields) {
-}
+FormDataPredictions::FormDataPredictions(const FormDataPredictions&) = default;
 
-FormDataPredictions::~FormDataPredictions() {
-}
+FormDataPredictions& FormDataPredictions::operator=(
+    const FormDataPredictions&) = default;
+
+FormDataPredictions::FormDataPredictions(FormDataPredictions&&) = default;
+
+FormDataPredictions& FormDataPredictions::operator=(FormDataPredictions&&) =
+    default;
+
+FormDataPredictions::~FormDataPredictions() = default;
 
 bool FormDataPredictions::operator==(
     const FormDataPredictions& predictions) const {
   return (data.SameFormAs(predictions.data) &&
-          signature == predictions.signature &&
-          fields == predictions.fields);
+          signature == predictions.signature && fields == predictions.fields);
 }
 
 bool FormDataPredictions::operator!=(
diff --git a/components/autofill/core/common/form_data_predictions.h b/components/autofill/core/common/form_data_predictions.h
index 164778a5..cc5f9cf 100644
--- a/components/autofill/core/common/form_data_predictions.h
+++ b/components/autofill/core/common/form_data_predictions.h
@@ -23,7 +23,10 @@
   std::vector<FormFieldDataPredictions> fields;
 
   FormDataPredictions();
-  FormDataPredictions(const FormDataPredictions& other);
+  FormDataPredictions(const FormDataPredictions&);
+  FormDataPredictions& operator=(const FormDataPredictions&);
+  FormDataPredictions(FormDataPredictions&&);
+  FormDataPredictions& operator=(FormDataPredictions&&);
   ~FormDataPredictions();
 
   // Added for the sake of testing.
diff --git a/components/autofill/core/common/form_field_data.cc b/components/autofill/core/common/form_field_data.cc
index fd68782..1a804330 100644
--- a/components/autofill/core/common/form_field_data.cc
+++ b/components/autofill/core/common/form_field_data.cc
@@ -144,7 +144,13 @@
 
 FormFieldData::FormFieldData() = default;
 
-FormFieldData::FormFieldData(const FormFieldData& other) = default;
+FormFieldData::FormFieldData(const FormFieldData&) = default;
+
+FormFieldData& FormFieldData::operator=(const FormFieldData&) = default;
+
+FormFieldData::FormFieldData(FormFieldData&&) = default;
+
+FormFieldData& FormFieldData::operator=(FormFieldData&&) = default;
 
 FormFieldData::~FormFieldData() = default;
 
diff --git a/components/autofill/core/common/form_field_data.h b/components/autofill/core/common/form_field_data.h
index c343c454..605f9e0 100644
--- a/components/autofill/core/common/form_field_data.h
+++ b/components/autofill/core/common/form_field_data.h
@@ -18,7 +18,7 @@
 namespace base {
 class Pickle;
 class PickleIterator;
-}
+}  // namespace base
 
 namespace autofill {
 
@@ -61,7 +61,10 @@
       std::numeric_limits<uint32_t>::max();
 
   FormFieldData();
-  FormFieldData(const FormFieldData& other);
+  FormFieldData(const FormFieldData&);
+  FormFieldData& operator=(const FormFieldData&);
+  FormFieldData(FormFieldData&&);
+  FormFieldData& operator=(FormFieldData&&);
   ~FormFieldData();
 
   // Returns true if two form fields are the same, not counting the value.
diff --git a/components/autofill/core/common/form_field_data_predictions.cc b/components/autofill/core/common/form_field_data_predictions.cc
index 9109fcfd..46e8bd2 100644
--- a/components/autofill/core/common/form_field_data_predictions.cc
+++ b/components/autofill/core/common/form_field_data_predictions.cc
@@ -6,21 +6,21 @@
 
 namespace autofill {
 
-FormFieldDataPredictions::FormFieldDataPredictions() {
-}
+FormFieldDataPredictions::FormFieldDataPredictions() = default;
 
 FormFieldDataPredictions::FormFieldDataPredictions(
-    const FormFieldDataPredictions& other)
-    : field(other.field),
-      signature(other.signature),
-      heuristic_type(other.heuristic_type),
-      server_type(other.server_type),
-      overall_type(other.overall_type),
-      parseable_name(other.parseable_name),
-      section(other.section) {}
+    const FormFieldDataPredictions&) = default;
 
-FormFieldDataPredictions::~FormFieldDataPredictions() {
-}
+FormFieldDataPredictions& FormFieldDataPredictions::operator=(
+    const FormFieldDataPredictions&) = default;
+
+FormFieldDataPredictions::FormFieldDataPredictions(FormFieldDataPredictions&&) =
+    default;
+
+FormFieldDataPredictions& FormFieldDataPredictions::operator=(
+    FormFieldDataPredictions&&) = default;
+
+FormFieldDataPredictions::~FormFieldDataPredictions() = default;
 
 bool FormFieldDataPredictions::operator==(
     const FormFieldDataPredictions& predictions) const {
diff --git a/components/autofill/core/common/form_field_data_predictions.h b/components/autofill/core/common/form_field_data_predictions.h
index baeb68b..1792ddc 100644
--- a/components/autofill/core/common/form_field_data_predictions.h
+++ b/components/autofill/core/common/form_field_data_predictions.h
@@ -15,7 +15,10 @@
 // Stores information about a field in a form.
 struct FormFieldDataPredictions {
   FormFieldDataPredictions();
-  FormFieldDataPredictions(const FormFieldDataPredictions& other);
+  FormFieldDataPredictions(const FormFieldDataPredictions&);
+  FormFieldDataPredictions& operator=(const FormFieldDataPredictions&);
+  FormFieldDataPredictions(FormFieldDataPredictions&&);
+  FormFieldDataPredictions& operator=(FormFieldDataPredictions&&);
   ~FormFieldDataPredictions();
 
   FormFieldData field;
diff --git a/components/autofill/core/common/password_form_fill_data.cc b/components/autofill/core/common/password_form_fill_data.cc
index db08ce0..360a7156 100644
--- a/components/autofill/core/common/password_form_fill_data.cc
+++ b/components/autofill/core/common/password_form_fill_data.cc
@@ -75,7 +75,15 @@
   }
 }
 
-PasswordFormFillData::PasswordFormFillData(const PasswordFormFillData& other) =
+PasswordFormFillData::PasswordFormFillData(const PasswordFormFillData&) =
+    default;
+
+PasswordFormFillData& PasswordFormFillData::operator=(
+    const PasswordFormFillData&) = default;
+
+PasswordFormFillData::PasswordFormFillData(PasswordFormFillData&&) = default;
+
+PasswordFormFillData& PasswordFormFillData::operator=(PasswordFormFillData&&) =
     default;
 
 PasswordFormFillData::~PasswordFormFillData() = default;
diff --git a/components/autofill/core/common/password_form_fill_data.h b/components/autofill/core/common/password_form_fill_data.h
index dfe6586f..8b3061e 100644
--- a/components/autofill/core/common/password_form_fill_data.h
+++ b/components/autofill/core/common/password_form_fill_data.h
@@ -38,8 +38,10 @@
       const PasswordForm& preferred_match,
       bool wait_for_username);
 
-  PasswordFormFillData(const PasswordFormFillData& other);
-
+  PasswordFormFillData(const PasswordFormFillData&);
+  PasswordFormFillData& operator=(const PasswordFormFillData&);
+  PasswordFormFillData(PasswordFormFillData&&);
+  PasswordFormFillData& operator=(PasswordFormFillData&&);
   ~PasswordFormFillData();
 
   // If |has_renderer_ids| == true then |form_renderer_id| contains the unique
@@ -89,7 +91,6 @@
   // TODO(https://crbug.com/831123): Remove this field when old parsing is
   // removed and filling by renderer ids is by default.
   bool has_renderer_ids = false;
-
 };
 
 // If |data.wait_for_username| is set, the renderer does not need to receive
diff --git a/components/dom_distiller/core/BUILD.gn b/components/dom_distiller/core/BUILD.gn
index 215a0309b..7d6ac95 100644
--- a/components/dom_distiller/core/BUILD.gn
+++ b/components/dom_distiller/core/BUILD.gn
@@ -88,8 +88,6 @@
 static_library("test_support") {
   testonly = true
   sources = [
-    "dom_distiller_test_util.cc",
-    "dom_distiller_test_util.h",
     "fake_distiller.cc",
     "fake_distiller.h",
     "fake_distiller_page.cc",
@@ -133,7 +131,6 @@
     "dom_distiller_model_unittest.cc",
     "dom_distiller_request_view_base_unittest.cc",
     "dom_distiller_service_unittest.cc",
-    "dom_distiller_store_unittest.cc",
     "page_features_unittest.cc",
     "task_tracker_unittest.cc",
     "url_utils_unittest.cc",
diff --git a/components/dom_distiller/core/dom_distiller_service_unittest.cc b/components/dom_distiller/core/dom_distiller_service_unittest.cc
index c88a344..bb9c859 100644
--- a/components/dom_distiller/core/dom_distiller_service_unittest.cc
+++ b/components/dom_distiller/core/dom_distiller_service_unittest.cc
@@ -15,15 +15,12 @@
 #include "components/dom_distiller/core/distilled_page_prefs.h"
 #include "components/dom_distiller/core/dom_distiller_model.h"
 #include "components/dom_distiller/core/dom_distiller_store.h"
-#include "components/dom_distiller/core/dom_distiller_test_util.h"
 #include "components/dom_distiller/core/fake_distiller.h"
 #include "components/dom_distiller/core/fake_distiller_page.h"
 #include "components/dom_distiller/core/task_tracker.h"
-#include "components/leveldb_proto/testing/fake_db.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using leveldb_proto::test::FakeDB;
 using testing::_;
 using testing::Invoke;
 using testing::Return;
@@ -75,9 +72,7 @@
     ArticleEntry entry;
     entry.set_entry_id(kTestEntryId);
     entry.add_pages()->set_url("http://www.example.com/p1");
-    db_model_[kTestEntryId] = entry;
-    FakeDB<ArticleEntry>* fake_db = new FakeDB<ArticleEntry>(&db_model_);
-    store_ = test::util::CreateStoreWithFakeDB(fake_db, db_model_);
+    store_ = new DomDistillerStore({entry});
     distiller_factory_ = new MockDistillerFactory();
     distiller_page_factory_ = new MockDistillerPageFactory();
     service_.reset(new DomDistillerService(
@@ -85,8 +80,6 @@
         std::unique_ptr<DistillerFactory>(distiller_factory_),
         std::unique_ptr<DistillerPageFactory>(distiller_page_factory_),
         std::unique_ptr<DistilledPagePrefs>()));
-    fake_db->InitStatusCallback(leveldb_proto::Enums::InitStatus::kOK);
-    fake_db->LoadCallback(true);
   }
 
   void TearDown() override {
@@ -103,7 +96,6 @@
   MockDistillerFactory* distiller_factory_;
   MockDistillerPageFactory* distiller_page_factory_;
   std::unique_ptr<DomDistillerService> service_;
-  FakeDB<ArticleEntry>::EntryMap db_model_;
 };
 
 TEST_F(DomDistillerServiceTest, TestViewEntry) {
diff --git a/components/dom_distiller/core/dom_distiller_store.cc b/components/dom_distiller/core/dom_distiller_store.cc
index d187df2b..4f37d22 100644
--- a/components/dom_distiller/core/dom_distiller_store.cc
+++ b/components/dom_distiller/core/dom_distiller_store.cc
@@ -8,35 +8,13 @@
 
 #include <utility>
 
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "components/dom_distiller/core/article_entry.h"
-#include "components/sync/model/sync_change.h"
-
-using leveldb_proto::ProtoDatabase;
-using syncer::SyncChange;
-using syncer::SyncChangeList;
-using syncer::SyncDataList;
-
 namespace dom_distiller {
 
-DomDistillerStore::DomDistillerStore(
-    std::unique_ptr<ProtoDatabase<ArticleEntry>> database)
-    : database_(std::move(database)), database_loaded_(false) {
-  database_->Init(base::BindOnce(&DomDistillerStore::OnDatabaseInit,
-                                 weak_ptr_factory_.GetWeakPtr()));
-}
+DomDistillerStore::DomDistillerStore() {}
 
 DomDistillerStore::DomDistillerStore(
-    std::unique_ptr<ProtoDatabase<ArticleEntry>> database,
     const std::vector<ArticleEntry>& initial_data)
-    : database_(std::move(database)),
-      database_loaded_(false),
-      model_(initial_data) {
-  database_->Init(base::BindOnce(&DomDistillerStore::OnDatabaseInit,
-                                 weak_ptr_factory_.GetWeakPtr()));
-}
+    : model_(initial_data) {}
 
 DomDistillerStore::~DomDistillerStore() {}
 
@@ -53,86 +31,4 @@
   return model_.GetEntries();
 }
 
-void DomDistillerStore::OnDatabaseInit(
-    leveldb_proto::Enums::InitStatus status) {
-  if (status != leveldb_proto::Enums::InitStatus::kOK) {
-    DVLOG(1) << "DOM Distiller database init failed.";
-    database_.reset();
-    return;
-  }
-  database_->LoadEntries(base::BindOnce(&DomDistillerStore::OnDatabaseLoad,
-                                        weak_ptr_factory_.GetWeakPtr()));
-}
-
-void DomDistillerStore::OnDatabaseLoad(bool success,
-                                       std::unique_ptr<EntryVector> entries) {
-  if (!success) {
-    DVLOG(1) << "DOM Distiller database load failed.";
-    database_.reset();
-    return;
-  }
-  database_loaded_ = true;
-
-  SyncDataList data;
-  for (auto it = entries->begin(); it != entries->end(); ++it) {
-    data.push_back(CreateLocalData(*it));
-  }
-  SyncChangeList changes_applied;
-  SyncChangeList database_changes_needed;
-  MergeDataWithModel(data, &changes_applied, &database_changes_needed);
-  ApplyChangesToDatabase(database_changes_needed);
-}
-
-void DomDistillerStore::OnDatabaseSave(bool success) {
-  if (!success) {
-    DVLOG(1) << "DOM Distiller database save failed."
-             << " Disabling modifications and sync.";
-    database_.reset();
-    database_loaded_ = false;
-  }
-}
-
-bool DomDistillerStore::ApplyChangesToDatabase(
-    const SyncChangeList& change_list) {
-  if (!database_loaded_) {
-    return false;
-  }
-  if (change_list.empty()) {
-    return true;
-  }
-  std::unique_ptr<ProtoDatabase<ArticleEntry>::KeyEntryVector> entries_to_save(
-      new ProtoDatabase<ArticleEntry>::KeyEntryVector());
-  std::unique_ptr<std::vector<std::string>> keys_to_remove(
-      new std::vector<std::string>());
-
-  for (auto it = change_list.begin(); it != change_list.end(); ++it) {
-    if (it->change_type() == SyncChange::ACTION_DELETE) {
-      ArticleEntry entry = GetEntryFromChange(*it);
-      keys_to_remove->push_back(entry.entry_id());
-    } else {
-      ArticleEntry entry = GetEntryFromChange(*it);
-      entries_to_save->push_back(std::make_pair(entry.entry_id(), entry));
-    }
-  }
-  database_->UpdateEntries(std::move(entries_to_save),
-                           std::move(keys_to_remove),
-                           base::BindOnce(&DomDistillerStore::OnDatabaseSave,
-                                          weak_ptr_factory_.GetWeakPtr()));
-  return true;
-}
-
-void DomDistillerStore::MergeDataWithModel(const SyncDataList& data,
-                                           SyncChangeList* changes_applied,
-                                           SyncChangeList* changes_missing) {
-  // TODO(cjhopman): This naive merge algorithm could cause flip-flopping
-  // between database/sync of multiple clients.
-  DCHECK(changes_applied);
-  DCHECK(changes_missing);
-
-  SyncChangeList changes_to_apply;
-  model_.CalculateChangesForMerge(data, &changes_to_apply, changes_missing);
-  model_.ApplyChangesToModel(changes_to_apply, changes_applied,
-                             changes_missing);
-}
-
 }  // namespace dom_distiller
diff --git a/components/dom_distiller/core/dom_distiller_store.h b/components/dom_distiller/core/dom_distiller_store.h
index 1c6cab8..a548c426 100644
--- a/components/dom_distiller/core/dom_distiller_store.h
+++ b/components/dom_distiller/core/dom_distiller_store.h
@@ -9,12 +9,8 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "base/memory/weak_ptr.h"
 #include "components/dom_distiller/core/article_entry.h"
 #include "components/dom_distiller/core/dom_distiller_model.h"
-#include "components/leveldb_proto/public/proto_database.h"
-#include "components/sync/model/sync_change.h"
-#include "components/sync/model/sync_data.h"
 #include "url/gurl.h"
 
 namespace dom_distiller {
@@ -51,17 +47,10 @@
 // TODO(cjhopman): Support deleting entries.
 class DomDistillerStore : public DomDistillerStoreInterface {
  public:
-  typedef std::vector<ArticleEntry> EntryVector;
+  DomDistillerStore();
 
-  // Creates storage using the given database for local storage.
-  DomDistillerStore(
-      std::unique_ptr<leveldb_proto::ProtoDatabase<ArticleEntry>> database);
-
-  // Creates storage using the given database for local storage. Initializes the
-  // internal model to |initial_model|.
-  DomDistillerStore(
-      std::unique_ptr<leveldb_proto::ProtoDatabase<ArticleEntry>> database,
-      const std::vector<ArticleEntry>& initial_data);
+  // Initializes the internal model to |initial_model|.
+  DomDistillerStore(const std::vector<ArticleEntry>& initial_data);
 
   ~DomDistillerStore() override;
 
@@ -70,23 +59,8 @@
   std::vector<ArticleEntry> GetEntries() const override;
 
  private:
-  void OnDatabaseInit(leveldb_proto::Enums::InitStatus status);
-  void OnDatabaseLoad(bool success, std::unique_ptr<EntryVector> entries);
-  void OnDatabaseSave(bool success);
-
-  void MergeDataWithModel(const syncer::SyncDataList& data,
-                          syncer::SyncChangeList* changes_applied,
-                          syncer::SyncChangeList* changes_missing);
-
-  bool ApplyChangesToDatabase(const syncer::SyncChangeList& change_list);
-
-  std::unique_ptr<leveldb_proto::ProtoDatabase<ArticleEntry>> database_;
-  bool database_loaded_;
-
   DomDistillerModel model_;
 
-  base::WeakPtrFactory<DomDistillerStore> weak_ptr_factory_{this};
-
   DISALLOW_COPY_AND_ASSIGN(DomDistillerStore);
 };
 
diff --git a/components/dom_distiller/core/dom_distiller_store_unittest.cc b/components/dom_distiller/core/dom_distiller_store_unittest.cc
deleted file mode 100644
index 1733891..0000000
--- a/components/dom_distiller/core/dom_distiller_store_unittest.cc
+++ /dev/null
@@ -1,176 +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 "components/dom_distiller/core/dom_distiller_store.h"
-
-#include <stdint.h>
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/memory/ptr_util.h"
-#include "base/run_loop.h"
-#include "base/test/task_environment.h"
-#include "base/time/time.h"
-#include "components/dom_distiller/core/article_entry.h"
-#include "components/dom_distiller/core/dom_distiller_test_util.h"
-#include "components/leveldb_proto/testing/fake_db.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using base::Time;
-using leveldb_proto::test::FakeDB;
-using testing::_;
-using testing::AssertionFailure;
-using testing::AssertionResult;
-using testing::AssertionSuccess;
-using testing::SaveArgPointee;
-
-namespace dom_distiller {
-
-namespace {
-
-typedef std::map<std::string, ArticleEntry> EntryMap;
-
-void AddEntry(const ArticleEntry& e, EntryMap* map) {
-  (*map)[e.entry_id()] = e;
-}
-
-ArticleEntry CreateEntry(const std::string& entry_id,
-                         const std::string& page_url1,
-                         const std::string& page_url2,
-                         const std::string& page_url3) {
-  ArticleEntry entry;
-  entry.set_entry_id(entry_id);
-  if (!page_url1.empty()) {
-    ArticleEntryPage* page = entry.add_pages();
-    page->set_url(page_url1);
-  }
-  if (!page_url2.empty()) {
-    ArticleEntryPage* page = entry.add_pages();
-    page->set_url(page_url2);
-  }
-  if (!page_url3.empty()) {
-    ArticleEntryPage* page = entry.add_pages();
-    page->set_url(page_url3);
-  }
-  return entry;
-}
-
-ArticleEntry GetSampleEntry(int id) {
-  static ArticleEntry entries[] = {
-      CreateEntry("entry0", "example.com/1", "example.com/2", "example.com/3"),
-      CreateEntry("entry1", "example.com/1", "", ""),
-      CreateEntry("entry2", "example.com/p1", "example.com/p2", ""),
-      CreateEntry("entry3", "example.com/something/all", "", ""),
-      CreateEntry("entry4", "example.com/somethingelse/1", "", ""),
-      CreateEntry("entry5", "rock.example.com/p1", "rock.example.com/p2", ""),
-      CreateEntry("entry7", "example.com/entry7/1", "example.com/entry7/2", ""),
-      CreateEntry("entry8", "example.com/entry8/1", "", ""),
-      CreateEntry("entry9", "example.com/entry9/all", "", ""),
-  };
-  EXPECT_LT(id, 9);
-  return entries[id % 9];
-}
-
-}  // namespace
-
-class DomDistillerStoreTest : public testing::Test {
- public:
-  void SetUp() override {
-    db_model_.clear();
-    store_model_.clear();
-  }
-
-  void TearDown() override {
-    store_.reset();
-    fake_db_ = nullptr;
-  }
-
-  // Creates a simple DomDistillerStore initialized with |store_model_| and
-  // with a FakeDB backed by |db_model_|.
-  void CreateStore() {
-    fake_db_ = new FakeDB<ArticleEntry>(&db_model_);
-    store_.reset(test::util::CreateStoreWithFakeDB(fake_db_, store_model_));
-  }
-
- protected:
-  base::test::SingleThreadTaskEnvironment task_environment_;
-
-  EntryMap db_model_;
-  FakeDB<ArticleEntry>::EntryMap store_model_;
-
-  std::unique_ptr<DomDistillerStore> store_;
-
-  // Both owned by |store_|.
-  FakeDB<ArticleEntry>* fake_db_;
-};
-
-AssertionResult AreEntriesEqual(const DomDistillerStore::EntryVector& entries,
-                                EntryMap expected_entries) {
-  if (entries.size() != expected_entries.size())
-    return AssertionFailure() << "Expected " << expected_entries.size()
-                              << " entries but found " << entries.size();
-
-  for (auto it = entries.begin(); it != entries.end(); ++it) {
-    auto expected_it = expected_entries.find(it->entry_id());
-    if (expected_it == expected_entries.end()) {
-      return AssertionFailure()
-             << "Found unexpected entry with id <" << it->entry_id() << ">";
-    }
-    if (!AreEntriesEqual(expected_it->second, *it)) {
-      return AssertionFailure()
-             << "Mismatched entry with id <" << it->entry_id() << ">";
-    }
-    expected_entries.erase(expected_it);
-  }
-  return AssertionSuccess();
-}
-
-AssertionResult AreEntryMapsEqual(const EntryMap& left, const EntryMap& right) {
-  DomDistillerStore::EntryVector entries;
-  for (auto it = left.begin(); it != left.end(); ++it) {
-    entries.push_back(it->second);
-  }
-  return AreEntriesEqual(entries, right);
-}
-
-TEST_F(DomDistillerStoreTest, TestDatabaseLoad) {
-  AddEntry(GetSampleEntry(0), &db_model_);
-  AddEntry(GetSampleEntry(1), &db_model_);
-  AddEntry(GetSampleEntry(2), &db_model_);
-
-  CreateStore();
-
-  fake_db_->InitStatusCallback(leveldb_proto::Enums::InitStatus::kOK);
-
-  fake_db_->LoadCallback(true);
-  EXPECT_TRUE(AreEntriesEqual(store_->GetEntries(), db_model_));
-}
-
-TEST_F(DomDistillerStoreTest, TestDatabaseLoadMerge) {
-  AddEntry(GetSampleEntry(0), &db_model_);
-  AddEntry(GetSampleEntry(1), &db_model_);
-  AddEntry(GetSampleEntry(2), &db_model_);
-
-  AddEntry(GetSampleEntry(2), &store_model_);
-  AddEntry(GetSampleEntry(3), &store_model_);
-  AddEntry(GetSampleEntry(4), &store_model_);
-
-  EntryMap expected_model(db_model_);
-  AddEntry(GetSampleEntry(3), &expected_model);
-  AddEntry(GetSampleEntry(4), &expected_model);
-
-  CreateStore();
-  fake_db_->InitStatusCallback(leveldb_proto::Enums::InitStatus::kOK);
-  fake_db_->LoadCallback(true);
-
-  EXPECT_TRUE(AreEntriesEqual(store_->GetEntries(), expected_model));
-  EXPECT_TRUE(AreEntryMapsEqual(db_model_, expected_model));
-}
-
-}  // namespace dom_distiller
diff --git a/components/dom_distiller/core/dom_distiller_test_util.cc b/components/dom_distiller/core/dom_distiller_test_util.cc
deleted file mode 100644
index 83199cd..0000000
--- a/components/dom_distiller/core/dom_distiller_test_util.cc
+++ /dev/null
@@ -1,39 +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 "components/dom_distiller/core/dom_distiller_test_util.h"
-
-#include "components/dom_distiller/core/dom_distiller_store.h"
-#include "components/dom_distiller/core/fake_distiller.h"
-
-using leveldb_proto::test::FakeDB;
-
-namespace dom_distiller {
-namespace test {
-namespace util {
-
-namespace {
-
-std::vector<ArticleEntry> EntryMapToList(
-    const FakeDB<ArticleEntry>::EntryMap& entries) {
-  std::vector<ArticleEntry> entry_list;
-  for (auto it = entries.begin(); it != entries.end(); ++it) {
-    entry_list.push_back(it->second);
-  }
-  return entry_list;
-}
-}  // namespace
-
-// static
-DomDistillerStore* CreateStoreWithFakeDB(
-    FakeDB<ArticleEntry>* fake_db,
-    const FakeDB<ArticleEntry>::EntryMap& store_model) {
-  return new DomDistillerStore(
-      std::unique_ptr<leveldb_proto::ProtoDatabase<ArticleEntry>>(fake_db),
-      EntryMapToList(store_model));
-}
-
-}  // namespace util
-}  // namespace test
-}  // namespace dom_distiller
diff --git a/components/dom_distiller/core/dom_distiller_test_util.h b/components/dom_distiller/core/dom_distiller_test_util.h
deleted file mode 100644
index 4c94a93..0000000
--- a/components/dom_distiller/core/dom_distiller_test_util.h
+++ /dev/null
@@ -1,31 +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 COMPONENTS_DOM_DISTILLER_CORE_DOM_DISTILLER_TEST_UTIL_H_
-#define COMPONENTS_DOM_DISTILLER_CORE_DOM_DISTILLER_TEST_UTIL_H_
-
-#include <vector>
-
-#include "components/dom_distiller/core/article_entry.h"
-#include "components/leveldb_proto/testing/fake_db.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-namespace dom_distiller {
-
-class DomDistillerStore;
-
-namespace test {
-namespace util {
-
-// Creates a simple DomDistillerStore backed by |fake_db| and initialized
-// with |store_model|.
-DomDistillerStore* CreateStoreWithFakeDB(
-    leveldb_proto::test::FakeDB<ArticleEntry>* fake_db,
-    const leveldb_proto::test::FakeDB<ArticleEntry>::EntryMap& store_model);
-
-}  // namespace util
-}  // namespace test
-}  // namespace dom_distiller
-
-#endif  // COMPONENTS_DOM_DISTILLER_CORE_DOM_DISTILLER_TEST_UTIL_H_
diff --git a/components/dom_distiller/core/viewer_unittest.cc b/components/dom_distiller/core/viewer_unittest.cc
index cf1c9cd6..9e7a238 100644
--- a/components/dom_distiller/core/viewer_unittest.cc
+++ b/components/dom_distiller/core/viewer_unittest.cc
@@ -6,11 +6,11 @@
 
 #include "components/dom_distiller/core/distilled_page_prefs.h"
 #include "components/dom_distiller/core/dom_distiller_service.h"
-#include "components/dom_distiller/core/dom_distiller_test_util.h"
 #include "components/dom_distiller/core/task_tracker.h"
 #include "components/dom_distiller/core/url_constants.h"
 #include "components/dom_distiller/core/url_utils.h"
 #include "net/base/url_util.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/url_util.h"
 
diff --git a/components/dom_distiller/standalone/content_extractor_browsertest.cc b/components/dom_distiller/standalone/content_extractor_browsertest.cc
index 227c8fe..d85a15ab 100644
--- a/components/dom_distiller/standalone/content_extractor_browsertest.cc
+++ b/components/dom_distiller/standalone/content_extractor_browsertest.cc
@@ -127,25 +127,11 @@
 std::unique_ptr<DomDistillerService> CreateDomDistillerService(
     content::BrowserContext* context,
     sync_preferences::TestingPrefServiceSyncable* pref_service,
-    const base::FilePath& db_path,
     const FileToUrlMap& file_to_url_map) {
-  scoped_refptr<base::SequencedTaskRunner> background_task_runner =
-      base::CreateSequencedTaskRunner({base::ThreadPool(), base::MayBlock()});
-
   // Setting up PrefService for DistilledPagePrefs.
   DistilledPagePrefs::RegisterProfilePrefs(pref_service->registry());
 
-  auto* db_provider =
-      content::BrowserContext::GetDefaultStoragePartition(context)
-          ->GetProtoDatabaseProvider();
-
-  // TODO(cjhopman): use an in-memory database instead of an on-disk one with
-  // temporary directory.
-  auto db = db_provider->GetDB<ArticleEntry>(
-      leveldb_proto::ProtoDbType::DOM_DISTILLER_STORE, db_path,
-      background_task_runner);
-
-  auto dom_distiller_store = std::make_unique<DomDistillerStore>(std::move(db));
+  auto dom_distiller_store = std::make_unique<DomDistillerStore>();
 
   auto distiller_page_factory =
       std::make_unique<DistillerPageWebContentsFactory>(context);
@@ -338,7 +324,6 @@
     if (!base::CommandLine::ForCurrentProcess()->HasSwitch(kDisableDnsSwitch)) {
       EnableDNSLookupForThisTest();
     }
-    CHECK(db_dir_.CreateUniqueTempDir());
     AddComponentsTestResources();
   }
 
@@ -359,7 +344,7 @@
         std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
 
     service_ = CreateDomDistillerService(context, pref_service_.get(),
-                                         db_dir_.GetPath(), file_to_url_map);
+                                         file_to_url_map);
     PumpQueue();
   }
 
@@ -435,7 +420,6 @@
   size_t max_tasks_;
   size_t next_request_;
 
-  base::ScopedTempDir db_dir_;
   std::unique_ptr<net::ScopedDefaultHostResolverProc>
       mock_host_resolver_override_;
   std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> pref_service_;
diff --git a/components/download/internal/common/download_file_impl.cc b/components/download/internal/common/download_file_impl.cc
index 890efd89..a8376fd 100644
--- a/components/download/internal/common/download_file_impl.cc
+++ b/components/download/internal/common/download_file_impl.cc
@@ -59,11 +59,10 @@
 
 DownloadFileImpl::SourceStream::SourceStream(
     int64_t offset,
-    int64_t length,
     int64_t starting_file_write_offset,
     std::unique_ptr<InputStream> stream)
     : offset_(offset),
-      length_(length),
+      length_(DownloadSaveInfo::kLengthFullContent),
       starting_file_write_offset_(starting_file_write_offset),
       bytes_read_(0),
       bytes_written_(0),
@@ -72,11 +71,6 @@
       input_stream_(std::move(stream)) {
   CHECK_LE(offset_, starting_file_write_offset_);
   CHECK_GE(offset_, 0);
-  DCHECK(length <= 0 || length >= starting_file_write_offset - offset)
-      << "Not enough for content validation. offset = " << offset
-      << ", length = " << length
-      << " , starting_file_write_offset = " << starting_file_write_offset
-      << ".";
 }
 
 DownloadFileImpl::SourceStream::~SourceStream() = default;
@@ -176,8 +170,8 @@
                                     download_id);
 
   source_streams_[save_info_->offset] = std::make_unique<SourceStream>(
-      save_info_->offset, save_info_->length,
-      save_info_->GetStartingFileWriteOffset(), std::move(stream));
+      save_info_->offset, save_info_->GetStartingFileWriteOffset(),
+      std::move(stream));
 
   DETACH_FROM_SEQUENCE(sequence_checker_);
 }
@@ -243,8 +237,7 @@
 }
 
 void DownloadFileImpl::AddInputStream(std::unique_ptr<InputStream> stream,
-                                      int64_t offset,
-                                      int64_t length) {
+                                      int64_t offset) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // UI thread may not be notified about completion and detach download file,
@@ -255,7 +248,7 @@
   }
   DCHECK(source_streams_.find(offset) == source_streams_.end());
   source_streams_[offset] =
-      std::make_unique<SourceStream>(offset, length, offset, std::move(stream));
+      std::make_unique<SourceStream>(offset, offset, std::move(stream));
   OnSourceStreamAdded(source_streams_[offset].get());
 }
 
diff --git a/components/download/internal/common/download_file_unittest.cc b/components/download/internal/common/download_file_unittest.cc
index a2a5883..0dac1e1 100644
--- a/components/download/internal/common/download_file_unittest.cc
+++ b/components/download/internal/common/download_file_unittest.cc
@@ -438,7 +438,7 @@
     // 1. RegisterCallback: Must called twice. One to set the callback, the
     // other to release the stream.
     // 2. Read: If filled with N buffer, called (N+1) times, where the last Read
-    // call doesn't read any data but returns STRAM_COMPLETE.
+    // call doesn't read any data but returns STREAM_COMPLETE.
     // The stream may terminate in the middle and less Read calls are expected.
     // 3. GetStatus: Only called if the stream is completed and last Read call
     // returns STREAM_COMPLETE.
@@ -997,8 +997,8 @@
 
   // Activate the streams.
   download_file_->AddInputStream(
-      std::unique_ptr<MockInputStream>(additional_streams_[0]), stream_0_length,
-      DownloadSaveInfo::kLengthFullContent);
+      std::unique_ptr<MockInputStream>(additional_streams_[0]),
+      stream_0_length);
   sink_callback_.Run(MOJO_RESULT_OK);
   base::RunLoop().RunUntilIdle();
 
@@ -1039,12 +1039,12 @@
   EXPECT_CALL(*(observer_.get()), MockDestinationCompleted(_, _));
 
   // Activate all the streams.
-  download_file_->AddInputStream(
-      std::unique_ptr<MockInputStream>(additional_streams_[0]), stream_0_length,
-      stream_1_length);
-  download_file_->AddInputStream(
+   download_file_->AddInputStream(
       std::unique_ptr<MockInputStream>(additional_streams_[1]),
-      stream_0_length + stream_1_length, DownloadSaveInfo::kLengthFullContent);
+      stream_0_length + stream_1_length);
+  download_file_->AddInputStream(
+      std::unique_ptr<MockInputStream>(additional_streams_[0]),
+      stream_0_length);
   sink_callback_.Run(MOJO_RESULT_OK);
   base::RunLoop().RunUntilIdle();
 
@@ -1085,7 +1085,7 @@
   additional_streams_[0] = new StrictMock<MockInputStream>();
   download_file_->AddInputStream(
       std::unique_ptr<MockInputStream>(additional_streams_[0]),
-      stream_0_length - 1, DownloadSaveInfo::kLengthFullContent);
+      stream_0_length - 1);
   base::RunLoop().RunUntilIdle();
 
   SourceStreamTestData stream_data_0(0, stream_0_length, true);
@@ -1127,7 +1127,7 @@
 
   download_file_->AddInputStream(
       std::unique_ptr<MockInputStream>(additional_streams_[0]),
-      strlen(kTestData1), DownloadSaveInfo::kLengthFullContent);
+      strlen(kTestData1));
 
   // The stream should get terminated and reset the callback.
   EXPECT_TRUE(sink_callback_.is_null());
@@ -1169,8 +1169,7 @@
       .RetiresOnSaturation();
   int64_t offset = strlen(kTestData1) + strlen(kTestData2);
   download_file_->AddInputStream(
-      std::unique_ptr<MockInputStream>(additional_streams_[0]), offset,
-      DownloadSaveInfo::kLengthFullContent);
+      std::unique_ptr<MockInputStream>(additional_streams_[0]), offset);
   base::RunLoop().RunUntilIdle();
 
   // First stream reads the 3rd chunk and writes it to disk.
diff --git a/components/download/internal/common/download_job.cc b/components/download/internal/common/download_job.cc
index 04861ab..d27f240 100644
--- a/components/download/internal/common/download_job.cc
+++ b/components/download/internal/common/download_job.cc
@@ -76,8 +76,7 @@
 }
 
 bool DownloadJob::AddInputStream(std::unique_ptr<InputStream> stream,
-                                 int64_t offset,
-                                 int64_t length) {
+                                 int64_t offset) {
   DownloadFile* download_file = download_item_->GetDownloadFile();
   if (!download_file) {
     CancelRequestWithOffset(offset);
@@ -90,7 +89,7 @@
   GetDownloadTaskRunner()->PostTask(
       FROM_HERE, base::BindOnce(&DownloadFile::AddInputStream,
                                 base::Unretained(download_file),
-                                std::move(stream), offset, length));
+                                std::move(stream), offset));
   return true;
 }
 
diff --git a/components/download/internal/common/download_utils.cc b/components/download/internal/common/download_utils.cc
index 023f695..0a595eb 100644
--- a/components/download/internal/common/download_utils.cc
+++ b/components/download/internal/common/download_utils.cc
@@ -177,15 +177,8 @@
     return result;
 
   // The caller is expecting a partial response.
-  if (save_info && (save_info->offset > 0 || save_info->length > 0)) {
+  if (save_info && save_info->offset > 0) {
     if (http_headers.response_code() != net::HTTP_PARTIAL_CONTENT) {
-      // Server should send partial content when "If-Match" or
-      // "If-Unmodified-Since" check passes, and the range request header has
-      // last byte position. e.g. "Range:bytes=50-99".
-      if (save_info->length != DownloadSaveInfo::kLengthFullContent &&
-          !fetch_error_body)
-        return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT;
-
       // Requested a partial range, but received the entire response, when
       // the range request header is "Range:bytes={offset}-".
       // The response can be HTTP 200 or other error code when
@@ -204,9 +197,7 @@
       return DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT;
     DCHECK_GE(first_byte, 0);
 
-    if (first_byte != save_info->offset ||
-        (save_info->length > 0 &&
-         last_byte != save_info->offset + save_info->length - 1)) {
+    if (first_byte != save_info->offset) {
       // The server returned a different range than the one we requested. Assume
       // the server doesn't support range request.
       return DOWNLOAD_INTERRUPT_REASON_SERVER_NO_RANGE;
@@ -337,8 +328,7 @@
 std::unique_ptr<net::HttpRequestHeaders> GetAdditionalRequestHeaders(
     DownloadUrlParameters* params) {
   auto headers = std::make_unique<net::HttpRequestHeaders>();
-  if (params->offset() == 0 &&
-      params->length() == DownloadSaveInfo::kLengthFullContent) {
+  if (params->offset() == 0) {
     AppendExtraHeaders(headers.get(), params);
     return headers;
   }
@@ -361,10 +351,7 @@
 
   // Add "Range" header.
   std::string range_header =
-      (params->length() == DownloadSaveInfo::kLengthFullContent)
-          ? base::StringPrintf("bytes=%" PRId64 "-", params->offset())
-          : base::StringPrintf("bytes=%" PRId64 "-%" PRId64, params->offset(),
-                               params->offset() + params->length() - 1);
+      base::StringPrintf("bytes=%" PRId64 "-", params->offset());
   headers->SetHeader(net::HttpRequestHeaders::kRange, range_header);
 
   // Add "If-Range" headers.
diff --git a/components/download/internal/common/download_worker.cc b/components/download/internal/common/download_worker.cc
index b1e9792..6efc94d6 100644
--- a/components/download/internal/common/download_worker.cc
+++ b/components/download/internal/common/download_worker.cc
@@ -68,11 +68,9 @@
 }  // namespace
 
 DownloadWorker::DownloadWorker(DownloadWorker::Delegate* delegate,
-                               int64_t offset,
-                               int64_t length)
+                               int64_t offset)
     : delegate_(delegate),
       offset_(offset),
-      length_(length),
       is_paused_(false),
       is_canceled_(false),
       url_download_handler_(nullptr, base::OnTaskRunnerDeleter(nullptr)) {
diff --git a/components/download/internal/common/download_worker.h b/components/download/internal/common/download_worker.h
index d560f0d..28e5b05f 100644
--- a/components/download/internal/common/download_worker.h
+++ b/components/download/internal/common/download_worker.h
@@ -38,13 +38,10 @@
         std::unique_ptr<DownloadCreateInfo> download_create_info) = 0;
   };
 
-  DownloadWorker(DownloadWorker::Delegate* delegate,
-                 int64_t offset,
-                 int64_t length);
+  DownloadWorker(DownloadWorker::Delegate* delegate, int64_t offset);
   virtual ~DownloadWorker();
 
   int64_t offset() const { return offset_; }
-  int64_t length() const { return length_; }
 
   // Send network request to ask for a download.
   void SendRequest(std::unique_ptr<DownloadUrlParameters> params,
@@ -74,9 +71,6 @@
   // The starting position of the content for this worker to download.
   int64_t offset_;
 
-  // The length of the request. May be 0 to fetch to the end of the file.
-  int64_t length_;
-
   // States of the worker.
   bool is_paused_;
   bool is_canceled_;
diff --git a/components/download/internal/common/parallel_download_job.cc b/components/download/internal/common/parallel_download_job.cc
index a2e1e42..9b92831 100644
--- a/components/download/internal/common/parallel_download_job.cc
+++ b/components/download/internal/common/parallel_download_job.cc
@@ -128,8 +128,8 @@
   // If server returns a wrong range, abort the parallel request.
   bool success = download_create_info->offset == worker->offset();
   if (success) {
-    success = DownloadJob::AddInputStream(std::move(input_stream),
-                                          worker->offset(), worker->length());
+    success =
+        DownloadJob::AddInputStream(std::move(input_stream), worker->offset());
   }
 
   RecordParallelDownloadAddStreamSuccess(
@@ -236,15 +236,14 @@
     // All parallel requests are half open, which sends request headers like
     // "Range:50-".
     // If server rejects a certain request, others should take over.
-    CreateRequest(it->offset, DownloadSaveInfo::kLengthFullContent);
+    CreateRequest(it->offset);
   }
 }
 
-void ParallelDownloadJob::CreateRequest(int64_t offset, int64_t length) {
+void ParallelDownloadJob::CreateRequest(int64_t offset) {
   DCHECK(download_item_);
-  DCHECK_EQ(DownloadSaveInfo::kLengthFullContent, length);
 
-  auto worker = std::make_unique<DownloadWorker>(this, offset, length);
+  auto worker = std::make_unique<DownloadWorker>(this, offset);
 
   net::NetworkTrafficAnnotationTag traffic_annotation =
       net::DefineNetworkTrafficAnnotation("parallel_download_job", R"(
@@ -277,10 +276,6 @@
   download_params->set_etag(download_item_->GetETag());
   download_params->set_offset(offset);
 
-  // Setting the length will result in range request to fetch a slice of the
-  // file.
-  download_params->set_length(length);
-
   // Subsequent range requests don't need the "If-Range" header.
   download_params->set_use_if_range(false);
 
diff --git a/components/download/internal/common/parallel_download_job.h b/components/download/internal/common/parallel_download_job.h
index e502805..564a885 100644
--- a/components/download/internal/common/parallel_download_job.h
+++ b/components/download/internal/common/parallel_download_job.h
@@ -88,9 +88,8 @@
   void ForkSubRequests(const DownloadItem::ReceivedSlices& slices_to_download);
 
   // Create one range request, virtual for testing. Range request will start
-  // from |offset| to |length|. Range request will be half open, e.g.
-  // "Range:50-" if |length| is 0.
-  virtual void CreateRequest(int64_t offset, int64_t length);
+  // from |offset| and will be half open.
+  virtual void CreateRequest(int64_t offset);
 
   // Information about the initial request when download is started.
   int64_t initial_request_offset_;
diff --git a/components/download/internal/common/parallel_download_job_unittest.cc b/components/download/internal/common/parallel_download_job_unittest.cc
index 7909c2e..f6faf8d 100644
--- a/components/download/internal/common/parallel_download_job_unittest.cc
+++ b/components/download/internal/common/parallel_download_job_unittest.cc
@@ -67,8 +67,8 @@
         min_slice_size_(min_slice_size),
         min_remaining_time_(min_remaining_time) {}
 
-  void CreateRequest(int64_t offset, int64_t length) override {
-    auto worker = std::make_unique<DownloadWorker>(this, offset, length);
+  void CreateRequest(int64_t offset) override {
+    auto worker = std::make_unique<DownloadWorker>(this, offset);
 
     DCHECK(workers_.find(offset) == workers_.end());
     workers_[offset] = std::move(worker);
@@ -155,7 +155,6 @@
   void VerifyWorker(int64_t offset, int64_t length) const {
     EXPECT_TRUE(job_->workers_.find(offset) != job_->workers_.end());
     EXPECT_EQ(offset, job_->workers_[offset]->offset());
-    EXPECT_EQ(length, job_->workers_[offset]->length());
   }
 
   void OnFileInitialized(DownloadInterruptReason result, int64_t bytes_wasted) {
diff --git a/components/download/internal/common/parallel_download_utils_unittest.cc b/components/download/internal/common/parallel_download_utils_unittest.cc
index b0c8462..8672f93 100644
--- a/components/download/internal/common/parallel_download_utils_unittest.cc
+++ b/components/download/internal/common/parallel_download_utils_unittest.cc
@@ -37,14 +37,12 @@
 
   // Creates a source stream to test.
   std::unique_ptr<DownloadFileImpl::SourceStream> CreateSourceStream(
-      int64_t offset,
-      int64_t length) {
+      int64_t offset) {
     input_stream_ = new StrictMock<MockInputStream>();
     EXPECT_CALL(*input_stream_, GetCompletionStatus())
         .WillRepeatedly(Return(DOWNLOAD_INTERRUPT_REASON_NONE));
     return std::make_unique<DownloadFileImpl::SourceStream>(
-        offset, length, offset,
-        std::unique_ptr<MockInputStream>(input_stream_));
+        offset, offset, std::unique_ptr<MockInputStream>(input_stream_));
   }
 
  protected:
@@ -140,15 +138,14 @@
   // Create a stream that will work on byte range "100-".
   const int kErrorStreamOffset = 100;
 
-  auto error_stream = CreateSourceStream(kErrorStreamOffset,
-                                         DownloadSaveInfo::kLengthFullContent);
+  auto error_stream = CreateSourceStream(kErrorStreamOffset);
   error_stream->set_finished(true);
 
   // Get starting offset of preceding stream.
   int64_t preceding_offset = GetParam();
   EXPECT_LT(preceding_offset, kErrorStreamOffset);
-  auto preceding_stream = CreateSourceStream(
-      preceding_offset, DownloadSaveInfo::kLengthFullContent);
+  auto preceding_stream = CreateSourceStream(preceding_offset);
+  // Half open preceding stream can always recover the error for later streams.
   EXPECT_FALSE(preceding_stream->is_finished());
   EXPECT_EQ(0u, preceding_stream->bytes_written());
   EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
@@ -170,88 +167,74 @@
   preceding_stream->OnBytesConsumed(1000u, 1000u);
   EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
 
-  // Now capped the length of preceding stream with different values.
-  preceding_stream = CreateSourceStream(preceding_offset,
-                                        kErrorStreamOffset - preceding_offset);
-  // Since preceding stream can't reach the first byte of the error stream, it
-  // will fail.
+  int64_t bytes_consumed = kErrorStreamOffset - preceding_offset - 1;
+  // Half open successfully finished preceding stream should always be
+  // able to recover error, even if it is not reaching the error offset as the
+  // error stream might be requesting something our of range.
+  preceding_stream = CreateSourceStream(preceding_offset);
   preceding_stream->set_finished(false);
-  EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
+  EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
   preceding_stream->set_finished(true);
-  int64_t bytes_consumed = kErrorStreamOffset - preceding_offset;
   preceding_stream->OnBytesConsumed(bytes_consumed, bytes_consumed);
-  EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
+  EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
+  preceding_stream->OnBytesConsumed(1, 1);
+  EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
 
-  // Inject an error results in failure, even if data written exceeds the first
-  // byte of error stream.
-  EXPECT_CALL(*input_stream_, GetCompletionStatus())
-      .WillRepeatedly(Return(DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE));
-  preceding_stream->OnBytesConsumed(1000u, 1000u);
-  EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
-
-  // Make preceding stream can reach the first byte of error stream.
-  preceding_stream = CreateSourceStream(
-      preceding_offset, kErrorStreamOffset - preceding_offset + 1);
-  // Since the error stream is half opened, no matter what it should fail.
-  preceding_stream->set_finished(false);
+  // If the preceding stream is truncated, it should never be able to recover
+  // a half open stream.
+  preceding_stream = CreateSourceStream(preceding_offset);
+  preceding_stream->TruncateLengthWithWrittenDataBlock(kErrorStreamOffset, 1);
+  EXPECT_EQ(preceding_stream->length(), kErrorStreamOffset - preceding_offset);
   EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
   preceding_stream->set_finished(true);
+  EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
   preceding_stream->OnBytesConsumed(bytes_consumed, bytes_consumed);
   EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
   preceding_stream->OnBytesConsumed(1, 1);
   EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
-
-  // Preceding stream that never download data won't recover the error stream.
-  preceding_stream = CreateSourceStream(preceding_offset, -1);
-  EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
 }
 
 // Verify recovery for length capped error stream.
-// Since the error stream length is capped, assume the previous stream length
-// is also capped or the previous stream is finished due to error like http
-// 404.
 TEST_P(ParallelDownloadUtilsRecoverErrorTest,
        RecoverErrorForLengthCappedErrorStream) {
   // Create a stream that will work on byte range "100-150".
   const int kErrorStreamLength = 50;
-  auto error_stream =
-      CreateSourceStream(kErrorStreamOffset, kErrorStreamLength);
+  auto error_stream = CreateSourceStream(kErrorStreamOffset);
+  error_stream->TruncateLengthWithWrittenDataBlock(
+      kErrorStreamOffset + kErrorStreamLength, 1);
+  EXPECT_EQ(error_stream->length(), 50);
   error_stream->set_finished(true);
 
   // Get starting offset of preceding stream.
   const int64_t preceding_offset = GetParam();
   EXPECT_LT(preceding_offset, kErrorStreamOffset);
 
-  // Create preceding stream capped before starting offset of error stream.
-  auto preceding_stream = CreateSourceStream(
-      preceding_offset, kErrorStreamOffset - preceding_offset);
+  // Create an half open preceding stream.
+  auto preceding_stream = CreateSourceStream(preceding_offset);
   EXPECT_FALSE(preceding_stream->is_finished());
   EXPECT_EQ(0u, preceding_stream->bytes_written());
 
-  // Since the preceding stream can never reach the starting offset, for an
-  // unfinished stream, we rely on length instead of bytes written.
-  EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
+  // Since the preceding stream can reach the starting offset, it should be able
+  // to recover the error stream..
+  EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
   int64_t bytes_consumed = kErrorStreamOffset - preceding_offset;
   preceding_stream->OnBytesConsumed(bytes_consumed, bytes_consumed);
-  EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
+  EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
   preceding_stream->OnBytesConsumed(kErrorStreamLength - 1,
                                     kErrorStreamLength - 1);
-  EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
+  EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
   preceding_stream->OnBytesConsumed(1, 1);
-
-  // Create preceding stream that can reach the upper bound of error stream.
-  // Since it's unfinished, it potentially can take over error stream's work
-  // even if no data is written.
-  preceding_stream = CreateSourceStream(
-      preceding_offset,
-      kErrorStreamOffset - preceding_offset + kErrorStreamLength);
-  EXPECT_FALSE(preceding_stream->is_finished());
-  EXPECT_EQ(0u, preceding_stream->bytes_written());
   EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
 
-  // Finished preceding stream only checks data written.
-  preceding_stream = CreateSourceStream(preceding_offset, 1);
+  // If preceding stream is truncated after error stream, checks data written.
+  preceding_stream = CreateSourceStream(preceding_offset);
+  preceding_stream->TruncateLengthWithWrittenDataBlock(
+      kErrorStreamOffset + kErrorStreamLength, 1);
+  EXPECT_EQ(preceding_stream->length(),
+            kErrorStreamOffset + kErrorStreamLength - preceding_offset);
+  EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
   preceding_stream->set_finished(true);
+  EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
   preceding_stream->OnBytesConsumed(bytes_consumed, bytes_consumed);
   EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
   preceding_stream->OnBytesConsumed(kErrorStreamLength - 1,
@@ -266,8 +249,17 @@
       .WillRepeatedly(Return(DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE));
   EXPECT_TRUE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
 
-  // Preceding stream that never download data won't recover the error stream.
-  preceding_stream = CreateSourceStream(preceding_offset, -1);
+  // If preceding stream is truncated before or in the middle of error stream,
+  // it should not recover the error stream when it reaches its length.
+  preceding_stream = CreateSourceStream(preceding_offset);
+  preceding_stream->TruncateLengthWithWrittenDataBlock(kErrorStreamOffset + 1,
+                                                       1);
+  EXPECT_EQ(preceding_stream->length(),
+            kErrorStreamOffset + 1 - preceding_offset);
+  EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
+  preceding_stream->set_finished(true);
+  EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
+  preceding_stream->OnBytesConsumed(bytes_consumed + 1, bytes_consumed + 1);
   EXPECT_FALSE(CanRecoverFromError(error_stream.get(), preceding_stream.get()));
 }
 
diff --git a/components/download/public/common/download_file.h b/components/download/public/common/download_file.h
index 7f81cfb..9392942 100644
--- a/components/download/public/common/download_file.h
+++ b/components/download/public/common/download_file.h
@@ -72,8 +72,7 @@
   // Add an input stream to write into a slice of the file, used for
   // parallel download.
   virtual void AddInputStream(std::unique_ptr<InputStream> stream,
-                              int64_t offset,
-                              int64_t length) = 0;
+                              int64_t offset) = 0;
 
   // Rename the download file to |full_path|.  If that file exists
   // |full_path| will be uniquified by suffixing " (<number>)" to the
diff --git a/components/download/public/common/download_file_impl.h b/components/download/public/common/download_file_impl.h
index 4f6c60c..3c4d5d62 100644
--- a/components/download/public/common/download_file_impl.h
+++ b/components/download/public/common/download_file_impl.h
@@ -60,8 +60,7 @@
                   const DownloadItem::ReceivedSlices& received_slices,
                   bool is_parallelizable) override;
   void AddInputStream(std::unique_ptr<InputStream> stream,
-                      int64_t offset,
-                      int64_t length) override;
+                      int64_t offset) override;
   void RenameAndUniquify(const base::FilePath& full_path,
                          const RenameCompletionCallback& callback) override;
   void RenameAndAnnotate(
@@ -102,7 +101,6 @@
   class COMPONENTS_DOWNLOAD_EXPORT SourceStream {
    public:
     SourceStream(int64_t offset,
-                 int64_t length,
                  int64_t starting_file_write_offset,
                  std::unique_ptr<InputStream> stream);
     ~SourceStream();
diff --git a/components/download/public/common/download_job.h b/components/download/public/common/download_job.h
index a4348310..42d5609 100644
--- a/components/download/public/common/download_job.h
+++ b/components/download/public/common/download_job.h
@@ -64,9 +64,7 @@
 
   // Add an input stream to the download sink. Return false if we start to
   // destroy download file.
-  bool AddInputStream(std::unique_ptr<InputStream> stream,
-                      int64_t offset,
-                      int64_t length);
+  bool AddInputStream(std::unique_ptr<InputStream> stream, int64_t offset);
 
   DownloadItem* download_item_;
 
diff --git a/components/download/public/common/download_save_info.h b/components/download/public/common/download_save_info.h
index 9f249c7..f2e0043 100644
--- a/components/download/public/common/download_save_info.h
+++ b/components/download/public/common/download_save_info.h
@@ -56,12 +56,6 @@
   // used for validation purpose.
   int64_t file_offset = -1;
 
-  // The number of the bytes to download from |offset|.
-  // Ask to retrieve segment of the download file when length is greater than 0.
-  // Request the rest of the file starting from |offset|, when length is
-  // |kLengthFullContent|.
-  int64_t length = kLengthFullContent;
-
   // The state of the hash. If specified, this hash state must indicate the
   // state of the partial file for the first |offset| bytes.
   std::unique_ptr<crypto::SecureHash> hash_state;
diff --git a/components/download/public/common/download_url_parameters.h b/components/download/public/common/download_url_parameters.h
index 5f8d490..bf4d01902 100644
--- a/components/download/public/common/download_url_parameters.h
+++ b/components/download/public/common/download_url_parameters.h
@@ -172,15 +172,8 @@
 
   // If |offset| is non-zero, then a byte range request will be issued to fetch
   // the range of bytes starting at |offset|.
-  // Use |set_length| to specify the last byte position, or the range
-  // request will be "Range:bytes={offset}-" to retrieve the rest of the file.
   void set_offset(int64_t offset) { save_info_.offset = offset; }
 
-  // When |length| > 0, the range of bytes will be from
-  // |save_info_.offset| to |save_info_.offset| + |length| - 1.
-  // See |DownloadSaveInfo.length|.
-  void set_length(int64_t length) { save_info_.length = length; }
-
   // Sets the offset to start writing to the file. If set, The data received
   // before |file_offset| are discarded or are used for validation purpose.
   void set_file_offset(int64_t file_offset) {
@@ -302,7 +295,6 @@
     return save_info_.suggested_name;
   }
   int64_t offset() const { return save_info_.offset; }
-  int64_t length() const { return save_info_.length; }
   const std::string& hash_of_partial_file() const {
     return save_info_.hash_of_partial_file;
   }
diff --git a/components/download/public/common/mock_download_file.cc b/components/download/public/common/mock_download_file.cc
index 4d24d9e..601f4fe 100644
--- a/components/download/public/common/mock_download_file.cc
+++ b/components/download/public/common/mock_download_file.cc
@@ -32,11 +32,10 @@
 MockDownloadFile::~MockDownloadFile() {}
 
 void MockDownloadFile::AddInputStream(std::unique_ptr<InputStream> input_stream,
-                                      int64_t offset,
-                                      int64_t length) {
+                                      int64_t offset) {
   // Gmock currently can't mock method that takes move-only parameters,
   // delegate the EXPECT_CALL count to |DoAddByteStream|.
-  DoAddInputStream(input_stream.get(), offset, length);
+  DoAddInputStream(input_stream.get(), offset);
 }
 
 }  // namespace download
diff --git a/components/download/public/common/mock_download_file.h b/components/download/public/common/mock_download_file.h
index 585223e4..917e534 100644
--- a/components/download/public/common/mock_download_file.h
+++ b/components/download/public/common/mock_download_file.h
@@ -35,10 +35,9 @@
                     const DownloadItem::ReceivedSlices& received_slices,
                     bool is_parallelizable));
   void AddInputStream(std::unique_ptr<InputStream> input_stream,
-                      int64_t offset,
-                      int64_t length) override;
-  MOCK_METHOD3(DoAddInputStream,
-               void(InputStream* input_stream, int64_t offset, int64_t length));
+                      int64_t offset) override;
+  MOCK_METHOD2(DoAddInputStream,
+               void(InputStream* input_stream, int64_t offset));
   MOCK_METHOD2(OnResponseCompleted,
                void(int64_t offset, DownloadInterruptReason status));
   MOCK_METHOD2(AppendDataToFile,
diff --git a/components/embedder_support/android/delegate/web_contents_delegate_android.cc b/components/embedder_support/android/delegate/web_contents_delegate_android.cc
index 3ba63a18..5316b981 100644
--- a/components/embedder_support/android/delegate/web_contents_delegate_android.cc
+++ b/components/embedder_support/android/delegate/web_contents_delegate_android.cc
@@ -189,27 +189,20 @@
   Java_WebContentsDelegateAndroid_rendererResponsive(env, obj);
 }
 
-bool WebContentsDelegateAndroid::ShouldCreateWebContents(
-    content::WebContents* web_contents,
-    content::RenderFrameHost* opener,
+bool WebContentsDelegateAndroid::IsWebContentsCreationOverridden(
     content::SiteInstance* source_site_instance,
-    int32_t route_id,
-    int32_t main_frame_route_id,
-    int32_t main_frame_widget_route_id,
     content::mojom::WindowContainerType window_container_type,
     const GURL& opener_url,
     const std::string& frame_name,
-    const GURL& target_url,
-    const std::string& partition_id,
-    content::SessionStorageNamespace* session_storage_namespace) {
+    const GURL& target_url) {
   JNIEnv* env = AttachCurrentThread();
   ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
   if (obj.is_null())
-    return true;
+    return false;
   ScopedJavaLocalRef<jstring> java_url =
       ConvertUTF8ToJavaString(env, target_url.spec());
-  return Java_WebContentsDelegateAndroid_shouldCreateWebContents(env, obj,
-                                                                 java_url);
+  return !Java_WebContentsDelegateAndroid_shouldCreateWebContents(env, obj,
+                                                                  java_url);
 }
 
 void WebContentsDelegateAndroid::WebContentsCreated(
diff --git a/components/embedder_support/android/delegate/web_contents_delegate_android.h b/components/embedder_support/android/delegate/web_contents_delegate_android.h
index 62ccbc2..3127006a 100644
--- a/components/embedder_support/android/delegate/web_contents_delegate_android.h
+++ b/components/embedder_support/android/delegate/web_contents_delegate_android.h
@@ -76,19 +76,12 @@
                           const std::string& frame_name,
                           const GURL& target_url,
                           content::WebContents* new_contents) override;
-  bool ShouldCreateWebContents(
-      content::WebContents* web_contents,
-      content::RenderFrameHost* opener,
+  bool IsWebContentsCreationOverridden(
       content::SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
       content::mojom::WindowContainerType window_container_type,
       const GURL& opener_url,
       const std::string& frame_name,
-      const GURL& target_url,
-      const std::string& partition_id,
-      content::SessionStorageNamespace* session_storage_namespace) override;
+      const GURL& target_url) override;
   void CloseContents(content::WebContents* source) override;
   void SetContentsBounds(content::WebContents* source,
                          const gfx::Rect& bounds) override;
diff --git a/components/leveldb_proto/public/shared_proto_database_client_list.h b/components/leveldb_proto/public/shared_proto_database_client_list.h
index 63bff8a..b8aa746 100644
--- a/components/leveldb_proto/public/shared_proto_database_client_list.h
+++ b/components/leveldb_proto/public/shared_proto_database_client_list.h
@@ -65,6 +65,7 @@
 // Add any obsolete databases in this list so that, if the data is no longer
 // needed.
 constexpr ProtoDbType kObsoleteSharedProtoDbTypeClients[] = {
+    ProtoDbType::DOM_DISTILLER_STORE,
     ProtoDbType::LAST,  // Marks the end of list.
 };
 
diff --git a/components/metrics/net/cellular_logic_helper.cc b/components/metrics/net/cellular_logic_helper.cc
index 8fcedc3..9f66d11 100644
--- a/components/metrics/net/cellular_logic_helper.cc
+++ b/components/metrics/net/cellular_logic_helper.cc
@@ -28,17 +28,15 @@
 
 }  // namespace
 
-base::TimeDelta GetUploadInterval() {
+base::TimeDelta GetUploadInterval(bool use_cellular_upload_interval) {
 #if defined(OS_ANDROID) || defined(OS_IOS)
-  if (IsCellularLogicEnabled())
+  if (use_cellular_upload_interval)
     return base::TimeDelta::FromSeconds(kStandardUploadIntervalCellularSeconds);
 #endif
   return base::TimeDelta::FromSeconds(kStandardUploadIntervalSeconds);
 }
 
-// Returns true if current connection type is cellular and cellular logic is
-// enabled.
-bool IsCellularLogicEnabled() {
+bool ShouldUseCellularUploadInterval() {
   if (!kDefaultCellularLogicEnabled)
     return false;
 
diff --git a/components/metrics/net/cellular_logic_helper.h b/components/metrics/net/cellular_logic_helper.h
index b5c7061c..3ff2178 100644
--- a/components/metrics/net/cellular_logic_helper.h
+++ b/components/metrics/net/cellular_logic_helper.h
@@ -9,12 +9,16 @@
 
 namespace metrics {
 
-// Returns UMA log upload interval based on OS and ongoing cellular experiment.
-base::TimeDelta GetUploadInterval();
+// Returns UMA log upload interval based on OS. If
+// |use_cellular_upload_interval| is true, this returns an interval suitable for
+// metered cellular connections. Otherwise, this returns an interval suitable
+// for unmetered (ex. WiFi) connections.
+base::TimeDelta GetUploadInterval(bool use_cellular_upload_interval);
 
-// Returns true if current connection type is cellular and user is assigned to
-// experimental group for enabled cellular uploads.
-bool IsCellularLogicEnabled();
+// Returns true if current connection type is cellular and the platform supports
+// using a separate interval for cellular connections (at the moment, this is
+// supported for OS_ANDROID and OS_IOS).
+bool ShouldUseCellularUploadInterval();
 
 }  // namespace metrics
 
diff --git a/components/mirroring/service/fake_network_service.cc b/components/mirroring/service/fake_network_service.cc
index 6b9794b4..97f36ac6 100644
--- a/components/mirroring/service/fake_network_service.cc
+++ b/components/mirroring/service/fake_network_service.cc
@@ -12,7 +12,7 @@
 
 MockUdpSocket::MockUdpSocket(
     mojo::PendingReceiver<network::mojom::UDPSocket> receiver,
-    network::mojom::UDPSocketListenerPtr listener)
+    mojo::PendingRemote<network::mojom::UDPSocketListener> listener)
     : receiver_(this, std::move(receiver)), listener_(std::move(listener)) {}
 
 MockUdpSocket::~MockUdpSocket() {}
@@ -60,7 +60,7 @@
 
 void MockNetworkContext::CreateUDPSocket(
     mojo::PendingReceiver<network::mojom::UDPSocket> receiver,
-    network::mojom::UDPSocketListenerPtr listener) {
+    mojo::PendingRemote<network::mojom::UDPSocketListener> listener) {
   udp_socket_ =
       std::make_unique<MockUdpSocket>(std::move(receiver), std::move(listener));
   OnUDPSocketCreated();
diff --git a/components/mirroring/service/fake_network_service.h b/components/mirroring/service/fake_network_service.h
index bd3a10d..d8ef20b 100644
--- a/components/mirroring/service/fake_network_service.h
+++ b/components/mirroring/service/fake_network_service.h
@@ -8,7 +8,9 @@
 #include "base/callback.h"
 #include "media/cast/net/cast_transport_defines.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/network/public/mojom/udp_socket.mojom.h"
 #include "services/network/test/test_network_context.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -18,8 +20,9 @@
 
 class MockUdpSocket final : public network::mojom::UDPSocket {
  public:
-  MockUdpSocket(mojo::PendingReceiver<network::mojom::UDPSocket> receiver,
-                network::mojom::UDPSocketListenerPtr listener);
+  MockUdpSocket(
+      mojo::PendingReceiver<network::mojom::UDPSocket> receiver,
+      mojo::PendingRemote<network::mojom::UDPSocketListener> listener);
   ~MockUdpSocket() override;
 
   MOCK_METHOD0(OnSend, void());
@@ -59,7 +62,7 @@
 
  private:
   mojo::Receiver<network::mojom::UDPSocket> receiver_;
-  network::mojom::UDPSocketListenerPtr listener_;
+  mojo::Remote<network::mojom::UDPSocketListener> listener_;
   std::unique_ptr<media::cast::Packet> sending_packet_;
   int num_ask_for_receive_ = 0;
 
@@ -77,7 +80,7 @@
   // network::mojom::NetworkContext implementation:
   void CreateUDPSocket(
       mojo::PendingReceiver<network::mojom::UDPSocket> receiver,
-      network::mojom::UDPSocketListenerPtr listener) override;
+      mojo::PendingRemote<network::mojom::UDPSocketListener> listener) override;
   void CreateURLLoaderFactory(
       network::mojom::URLLoaderFactoryRequest request,
       network::mojom::URLLoaderFactoryParamsPtr params) override;
diff --git a/components/mirroring/service/udp_socket_client.cc b/components/mirroring/service/udp_socket_client.cc
index d7b6a57..3c8e19f 100644
--- a/components/mirroring/service/udp_socket_client.cc
+++ b/components/mirroring/service/udp_socket_client.cc
@@ -53,7 +53,6 @@
     : remote_endpoint_(remote_endpoint),
       network_context_(context),
       error_callback_(std::move(error_callback)),
-      binding_(this),
       bytes_sent_(0),
       allow_sending_(false),
       num_packets_pending_receive_(0) {
@@ -105,10 +104,8 @@
     const media::cast::PacketReceiverCallbackWithStatus& packet_receiver) {
   DVLOG(1) << __func__;
   packet_receiver_callback_ = packet_receiver;
-  network::mojom::UDPSocketListenerPtr udp_socket_listener;
-  binding_.Bind(mojo::MakeRequest(&udp_socket_listener));
   network_context_->CreateUDPSocket(udp_socket_.BindNewPipeAndPassReceiver(),
-                                    std::move(udp_socket_listener));
+                                    receiver_.BindNewPipeAndPassRemote());
   network::mojom::UDPSocketOptionsPtr options;
   udp_socket_->Connect(remote_endpoint_, std::move(options),
                        base::BindOnce(&UdpSocketClient::OnSocketConnected,
@@ -140,8 +137,8 @@
 
 void UdpSocketClient::StopReceiving() {
   packet_receiver_callback_.Reset();
-  if (binding_.is_bound())
-    binding_.Close();
+  if (receiver_.is_bound())
+    receiver_.reset();
   if (udp_socket_.is_bound())
     udp_socket_.reset();
   num_packets_pending_receive_ = 0;
diff --git a/components/mirroring/service/udp_socket_client.h b/components/mirroring/service/udp_socket_client.h
index 7cbd8195..7618cac4 100644
--- a/components/mirroring/service/udp_socket_client.h
+++ b/components/mirroring/service/udp_socket_client.h
@@ -8,7 +8,7 @@
 #include "base/callback.h"
 #include "base/component_export.h"
 #include "media/cast/net/cast_transport_config.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/ip_endpoint.h"
 #include "services/network/public/mojom/network_service.mojom.h"
@@ -60,7 +60,7 @@
   network::mojom::NetworkContext* const network_context_;
   base::OnceClosure error_callback_;
 
-  mojo::Binding<network::mojom::UDPSocketListener> binding_;
+  mojo::Receiver<network::mojom::UDPSocketListener> receiver_{this};
 
   // The callback to deliver the received packets to the packet parser. Set
   // when StartReceiving() is called.
diff --git a/components/neterror/resources/offline.js b/components/neterror/resources/offline.js
index c8072fd..bfc275d 100644
--- a/components/neterror/resources/offline.js
+++ b/components/neterror/resources/offline.js
@@ -1618,6 +1618,7 @@
   this.spritePos = spritePos;
   this.xPos = 0;
   this.yPos = 0;
+  this.xInitialPos = 0;
   // Position when on the ground.
   this.groundYPos = 0;
   this.currentFrame = 0;
@@ -1630,7 +1631,6 @@
   this.config = Trex.config;
   // Current status.
   this.status = Trex.status.WAITING;
-
   this.jumping = false;
   this.ducking = false;
   this.jumpVelocity = 0;
@@ -1779,6 +1779,7 @@
     if (this.playingIntro && this.xPos < this.config.START_X_POS) {
       this.xPos += Math.round((this.config.START_X_POS /
           this.config.INTRO_DURATION) * deltaTime);
+      this.xInitialPos = this.xPos;
     }
 
     if (this.status == Trex.status.WAITING) {
@@ -1957,6 +1958,7 @@
    * Reset the t-rex to running at start of game.
    */
   reset: function() {
+    this.xPos = this.xInitialPos;
     this.yPos = this.groundYPos;
     this.jumpVelocity = 0;
     this.jumping = false;
diff --git a/components/offline_pages/content/background_loader/background_loader_contents.cc b/components/offline_pages/content/background_loader/background_loader_contents.cc
index b0b86f1..030e61f 100644
--- a/components/offline_pages/content/background_loader/background_loader_contents.cc
+++ b/components/offline_pages/content/background_loader/background_loader_contents.cc
@@ -76,21 +76,14 @@
   }
 }
 
-bool BackgroundLoaderContents::ShouldCreateWebContents(
-    content::WebContents* web_contents,
-    content::RenderFrameHost* opener,
+bool BackgroundLoaderContents::IsWebContentsCreationOverridden(
     content::SiteInstance* source_site_instance,
-    int32_t route_id,
-    int32_t main_frame_route_id,
-    int32_t main_frame_widget_route_id,
     content::mojom::WindowContainerType window_container_type,
     const GURL& opener_url,
     const std::string& frame_name,
-    const GURL& target_url,
-    const std::string& partition_id,
-    content::SessionStorageNamespace* session_storage_namespace) {
+    const GURL& target_url) {
   // Background pages should not create other webcontents/tabs.
-  return false;
+  return true;
 }
 
 void BackgroundLoaderContents::AddNewContents(
diff --git a/components/offline_pages/content/background_loader/background_loader_contents.h b/components/offline_pages/content/background_loader/background_loader_contents.h
index 77638f0..cac688e 100644
--- a/components/offline_pages/content/background_loader/background_loader_contents.h
+++ b/components/offline_pages/content/background_loader/background_loader_contents.h
@@ -56,19 +56,12 @@
                    const std::string& request_method,
                    base::OnceCallback<void(bool)> callback) override;
 
-  bool ShouldCreateWebContents(
-      content::WebContents* web_contents,
-      content::RenderFrameHost* opener,
+  bool IsWebContentsCreationOverridden(
       content::SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
       content::mojom::WindowContainerType window_container_type,
       const GURL& opener_url,
       const std::string& frame_name,
-      const GURL& target_url,
-      const std::string& partition_id,
-      content::SessionStorageNamespace* session_storage_namespace) override;
+      const GURL& target_url) override;
 
   void AddNewContents(content::WebContents* source,
                       std::unique_ptr<content::WebContents> new_contents,
diff --git a/components/offline_pages/content/background_loader/background_loader_contents_unittest.cc b/components/offline_pages/content/background_loader/background_loader_contents_unittest.cc
index 7e22d0e..0a0aec9 100644
--- a/components/offline_pages/content/background_loader/background_loader_contents_unittest.cc
+++ b/components/offline_pages/content/background_loader/background_loader_contents_unittest.cc
@@ -134,14 +134,11 @@
 }
 
 TEST_F(BackgroundLoaderContentsTest, ShouldNotCreateWebContents) {
-  ASSERT_FALSE(contents()->ShouldCreateWebContents(
-      nullptr /* contents */, nullptr /* opener */,
-      nullptr /* source_site_instance */, 0 /* route_id */,
-      0 /* main_frame_route_id */, 0 /* main_frame_widget_route_id */,
+  ASSERT_TRUE(contents()->IsWebContentsCreationOverridden(
+      nullptr /* source_site_instance */,
       content::mojom::WindowContainerType::NORMAL /* window_container_type */,
       GURL() /* opener_url */, "foo" /* frame_name */,
-      GURL::EmptyGURL() /* target_url */, "bar" /* partition_id */,
-      nullptr /* session_storage_namespace */));
+      GURL::EmptyGURL() /* target_url */));
 }
 
 TEST_F(BackgroundLoaderContentsTest, ShouldNotAddNewContents) {
diff --git a/components/optimization_guide/optimization_guide_enums.h b/components/optimization_guide/optimization_guide_enums.h
index b00303d..9423c6c 100644
--- a/components/optimization_guide/optimization_guide_enums.h
+++ b/components/optimization_guide/optimization_guide_enums.h
@@ -52,9 +52,11 @@
   kPageLoadDoesNotMatch,
   // The page load matches the optimization target.
   kPageLoadMatches,
-
+  // The model needed to make the target decision was not available on the
+  // client.
+  kModelNotAvailableOnClient,
   // Add new values above this line.
-  kMaxValue = kPageLoadMatches,
+  kMaxValue = kModelNotAvailableOnClient,
 };
 
 }  // namespace optimization_guide
diff --git a/components/previews/content/previews_decider_impl.cc b/components/previews/content/previews_decider_impl.cc
index f1685267..cda604e 100644
--- a/components/previews/content/previews_decider_impl.cc
+++ b/components/previews/content/previews_decider_impl.cc
@@ -323,21 +323,21 @@
     }
     passed_reasons->push_back(PreviewsEligibilityReason::DEVICE_OFFLINE);
 
-    // If the optimization type does not require optimization hints, determine
+    // If the optimization type is not a commit-time preview, determine
     // the ECT network triggering condition here.
-    if (!ShouldCheckOptimizationHints(type)) {
+    if (!IsCommitTimePreview(type)) {
       if (effective_connection_type_ >
           previews::params::GetECTThresholdForPreview(type)) {
         return PreviewsEligibilityReason::NETWORK_NOT_SLOW;
       }
       passed_reasons->push_back(PreviewsEligibilityReason::NETWORK_NOT_SLOW);
-    }
 
-    if (effective_connection_type_ > params::GetSessionMaxECTThreshold()) {
-      return PreviewsEligibilityReason::NETWORK_NOT_SLOW_FOR_SESSION;
+      if (effective_connection_type_ > params::GetSessionMaxECTThreshold()) {
+        return PreviewsEligibilityReason::NETWORK_NOT_SLOW_FOR_SESSION;
+      }
+      passed_reasons->push_back(
+          PreviewsEligibilityReason::NETWORK_NOT_SLOW_FOR_SESSION);
     }
-    passed_reasons->push_back(
-        PreviewsEligibilityReason::NETWORK_NOT_SLOW_FOR_SESSION);
   }
 
   if (is_reload) {
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/profile_sync_service.cc
index 19c3d8f0..d1423bf 100644
--- a/components/sync/driver/profile_sync_service.cc
+++ b/components/sync/driver/profile_sync_service.cc
@@ -859,7 +859,8 @@
           initial_types, debug_info_listener, &data_type_controllers_,
           user_settings_.get(), engine_.get(), this);
 
-  crypto_.SetSyncEngine(engine_.get());
+  crypto_.SetSyncEngine(GetAuthenticatedAccountInfo().account_id,
+                        engine_.get());
 
   // Auto-start means IsFirstSetupComplete gets set automatically.
   if (start_behavior_ == AUTO_START &&
diff --git a/components/sync/driver/sync_service_crypto.cc b/components/sync/driver/sync_service_crypto.cc
index 6faacdc..78029e7a 100644
--- a/components/sync/driver/sync_service_crypto.cc
+++ b/components/sync/driver/sync_service_crypto.cc
@@ -284,8 +284,11 @@
 }
 
 void SyncServiceCrypto::AddTrustedVaultDecryptionKeys(
+    const CoreAccountId& account_id,
     const std::vector<std::string>& keys) {
-  state_.engine->AddTrustedVaultDecryptionKeys(keys);
+  if (state_.engine && state_.account_id == account_id) {
+    state_.engine->AddTrustedVaultDecryptionKeys(keys);
+  }
 }
 
 PassphraseType SyncServiceCrypto::GetPassphraseType() const {
@@ -433,6 +436,13 @@
   notify_observers_.Run();
 }
 
+void SyncServiceCrypto::SetSyncEngine(const CoreAccountId& account_id,
+                                      SyncEngine* engine) {
+  DCHECK(engine);
+  state_.account_id = account_id;
+  state_.engine = engine;
+}
+
 std::unique_ptr<SyncEncryptionHandler::Observer>
 SyncServiceCrypto::GetEncryptionObserverProxy() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/components/sync/driver/sync_service_crypto.h b/components/sync/driver/sync_service_crypto.h
index f996c11..786a3ce 100644
--- a/components/sync/driver/sync_service_crypto.h
+++ b/components/sync/driver/sync_service_crypto.h
@@ -16,6 +16,7 @@
 #include "components/sync/engine/configure_reason.h"
 #include "components/sync/engine/sync_encryption_handler.h"
 #include "components/sync/engine/sync_engine.h"
+#include "google_apis/gaia/core_account_id.h"
 
 namespace syncer {
 
@@ -43,7 +44,8 @@
   bool IsEncryptEverythingEnabled() const;
   void SetEncryptionPassphrase(const std::string& passphrase);
   bool SetDecryptionPassphrase(const std::string& passphrase);
-  void AddTrustedVaultDecryptionKeys(const std::vector<std::string>& keys);
+  void AddTrustedVaultDecryptionKeys(const CoreAccountId& account_id,
+                                     const std::vector<std::string>& keys);
 
   // Returns the actual passphrase type being used for encryption.
   PassphraseType GetPassphraseType() const;
@@ -70,7 +72,7 @@
                                base::Time passphrase_time) override;
 
   // Used to provide the engine when it is initialized.
-  void SetSyncEngine(SyncEngine* engine) { state_.engine = engine; }
+  void SetSyncEngine(const CoreAccountId& account_id, SyncEngine* engine);
 
   // Creates a proxy observer object that will post calls to this thread.
   std::unique_ptr<SyncEncryptionHandler::Observer> GetEncryptionObserverProxy();
@@ -105,6 +107,9 @@
     // Not-null when the engine is initialized.
     SyncEngine* engine = nullptr;
 
+    // Populated when the engine is initialized.
+    CoreAccountId account_id;
+
     RequiredUserAction required_user_action = RequiredUserAction::kNone;
 
     // The current set of encrypted types. Always a superset of
diff --git a/components/sync/driver/sync_user_settings.h b/components/sync/driver/sync_user_settings.h
index 7d0332f9..efa0b6c3 100644
--- a/components/sync/driver/sync_user_settings.h
+++ b/components/sync/driver/sync_user_settings.h
@@ -15,6 +15,8 @@
 #include "components/sync/base/user_selectable_type.h"
 #include "components/sync/driver/data_type_encryption_handler.h"
 
+struct CoreAccountId;
+
 namespace syncer {
 
 // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser
@@ -118,6 +120,7 @@
   // TRUSTED_VAULT_PASSPHRASE: it provides new decryption keys that could
   // allow decrypting pending Nigori keys.
   virtual void AddTrustedVaultDecryptionKeys(
+      const CoreAccountId& account_id,
       const std::vector<std::string>& keys) = 0;
 };
 
diff --git a/components/sync/driver/sync_user_settings_impl.cc b/components/sync/driver/sync_user_settings_impl.cc
index b77ef212..d336fa95 100644
--- a/components/sync/driver/sync_user_settings_impl.cc
+++ b/components/sync/driver/sync_user_settings_impl.cc
@@ -171,9 +171,10 @@
 }
 
 void SyncUserSettingsImpl::AddTrustedVaultDecryptionKeys(
+    const CoreAccountId& account_id,
     const std::vector<std::string>& keys) {
   DVLOG(1) << "Adding trusted vault decryption keys.";
-  crypto_->AddTrustedVaultDecryptionKeys(keys);
+  crypto_->AddTrustedVaultDecryptionKeys(account_id, keys);
 }
 
 void SyncUserSettingsImpl::SetSyncRequestedIfNotSetExplicitly() {
diff --git a/components/sync/driver/sync_user_settings_impl.h b/components/sync/driver/sync_user_settings_impl.h
index e689df9..c18c6b4 100644
--- a/components/sync/driver/sync_user_settings_impl.h
+++ b/components/sync/driver/sync_user_settings_impl.h
@@ -14,6 +14,8 @@
 #include "components/sync/driver/sync_type_preference_provider.h"
 #include "components/sync/driver/sync_user_settings.h"
 
+struct CoreAccountId;
+
 namespace syncer {
 
 class SyncPrefs;
@@ -63,6 +65,7 @@
   void SetEncryptionPassphrase(const std::string& passphrase) override;
   bool SetDecryptionPassphrase(const std::string& passphrase) override;
   void AddTrustedVaultDecryptionKeys(
+      const CoreAccountId& account_id,
       const std::vector<std::string>& keys) override;
 
   void SetSyncRequestedIfNotSetExplicitly();
diff --git a/components/sync/driver/sync_user_settings_mock.h b/components/sync/driver/sync_user_settings_mock.h
index bd279f2..7ab5cf6 100644
--- a/components/sync/driver/sync_user_settings_mock.h
+++ b/components/sync/driver/sync_user_settings_mock.h
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "components/sync/driver/sync_user_settings.h"
+#include "google_apis/gaia/core_account_id.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace syncer {
@@ -47,8 +48,8 @@
 
   MOCK_METHOD1(SetEncryptionPassphrase, void(const std::string&));
   MOCK_METHOD1(SetDecryptionPassphrase, bool(const std::string&));
-  MOCK_METHOD1(AddTrustedVaultDecryptionKeys,
-               void(const std::vector<std::string>&));
+  MOCK_METHOD2(AddTrustedVaultDecryptionKeys,
+               void(const CoreAccountId&, const std::vector<std::string>&));
 };
 
 }  // namespace syncer
diff --git a/components/sync/driver/test_sync_user_settings.cc b/components/sync/driver/test_sync_user_settings.cc
index 3335da8..a5e45d69 100644
--- a/components/sync/driver/test_sync_user_settings.cc
+++ b/components/sync/driver/test_sync_user_settings.cc
@@ -153,6 +153,7 @@
 }
 
 void TestSyncUserSettings::AddTrustedVaultDecryptionKeys(
+    const CoreAccountId& account_id,
     const std::vector<std::string>& keys) {}
 
 void TestSyncUserSettings::SetFirstSetupComplete() {
diff --git a/components/sync/driver/test_sync_user_settings.h b/components/sync/driver/test_sync_user_settings.h
index d79639df..3c0fd09 100644
--- a/components/sync/driver/test_sync_user_settings.h
+++ b/components/sync/driver/test_sync_user_settings.h
@@ -10,6 +10,8 @@
 
 #include "components/sync/driver/sync_user_settings.h"
 
+struct CoreAccountId;
+
 namespace syncer {
 
 class TestSyncService;
@@ -52,6 +54,7 @@
   void SetEncryptionPassphrase(const std::string& passphrase) override;
   bool SetDecryptionPassphrase(const std::string& passphrase) override;
   void AddTrustedVaultDecryptionKeys(
+      const CoreAccountId& account_id,
       const std::vector<std::string>& keys) override;
 
   void SetFirstSetupComplete();
diff --git a/components/viz/demo/demo_main.cc b/components/viz/demo/demo_main.cc
index d4ab1be..e40e9eb 100644
--- a/components/viz/demo/demo_main.cc
+++ b/components/viz/demo/demo_main.cc
@@ -17,7 +17,7 @@
 #include "mojo/core/embedder/embedder.h"
 #include "mojo/core/embedder/scoped_ipc_support.h"
 #include "ui/events/platform/platform_event_source.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_delegate.h"
 #include "ui/platform_window/platform_window_init_properties.h"
 
@@ -110,7 +110,7 @@
   }
 
  private:
-  std::unique_ptr<ui::PlatformWindow> CreatePlatformWindow(
+  std::unique_ptr<ui::PlatformWindowBase> CreatePlatformWindow(
       const gfx::Rect& bounds) {
     ui::PlatformWindowInitProperties props(bounds);
 #if defined(USE_OZONE)
@@ -178,7 +178,7 @@
   std::unique_ptr<demo::DemoHost> host_;
   std::unique_ptr<demo::DemoService> service_;
 
-  std::unique_ptr<ui::PlatformWindow> platform_window_;
+  std::unique_ptr<ui::PlatformWindowBase> platform_window_;
   gfx::AcceleratedWidget widget_;
 
   DISALLOW_COPY_AND_ASSIGN(DemoWindow);
diff --git a/components/viz/service/display_embedder/software_output_device_ozone_unittest.cc b/components/viz/service/display_embedder/software_output_device_ozone_unittest.cc
index e71d6a9..e002109 100644
--- a/components/viz/service/display_embedder/software_output_device_ozone_unittest.cc
+++ b/components/viz/service/display_embedder/software_output_device_ozone_unittest.cc
@@ -21,7 +21,7 @@
 #include "ui/ozone/public/platform_window_surface.h"
 #include "ui/ozone/public/surface_factory_ozone.h"
 #include "ui/ozone/public/surface_ozone_canvas.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_delegate.h"
 #include "ui/platform_window/platform_window_init_properties.h"
 
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc
index 01a9482..21c26f2d 100644
--- a/content/browser/back_forward_cache_browsertest.cc
+++ b/content/browser/back_forward_cache_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/command_line.h"
+#include "base/metrics/metrics_hashes.h"
 #include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_feature_list.h"
@@ -86,14 +87,7 @@
   void ExpectOutcome(BackForwardCacheMetrics::HistoryNavigationOutcome outcome,
                      base::Location location) {
     base::HistogramBase::Sample sample = base::HistogramBase::Sample(outcome);
-    auto it = std::find_if(
-        expected_outcomes_.begin(), expected_outcomes_.end(),
-        [sample](const base::Bucket& bucket) { return bucket.min == sample; });
-    if (it == expected_outcomes_.end()) {
-      expected_outcomes_.push_back(base::Bucket(sample, 1));
-    } else {
-      it->count++;
-    }
+    AddSampleToBuckets(&expected_outcomes_, sample);
 
     EXPECT_EQ(expected_outcomes_,
               histogram_tester_.GetAllSamples(
@@ -108,11 +102,37 @@
         << location.ToString();
   }
 
+  void ExpectDisabledWithReason(const std::string& reason,
+                                base::Location location) {
+    base::HistogramBase::Sample sample =
+        base::HistogramBase::Sample(base::HashMetricName(reason));
+    AddSampleToBuckets(&expected_disabled_reasons_, sample);
+
+    EXPECT_EQ(expected_disabled_reasons_,
+              histogram_tester_.GetAllSamples(
+                  "BackForwardCache.HistoryNavigationOutcome."
+                  "DisabledForRenderFrameHostReason"))
+        << location.ToString();
+  }
+
  private:
+  void AddSampleToBuckets(std::vector<base::Bucket>* buckets,
+                          base::HistogramBase::Sample sample) {
+    auto it = std::find_if(
+        buckets->begin(), buckets->end(),
+        [sample](const base::Bucket& bucket) { return bucket.min == sample; });
+    if (it == buckets->end()) {
+      buckets->push_back(base::Bucket(sample, 1));
+    } else {
+      it->count++;
+    }
+  }
+
   base::test::ScopedFeatureList feature_list_;
 
   base::HistogramTester histogram_tester_;
   std::vector<base::Bucket> expected_outcomes_;
+  std::vector<base::Bucket> expected_disabled_reasons_;
 };
 
 // Match RenderFrameHostImpl* that are in the BackForwardCache.
@@ -2377,11 +2397,17 @@
   web_contents()
       ->GetController()
       .GetBackForwardCache()
-      .DisableForRenderFrameHost(rfh_a->GetGlobalFrameRoutingId(), "test");
+      .DisableForRenderFrameHost(rfh_a->GetGlobalFrameRoutingId(),
+                                 "DisabledByBackForwardCacheBrowserTest");
 
   // 2) Navigate to B.
   EXPECT_TRUE(NavigateToURL(shell(), url_b));
   EXPECT_TRUE(delete_observer_rfh_a.deleted());
+
+  // 3) Go back to A.
+  web_contents()->GetController().GoBack();
+  EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
+  ExpectDisabledWithReason("DisabledByBackForwardCacheBrowserTest", FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
@@ -2400,7 +2426,8 @@
   web_contents()
       ->GetController()
       .GetBackForwardCache()
-      .DisableForRenderFrameHost(rfh_a_id, "test");
+      .DisableForRenderFrameHost(rfh_a_id,
+                                 "DisabledByBackForwardCacheBrowserTest");
 
   // 2) Navigate to B.
   EXPECT_TRUE(NavigateToURL(shell(), url_b));
@@ -2410,7 +2437,13 @@
   web_contents()
       ->GetController()
       .GetBackForwardCache()
-      .DisableForRenderFrameHost(rfh_a_id, "test");
+      .DisableForRenderFrameHost(rfh_a_id,
+                                 "DisabledByBackForwardCacheBrowserTest");
+
+  // 3) Go back to A.
+  web_contents()->GetController().GoBack();
+  EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
+  ExpectDisabledWithReason("DisabledByBackForwardCacheBrowserTest", FROM_HERE);
 }
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
@@ -2437,6 +2470,8 @@
 
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
                        DisableBackForwardEvictsIfAlreadyInCache) {
+  base::HistogramTester histogram_tester;
+
   ASSERT_TRUE(embedded_test_server()->Start());
   const GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html"));
   const GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html"));
@@ -2456,10 +2491,16 @@
   web_contents()
       ->GetController()
       .GetBackForwardCache()
-      .DisableForRenderFrameHost(rfh_a->GetGlobalFrameRoutingId(), "test");
+      .DisableForRenderFrameHost(rfh_a->GetGlobalFrameRoutingId(),
+                                 "DisabledByBackForwardCacheBrowserTest");
 
   EXPECT_TRUE(rfh_a->is_evicted_from_back_forward_cache());
   delete_observer_rfh_a.WaitUntilDeleted();
+
+  // 3) Go back to A.
+  web_contents()->GetController().GoBack();
+  EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
+  ExpectDisabledWithReason("DisabledByBackForwardCacheBrowserTest", FROM_HERE);
 }
 
 // Confirm that same-document navigation and not history-navigation does not
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc
index 51e7d8fc..f5c6728 100644
--- a/content/browser/browser_interface_binders.cc
+++ b/content/browser/browser_interface_binders.cc
@@ -58,6 +58,7 @@
 #include "third_party/blink/public/mojom/sms/sms_receiver.mojom.h"
 #include "third_party/blink/public/mojom/speech/speech_recognizer.mojom.h"
 #include "third_party/blink/public/mojom/speech/speech_synthesis.mojom.h"
+#include "third_party/blink/public/mojom/usb/web_usb_service.mojom.h"
 #include "third_party/blink/public/mojom/wake_lock/wake_lock.mojom.h"
 #include "third_party/blink/public/mojom/webaudio/audio_context_manager.mojom.h"
 #include "third_party/blink/public/mojom/webauthn/authenticator.mojom.h"
@@ -181,6 +182,9 @@
         &RenderFrameHostImpl::BindSmsReceiverReceiver, base::Unretained(host)));
   }
 
+  map->Add<blink::mojom::WebUsbService>(base::BindRepeating(
+      &RenderFrameHostImpl::CreateWebUsbService, base::Unretained(host)));
+
   map->Add<blink::mojom::LockManager>(base::BindRepeating(
       &RenderFrameHostImpl::CreateLockManager, base::Unretained(host)));
 
@@ -307,6 +311,8 @@
     map->Add<blink::mojom::SmsReceiver>(base::BindRepeating(
         &DedicatedWorkerHost::BindSmsReceiverReceiver, base::Unretained(host)));
   }
+  map->Add<blink::mojom::WebUsbService>(base::BindRepeating(
+      &DedicatedWorkerHost::CreateWebUsbService, base::Unretained(host)));
   map->Add<media::mojom::VideoDecodePerfHistory>(
       base::BindRepeating(&DedicatedWorkerHost::BindVideoDecodePerfHistory,
                           base::Unretained(host)));
diff --git a/content/browser/content_service_delegate_impl.cc b/content/browser/content_service_delegate_impl.cc
index f792a5e..37692e762 100644
--- a/content/browser/content_service_delegate_impl.cc
+++ b/content/browser/content_service_delegate_impl.cc
@@ -104,25 +104,18 @@
   }
 
   // WebContentsDelegate:
-  bool ShouldCreateWebContents(
-      content::WebContents* web_contents,
-      content::RenderFrameHost* opener,
+  bool IsWebContentsCreationOverridden(
       content::SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
       content::mojom::WindowContainerType window_container_type,
       const GURL& opener_url,
       const std::string& frame_name,
-      const GURL& target_url,
-      const std::string& partition_id,
-      content::SessionStorageNamespace* session_storage_namespace) override {
+      const GURL& target_url) override {
     // This method is invoked when attempting to open links in a new tab, e.g.:
     // <a href="https://www.google.com/" target="_blank">Link</a>
     client_->DidSuppressNavigation(target_url,
                                    WindowOpenDisposition::NEW_FOREGROUND_TAB,
                                    /*from_user_gesture=*/true);
-    return false;
+    return true;
   }
 
   WebContents* OpenURLFromTab(WebContents* source,
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc
index eb4b7547..bd94ac13 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -527,9 +527,8 @@
 #else
   if (delegate_) {
     base::FilePath website_save_directory;  // Unused
-    bool skip_dir_check = false;            // Unused
     delegate_->GetSaveDir(GetBrowserContext(), &website_save_directory,
-                          &default_download_directory, &skip_dir_check);
+                          &default_download_directory);
   }
 #endif
   if (default_download_directory.empty()) {
diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc
index cf1e3383..9fb209b 100644
--- a/content/browser/download/download_manager_impl_unittest.cc
+++ b/content/browser/download/download_manager_impl_unittest.cc
@@ -91,8 +91,8 @@
   MOCK_METHOD2(ShouldOpenDownload,
                bool(download::DownloadItem*,
                     const DownloadOpenDelayedCallback&));
-  MOCK_METHOD4(GetSaveDir, void(BrowserContext*,
-                                base::FilePath*, base::FilePath*, bool*));
+  MOCK_METHOD3(GetSaveDir,
+               void(BrowserContext*, base::FilePath*, base::FilePath*));
   MOCK_METHOD5(ChooseSavePath, void(
       WebContents*, const base::FilePath&, const base::FilePath::StringType&,
       bool, const SavePackagePathPickedCallback&));
@@ -599,7 +599,7 @@
 
 #if !defined(USE_X11)
   // Doing nothing will set the default download directory to null.
-  EXPECT_CALL(GetMockDownloadManagerDelegate(), GetSaveDir(_, _, _, _));
+  EXPECT_CALL(GetMockDownloadManagerDelegate(), GetSaveDir(_, _, _));
 #endif
   EXPECT_CALL(GetMockDownloadManagerDelegate(),
               ApplicationClientIdForFileScanning())
@@ -635,7 +635,7 @@
 
 #if !defined(USE_X11)
   // Doing nothing will set the default download directory to null.
-  EXPECT_CALL(GetMockDownloadManagerDelegate(), GetSaveDir(_, _, _, _));
+  EXPECT_CALL(GetMockDownloadManagerDelegate(), GetSaveDir(_, _, _));
 #endif
   EXPECT_CALL(GetMockDownloadManagerDelegate(),
               ApplicationClientIdForFileScanning())
diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc
index 46ca3cec..e6b08b0 100644
--- a/content/browser/download/save_package.cc
+++ b/content/browser/download/save_package.cc
@@ -1240,12 +1240,10 @@
   // need before calling to it.
   base::FilePath website_save_dir;
   base::FilePath download_save_dir;
-  bool skip_dir_check = false;
   auto* delegate = download_manager_->GetDelegate();
   if (delegate) {
-    delegate->GetSaveDir(
-        web_contents()->GetBrowserContext(), &website_save_dir,
-        &download_save_dir, &skip_dir_check);
+    delegate->GetSaveDir(web_contents()->GetBrowserContext(), &website_save_dir,
+                         &download_save_dir);
   }
   std::string mime_type = web_contents()->GetContentsMimeType();
   bool can_save_as_complete = CanSaveAsComplete(mime_type);
@@ -1253,7 +1251,7 @@
       download::GetDownloadTaskRunner().get(), FROM_HERE,
       base::Bind(&SavePackage::CreateDirectoryOnFileThread, title_, page_url_,
                  can_save_as_complete, mime_type, website_save_dir,
-                 download_save_dir, skip_dir_check),
+                 download_save_dir),
       base::Bind(&SavePackage::ContinueGetSaveInfo, this,
                  can_save_as_complete));
 }
@@ -1265,8 +1263,7 @@
     bool can_save_as_complete,
     const std::string& mime_type,
     const base::FilePath& website_save_dir,
-    const base::FilePath& download_save_dir,
-    bool skip_dir_check) {
+    const base::FilePath& download_save_dir) {
   DCHECK(download::GetDownloadTaskRunner()->RunsTasksInCurrentSequence());
 
   base::FilePath suggested_filename = filename_generation::GenerateFilename(
@@ -1274,8 +1271,7 @@
 
   base::FilePath save_dir;
   // If the default html/websites save folder doesn't exist...
-  // We skip the directory check for gdata directories on ChromeOS.
-  if (!skip_dir_check && !base::DirectoryExists(website_save_dir)) {
+  if (!base::DirectoryExists(website_save_dir)) {
     // If the default download dir doesn't exist, create it.
     if (!base::DirectoryExists(download_save_dir)) {
       bool res = base::CreateDirectory(download_save_dir);
diff --git a/content/browser/download/save_package.h b/content/browser/download/save_package.h
index c3385f8..742fd2f 100644
--- a/content/browser/download/save_package.h
+++ b/content/browser/download/save_package.h
@@ -305,8 +305,7 @@
       bool can_save_as_complete,
       const std::string& mime_type,
       const base::FilePath& website_save_dir,
-      const base::FilePath& download_save_dir,
-      bool skip_dir_check);
+      const base::FilePath& download_save_dir);
   void ContinueGetSaveInfo(bool can_save_as_complete,
                            const base::FilePath& suggested_path);
   void OnPathPicked(
diff --git a/content/browser/download/save_package_browsertest.cc b/content/browser/download/save_package_browsertest.cc
index 69dee7f5..0007dac 100644
--- a/content/browser/download/save_package_browsertest.cc
+++ b/content/browser/download/save_package_browsertest.cc
@@ -38,11 +38,9 @@
 
   void GetSaveDir(BrowserContext* context,
                   base::FilePath* website_save_dir,
-                  base::FilePath* download_save_dir,
-                  bool* skip_dir_check) override {
+                  base::FilePath* download_save_dir) override {
     *website_save_dir = download_dir_;
     *download_save_dir = download_dir_;
-    *skip_dir_check = false;
   }
 
   bool ShouldCompleteDownload(download::DownloadItem* download,
diff --git a/content/browser/frame_host/back_forward_cache_impl.cc b/content/browser/frame_host/back_forward_cache_impl.cc
index 35f7041..20a3d33 100644
--- a/content/browser/frame_host/back_forward_cache_impl.cc
+++ b/content/browser/frame_host/back_forward_cache_impl.cc
@@ -413,8 +413,16 @@
     g_bfcache_disabled_test_observer->OnDisabledForFrameWithReason(id, reason);
 
   auto* rfh = RenderFrameHostImpl::FromID(id);
-  if (rfh)
+  if (rfh) {
     rfh->DisallowBackForwardCache();
+
+    RenderFrameHostImpl* frame = rfh;
+    while (frame->GetParent())
+      frame = frame->GetParent();
+
+    if (BackForwardCacheMetrics* metrics = frame->GetBackForwardCacheMetrics())
+      metrics->MarkDisableForRenderFrameHost(reason);
+  }
 }
 
 void BackForwardCacheImpl::DisableForTesting(DisableForTestingReason reason) {
diff --git a/content/browser/frame_host/back_forward_cache_metrics.cc b/content/browser/frame_host/back_forward_cache_metrics.cc
index 9b20ac30..45fdb9af 100644
--- a/content/browser/frame_host/back_forward_cache_metrics.cc
+++ b/content/browser/frame_host/back_forward_cache_metrics.cc
@@ -5,6 +5,8 @@
 #include "content/browser/frame_host/back_forward_cache_metrics.h"
 
 #include "base/metrics/histogram_macros.h"
+#include "base/metrics/metrics_hashes.h"
+#include "base/metrics/sparse_histogram.h"
 #include "content/browser/frame_host/navigation_entry_impl.h"
 #include "content/browser/frame_host/navigation_request.h"
 #include "content/public/browser/browser_thread.h"
@@ -98,18 +100,9 @@
       navigation->GetPageTransition() & ui::PAGE_TRANSITION_FORWARD_BACK;
   if (navigation->IsInMainFrame() && !navigation->IsSameDocument() &&
       is_history_navigation) {
-    // TODO(hajimehoshi): Use kNotCachedDueToExperimentCondition if the
-    // experiment condition does not match.
-    HistoryNavigationOutcome outcome = HistoryNavigationOutcome::kNotCached;
-    if (navigation->is_served_from_back_forward_cache())
-      outcome = HistoryNavigationOutcome::kRestored;
-    if (evicted_ || last_committed_main_frame_navigation_id_ == -1) {
-      DCHECK(!navigation->is_served_from_back_forward_cache());
-      outcome = HistoryNavigationOutcome::kEvicted;
-    }
-    UMA_HISTOGRAM_ENUMERATION("BackForwardCache.HistoryNavigationOutcome",
-                              outcome, HistoryNavigationOutcome::kMaxValue);
+    RecordMetricsForHistoryNavigationCommit(navigation);
     evicted_ = false;
+    disallowed_reasons_.clear();
   }
 
   if (last_committed_main_frame_navigation_id_ != -1 &&
@@ -189,4 +182,38 @@
   evicted_ = true;
 }
 
+void BackForwardCacheMetrics::MarkDisableForRenderFrameHost(
+    const base::StringPiece& reason) {
+  disallowed_reasons_.push_back(reason.as_string());
+}
+
+void BackForwardCacheMetrics::RecordMetricsForHistoryNavigationCommit(
+    NavigationRequest* navigation) {
+  // TODO(hajimehoshi): Use kNotCachedDueToExperimentCondition if the
+  // experiment condition does not match.
+  HistoryNavigationOutcome outcome = HistoryNavigationOutcome::kNotCached;
+  if (navigation->is_served_from_back_forward_cache())
+    outcome = HistoryNavigationOutcome::kRestored;
+  if (evicted_ || last_committed_main_frame_navigation_id_ == -1) {
+    DCHECK(!navigation->is_served_from_back_forward_cache());
+    outcome = HistoryNavigationOutcome::kEvicted;
+  }
+  UMA_HISTOGRAM_ENUMERATION("BackForwardCache.HistoryNavigationOutcome",
+                            outcome, HistoryNavigationOutcome::kMaxValue);
+
+  for (const std::string& reason : disallowed_reasons_) {
+    // Use SparseHistogram instead of other simple macros for metrics. It is
+    // because the reasons are represented as strings, and it was impossible to
+    // define an enum values.
+    base::HistogramBase* histogram = base::SparseHistogram::FactoryGet(
+        "BackForwardCache.HistoryNavigationOutcome."
+        "DisabledForRenderFrameHostReason",
+        base::HistogramBase::kUmaTargetedHistogramFlag);
+    // Adopts the lower 32 bits as a signed integer from unsigned 64 bits
+    // integer.
+    histogram->Add(base::HistogramBase::Sample(
+        static_cast<int32_t>(base::HashMetricName(reason))));
+  }
+}
+
 }  // namespace content
diff --git a/content/browser/frame_host/back_forward_cache_metrics.h b/content/browser/frame_host/back_forward_cache_metrics.h
index 29aa5d2..820e064d 100644
--- a/content/browser/frame_host/back_forward_cache_metrics.h
+++ b/content/browser/frame_host/back_forward_cache_metrics.h
@@ -8,6 +8,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/optional.h"
+#include "base/strings/string_piece.h"
 #include "base/time/tick_clock.h"
 #include "base/time/time.h"
 #include "content/common/content_export.h"
@@ -96,6 +97,9 @@
   // TODO(hajimehoshi): Add the parameter representing the reason.
   void MarkEvictedFromBackForwardCache();
 
+  // Marks the frame disabled the back forward cache with the reason.
+  void MarkDisableForRenderFrameHost(const base::StringPiece& reason);
+
   // Injects a clock for mocking time.
   // Should be called only from the UI thread.
   CONTENT_EXPORT static void OverrideTimeForTesting(base::TickClock* clock);
@@ -112,6 +116,8 @@
   void CollectFeatureUsageFromSubtree(RenderFrameHostImpl* rfh,
                                       const url::Origin& main_frame_origin);
 
+  void RecordMetricsForHistoryNavigationCommit(NavigationRequest* navigation);
+
   // Main frame document sequence number that identifies all NavigationEntries
   // this metrics object is associated with.
   const int64_t document_sequence_number_;
@@ -136,6 +142,7 @@
   base::Optional<base::TimeTicks> navigated_away_from_main_document_timestamp_;
 
   bool evicted_ = false;
+  std::vector<std::string> disallowed_reasons_;
 
   DISALLOW_COPY_AND_ASSIGN(BackForwardCacheMetrics);
 };
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index ec254065..9e0df57 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -4203,8 +4203,9 @@
       cloned_namespace.get());
 
   if (is_new_browsing_instance || !new_window) {
-    // Opener suppressed or Javascript access disabled. Never tell the renderer
-    // about the new window.
+    // Opener suppressed, Javascript access disabled, or delegate did not
+    // provide a handle to any windows it created. In these cases, never tell
+    // the renderer about the new window.
     std::move(callback).Run(mojom::CreateNewWindowStatus::kIgnore, nullptr);
     return;
   }
@@ -4223,8 +4224,8 @@
 
   if (main_frame->waiting_for_init_) {
     // Need to check |waiting_for_init_| as some paths inside CreateNewWindow
-    // call above (namely, if WebContentsDelegate::ShouldCreateWebContents
-    // returns false) will resume requests by calling RenderFrameHostImpl::Init.
+    // call above (eg if WebContentsDelegate::IsWebContentsCreationOverridden()
+    // returns true) will resume requests by calling RenderFrameHostImpl::Init.
     main_frame->frame_->BlockRequests();
   }
 
@@ -4436,9 +4437,6 @@
     }
   }
 
-  registry_->AddInterface(base::BindRepeating(
-      &RenderFrameHostImpl::CreateWebUsbService, base::Unretained(this)));
-
   registry_->AddInterface<media::mojom::InterfaceFactory>(
       base::Bind(&RenderFrameHostImpl::BindMediaInterfaceFactoryRequest,
                  base::Unretained(this)));
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index 05b5ee08..5706d3a1 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -1133,6 +1133,10 @@
   void BindSmsReceiverReceiver(
       mojo::PendingReceiver<blink::mojom::SmsReceiver> receiver);
 
+  // Creates connections to WebUSB interfaces bound to this frame.
+  void CreateWebUsbService(
+      mojo::PendingReceiver<blink::mojom::WebUsbService> receiver);
+
   // https://mikewest.github.io/corpp/#initialize-embedder-policy-for-global
   network::mojom::CrossOriginEmbedderPolicy cross_origin_embedder_policy()
       const {
@@ -1170,6 +1174,10 @@
     return appcache_handle_.get();
   }
 
+  // Returns the BackForwardCacheMetrics associated with the last
+  // NavigationEntry this RenderFrameHostImpl committed.
+  BackForwardCacheMetrics* GetBackForwardCacheMetrics();
+
   base::WeakPtr<RenderFrameHostImpl> GetWeakPtr();
 
  protected:
@@ -1604,10 +1612,6 @@
   void DeleteWebBluetoothService(
       WebBluetoothServiceImpl* web_bluetooth_service);
 
-  // Creates connections to WebUSB interfaces bound to this frame.
-  void CreateWebUsbService(
-      mojo::PendingReceiver<blink::mojom::WebUsbService> receiver);
-
   void CreateAudioInputStreamFactory(
       mojo::PendingReceiver<mojom::RendererAudioInputStreamFactory> receiver);
   void CreateAudioOutputStreamFactory(
@@ -1897,10 +1901,6 @@
   // and ineligible for caching.
   void MaybeEvictFromBackForwardCache();
 
-  // Returns the BackForwardCacheMetrics associated with the last
-  // NavigationEntry this RenderFrameHostImpl committed.
-  BackForwardCacheMetrics* GetBackForwardCacheMetrics();
-
   // Helper for handling download-related IPCs.
   void DownloadUrl(
       const GURL& url,
diff --git a/content/browser/loader/source_stream_to_data_pipe.cc b/content/browser/loader/source_stream_to_data_pipe.cc
index 42793d7..d9b8c51 100644
--- a/content/browser/loader/source_stream_to_data_pipe.cc
+++ b/content/browser/loader/source_stream_to_data_pipe.cc
@@ -11,11 +11,9 @@
 
 SourceStreamToDataPipe::SourceStreamToDataPipe(
     std::unique_ptr<net::SourceStream> source,
-    mojo::ScopedDataPipeProducerHandle dest,
-    base::OnceCallback<void(int)> completion_callback)
+    mojo::ScopedDataPipeProducerHandle dest)
     : source_(std::move(source)),
       dest_(std::move(dest)),
-      completion_callback_(std::move(completion_callback)),
       writable_handle_watcher_(FROM_HERE,
                                mojo::SimpleWatcher::ArmingPolicy::MANUAL,
                                base::SequencedTaskRunnerHandle::Get()) {
@@ -27,7 +25,9 @@
 
 SourceStreamToDataPipe::~SourceStreamToDataPipe() = default;
 
-void SourceStreamToDataPipe::Start() {
+void SourceStreamToDataPipe::Start(
+    base::OnceCallback<void(int)> completion_callback) {
+  completion_callback_ = std::move(completion_callback);
   ReadMore();
 }
 
diff --git a/content/browser/loader/source_stream_to_data_pipe.h b/content/browser/loader/source_stream_to_data_pipe.h
index f909755a..899b802 100644
--- a/content/browser/loader/source_stream_to_data_pipe.h
+++ b/content/browser/loader/source_stream_to_data_pipe.h
@@ -24,12 +24,11 @@
  public:
   // Reads out the data from |source| and write into |dest|.
   SourceStreamToDataPipe(std::unique_ptr<net::SourceStream> source,
-                         mojo::ScopedDataPipeProducerHandle dest,
-                         base::OnceCallback<void(int)> completion_callback);
+                         mojo::ScopedDataPipeProducerHandle dest);
   ~SourceStreamToDataPipe();
 
   // Start reading the source.
-  void Start();
+  void Start(base::OnceCallback<void(int)> completion_callback);
   int64_t TransferredBytes() const { return transferred_bytes_; }
 
  private:
diff --git a/content/browser/loader/source_stream_to_data_pipe_unittest.cc b/content/browser/loader/source_stream_to_data_pipe_unittest.cc
index 5086c72..cac914a 100644
--- a/content/browser/loader/source_stream_to_data_pipe_unittest.cc
+++ b/content/browser/loader/source_stream_to_data_pipe_unittest.cc
@@ -63,9 +63,12 @@
                                   &consumer_end_));
 
     adapter_ = std::make_unique<SourceStreamToDataPipe>(
-        std::move(source), std::move(producer_end),
-        base::BindOnce(&SourceStreamToDataPipeTest::FinishedReading,
-                       base::Unretained(this)));
+        std::move(source), std::move(producer_end));
+  }
+
+  base::OnceCallback<void(int)> callback() {
+    return base::BindOnce(&SourceStreamToDataPipeTest::FinishedReading,
+                          base::Unretained(this));
   }
 
   void CompleteReadsIfAsync() {
@@ -142,7 +145,7 @@
 TEST_P(SourceStreamToDataPipeTest, EmptyStream) {
   Init();
   source()->AddReadResult(nullptr, 0, net::OK, GetParam().mode);
-  adapter()->Start();
+  adapter()->Start(callback());
 
   std::string output;
   EXPECT_EQ(ReadPipe(&output), net::OK);
@@ -156,7 +159,7 @@
   source()->AddReadResult(message, sizeof(message) - 1, net::OK,
                           GetParam().mode);
   source()->AddReadResult(nullptr, 0, net::OK, GetParam().mode);
-  adapter()->Start();
+  adapter()->Start(callback());
 
   std::string output;
   EXPECT_EQ(ReadPipe(&output), net::OK);
@@ -170,7 +173,7 @@
   source()->AddReadResult(message, sizeof(message) - 1, net::OK,
                           GetParam().mode);
   source()->AddReadResult(nullptr, 0, net::ERR_FAILED, GetParam().mode);
-  adapter()->Start();
+  adapter()->Start(callback());
 
   std::string output;
   EXPECT_EQ(ReadPipe(&output), net::ERR_FAILED);
@@ -183,7 +186,7 @@
   Init();
   source()->AddReadResult(message, sizeof(message) - 1, net::OK,
                           GetParam().mode);
-  adapter()->Start();
+  adapter()->Start(callback());
 
   CloseConsumerHandle();
   CompleteReadsIfAsync();
diff --git a/content/browser/media/capture/web_contents_audio_input_stream.cc b/content/browser/media/capture/web_contents_audio_input_stream.cc
index 9acca58..26b35f6 100644
--- a/content/browser/media/capture/web_contents_audio_input_stream.cc
+++ b/content/browser/media/capture/web_contents_audio_input_stream.cc
@@ -385,7 +385,7 @@
 
   return new WebContentsAudioInputStream(
       media_id.render_process_id, media_id.main_render_frame_id,
-      audio_mirroring_manager, new WebContentsTracker(false),
+      audio_mirroring_manager, new WebContentsTracker(),
       new media::VirtualAudioInputStream(
           params, worker_task_runner,
           media::VirtualAudioInputStream::AfterCloseCallback()),
diff --git a/content/browser/media/capture/web_contents_audio_input_stream_unittest.cc b/content/browser/media/capture/web_contents_audio_input_stream_unittest.cc
index 1dcf4f6..0469f64 100644
--- a/content/browser/media/capture/web_contents_audio_input_stream_unittest.cc
+++ b/content/browser/media/capture/web_contents_audio_input_stream_unittest.cc
@@ -77,8 +77,7 @@
 
 class MockWebContentsTracker : public WebContentsTracker {
  public:
-  MockWebContentsTracker() : WebContentsTracker(false) {}
-
+  MockWebContentsTracker() = default;
   MOCK_METHOD3(Start,
                void(int render_process_id, int render_frame_id,
                     const ChangeCallback& callback));
diff --git a/content/browser/media/capture/web_contents_tracker.cc b/content/browser/media/capture/web_contents_tracker.cc
index 9a62779d..e88e0fc 100644
--- a/content/browser/media/capture/web_contents_tracker.cc
+++ b/content/browser/media/capture/web_contents_tracker.cc
@@ -15,9 +15,7 @@
 
 namespace content {
 
-WebContentsTracker::WebContentsTracker(bool track_fullscreen_rwhv)
-    : track_fullscreen_rwhv_(track_fullscreen_rwhv),
-      last_target_view_(nullptr) {}
+WebContentsTracker::WebContentsTracker() : last_target_view_(nullptr) {}
 
 WebContentsTracker::~WebContentsTracker() {
   // Likely unintentional BUG if Stop() was not called before this point.
@@ -64,11 +62,6 @@
   if (!wc)
     return nullptr;
 
-  if (track_fullscreen_rwhv_) {
-    if (auto* view = wc->GetFullscreenRenderWidgetHostView())
-      return view;
-  }
-
   if (auto* view = wc->GetRenderWidgetHostView()) {
     // Make sure the RWHV is still associated with a RWH before considering the
     // view "alive." This is because a null RWH indicates the RWHV has had its
diff --git a/content/browser/media/capture/web_contents_tracker.h b/content/browser/media/capture/web_contents_tracker.h
index 0805772..e306cb99 100644
--- a/content/browser/media/capture/web_contents_tracker.h
+++ b/content/browser/media/capture/web_contents_tracker.h
@@ -33,11 +33,7 @@
     : public base::RefCountedThreadSafe<WebContentsTracker>,
       public WebContentsObserver {
  public:
-  // If |track_fullscreen_rwhv| is true, the ChangeCallback will be run when a
-  // WebContents shows/destroys a fullscreen RenderWidgetHostView. If false,
-  // fullscreen events are ignored. Normally, specify true for video capture and
-  // false for audio capture.
-  explicit WebContentsTracker(bool track_fullscreen_rwhv);
+  WebContentsTracker();
 
   // Callback to indicate a new RenderWidgetHostView should be targeted for
   // capture. This is also invoked with false to indicate tracking will not
@@ -116,10 +112,6 @@
   void DidShowFullscreenWidget() final;
   void DidDestroyFullscreenWidget() final;
 
-  // If true, the client is interested in the showing/destruction of fullscreen
-  // RenderWidgetHostViews.
-  const bool track_fullscreen_rwhv_;
-
   // Pointer to the RenderWidgetHostView provided in the last run of
   // |callback_|. This is used to eliminate duplicate callback runs.
   RenderWidgetHostView* last_target_view_;
diff --git a/content/browser/network_service_restart_browsertest.cc b/content/browser/network_service_restart_browsertest.cc
index 7eb1e913..94b43ac 100644
--- a/content/browser/network_service_restart_browsertest.cc
+++ b/content/browser/network_service_restart_browsertest.cc
@@ -130,30 +130,24 @@
 
 class ServiceWorkerStatusObserver : public ServiceWorkerContextCoreObserver {
  public:
-  void WaitForState(EmbeddedWorkerStatus expected_status) {
-    for (const auto& status : statuses_in_past_) {
-      if (status == expected_status)
-        return;
-    }
+  void WaitForStopped() {
+    if (stopped_)
+      return;
 
-    expected_status_ = expected_status;
     base::RunLoop loop;
     callback_ = loop.QuitClosure();
     loop.Run();
   }
 
  private:
-  void OnRunningStateChanged(int64_t version_id,
-                             EmbeddedWorkerStatus running_status) override {
-    statuses_in_past_.push_back(running_status);
-    if (expected_status_.has_value() &&
-        running_status == expected_status_.value()) {
+  void OnStopped(int64_t version_id) override {
+    stopped_ = true;
+
+    if (callback_)
       std::move(callback_).Run();
-    }
   }
 
-  base::Optional<EmbeddedWorkerStatus> expected_status_;
-  std::vector<EmbeddedWorkerStatus> statuses_in_past_;
+  bool stopped_ = false;
   base::OnceClosure callback_;
 };
 
@@ -802,7 +796,7 @@
   partition->FlushNetworkInterfaceForTesting();
 
   // Service worker should be stopped when network service crashes.
-  observer.WaitForState(EmbeddedWorkerStatus::STOPPED);
+  observer.WaitForStopped();
 
   // Fetch from the controlled page again.
   EXPECT_EQ("Echo", EvalJs(shell(), script));
@@ -845,7 +839,7 @@
   partition->FlushNetworkInterfaceForTesting();
 
   // Service worker should be stopped when network service crashes.
-  observer.WaitForState(EmbeddedWorkerStatus::STOPPED);
+  observer.WaitForStopped();
 
   // Fetch from the controlled page again.
   EXPECT_EQ("Echo", EvalJs(shell(), script));
@@ -889,7 +883,7 @@
   partition->FlushNetworkInterfaceForTesting();
 
   // Service worker should be stopped when network service crashes.
-  observer.WaitForState(EmbeddedWorkerStatus::STOPPED);
+  observer.WaitForStopped();
 
   // Fetch from the controlled page again.
   EXPECT_EQ("Echo", EvalJs(shell(), script));
@@ -928,7 +922,7 @@
   partition->FlushNetworkInterfaceForTesting();
 
   // Service worker should be stopped when network service crashes.
-  observer.WaitForState(EmbeddedWorkerStatus::STOPPED);
+  observer.WaitForStopped();
 
   // Fetch from the service worker again.
   EXPECT_EQ("Echo", EvalJs(shell(), script));
diff --git a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
index eaca3258..0f465dfe 100644
--- a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
+++ b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.cc
@@ -92,12 +92,7 @@
       render_process_id_(0),
       render_frame_id_(0),
       is_potentially_secure_plugin_context_(
-          host->IsPotentiallySecurePluginContext(instance)),
-      binding_(this)
-#if defined(OS_CHROMEOS)
-
-#endif  //  defined(OS_CHROMEOS)
-{
+          host->IsPotentiallySecurePluginContext(instance)) {
   ++g_num_udp_filter_instances;
   DCHECK(host);
 
@@ -110,7 +105,7 @@
 PepperUDPSocketMessageFilter::~PepperUDPSocketMessageFilter() {
   DCHECK(closed_);
   DCHECK(!socket_);
-  DCHECK(!binding_);
+  DCHECK(!receiver_.is_bound());
   --g_num_udp_filter_instances;
 }
 
@@ -384,12 +379,12 @@
   if (!render_frame_host)
     return PP_ERROR_NOACCESS;
 
-  network::mojom::UDPSocketListenerPtr udp_socket_listener;
+  mojo::PendingRemote<network::mojom::UDPSocketListener> udp_socket_listener;
   // Avoid binding the listener until the socket has been successfully Bound (in
   // a socket sense), to avoid providing read data to the caller until it has
   // been told that the socket was bound.
-  network::mojom::UDPSocketListenerRequest listener_request =
-      mojo::MakeRequest(&udp_socket_listener);
+  mojo::PendingReceiver<network::mojom::UDPSocketListener> listener_receiver =
+      udp_socket_listener.InitWithNewPipeAndPassReceiver();
 
   SiteInstance* site_instance = render_frame_host->GetSiteInstance();
   network::mojom::NetworkContext* network_context =
@@ -416,7 +411,7 @@
   socket_->Bind(end_point, std::move(udp_socket_options),
                 base::BindOnce(&PepperUDPSocketMessageFilter::DoBindCallback,
                                base::Unretained(this),
-                               std::move(listener_request), reply_context));
+                               std::move(listener_receiver), reply_context));
 
   return PP_OK_COMPLETIONPENDING;
 }
@@ -428,9 +423,9 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(context);
 
-  // Check |binding_| instead of |socket_| because |binding_| is only set
+  // Check |receiver_| instead of |socket_| because |receiver_| is only set
   // after the Bind() call completes.
-  if (closed_ || !binding_)
+  if (closed_ || !receiver_.is_bound())
     return PP_ERROR_FAILED;
 
   SocketPermissionRequest request =
@@ -492,7 +487,7 @@
       UDPSocketResourceConstants::kPluginReceiveBufferSlots) {
     // If the pipe was closed, but the consumer has not yet closed the UDP
     // socket, keep the read buffer filled with errors.
-    if (!binding_) {
+    if (!receiver_.is_bound()) {
       PepperUDPSocketMessageFilter::SendRecvFromError(PP_ERROR_FAILED);
       return PP_OK;
     }
@@ -555,7 +550,7 @@
 }
 
 void PepperUDPSocketMessageFilter::DoBindCallback(
-    network::mojom::UDPSocketListenerRequest listener_request,
+    mojo::PendingReceiver<network::mojom::UDPSocketListener> listener_receiver,
     const ppapi::host::ReplyMessageContext& context,
     int result,
     const base::Optional<net::IPEndPoint>& local_addr_out) {
@@ -579,15 +574,15 @@
       *local_addr_out,
       base::BindRepeating(&PepperUDPSocketMessageFilter::OnFirewallHoleOpened,
                           firewall_hole_weak_ptr_factory_.GetWeakPtr(),
-                          base::Passed(std::move(listener_request)), context,
+                          base::Passed(std::move(listener_receiver)), context,
                           net_address));
 #else   // !defined(OS_CHROMEOS)
-  OnBindComplete(std::move(listener_request), context, net_address);
+  OnBindComplete(std::move(listener_receiver), context, net_address);
 #endif  // !defined(OS_CHROMEOS)
 }
 
 void PepperUDPSocketMessageFilter::OnBindComplete(
-    network::mojom::UDPSocketListenerRequest listener_request,
+    mojo::PendingReceiver<network::mojom::UDPSocketListener> listener_receiver,
     const ppapi::host::ReplyMessageContext& context,
     const PP_NetAddress_Private& net_address) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -595,8 +590,8 @@
 
   SendBindReply(context, PP_OK, net_address);
 
-  binding_.Bind(std::move(listener_request));
-  binding_.set_connection_error_handler(base::BindOnce(
+  receiver_.Bind(std::move(listener_receiver));
+  receiver_.set_disconnect_handler(base::BindOnce(
       &PepperUDPSocketMessageFilter::PipeClosed, base::Unretained(this)));
   socket_.set_disconnect_handler(base::BindOnce(
       &PepperUDPSocketMessageFilter::PipeClosed, base::Unretained(this)));
@@ -605,7 +600,7 @@
 
 #if defined(OS_CHROMEOS)
 void PepperUDPSocketMessageFilter::OnFirewallHoleOpened(
-    network::mojom::UDPSocketListenerRequest listener_request,
+    mojo::PendingReceiver<network::mojom::UDPSocketListener> listener_receiver,
     const ppapi::host::ReplyMessageContext& context,
     const PP_NetAddress_Private& net_address,
     std::unique_ptr<chromeos::FirewallHole> hole) {
@@ -614,7 +609,7 @@
   LOG_IF(WARNING, !hole.get()) << "Firewall hole could not be opened.";
   firewall_hole_.reset(hole.release());
 
-  OnBindComplete(std::move(listener_request), context, net_address);
+  OnBindComplete(std::move(listener_receiver), context, net_address);
 }
 #endif  // defined(OS_CHROMEOS)
 
@@ -636,7 +631,7 @@
 void PepperUDPSocketMessageFilter::Close() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   socket_.reset();
-  binding_.Close();
+  receiver_.reset();
   closed_ = true;
 }
 
diff --git a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.h b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.h
index bf7e052..ca0eb1e 100644
--- a/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.h
+++ b/content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.h
@@ -21,8 +21,9 @@
 #include "build/build_config.h"
 #include "content/common/content_export.h"
 #include "content/public/common/process_type.h"
-#include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
@@ -69,7 +70,7 @@
   using CreateUDPSocketCallback = base::RepeatingCallback<void(
       network::mojom::NetworkContext* network_context,
       mojo::PendingReceiver<network::mojom::UDPSocket> socket_receiver,
-      network::mojom::UDPSocketListenerPtr socket_listener)>;
+      mojo::PendingRemote<network::mojom::UDPSocketListener> socket_listener)>;
 
   static void SetCreateUDPSocketCallbackForTesting(
       const CreateUDPSocketCallback* create_udp_socket_callback);
@@ -127,16 +128,19 @@
   int32_t OnMsgLeaveGroup(const ppapi::host::HostMessageContext* context,
                           const PP_NetAddress_Private& addr);
 
-  void DoBindCallback(network::mojom::UDPSocketListenerRequest listener_request,
+  void DoBindCallback(mojo::PendingReceiver<network::mojom::UDPSocketListener>
+                          listener_receiver,
                       const ppapi::host::ReplyMessageContext& context,
                       int result,
                       const base::Optional<net::IPEndPoint>& local_addr_out);
-  void OnBindComplete(network::mojom::UDPSocketListenerRequest listener_request,
+  void OnBindComplete(mojo::PendingReceiver<network::mojom::UDPSocketListener>
+                          listener_receiver,
                       const ppapi::host::ReplyMessageContext& context,
                       const PP_NetAddress_Private& net_address);
 #if defined(OS_CHROMEOS)
   void OnFirewallHoleOpened(
-      network::mojom::UDPSocketListenerRequest listener_request,
+      mojo::PendingReceiver<network::mojom::UDPSocketListener>
+          listener_receiver,
       const ppapi::host::ReplyMessageContext& context,
       const PP_NetAddress_Private& net_address,
       std::unique_ptr<chromeos::FirewallHole> hole);
@@ -217,7 +221,7 @@
   // Binding late avoids receiving data when still setting up the socket. Closed
   // in Close() and on Mojo pipe errors. Must only be accessed (and destroyed)
   // on UI thread.
-  mojo::Binding<network::mojom::UDPSocketListener> binding_;
+  mojo::Receiver<network::mojom::UDPSocketListener> receiver_{this};
 
 #if defined(OS_CHROMEOS)
   std::unique_ptr<chromeos::FirewallHole,
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index a02393b..85d02697 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -3146,6 +3146,7 @@
     switches::kUseGpuInTests,
     switches::kUseMobileUserAgent,
     switches::kV,
+    switches::kVideoCaptureUseGpuMemoryBuffer,
     switches::kVideoThreads,
     switches::kVideoUnderflowThresholdMs,
     switches::kVModule,
diff --git a/content/browser/resources/service_worker/serviceworker_internals.js b/content/browser/resources/service_worker/serviceworker_internals.js
index 05eb06a..626f37f 100644
--- a/content/browser/resources/service_worker/serviceworker_internals.js
+++ b/content/browser/resources/service_worker/serviceworker_internals.js
@@ -192,7 +192,7 @@
     }
   }
 
-  function onRunningStateChanged(partition_id, version_id) {
+  function onRunningStateChanged() {
     update();
   }
 
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc
index 7b552b3..dc28d77 100644
--- a/content/browser/security_exploit_browsertest.cc
+++ b/content/browser/security_exploit_browsertest.cc
@@ -618,6 +618,9 @@
 // deprecated.
 IN_PROC_BROWSER_TEST_F(CorsExploitBrowserTest,
                        OriginHeaderSpoofViaHtmlImports) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(
+      blink::features::kHtmlImportsRequestInitiatorLock);
   std::string victim_path = "/victim/secret.json";
   net::test_server::ControllableHttpResponse victim_response(
       embedded_test_server(), victim_path, false);
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index 61679b2..765c1e8 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -3007,16 +3007,16 @@
       run_loop_.Run();
   }
 
-  void OnVersionRunningStatusChanged(content::ServiceWorkerContext* context,
-                                     int64_t version_id,
-                                     bool is_running) override {
-    if (is_running) {
-      EXPECT_EQ(context_, context);
-      version_id_ = version_id;
+  void OnVersionStartedRunning(content::ServiceWorkerContext* context,
+                               int64_t version_id,
+                               const GURL& scope,
+                               int process_id,
+                               const GURL& script_url) override {
+    EXPECT_EQ(context_, context);
+    version_id_ = version_id;
 
-      if (run_loop_.running())
-        run_loop_.Quit();
-    }
+    if (run_loop_.running())
+      run_loop_.Quit();
   }
 
  private:
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc
index 881dade..34c11cc6 100644
--- a/content/browser/service_worker/service_worker_context_core.cc
+++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -606,15 +606,18 @@
 }
 
 void ServiceWorkerContextCore::RemoveLiveVersion(int64_t id) {
-  if (live_versions_[id]->running_status() != EmbeddedWorkerStatus::STOPPED) {
+  auto it = live_versions_.find(id);
+  DCHECK(it != live_versions_.end());
+  ServiceWorkerVersion* version = it->second;
+
+  if (version->running_status() != EmbeddedWorkerStatus::STOPPED) {
     // Notify all observers that this live version is stopped, as it will
     // be removed from |live_versions_|.
-    observer_list_->Notify(
-        FROM_HERE, &ServiceWorkerContextCoreObserver::OnRunningStateChanged, id,
-        EmbeddedWorkerStatus::STOPPED);
+    observer_list_->Notify(FROM_HERE,
+                           &ServiceWorkerContextCoreObserver::OnStopped, id);
   }
 
-  live_versions_.erase(id);
+  live_versions_.erase(it);
 }
 
 std::vector<ServiceWorkerRegistrationInfo>
@@ -750,9 +753,29 @@
   if (!version->context())
     return;
 
-  observer_list_->Notify(
-      FROM_HERE, &ServiceWorkerContextCoreObserver::OnRunningStateChanged,
-      version->version_id(), version->running_status());
+  switch (version->running_status()) {
+    case EmbeddedWorkerStatus::STOPPED:
+      observer_list_->Notify(FROM_HERE,
+                             &ServiceWorkerContextCoreObserver::OnStopped,
+                             version->version_id());
+      break;
+    case EmbeddedWorkerStatus::STARTING:
+      observer_list_->Notify(FROM_HERE,
+                             &ServiceWorkerContextCoreObserver::OnStarting,
+                             version->version_id());
+      break;
+    case EmbeddedWorkerStatus::RUNNING:
+      observer_list_->Notify(
+          FROM_HERE, &ServiceWorkerContextCoreObserver::OnStarted,
+          version->version_id(), version->scope(),
+          version->embedded_worker()->process_id(), version->script_url());
+      break;
+    case EmbeddedWorkerStatus::STOPPING:
+      observer_list_->Notify(FROM_HERE,
+                             &ServiceWorkerContextCoreObserver::OnStopping,
+                             version->version_id());
+      break;
+  }
 }
 
 void ServiceWorkerContextCore::OnVersionStateChanged(
diff --git a/content/browser/service_worker/service_worker_context_core_observer.h b/content/browser/service_worker/service_worker_context_core_observer.h
index 50edd986..e5e8bd9 100644
--- a/content/browser/service_worker/service_worker_context_core_observer.h
+++ b/content/browser/service_worker/service_worker_context_core_observer.h
@@ -46,8 +46,13 @@
   virtual void OnNewLiveRegistration(int64_t registration_id,
                                      const GURL& scope) {}
   virtual void OnNewLiveVersion(const ServiceWorkerVersionInfo& version_info) {}
-  virtual void OnRunningStateChanged(int64_t version_id,
-                                     EmbeddedWorkerStatus running_status) {}
+  virtual void OnStarting(int64_t version_id) {}
+  virtual void OnStarted(int64_t version_id,
+                         const GURL& scope,
+                         int process_id,
+                         const GURL& script_url) {}
+  virtual void OnStopping(int64_t version_id) {}
+  virtual void OnStopped(int64_t version_id) {}
   // Called when the context core is about to be deleted. After this is called,
   // method calls on this observer will be for a new context core, possibly
   // reusing version/registration IDs previously seen. So this method gives the
diff --git a/content/browser/service_worker/service_worker_context_unittest.cc b/content/browser/service_worker/service_worker_context_unittest.cc
index f8fb56e..7959901b 100644
--- a/content/browser/service_worker/service_worker_context_unittest.cc
+++ b/content/browser/service_worker/service_worker_context_unittest.cc
@@ -248,7 +248,8 @@
     VersionActivated,
     VersionRedundant,
     NoControllees,
-    VersionRunningStatusChanged,
+    VersionStartedRunning,
+    VersionStoppedRunning,
     Destruct
   };
   struct EventLog {
@@ -310,13 +311,22 @@
     events_.push_back(log);
   }
 
-  void OnVersionRunningStatusChanged(content::ServiceWorkerContext* context,
-                                     int64_t version_id,
-                                     bool is_running) override {
+  void OnVersionStartedRunning(content::ServiceWorkerContext* context,
+                               int64_t version_id,
+                               const GURL& scope,
+                               int process_id,
+                               const GURL& script_url) override {
     EventLog log;
-    log.type = EventType::VersionRunningStatusChanged;
+    log.type = EventType::VersionStartedRunning;
     log.version_id = version_id;
-    log.is_running = is_running;
+    events_.push_back(log);
+  }
+
+  void OnVersionStoppedRunning(content::ServiceWorkerContext* context,
+                               int64_t version_id) override {
+    EventLog log;
+    log.type = EventType::VersionStoppedRunning;
+    log.version_id = version_id;
     events_.push_back(log);
   }
 
@@ -470,7 +480,8 @@
   EXPECT_EQ(2l, observer.events()[0].version_id);
 }
 
-// Make sure OnVersionRunningStatusChanged is called on observer.
+// Make sure OnVersionStartedRunning and OnVersionStoppedRunning are called on
+// observer.
 TEST_F(ServiceWorkerContextTest, OnVersionRunningStatusChangedObserver) {
   GURL scope("https://www.example.com/");
   GURL script_url("https://www.example.com/service_worker.js");
@@ -492,13 +503,18 @@
   // Filter the events to be verified.
   for (auto event : observer.events()) {
     if (event.type == TestServiceWorkerContextObserver::EventType::
-                          VersionRunningStatusChanged)
+                          VersionStartedRunning ||
+        event.type == TestServiceWorkerContextObserver::EventType::
+                          VersionStoppedRunning) {
       events.push_back(event);
+    }
   }
 
   ASSERT_EQ(2u, events.size());
-  EXPECT_EQ(true, events[0].is_running);
-  EXPECT_EQ(false, events[1].is_running);
+  EXPECT_EQ(TestServiceWorkerContextObserver::EventType::VersionStartedRunning,
+            events[0].type);
+  EXPECT_EQ(TestServiceWorkerContextObserver::EventType::VersionStoppedRunning,
+            events[1].type);
   EXPECT_EQ(events[0].version_id, events[1].version_id);
 }
 
diff --git a/content/browser/service_worker/service_worker_context_watcher.cc b/content/browser/service_worker/service_worker_context_watcher.cc
index d6e1e92..1c458426 100644
--- a/content/browser/service_worker/service_worker_context_watcher.cc
+++ b/content/browser/service_worker/service_worker_context_watcher.cc
@@ -34,7 +34,7 @@
     WorkerRegistrationUpdatedCallback registration_callback,
     WorkerVersionUpdatedCallback version_callback,
     WorkerErrorReportedCallback error_callback)
-    : context_(context),
+    : context_(std::move(context)),
       registration_callback_(std::move(registration_callback)),
       version_callback_(std::move(version_callback)),
       error_callback_(std::move(error_callback)) {
@@ -233,20 +233,23 @@
     version_info_map_[version_id] = std::move(version);
 }
 
-void ServiceWorkerContextWatcher::OnRunningStateChanged(
-    int64_t version_id,
-    content::EmbeddedWorkerStatus running_status) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
-  auto it = version_info_map_.find(version_id);
-  if (it == version_info_map_.end())
-    return;
-  ServiceWorkerVersionInfo* version = it->second.get();
-  if (version->running_status == running_status)
-    return;
-  version->running_status = running_status;
-  SendVersionInfo(*version);
-  if (IsStoppedAndRedundant(*version))
-    version_info_map_.erase(version_id);
+void ServiceWorkerContextWatcher::OnStarting(int64_t version_id) {
+  OnRunningStateChanged(version_id, EmbeddedWorkerStatus::STARTING);
+}
+
+void ServiceWorkerContextWatcher::OnStarted(int64_t version_id,
+                                            const GURL& scope,
+                                            int process_id,
+                                            const GURL& script_url) {
+  OnRunningStateChanged(version_id, EmbeddedWorkerStatus::RUNNING);
+}
+
+void ServiceWorkerContextWatcher::OnStopping(int64_t version_id) {
+  OnRunningStateChanged(version_id, EmbeddedWorkerStatus::STOPPING);
+}
+
+void ServiceWorkerContextWatcher::OnStopped(int64_t version_id) {
+  OnRunningStateChanged(version_id, EmbeddedWorkerStatus::STOPPED);
 }
 
 void ServiceWorkerContextWatcher::OnVersionStateChanged(
@@ -375,4 +378,20 @@
                        ServiceWorkerRegistrationInfo::IS_DELETED);
 }
 
+void ServiceWorkerContextWatcher::OnRunningStateChanged(
+    int64_t version_id,
+    EmbeddedWorkerStatus running_status) {
+  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  auto it = version_info_map_.find(version_id);
+  if (it == version_info_map_.end())
+    return;
+  ServiceWorkerVersionInfo* version = it->second.get();
+  if (version->running_status == running_status)
+    return;
+  version->running_status = running_status;
+  SendVersionInfo(*version);
+  if (IsStoppedAndRedundant(*version))
+    version_info_map_.erase(version_id);
+}
+
 }  // namespace content
diff --git a/content/browser/service_worker/service_worker_context_watcher.h b/content/browser/service_worker/service_worker_context_watcher.h
index e921b80..bb05c08 100644
--- a/content/browser/service_worker/service_worker_context_watcher.h
+++ b/content/browser/service_worker/service_worker_context_watcher.h
@@ -84,8 +84,13 @@
   void OnNewLiveRegistration(int64_t registration_id,
                              const GURL& scope) override;
   void OnNewLiveVersion(const ServiceWorkerVersionInfo& version_info) override;
-  void OnRunningStateChanged(int64_t version_id,
-                             EmbeddedWorkerStatus running_status) override;
+  void OnStarting(int64_t version_id) override;
+  void OnStarted(int64_t version_id,
+                 const GURL& scope,
+                 int process_id,
+                 const GURL& script_url) override;
+  void OnStopping(int64_t version_id) override;
+  void OnStopped(int64_t version_id) override;
   void OnVersionStateChanged(int64_t version_id,
                              const GURL& scope,
                              ServiceWorkerVersion::Status status) override;
@@ -112,6 +117,9 @@
   void OnRegistrationDeleted(int64_t registration_id,
                              const GURL& scope) override;
 
+  void OnRunningStateChanged(int64_t version_id,
+                             EmbeddedWorkerStatus running_status);
+
   std::unordered_map<int64_t, std::unique_ptr<ServiceWorkerVersionInfo>>
       version_info_map_;
   scoped_refptr<ServiceWorkerContextWrapper> context_;
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc
index b00b996..6e974b6 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.cc
+++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -374,43 +374,28 @@
     observer.OnNoControllees(version_id, scope);
 }
 
-void ServiceWorkerContextWrapper::OnRunningStateChanged(
-    int64_t version_id,
-    EmbeddedWorkerStatus running_status) {
+void ServiceWorkerContextWrapper::OnStarted(int64_t version_id,
+                                            const GURL& scope,
+                                            int process_id,
+                                            const GURL& script_url) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  // When |running_status| is RUNNING/STOPPING, the service
-  // worker is doing some actual tasks, so we consider the service worker is
-  // in a running status.
-  //
-  // Although the service work does have some tasks being processed in the stage
-  // of STARTING, some resources of it may have not been allocated yet,
-  // e.g. process id. If STARTING is considered as running, then the observer of
-  // ServiceWorkerContextWrapper may get the unexpected information of this
-  // service worker after being notified due to the absence of the resoureces.
-  //
-  // TODO(minggang): Create a new observer to listen to the events when the
-  // process of the service worker is allocated/released, instead of using the
-  // running status of the embedded worker.
-  if (running_status == EmbeddedWorkerStatus::RUNNING) {
-    bool inserted = running_service_workers_.emplace(version_id).second;
-    DCHECK(inserted);
-    for (auto& observer : observer_list_) {
-      observer.OnVersionRunningStatusChanged(this, version_id,
-                                             true /* is_running */);
-    }
-    return;
+  bool inserted = running_service_workers_.emplace(version_id).second;
+  DCHECK(inserted);
+  for (auto& observer : observer_list_) {
+    observer.OnVersionStartedRunning(this, version_id, scope, process_id,
+                                     script_url);
   }
+}
 
-  if (running_service_workers_.find(version_id) !=
-          running_service_workers_.end() &&
-      running_status == EmbeddedWorkerStatus::STOPPED) {
-    size_t removed = running_service_workers_.erase(version_id);
-    DCHECK_EQ(removed, 1u);
-    for (auto& observer : observer_list_) {
-      observer.OnVersionRunningStatusChanged(this, version_id,
-                                             false /* is_running */);
-    }
+void ServiceWorkerContextWrapper::OnStopped(int64_t version_id) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  auto it = running_service_workers_.find(version_id);
+  if (it != running_service_workers_.end()) {
+    running_service_workers_.erase(it);
+    for (auto& observer : observer_list_)
+      observer.OnVersionStoppedRunning(this, version_id);
   }
 }
 
@@ -419,8 +404,7 @@
 
   for (int version_id : running_service_workers_) {
     for (auto& observer : observer_list_) {
-      observer.OnVersionRunningStatusChanged(this, version_id,
-                                             false /* is_running */);
+      observer.OnVersionStoppedRunning(this, version_id);
     }
   }
   running_service_workers_.clear();
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h
index d20ab19f..a1148924 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.h
+++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -123,8 +123,11 @@
   void OnReportConsoleMessage(int64_t version_id,
                               const ConsoleMessage& message) override;
   void OnNoControllees(int64_t version_id, const GURL& scope) override;
-  void OnRunningStateChanged(int64_t version_id,
-                             EmbeddedWorkerStatus running_status) override;
+  void OnStarted(int64_t version_id,
+                 const GURL& scope,
+                 int process_id,
+                 const GURL& script_url) override;
+  void OnStopped(int64_t version_id) override;
   void OnDeleteAndStartOver() override;
   void OnVersionStateChanged(int64_t version_id,
                              const GURL& scope,
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
index 5d47fb53..8b5df1c 100644
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -457,31 +457,31 @@
       version_(std::move(version)),
       resource_type_(resource_type),
       prepare_callback_(std::move(prepare_callback)),
-      fetch_callback_(std::move(fetch_callback)),
-      did_complete_(false) {
+      fetch_callback_(std::move(fetch_callback)) {
   DCHECK(!request_->blob);
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(
-      "ServiceWorker", "ServiceWorkerFetchDispatcher::DispatchFetchEvent", this,
-      "event_type", ServiceWorkerMetrics::EventTypeToString(GetEventType()));
+  TRACE_EVENT_WITH_FLOW1(
+      "ServiceWorker",
+      "ServiceWorkerFetchDispatcher::ServiceWorkerFetchDispatcher",
+      TRACE_ID_LOCAL(this), TRACE_EVENT_FLAG_FLOW_OUT, "event_type",
+      ServiceWorkerMetrics::EventTypeToString(GetEventType()));
 }
 
 ServiceWorkerFetchDispatcher::~ServiceWorkerFetchDispatcher() {
-  if (!did_complete_) {
-    TRACE_EVENT_NESTABLE_ASYNC_END0(
-        "ServiceWorker", "ServiceWorkerFetchDispatcher::DispatchFetchEvent",
-        this);
-  }
+  TRACE_EVENT_WITH_FLOW0(
+      "ServiceWorker",
+      "ServiceWorkerFetchDispatcher::~ServiceWorkerFetchDispatcher",
+      TRACE_ID_LOCAL(this), TRACE_EVENT_FLAG_FLOW_IN);
 }
 
 void ServiceWorkerFetchDispatcher::Run() {
   DCHECK(version_->status() == ServiceWorkerVersion::ACTIVATING ||
          version_->status() == ServiceWorkerVersion::ACTIVATED)
       << version_->status();
+  TRACE_EVENT_WITH_FLOW0("ServiceWorker", "ServiceWorkerFetchDispatcher::Run",
+                         TRACE_ID_LOCAL(this),
+                         TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
 
   if (version_->status() == ServiceWorkerVersion::ACTIVATING) {
-    TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(
-        "ServiceWorker", "ServiceWorkerFetchDispatcher::WaitForActivation",
-        this);
     version_->RegisterStatusChangeCallback(
         base::BindOnce(&ServiceWorkerFetchDispatcher::DidWaitForActivation,
                        weak_factory_.GetWeakPtr()));
@@ -491,12 +491,19 @@
 }
 
 void ServiceWorkerFetchDispatcher::DidWaitForActivation() {
-  TRACE_EVENT_NESTABLE_ASYNC_END0(
-      "ServiceWorker", "ServiceWorkerFetchDispatcher::WaitForActivation", this);
+  TRACE_EVENT_WITH_FLOW0("ServiceWorker",
+                         "ServiceWorkerFetchDispatcher::DidWaitForActivation",
+                         TRACE_ID_LOCAL(this),
+                         TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
   StartWorker();
 }
 
 void ServiceWorkerFetchDispatcher::StartWorker() {
+  TRACE_EVENT_WITH_FLOW0("ServiceWorker",
+                         "ServiceWorkerFetchDispatcher::StartWorker",
+                         TRACE_ID_LOCAL(this),
+                         TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
+
   // We might be REDUNDANT if a new worker started activating and kicked us out
   // before we could finish activation.
   if (version_->status() != ServiceWorkerVersion::ACTIVATED) {
@@ -510,8 +517,6 @@
     return;
   }
 
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(
-      "ServiceWorker", "ServiceWorkerFetchDispatcher::StartWorker", this);
   version_->RunAfterStartWorker(
       GetEventType(),
       base::BindOnce(&ServiceWorkerFetchDispatcher::DidStartWorker,
@@ -520,9 +525,11 @@
 
 void ServiceWorkerFetchDispatcher::DidStartWorker(
     blink::ServiceWorkerStatusCode status) {
-  TRACE_EVENT_NESTABLE_ASYNC_END1("ServiceWorker",
-                                  "ServiceWorkerFetchDispatcher::StartWorker",
-                                  this, "status", status);
+  TRACE_EVENT_WITH_FLOW0("ServiceWorker",
+                         "ServiceWorkerFetchDispatcher::DidStartWorker",
+                         TRACE_ID_LOCAL(this),
+                         TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
+
   if (status != blink::ServiceWorkerStatusCode::kOk) {
     DidFail(status);
     return;
@@ -533,6 +540,10 @@
 void ServiceWorkerFetchDispatcher::DispatchFetchEvent() {
   DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status())
       << "Worker stopped too soon after it was started.";
+  TRACE_EVENT_WITH_FLOW0("ServiceWorker",
+                         "ServiceWorkerFetchDispatcher::DispatchFetchEvent",
+                         TRACE_ID_LOCAL(this),
+                         TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
 
   // Grant the service worker's process access to files in the request body.
   if (request_->body) {
@@ -543,8 +554,6 @@
   // Run callback to say that the fetch event will be dispatched.
   DCHECK(prepare_callback_);
   std::move(prepare_callback_).Run();
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(
-      "ServiceWorker", "ServiceWorkerFetchDispatcher::FetchEvent", this);
 
   // Set up for receiving the response.
   mojo::PendingRemote<blink::mojom::ServiceWorkerFetchResponseCallback>
@@ -591,15 +600,16 @@
 void ServiceWorkerFetchDispatcher::DidFailToDispatch(
     std::unique_ptr<ResponseCallback> response_callback,
     blink::ServiceWorkerStatusCode status) {
-  TRACE_EVENT_NESTABLE_ASYNC_END1("ServiceWorker",
-                                  "ServiceWorkerFetchDispatcher::FetchEvent",
-                                  this, "status", status);
   DidFail(status);
 }
 
 void ServiceWorkerFetchDispatcher::DidFail(
     blink::ServiceWorkerStatusCode status) {
   DCHECK_NE(blink::ServiceWorkerStatusCode::kOk, status);
+  TRACE_EVENT_WITH_FLOW1(
+      "ServiceWorker", "ServiceWorkerFetchDispatcher::DidFail",
+      TRACE_ID_LOCAL(this),
+      TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "status", status);
   Complete(status, FetchEventResult::kShouldFallback,
            blink::mojom::FetchAPIResponse::New(), nullptr /* body_as_stream */,
            nullptr /* timing */);
@@ -611,8 +621,10 @@
     blink::mojom::FetchAPIResponsePtr response,
     blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream,
     blink::mojom::ServiceWorkerFetchEventTimingPtr timing) {
-  TRACE_EVENT_NESTABLE_ASYNC_END0(
-      "ServiceWorker", "ServiceWorkerFetchDispatcher::FetchEvent", this);
+  TRACE_EVENT_WITH_FLOW0("ServiceWorker",
+                         "ServiceWorkerFetchDispatcher::DidFinish",
+                         TRACE_ID_LOCAL(this),
+                         TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
   Complete(blink::ServiceWorkerStatusCode::kOk, fetch_result,
            std::move(response), std::move(body_as_stream), std::move(timing));
 }
@@ -625,10 +637,6 @@
     blink::mojom::ServiceWorkerFetchEventTimingPtr timing) {
   DCHECK(fetch_callback_);
 
-  did_complete_ = true;
-  TRACE_EVENT_NESTABLE_ASYNC_END1(
-      "ServiceWorker", "ServiceWorkerFetchDispatcher::DispatchFetchEvent", this,
-      "result", fetch_result);
   std::move(fetch_callback_)
       .Run(status, fetch_result, std::move(response), std::move(body_as_stream),
            std::move(timing), version_);
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.h b/content/browser/service_worker/service_worker_fetch_dispatcher.h
index 5cebdd7..551d67b 100644
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.h
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.h
@@ -114,7 +114,6 @@
   const ResourceType resource_type_;
   base::OnceClosure prepare_callback_;
   FetchCallback fetch_callback_;
-  bool did_complete_;
 
   scoped_refptr<URLLoaderAssets> url_loader_assets_;
 
diff --git a/content/browser/service_worker/service_worker_internals_ui.cc b/content/browser/service_worker/service_worker_internals_ui.cc
index e7fb99c..a08b10c5 100644
--- a/content/browser/service_worker/service_worker_internals_ui.cc
+++ b/content/browser/service_worker/service_worker_internals_ui.cc
@@ -250,12 +250,28 @@
       : partition_id_(partition_id), web_ui_(web_ui) {}
   ~PartitionObserver() override {}
   // ServiceWorkerContextCoreObserver overrides:
-  void OnRunningStateChanged(int64_t version_id,
-                             EmbeddedWorkerStatus) override {
+  void OnStarting(int64_t version_id) override {
     DCHECK_CURRENTLY_ON(BrowserThread::UI);
     web_ui_->CallJavascriptFunctionUnsafe(
-        "serviceworker.onRunningStateChanged", Value(partition_id_),
-        Value(base::NumberToString(version_id)));
+        "serviceworker.onRunningStateChanged");
+  }
+  void OnStarted(int64_t version_id,
+                 const GURL& scope,
+                 int process_id,
+                 const GURL& script_url) override {
+    DCHECK_CURRENTLY_ON(BrowserThread::UI);
+    web_ui_->CallJavascriptFunctionUnsafe(
+        "serviceworker.onRunningStateChanged");
+  }
+  void OnStopping(int64_t version_id) override {
+    DCHECK_CURRENTLY_ON(BrowserThread::UI);
+    web_ui_->CallJavascriptFunctionUnsafe(
+        "serviceworker.onRunningStateChanged");
+  }
+  void OnStopped(int64_t version_id) override {
+    DCHECK_CURRENTLY_ON(BrowserThread::UI);
+    web_ui_->CallJavascriptFunctionUnsafe(
+        "serviceworker.onRunningStateChanged");
   }
   void OnVersionStateChanged(int64_t version_id,
                              const GURL& scope,
diff --git a/content/browser/site_per_process_unload_browsertest.cc b/content/browser/site_per_process_unload_browsertest.cc
index 1a51200a..566c4a5 100644
--- a/content/browser/site_per_process_unload_browsertest.cc
+++ b/content/browser/site_per_process_unload_browsertest.cc
@@ -21,6 +21,7 @@
 #include "base/test/test_timeouts.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
+#include "build/build_config.h"
 #include "content/browser/frame_host/cross_process_frame_connector.h"
 #include "content/browser/frame_host/frame_tree.h"
 #include "content/browser/frame_host/navigation_controller_impl.h"
@@ -378,7 +379,14 @@
 // B2  A2
 //     |
 //     C3
-IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, UnloadHandlerSubframes) {
+// TODO(crbug.com/1012185): Flaky timeouts on Linux and Mac.
+#if defined(OS_LINUX) || defined(OS_MACOSX)
+#define MAYBE_UnloadHandlerSubframes DISABLED_UnloadHandlerSubframes
+#else
+#define MAYBE_UnloadHandlerSubframes UnloadHandlerSubframes
+#endif
+IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
+                       MAYBE_UnloadHandlerSubframes) {
   GURL main_url(embedded_test_server()->GetURL(
       "a.com", "/cross_site_iframe_factory.html?a(b(c(b),c(a(c))),d)"));
   EXPECT_TRUE(NavigateToURL(shell(), main_url));
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 3d447fd..91c9a1c 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -2824,39 +2824,14 @@
       static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace);
   CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context));
 
-  // TODO(crbug.com/545684): Move these closer to usage after cleaning up the
-  // ShouldCreateWebContents() interface to not need the raw ID numbers.
-  int render_view_route_id = MSG_ROUTING_NONE;
-  int main_frame_route_id = MSG_ROUTING_NONE;
-  int main_frame_widget_route_id = MSG_ROUTING_NONE;
-  if (!is_new_browsing_instance) {
-    render_view_route_id = opener->GetProcess()->GetNextRoutingID();
-    main_frame_route_id = opener->GetProcess()->GetNextRoutingID();
-    main_frame_widget_route_id = opener->GetProcess()->GetNextRoutingID();
-  }
-
-  if (delegate_ &&
-      !delegate_->ShouldCreateWebContents(
-          this, opener, source_site_instance, render_view_route_id,
-          main_frame_route_id, main_frame_widget_route_id,
-          params.window_container_type, opener->GetLastCommittedURL(),
-          params.frame_name, params.target_url, partition_id,
-          session_storage_namespace)) {
-    // Note: even though we're not creating a WebContents here, it could have
-    // been created by the embedder so ensure that the RenderFrameHost is
-    // properly initialized.
-    // It's safe to only target the frame because the render process will not
-    // have a chance to create more frames at this point.
-    RenderFrameHostImpl* rfh =
-        RenderFrameHostImpl::FromID(render_process_id, main_frame_route_id);
-    if (rfh) {
-      // TODO(crbug.com/545684): It's super surprising that
-      // ShouldCreateWebContents() is actually a way to allow
-      // BackgroundWebContents to intercede and provide a completely different
-      // webcontents. Fix that API.
-      return rfh->delegate();
-    }
-    return nullptr;
+  if (delegate_ && delegate_->IsWebContentsCreationOverridden(
+                       source_site_instance, params.window_container_type,
+                       opener->GetLastCommittedURL(), params.frame_name,
+                       params.target_url)) {
+    return static_cast<WebContentsImpl*>(delegate_->CreateCustomWebContents(
+        opener, source_site_instance, is_new_browsing_instance,
+        opener->GetLastCommittedURL(), params.frame_name, params.target_url,
+        partition_id, session_storage_namespace));
   }
 
   bool renderer_started_hidden =
@@ -2878,9 +2853,22 @@
   // the opener's process will not given the routing IDs for the new
   // objects.
   create_params.renderer_initiated_creation = !is_new_browsing_instance;
-  create_params.routing_id = render_view_route_id;
-  create_params.main_frame_routing_id = main_frame_route_id;
-  create_params.main_frame_widget_routing_id = main_frame_widget_route_id;
+
+  // If |is_new_browsing_instance| is true, defer routing_id allocation
+  // to the WebContentsImpl::Create() call. This is required because with
+  // a new browsing instance, WebContentsImpl::Create() may elect a different
+  // SiteInstance from |site_instance| (which happens if |site_instance| is
+  // nullptr for example).
+  //
+  // TODO(ajwong): This routing id allocation should be pushed down further
+  // into WebContentsImpl::Create().
+  if (!is_new_browsing_instance) {
+    create_params.routing_id = opener->GetProcess()->GetNextRoutingID();
+    create_params.main_frame_routing_id =
+        opener->GetProcess()->GetNextRoutingID();
+    create_params.main_frame_widget_routing_id =
+        opener->GetProcess()->GetNextRoutingID();
+  }
 
   std::unique_ptr<WebContentsImpl> new_contents;
   if (!is_guest) {
@@ -2924,8 +2912,9 @@
     // TODO(ajwong): This should be keyed off the RenderFrame routing id or the
     // FrameTreeNode id instead of the routing id of the Widget for the main
     // frame.  https://crbug.com/545684
-    DCHECK_NE(MSG_ROUTING_NONE, main_frame_widget_route_id);
-    GlobalRoutingID id(render_process_id, main_frame_widget_route_id);
+    DCHECK_NE(MSG_ROUTING_NONE, create_params.main_frame_routing_id);
+    GlobalRoutingID id(render_process_id,
+                       create_params.main_frame_widget_routing_id);
     pending_contents_[id] = std::move(new_contents);
     AddDestructionObserver(new_contents_impl);
   }
diff --git a/content/browser/web_package/signed_exchange_loader.cc b/content/browser/web_package/signed_exchange_loader.cc
index 9fa3f45..78798b3c 100644
--- a/content/browser/web_package/signed_exchange_loader.cc
+++ b/content/browser/web_package/signed_exchange_loader.cc
@@ -300,9 +300,7 @@
   }
   pending_body_consumer_ = std::move(consumer_handle);
   body_data_pipe_adapter_ = std::make_unique<SourceStreamToDataPipe>(
-      std::move(payload_stream), std::move(producer_handle),
-      base::BindOnce(&SignedExchangeLoader::FinishReadingBody,
-                     base::Unretained(this)));
+      std::move(payload_stream), std::move(producer_handle));
 
   StartReadingBody();
 }
@@ -337,7 +335,8 @@
 
   // Start reading.
   client_->OnStartLoadingResponseBody(std::move(pending_body_consumer_));
-  body_data_pipe_adapter_->Start();
+  body_data_pipe_adapter_->Start(base::BindOnce(
+      &SignedExchangeLoader::FinishReadingBody, base::Unretained(this)));
 }
 
 void SignedExchangeLoader::FinishReadingBody(int result) {
diff --git a/content/browser/worker_host/dedicated_worker_host.h b/content/browser/worker_host/dedicated_worker_host.h
index c2a8be3..d35c23e 100644
--- a/content/browser/worker_host/dedicated_worker_host.h
+++ b/content/browser/worker_host/dedicated_worker_host.h
@@ -84,6 +84,8 @@
       mojo::PendingReceiver<blink::mojom::IDBFactory> receiver);
   void BindSmsReceiverReceiver(
       mojo::PendingReceiver<blink::mojom::SmsReceiver> receiver);
+  void CreateWebUsbService(
+      mojo::PendingReceiver<blink::mojom::WebUsbService> receiver);
 
 #if !defined(OS_ANDROID)
   void BindSerialService(
@@ -148,9 +150,6 @@
                                       RenderFrameHostImpl* render_frame_host,
                                       bool* bypass_redirect_checks);
 
-  void CreateWebUsbService(
-      mojo::PendingReceiver<blink::mojom::WebUsbService> receiver);
-
   void CreateWebSocketConnector(
       mojo::PendingReceiver<blink::mojom::WebSocketConnector> receiver);
 
diff --git a/content/common/resource_messages.h b/content/common/resource_messages.h
index c31444d..0d31d88 100644
--- a/content/common/resource_messages.h
+++ b/content/common/resource_messages.h
@@ -29,10 +29,6 @@
 
 #endif  // INTERNAL_CONTENT_COMMON_RESOURCE_MESSAGES_H_
 
-#define IPC_MESSAGE_START ResourceMsgStart
-#undef IPC_MESSAGE_EXPORT
-#define IPC_MESSAGE_EXPORT CONTENT_EXPORT
-
 IPC_ENUM_TRAITS_MAX_VALUE(blink::WebMixedContentContextType,
                           blink::WebMixedContentContextType::kLast)
 
diff --git a/content/public/app/content_browser_manifest.cc b/content/public/app/content_browser_manifest.cc
index ac188a6e..d73d0ea 100644
--- a/content/public/app/content_browser_manifest.cc
+++ b/content/public/app/content_browser_manifest.cc
@@ -179,7 +179,6 @@
                   "blink.mojom.NativeFileSystemManager",
                   "blink.mojom.NotificationService",
                   "blink.mojom.QuotaDispatcherHost",
-                  "blink.mojom.WebUsbService",
                   "blink.mojom.WebSocketConnector"})
           .ExposeInterfaceFilterCapability_Deprecated(
               "navigation:service_worker", "renderer",
@@ -212,7 +211,6 @@
                   "blink.mojom.SharedWorkerConnector",
                   "blink.mojom.TextSuggestionHost",
                   "blink.mojom.UnhandledTapNotifier",
-                  "blink.mojom.WebUsbService",
                   "content.mojom.BrowserTarget",
                   "content.mojom.InputInjector",
                   "content.mojom.RendererAudioInputStreamFactory",
diff --git a/content/public/browser/download_manager_delegate.h b/content/public/browser/download_manager_delegate.h
index ff0f7d0f..c2f4214b 100644
--- a/content/public/browser/download_manager_delegate.h
+++ b/content/public/browser/download_manager_delegate.h
@@ -138,8 +138,7 @@
   // Retrieve the directories to save html pages and downloads to.
   virtual void GetSaveDir(BrowserContext* browser_context,
                           base::FilePath* website_save_dir,
-                          base::FilePath* download_save_dir,
-                          bool* skip_dir_check) {}
+                          base::FilePath* download_save_dir) {}
 
   // Asks the user for the path to save a page. The delegate calls the callback
   // to give the answer.
diff --git a/content/public/browser/service_worker_context_observer.h b/content/public/browser/service_worker_context_observer.h
index ea0f8d3..6bafdd0 100644
--- a/content/public/browser/service_worker_context_observer.h
+++ b/content/public/browser/service_worker_context_observer.h
@@ -38,15 +38,21 @@
   // Called when the service worker with id |version_id| starts or stops
   // running.
   //
-  // This function is currently only called after a worker finishes
+  // These functions are currently only called after a worker finishes
   // starting/stopping or the version is destroyed before finishing
   // stopping. That is, a worker in the process of starting is not yet
-  // considered running, even if it's executing JavaScript. See TODO in
-  // ServiceWorkerContextWrapper::OnRunningStateChanged.
-  virtual void OnVersionRunningStatusChanged(
-      content::ServiceWorkerContext* context,
-      int64_t version_id,
-      bool is_running) {}
+  // considered running, even if it's executing JavaScript.
+  //
+  // TODO(minggang): Create a new observer to listen to the events when the
+  // process of the service worker is allocated/released, instead of using the
+  // running status of the embedded worker.
+  virtual void OnVersionStartedRunning(ServiceWorkerContext* context,
+                                       int64_t version_id,
+                                       const GURL& scope,
+                                       int process_id,
+                                       const GURL& script_url) {}
+  virtual void OnVersionStoppedRunning(ServiceWorkerContext* context,
+                                       int64_t version_id) {}
 
   // Called when there are no more controllees for the service worker with id
   // |version_id|.
@@ -58,7 +64,7 @@
                                       const ConsoleMessage& message) {}
 
   // Called when |context| is destroyed. Observers must no longer use |context|.
-  virtual void OnDestruct(content::ServiceWorkerContext* context) {}
+  virtual void OnDestruct(ServiceWorkerContext* context) {}
 
  protected:
   virtual ~ServiceWorkerContextObserver() {}
diff --git a/content/public/browser/web_contents_delegate.cc b/content/public/browser/web_contents_delegate.cc
index d868e5cc..1f046dd 100644
--- a/content/public/browser/web_contents_delegate.cc
+++ b/content/public/browser/web_contents_delegate.cc
@@ -119,20 +119,25 @@
   return true;
 }
 
-bool WebContentsDelegate::ShouldCreateWebContents(
-    WebContents* web_contents,
+bool WebContentsDelegate::IsWebContentsCreationOverridden(
+    SiteInstance* source_site_instance,
+    content::mojom::WindowContainerType window_container_type,
+    const GURL& opener_url,
+    const std::string& frame_name,
+    const GURL& target_url) {
+  return false;
+}
+
+WebContents* WebContentsDelegate::CreateCustomWebContents(
     RenderFrameHost* opener,
     SiteInstance* source_site_instance,
-    int32_t route_id,
-    int32_t main_frame_route_id,
-    int32_t main_frame_widget_route_id,
-    content::mojom::WindowContainerType window_container_type,
+    bool is_new_browsing_instance,
     const GURL& opener_url,
     const std::string& frame_name,
     const GURL& target_url,
     const std::string& partition_id,
     SessionStorageNamespace* session_storage_namespace) {
-  return true;
+  return nullptr;
 }
 
 JavaScriptDialogManager* WebContentsDelegate::GetJavaScriptDialogManager(
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h
index b0f8fe9..dd9fcc80 100644
--- a/content/public/browser/web_contents_delegate.h
+++ b/content/public/browser/web_contents_delegate.h
@@ -57,7 +57,6 @@
 class FileSelectListener;
 class JavaScriptDialogManager;
 class RenderFrameHost;
-class RenderProcessHost;
 class RenderWidgetHost;
 class SessionStorageNamespace;
 class SiteInstance;
@@ -298,35 +297,30 @@
   virtual bool OnGoToEntryOffset(int offset);
 
   // Allows delegate to control whether a new WebContents can be created by
-  // |web_contents|.
+  // the WebContents itself.
   //
-  // The route ID parameters passed to this method are associated with the
-  // |source_site_instance|'s RenderProcessHost. They may also be
-  // MSG_ROUTING_NONE. If they are valid, they correspond to a trio of
-  // RenderView, RenderFrame, and RenderWidget objects that have been created in
-  // the renderer, but not yet assigned a WebContents, RenderViewHost,
-  // RenderFrameHost, or RenderWidgetHost.
+  // If an delegate returns true, it can optionally also override
+  // CreateCustomWebContents() below to provide their own WebContents.
+  virtual bool IsWebContentsCreationOverridden(
+      SiteInstance* source_site_instance,
+      content::mojom::WindowContainerType window_container_type,
+      const GURL& opener_url,
+      const std::string& frame_name,
+      const GURL& target_url);
+
+  // Allow delegate to creates a custom WebContents when
+  // WebContents::CreateNewWindow() is called. This function is only called
+  // when IsWebContentsCreationOverridden() returns true.
   //
-  // The return value is interpreted as follows:
-  //
-  //   Return true: |web_contents| should create a WebContents.
-  //   Return false: |web_contents| should not create a WebContents. The
-  //       provisionally-created RenderView (if it exists) in the renderer
-  //       process will be destroyed, UNLESS the delegate, during this method,
-  //       itself creates a WebContents using |source_site_instance|,
-  //       |route_id|, |main_frame_route_id|, and |main_frame_widget_route_id|
-  //       as creation parameters. If this happens, the delegate assumes
-  //       ownership of the corresponding RenderView, etc. |web_contents| will
-  //       detect that this has happened by looking for the existence of a
-  //       RenderViewHost in |source_site_instance| with |route_id|.
-  virtual bool ShouldCreateWebContents(
-      WebContents* web_contents,
+  // In general, a delegate should return a pointer to a created WebContents
+  // so that the opener can be given a references to it as appropriate.
+  // Returning nullptr also makes sense if the delegate wishes to suppress
+  // all window creation, or if the delegate wants to ensure the opener
+  // cannot get a reference effectively creating a new browsing instance.
+  virtual WebContents* CreateCustomWebContents(
       RenderFrameHost* opener,
       SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
-      content::mojom::WindowContainerType window_container_type,
+      bool is_new_browsing_instance,
       const GURL& opener_url,
       const std::string& frame_name,
       const GURL& target_url,
diff --git a/content/public/test/ppapi_test_utils.h b/content/public/test/ppapi_test_utils.h
index f0ff0c3..bfde4be 100644
--- a/content/public/test/ppapi_test_utils.h
+++ b/content/public/test/ppapi_test_utils.h
@@ -9,6 +9,7 @@
 #include "base/compiler_specific.h"
 #include "base/files/file_path.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "services/network/public/mojom/udp_socket.mojom.h"
 
 namespace base {
@@ -50,7 +51,7 @@
 using CreateUDPSocketCallback = base::RepeatingCallback<void(
     network::mojom::NetworkContext* network_context,
     mojo::PendingReceiver<network::mojom::UDPSocket> socket_receiver,
-    network::mojom::UDPSocketListenerPtr socket_listener)>;
+    mojo::PendingRemote<network::mojom::UDPSocketListener> socket_listener)>;
 
 // Sets a NetworkContext to be used by the Pepper TCP classes for testing.
 // Passed in NetworkContext must remain valid until the method is called again
diff --git a/content/public/test/service_worker_test_helpers.cc b/content/public/test/service_worker_test_helpers.cc
index 50fd97f6..18ba6915 100644
--- a/content/public/test/service_worker_test_helpers.cc
+++ b/content/public/test/service_worker_test_helpers.cc
@@ -55,10 +55,9 @@
     }
 
     // ServiceWorkerContextCoreObserver:
-    void OnRunningStateChanged(int64_t version_id,
-                               EmbeddedWorkerStatus status) override {
+    void OnStopped(int64_t version_id) override {
       DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
-      if (version_id != version_id_ || status != EmbeddedWorkerStatus::STOPPED)
+      if (version_id != version_id_)
         return;
       std::move(stopped_callback_).Run();
     }
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
index 3bd9cb1..6191caaf 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -35,6 +35,10 @@
 [ mac ] WebglExtension_WEBGL_compressed_texture_s3tc_srgb [ Skip ]
 [ linux ] WebglExtension_WEBGL_compressed_texture_s3tc_srgb [ Skip ]
 
+# TODO(crbug.com/1011653): re-enable these tests after ANGLE roll.
+crbug.com/1011653 [ android ] WebglExtension_WEBGL_compressed_texture_etc [ Skip ]
+crbug.com/1011653 [ android ] WebglExtension_WEBGL_compressed_texture_etc1 [ Skip ]
+
 # Disabling all multiview checks temporarily while ANGLE side changes
 # get merged in.
 crbug.com/864524 [ win ] WebglExtension_OVR_multiview2 [ Skip ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
index 9ba7f41..2509827 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -42,6 +42,10 @@
 crbug.com/808744 [ android ] WebglExtension_EXT_disjoint_timer_query [ Skip ]
 crbug.com/849576 [ no-passthrough ] WebglExtension_KHR_parallel_shader_compile [ Skip ]
 
+# TODO(crbug.com/1011653): re-enable these tests after ANGLE roll.
+crbug.com/1011653 [ android ] WebglExtension_WEBGL_compressed_texture_etc [ Skip ]
+crbug.com/1011653 [ android ] WebglExtension_WEBGL_compressed_texture_etc1 [ Skip ]
+
 # Extensions not available under D3D9
 [ win d3d9 ] WebglExtension_EXT_sRGB [ Failure ]
 crbug.com/867718 [ win d3d9 ] WebglExtension_EXT_disjoint_timer_query [ Failure ]
diff --git a/extensions/browser/api/socket/socket_api.cc b/extensions/browser/api/socket/socket_api.cc
index 7424290..94dc48ce 100644
--- a/extensions/browser/api/socket/socket_api.cc
+++ b/extensions/browser/api/socket/socket_api.cc
@@ -241,12 +241,13 @@
     case extensions::api::socket::SOCKET_TYPE_UDP: {
       socket_type_ = kSocketTypeUDP;
 
-      network::mojom::UDPSocketListenerPtr listener_ptr;
-      socket_listener_request_ = mojo::MakeRequest(&listener_ptr);
+      mojo::PendingRemote<network::mojom::UDPSocketListener> listener_remote;
+      socket_listener_receiver_ =
+          listener_remote.InitWithNewPipeAndPassReceiver();
       content::BrowserContext::GetDefaultStoragePartition(browser_context())
           ->GetNetworkContext()
           ->CreateUDPSocket(socket_.InitWithNewPipeAndPassReceiver(),
-                            std::move(listener_ptr));
+                            std::move(listener_remote));
       break;
     }
     case extensions::api::socket::SOCKET_TYPE_NONE:
@@ -263,7 +264,7 @@
     socket = new TCPSocket(browser_context(), extension_->id());
   } else if (socket_type_ == kSocketTypeUDP) {
     socket =
-        new UDPSocket(std::move(socket_), std::move(socket_listener_request_),
+        new UDPSocket(std::move(socket_), std::move(socket_listener_receiver_),
                       extension_->id());
   }
   DCHECK(socket);
diff --git a/extensions/browser/api/socket/socket_api.h b/extensions/browser/api/socket/socket_api.h
index 2280d8f..1657ac6 100644
--- a/extensions/browser/api/socket/socket_api.h
+++ b/extensions/browser/api/socket/socket_api.h
@@ -22,6 +22,7 @@
 #include "extensions/browser/extension_function.h"
 #include "extensions/common/api/socket.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "net/base/address_list.h"
 #include "net/base/network_change_notifier.h"
@@ -197,7 +198,8 @@
 
   // These two fields are only applicable if |socket_type_| is UDP.
   mojo::PendingRemote<network::mojom::UDPSocket> socket_;
-  network::mojom::UDPSocketListenerRequest socket_listener_request_;
+  mojo::PendingReceiver<network::mojom::UDPSocketListener>
+      socket_listener_receiver_;
 
   std::unique_ptr<api::socket::Create::Params> params_;
   SocketType socket_type_;
diff --git a/extensions/browser/api/sockets_udp/sockets_udp_api.cc b/extensions/browser/api/sockets_udp/sockets_udp_api.cc
index 6bd1419..aedfe02e 100644
--- a/extensions/browser/api/sockets_udp/sockets_udp_api.cc
+++ b/extensions/browser/api/sockets_udp/sockets_udp_api.cc
@@ -96,18 +96,18 @@
   params_ = sockets_udp::Create::Params::Create(*args_);
   EXTENSION_FUNCTION_VALIDATE(params_.get());
 
-  network::mojom::UDPSocketListenerPtr listener_ptr;
-  socket_listener_request_ = mojo::MakeRequest(&listener_ptr);
+  mojo::PendingRemote<network::mojom::UDPSocketListener> listener_remote;
+  socket_listener_receiver_ = listener_remote.InitWithNewPipeAndPassReceiver();
   content::BrowserContext::GetDefaultStoragePartition(browser_context())
       ->GetNetworkContext()
       ->CreateUDPSocket(socket_.InitWithNewPipeAndPassReceiver(),
-                        std::move(listener_ptr));
+                        std::move(listener_remote));
   return true;
 }
 
 void SocketsUdpCreateFunction::Work() {
   ResumableUDPSocket* socket = new ResumableUDPSocket(
-      std::move(socket_), std::move(socket_listener_request_),
+      std::move(socket_), std::move(socket_listener_receiver_),
       extension_->id());
 
   sockets_udp::SocketProperties* properties = params_->properties.get();
diff --git a/extensions/browser/api/sockets_udp/sockets_udp_api.h b/extensions/browser/api/sockets_udp/sockets_udp_api.h
index 128676a..ad9b06f2 100644
--- a/extensions/browser/api/sockets_udp/sockets_udp_api.h
+++ b/extensions/browser/api/sockets_udp/sockets_udp_api.h
@@ -10,6 +10,7 @@
 #include "base/gtest_prod_util.h"
 #include "extensions/browser/api/socket/socket_api.h"
 #include "extensions/common/api/sockets_udp.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 
 namespace extensions {
@@ -59,7 +60,8 @@
   FRIEND_TEST_ALL_PREFIXES(SocketsUdpUnitTest, Create);
 
   mojo::PendingRemote<network::mojom::UDPSocket> socket_;
-  network::mojom::UDPSocketListenerRequest socket_listener_request_;
+  mojo::PendingReceiver<network::mojom::UDPSocketListener>
+      socket_listener_receiver_;
   std::unique_ptr<sockets_udp::Create::Params> params_;
 };
 
diff --git a/extensions/browser/guest_view/extension_options/extension_options_guest.cc b/extensions/browser/guest_view/extension_options/extension_options_guest.cc
index 0890def7..bfe998a 100644
--- a/extensions/browser/guest_view/extension_options/extension_options_guest.cc
+++ b/extensions/browser/guest_view/extension_options/extension_options_guest.cc
@@ -207,24 +207,29 @@
   return extension_options_guest_delegate_->HandleContextMenu(params);
 }
 
-bool ExtensionOptionsGuest::ShouldCreateWebContents(
-    content::WebContents* web_contents,
+bool ExtensionOptionsGuest::IsWebContentsCreationOverridden(
+    content::SiteInstance* source_site_instance,
+    content::mojom::WindowContainerType window_container_type,
+    const GURL& opener_url,
+    const std::string& frame_name,
+    const GURL& target_url) {
+  // This method handles opening links from within the guest. Since this guest
+  // view is used for displaying embedded extension options, we want any
+  // external links to be opened in a new tab, not in a new guest view so we
+  // override creation.
+  return true;
+}
+
+WebContents* ExtensionOptionsGuest::CreateCustomWebContents(
     content::RenderFrameHost* opener,
     content::SiteInstance* source_site_instance,
-    int32_t route_id,
-    int32_t main_frame_route_id,
-    int32_t main_frame_widget_route_id,
-    content::mojom::WindowContainerType window_container_type,
+    bool is_renderer_initiated,
     const GURL& opener_url,
     const std::string& frame_name,
     const GURL& target_url,
     const std::string& partition_id,
     content::SessionStorageNamespace* session_storage_namespace) {
-  // This method handles opening links from within the guest. Since this guest
-  // view is used for displaying embedded extension options, we want any
-  // external links to be opened in a new tab, not in a new guest view.
-  // Therefore we just open the URL in a new tab, and since we aren't handling
-  // the new web contents, we return false.
+  // To get links out of the guest view, we just open the URL in a new tab.
   // TODO(ericzeng): Open the tab in the background if the click was a
   //   ctrl-click or middle mouse button click
   if (extension_options_guest_delegate_) {
@@ -233,7 +238,11 @@
                                WindowOpenDisposition::NEW_FOREGROUND_TAB,
                                ui::PAGE_TRANSITION_LINK, false));
   }
-  return false;
+
+  // Returning nullptr here ensures that the guest-view can never get a
+  // reference to the new WebContents. It effectively forces a new browsing
+  // instance for all popups from an extensions guest.
+  return nullptr;
 }
 
 void ExtensionOptionsGuest::DidFinishNavigation(
diff --git a/extensions/browser/guest_view/extension_options/extension_options_guest.h b/extensions/browser/guest_view/extension_options/extension_options_guest.h
index bdeb2d5..3378cb2 100644
--- a/extensions/browser/guest_view/extension_options/extension_options_guest.h
+++ b/extensions/browser/guest_view/extension_options/extension_options_guest.h
@@ -50,14 +50,16 @@
   void CloseContents(content::WebContents* source) final;
   bool HandleContextMenu(content::RenderFrameHost* render_frame_host,
                          const content::ContextMenuParams& params) final;
-  bool ShouldCreateWebContents(
-      content::WebContents* web_contents,
+  bool IsWebContentsCreationOverridden(
+      content::SiteInstance* source_site_instance,
+      content::mojom::WindowContainerType window_container_type,
+      const GURL& opener_url,
+      const std::string& frame_name,
+      const GURL& target_url) final;
+  content::WebContents* CreateCustomWebContents(
       content::RenderFrameHost* opener,
       content::SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
-      content::mojom::WindowContainerType window_container_type,
+      bool is_new_browsing_instance,
       const GURL& opener_url,
       const std::string& frame_name,
       const GURL& target_url,
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
index 78cfe84..af060f3 100644
--- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
+++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.cc
@@ -391,14 +391,19 @@
   return is_guest_fullscreen_;
 }
 
-bool MimeHandlerViewGuest::ShouldCreateWebContents(
-    content::WebContents* web_contents,
+bool MimeHandlerViewGuest::IsWebContentsCreationOverridden(
+    content::SiteInstance* source_site_instance,
+    content::mojom::WindowContainerType window_container_type,
+    const GURL& opener_url,
+    const std::string& frame_name,
+    const GURL& target_url) {
+  return true;
+}
+
+content::WebContents* MimeHandlerViewGuest::CreateCustomWebContents(
     content::RenderFrameHost* opener,
     content::SiteInstance* source_site_instance,
-    int32_t route_id,
-    int32_t main_frame_route_id,
-    int32_t main_frame_widget_route_id,
-    content::mojom::WindowContainerType window_container_type,
+    bool is_renderer_initiated,
     const GURL& opener_url,
     const std::string& frame_name,
     const GURL& target_url,
@@ -414,7 +419,7 @@
   auto* delegate = embedder_web_contents()->GetDelegate();
   if (delegate)
     delegate->OpenURLFromTab(embedder_web_contents(), open_params);
-  return false;
+  return nullptr;
 }
 
 bool MimeHandlerViewGuest::SetFullscreenState(bool is_fullscreen) {
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
index a608b0f3..14c969b9 100644
--- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
+++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h
@@ -147,14 +147,16 @@
   void ExitFullscreenModeForTab(content::WebContents*) override;
   bool IsFullscreenForTabOrPending(
       const content::WebContents* web_contents) override;
-  bool ShouldCreateWebContents(
-      content::WebContents* web_contents,
+  bool IsWebContentsCreationOverridden(
+      content::SiteInstance* source_site_instance,
+      content::mojom::WindowContainerType window_container_type,
+      const GURL& opener_url,
+      const std::string& frame_name,
+      const GURL& target_url) override;
+  content::WebContents* CreateCustomWebContents(
       content::RenderFrameHost* opener,
       content::SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
-      content::mojom::WindowContainerType window_container_type,
+      bool is_new_browsing_instance,
       const GURL& opener_url,
       const std::string& frame_name,
       const GURL& target_url,
diff --git a/fuchsia/engine/browser/frame_impl.cc b/fuchsia/engine/browser/frame_impl.cc
index 0e17d7a..b1f3ae5 100644
--- a/fuchsia/engine/browser/frame_impl.cc
+++ b/fuchsia/engine/browser/frame_impl.cc
@@ -300,27 +300,18 @@
   }
 }
 
-bool FrameImpl::ShouldCreateWebContents(
-    content::WebContents* web_contents,
-    content::RenderFrameHost* opener,
+bool FrameImpl::IsWebContentsCreationOverridden(
     content::SiteInstance* source_site_instance,
-    int32_t route_id,
-    int32_t main_frame_route_id,
-    int32_t main_frame_widget_route_id,
     content::mojom::WindowContainerType window_container_type,
     const GURL& opener_url,
     const std::string& frame_name,
-    const GURL& target_url,
-    const std::string& partition_id,
-    content::SessionStorageNamespace* session_storage_namespace) {
+    const GURL& target_url) {
   // Specify a generous upper bound for unacknowledged popup windows, so that we
   // can catch bad client behavior while not interfering with normal operation.
   constexpr size_t kMaxPendingWebContentsCount = 10;
 
-  DCHECK_EQ(web_contents, web_contents_.get());
-
   if (!popup_listener_)
-    return false;
+    return true;
 
   if (pending_popups_.size() >= kMaxPendingWebContentsCount) {
     // The content is producing popups faster than the embedder can process
@@ -328,10 +319,10 @@
     LOG(WARNING) << "Too many pending popups, ignoring request.";
 
     // Don't produce a WebContents for this popup.
-    return false;
+    return true;
   }
 
-  return true;
+  return false;
 }
 
 void FrameImpl::AddNewContents(
diff --git a/fuchsia/engine/browser/frame_impl.h b/fuchsia/engine/browser/frame_impl.h
index 45c3abd..6e7f8c6 100644
--- a/fuchsia/engine/browser/frame_impl.h
+++ b/fuchsia/engine/browser/frame_impl.h
@@ -141,19 +141,12 @@
                               const base::string16& message,
                               int32_t line_no,
                               const base::string16& source_id) override;
-  bool ShouldCreateWebContents(
-      content::WebContents* web_contents,
-      content::RenderFrameHost* opener,
+  bool IsWebContentsCreationOverridden(
       content::SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
       content::mojom::WindowContainerType window_container_type,
       const GURL& opener_url,
       const std::string& frame_name,
-      const GURL& target_url,
-      const std::string& partition_id,
-      content::SessionStorageNamespace* session_storage_namespace) override;
+      const GURL& target_url) override;
   void WebContentsCreated(content::WebContents* source_contents,
                           int opener_render_process_id,
                           int opener_render_frame_id,
diff --git a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_compressed_texture_etc.txt b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_compressed_texture_etc.txt
deleted file mode 100644
index cea65c6..0000000
--- a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_compressed_texture_etc.txt
+++ /dev/null
@@ -1,72 +0,0 @@
-Name
-
-    CHROMIUM_compressed_texture_etc
-
-Name Strings
-
-    GL_CHROMIUM_compressed_texture_etc
-
-Version
-
-    Last Modifed Date: September 19, 2016
-
-Dependencies
-
-    OpenGL ES 2.0 is required.
-
-Overview
-
-    This extension exposes the OpenGL ES 3.0 core compressed texture
-    formats in OpenGL ES 2.0.
-
-New Procedures and Functions
-
-    None
-
-New Tokens
-
-    Accepted by the <internalformat> parameter of CompressedTexImage2D and the
-    <format> parameter of CompressedTexSubImage2D:
-
-        COMPRESSED_R11_EAC                                0x9270
-        COMPRESSED_SIGNED_R11_EAC                         0x9271
-        COMPRESSED_RG11_EAC                               0x9272
-        COMPRESSED_SIGNED_RG11_EAC                        0x9273
-        COMPRESSED_RGB8_ETC2                              0x9274
-        COMPRESSED_SRGB8_ETC2                             0x9275
-        COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2          0x9276
-        COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2         0x9277
-        COMPRESSED_RGBA8_ETC2_EAC                         0x9278
-        COMPRESSED_SRGB8_ALPHA8_ETC2_EAC                  0x9279
-
-    Querying COMPRESSED_TEXTURE_FORMATS will include these new formats.
-
-New Procedures and Functions
-
-    None.
-
-Errors
-
-    The error INVALID_VALUE is generated if the <internalformat> parameter of
-    CompressedTexImage2D or the <format> parameter of CompressedTexSubImage2D is
-    COMPRESSED_R11_EAC, COMPRESSED_SIGNED_R11_EAC, COMPRESSED_RGB8_ETC2,
-    COMPRESSED_SRGB8_ETC2, COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 or
-    COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, and imageSize is not
-
-        floor((width + 3) / 4) * floor((height + 3) / 4) * 8
-
-    The error INVALID_VALUE is generated if the <internalformat> parameter of
-    CompressedTexImage2D or the <format> paremeter of CompressedTexSubImage2D is
-    COMPRESSED_RG11_EAC, COMPRESSED_SIGNED_RG11_EAC, COMPRESSED_RGBA8_ETC2_EAC,
-    or COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, and imageSize is not
-
-        floor((width + 3) / 4) * floor((height + 3) / 4) * 16
-
-
-New State
-
-    None.
-
-Revision History
-
-    9/19/2016   First revision
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc
index f16cdc4..a737820a 100644
--- a/gpu/command_buffer/service/feature_info.cc
+++ b/gpu/command_buffer/service/feature_info.cc
@@ -1060,12 +1060,12 @@
     validators_.texture_internal_format_storage.AddValue(GL_ETC1_RGB8_OES);
   }
 
-  // Expose GL_CHROMIUM_compressed_texture_etc when ANGLE exposes it directly or
+  // Expose GL_ANGLE_compressed_texture_etc when ANGLE exposes it directly or
   // running on top of a non-ANGLE ES driver. We assume that this implies native
   // support of these formats.
-  if (gfx::HasExtension(extensions, "GL_CHROMIUM_compressed_texture_etc") ||
+  if (gfx::HasExtension(extensions, "GL_ANGLE_compressed_texture_etc") ||
       (gl_version_info_->is_es3 && !gl_version_info_->is_angle)) {
-    AddExtensionString("GL_CHROMIUM_compressed_texture_etc");
+    AddExtensionString("GL_ANGLE_compressed_texture_etc");
     validators_.UpdateETCCompressedTextureFormats();
   }
 
diff --git a/gpu/command_buffer/service/feature_info_unittest.cc b/gpu/command_buffer/service/feature_info_unittest.cc
index 9245613..0865a9b 100644
--- a/gpu/command_buffer/service/feature_info_unittest.cc
+++ b/gpu/command_buffer/service/feature_info_unittest.cc
@@ -468,11 +468,11 @@
       GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT));
 }
 
-TEST_P(FeatureInfoTest, InitializeCHROMIUM_compressed_texture_etc) {
+TEST_P(FeatureInfoTest, InitializeANGLE_compressed_texture_etc) {
   SetupInitExpectationsWithGLVersion("", "",
                                      "OpenGL ES 3.0");
   EXPECT_TRUE(gfx::HasExtension(info_->extensions(),
-                                "GL_CHROMIUM_compressed_texture_etc"));
+                                "GL_ANGLE_compressed_texture_etc"));
   EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
       GL_COMPRESSED_R11_EAC));
   EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid(
diff --git a/gpu/vulkan/demo/vulkan_demo.h b/gpu/vulkan/demo/vulkan_demo.h
index 3d8cd19..e1ca7307 100644
--- a/gpu/vulkan/demo/vulkan_demo.h
+++ b/gpu/vulkan/demo/vulkan_demo.h
@@ -12,7 +12,7 @@
 #include "gpu/vulkan/vulkan_swap_chain.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 #include "ui/gfx/geometry/size.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_delegate.h"
 
 class SkCanvas;
@@ -66,7 +66,7 @@
   scoped_refptr<viz::VulkanContextProvider> vulkan_context_provider_;
   gfx::AcceleratedWidget accelerated_widget_ = gfx::kNullAcceleratedWidget;
   std::unique_ptr<ui::PlatformEventSource> event_source_;
-  std::unique_ptr<ui::PlatformWindow> window_;
+  std::unique_ptr<ui::PlatformWindowBase> window_;
   std::unique_ptr<VulkanSurface> vulkan_surface_;
   base::Optional<VulkanSwapChain::ScopedWrite> scoped_write_;
   sk_sp<SkSurface> sk_surface_;
diff --git a/headless/lib/browser/headless_web_contents_impl.cc b/headless/lib/browser/headless_web_contents_impl.cc
index c0ff8fa6..86f4d81 100644
--- a/headless/lib/browser/headless_web_contents_impl.cc
+++ b/headless/lib/browser/headless_web_contents_impl.cc
@@ -177,22 +177,15 @@
     return target;
   }
 
-  bool ShouldCreateWebContents(
-      content::WebContents* web_contents,
-      content::RenderFrameHost* opener,
+  bool IsWebContentsCreationOverridden(
       content::SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
       content::mojom::WindowContainerType window_container_type,
       const GURL& opener_url,
       const std::string& frame_name,
-      const GURL& target_url,
-      const std::string& partition_id,
-      content::SessionStorageNamespace* session_storage_namespace) override {
-    return !headless_web_contents_->browser_context()
-                ->options()
-                ->block_new_web_contents();
+      const GURL& target_url) override {
+    return headless_web_contents_->browser_context()
+        ->options()
+        ->block_new_web_contents();
   }
 
  private:
diff --git a/ios/chrome/browser/metrics/BUILD.gn b/ios/chrome/browser/metrics/BUILD.gn
index d457830..a2e1ebf 100644
--- a/ios/chrome/browser/metrics/BUILD.gn
+++ b/ios/chrome/browser/metrics/BUILD.gn
@@ -240,6 +240,7 @@
     "//ios/chrome/browser/ui/authentication/cells",
     "//ios/chrome/browser/ui/popup_menu:constants",
     "//ios/chrome/browser/ui/settings",
+    "//ios/chrome/browser/ui/settings/google_services",
     "//ios/chrome/browser/ui/toolbar/buttons",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/util",
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
index 618a85b..415d973 100644
--- a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
+++ b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
@@ -215,7 +215,7 @@
 }
 
 base::TimeDelta IOSChromeMetricsServiceClient::GetStandardUploadInterval() {
-  return metrics::GetUploadInterval();
+  return metrics::GetUploadInterval(metrics::ShouldUseCellularUploadInterval());
 }
 
 void IOSChromeMetricsServiceClient::OnRendererProcessCrash() {
diff --git a/ios/chrome/browser/metrics/ukm_egtest.mm b/ios/chrome/browser/metrics/ukm_egtest.mm
index 6ad1ae6..a60de87 100644
--- a/ios/chrome/browser/metrics/ukm_egtest.mm
+++ b/ios/chrome/browser/metrics/ukm_egtest.mm
@@ -18,6 +18,7 @@
 #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view.h"
 #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h"
 #import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
+#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
@@ -343,7 +344,7 @@
                                      YES)]
            usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, 200)
         onElementWithMatcher:grey_accessibilityID(
-                                 @"google_services_settings_view_controller")]
+                                 kGoogleServicesSettingsViewIdentifier)]
         performAction:chrome_test_util::TurnSettingsSwitchOn(NO)];
 
   } else {
diff --git a/ios/chrome/browser/ui/authentication/BUILD.gn b/ios/chrome/browser/ui/authentication/BUILD.gn
index f524d082..74dcd98 100644
--- a/ios/chrome/browser/ui/authentication/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/BUILD.gn
@@ -60,6 +60,7 @@
     "//ios/chrome/browser/ui/signin_interaction/public",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/unified_consent",
+    "//ios/chrome/browser/web_state_list",
     "//ios/chrome/common",
     "//ios/chrome/common/colors",
     "//ios/chrome/common/ui_util",
diff --git a/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm b/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm
index 711fb5d1..1eec6d2 100644
--- a/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm
+++ b/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm
@@ -18,6 +18,7 @@
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/strings/grit/components_strings.h"
 #include "google_apis/gaia/gaia_auth_util.h"
+#include "google_apis/gaia/gaia_urls.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/signin/authentication_service.h"
 #include "ios/chrome/browser/signin/authentication_service_factory.h"
@@ -26,15 +27,19 @@
 #include "ios/chrome/browser/sync/sync_setup_service.h"
 #include "ios/chrome/browser/sync/sync_setup_service_factory.h"
 #include "ios/chrome/browser/system_flags.h"
+#include "ios/chrome/browser/tabs/tab_model.h"
+#import "ios/chrome/browser/tabs/tab_model_list.h"
 #include "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h"
 #import "ios/chrome/browser/ui/authentication/authentication_ui_util.h"
 #import "ios/chrome/browser/ui/commands/browsing_data_commands.h"
 #import "ios/chrome/browser/ui/settings/import_data_table_view_controller.h"
 #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
+#import "ios/chrome/browser/web_state_list/web_state_list.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
 #import "ios/public/provider/chrome/browser/signin/chrome_identity.h"
+#import "ios/web/public/web_state.h"
 #include "ui/base/l10n/l10n_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -283,12 +288,46 @@
   DCHECK(!AuthenticationServiceFactory::GetForBrowserState(browserState)
               ->IsAuthenticated());
 
+  // Workaround for crbug.com/1003578
+  //
+  // During the Chrome sign-in flow, if the user chooses to clear the cookies
+  // when switching their primary account, then the following actions take
+  // place (in the following order):
+  //   1. All cookies are cleared.
+  //   2. The user is signed in to Chrome (aka the primary account set)
+  //   2.a. All requests to Gaia page will include Mirror header.
+  //   2.b. Account reconcilor will rebuild the Gaia cookies having the Chrome
+  //      primary account as the Gaia default web account.
+  //
+  // The Gaia sign-in webpage monitors changes to its cookies and reloads the
+  // page whenever they change. Reloading the webpage while the cookies are
+  // cleared and just before they are rebuilt seems to confuse WKWebView that
+  // ends up with a nil URL, which in turns translates in about:blank URL shown
+  // in the Omnibox.
+  //
+  // This CL works around this issue by waiting for 1 second between steps 1
+  // and 2 above to allow the WKWebView to initiate the reload after the
+  // cookies are cleared.
+  WebStateList* webStateList =
+      TabModelList::GetLastActiveTabModelForChromeBrowserState(browserState)
+          .webStateList;
+  web::WebState* activeWebState = webStateList->GetActiveWebState();
+  bool activeWebStateHasGaiaOrigin =
+      activeWebState && (activeWebState->GetVisibleURL().GetOrigin() ==
+                         GaiaUrls::GetInstance()->gaia_url());
+  int64_t dispatchDelaySecs = activeWebStateHasGaiaOrigin ? 1 : 0;
+
   [dispatcher
       removeBrowsingDataForBrowserState:browserState
                              timePeriod:browsing_data::TimePeriod::ALL_TIME
                              removeMask:BrowsingDataRemoveMask::REMOVE_ALL
                         completionBlock:^{
-                          [_delegate didClearData];
+                          dispatch_after(
+                              dispatch_time(DISPATCH_TIME_NOW,
+                                            dispatchDelaySecs * NSEC_PER_SEC),
+                              dispatch_get_main_queue(), ^{
+                                [_delegate didClearData];
+                              });
                         }];
 }
 
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm
index 9920202..e412146 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm
@@ -11,6 +11,7 @@
 #import "ios/chrome/browser/tabs/tab_model.h"
 #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h"
 #import "ios/chrome/browser/ui/authentication/signin_earlgrey_utils.h"
+#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h"
 #import "ios/chrome/browser/ui/settings/google_services/manage_sync_settings_table_view_controller.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
@@ -137,7 +138,7 @@
   [ChromeEarlGreyUI openSettingsMenu];
   [ChromeEarlGreyUI tapSettingsMenuButton:GoogleServicesSettingsButton()];
   self.scrollViewMatcher =
-      grey_accessibilityID(@"google_services_settings_view_controller");
+      grey_accessibilityID(kGoogleServicesSettingsViewIdentifier);
   [[EarlGrey selectElementWithMatcher:self.scrollViewMatcher]
       assertWithMatcher:grey_notNil()];
 }
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h b/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h
index 95cb9d6..9685b1c 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h
@@ -13,6 +13,8 @@
 @protocol GoogleServicesSettingsServiceDelegate;
 @protocol GoogleServicesSettingsViewControllerModelDelegate;
 
+extern NSString* const kGoogleServicesSettingsViewIdentifier;
+
 // Delegate for presentation events related to
 // GoogleServicesSettingsViewController.
 @protocol GoogleServicesSettingsViewControllerPresentationDelegate <NSObject>
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.mm
index c62ba9d..665d938 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.mm
@@ -16,12 +16,16 @@
 #error "This file requires ARC support."
 #endif
 
+// Accessibility identifier for the Google services settings table view.
+NSString* const kGoogleServicesSettingsViewIdentifier =
+    @"google_services_settings_view_controller";
+
 @implementation GoogleServicesSettingsViewController
 
 - (void)viewDidLoad {
   [super viewDidLoad];
   self.tableView.accessibilityIdentifier =
-      @"google_services_settings_view_controller";
+      kGoogleServicesSettingsViewIdentifier;
   self.title = l10n_util::GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_TITLE);
 }
 
diff --git a/ios/chrome/browser/ui/signin_interaction/BUILD.gn b/ios/chrome/browser/ui/signin_interaction/BUILD.gn
index 1eb25a2..a67bf66 100644
--- a/ios/chrome/browser/ui/signin_interaction/BUILD.gn
+++ b/ios/chrome/browser/ui/signin_interaction/BUILD.gn
@@ -69,6 +69,7 @@
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant",
     "//ios/chrome/browser/ui/recent_tabs:recent_tabs_ui_constants",
     "//ios/chrome/browser/ui/settings",
+    "//ios/chrome/browser/ui/settings/google_services",
     "//ios/chrome/browser/ui/table_view/cells",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/web_state_list",
diff --git a/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_egtest.mm b/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_egtest.mm
index cdf3361..e357bf4 100644
--- a/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_egtest.mm
+++ b/ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_egtest.mm
@@ -6,6 +6,7 @@
 #import <XCTest/XCTest.h>
 
 #import "base/ios/block_types.h"
+#include "base/ios/ios_util.h"
 #include "base/strings/sys_string_conversions.h"
 #import "base/test/ios/wait_util.h"
 #include "base/test/scoped_feature_list.h"
@@ -20,6 +21,7 @@
 #import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
 #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h"
 #import "ios/chrome/browser/ui/recent_tabs/recent_tabs_constants.h"
+#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_view_controller.h"
 #import "ios/chrome/browser/ui/signin_interaction/signin_interaction_controller_egtest_util.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
@@ -30,7 +32,9 @@
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity.h"
 #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h"
+#import "ios/testing/earl_grey/matchers.h"
 #import "ios/web/public/web_state.h"
+#include "ui/base/l10n/l10n_util_mac.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -41,6 +45,8 @@
 using chrome_test_util::SecondarySignInButton;
 using chrome_test_util::SettingsDoneButton;
 using chrome_test_util::SyncSettingsConfirmButton;
+using l10n_util::GetNSString;
+using testing::ButtonWithAccessibilityLabel;
 
 typedef NS_ENUM(NSInteger, OpenSigninMethod) {
   OpenSigninMethodFromSettings,
@@ -367,16 +373,36 @@
                         tapSettingsLink:YES];
 }
 
-#pragma mark - Utils
-
-// Starts the sign-in workflow, and simulates opening an URL from another app.
-// |openSigninMethod| is the way to start the sign-in.
-// |tapSettingsLink| if YES, the setting link is tapped before opening the URL.
-- (void)assertOpenURLWhenSigninFromView:(OpenSigninMethod)openSigninMethod
-                        tapSettingsLink:(BOOL)tapSettingsLink {
+// Verifies that advanced sign-in shows an alert dialog when being swiped to
+// dismiss.
+- (void)testSwipeDownToCancelAdvancedSignin {
+  if (!base::ios::IsRunningOnOrLater(13, 0, 0)) {
+    EARL_GREY_TEST_SKIPPED(@"Test disabled on iOS 12 and lower.");
+  }
   ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
   ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
       identity);
+  [self openSigninFromView:OpenSigninMethodFromSettings tapSettingsLink:YES];
+
+  [[EarlGrey
+      selectElementWithMatcher:grey_accessibilityID(
+                                   kGoogleServicesSettingsViewIdentifier)]
+      performAction:grey_swipeFastInDirection(kGREYDirectionDown)];
+  [[EarlGrey
+      selectElementWithMatcher:
+          ButtonWithAccessibilityLabel(GetNSString(
+              IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_CANCEL_SYNC_BUTTON))]
+      performAction:grey_tap()];
+  [SigninEarlGreyUtils checkSignedOut];
+}
+
+#pragma mark - Utils
+
+// Opens sign-in view.
+// |openSigninMethod| is the way to start the sign-in.
+// |tapSettingsLink| if YES, the setting link is tapped before opening the URL.
+- (void)openSigninFromView:(OpenSigninMethod)openSigninMethod
+           tapSettingsLink:(BOOL)tapSettingsLink {
   switch (openSigninMethod) {
     case OpenSigninMethodFromSettings:
       [ChromeEarlGreyUI openSettingsMenu];
@@ -409,6 +435,17 @@
     [SigninEarlGreyUI tapSettingsLink];
   }
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+}
+
+// Starts the sign-in workflow, and simulates opening an URL from another app.
+// |openSigninMethod| is the way to start the sign-in.
+// |tapSettingsLink| if YES, the setting link is tapped before opening the URL.
+- (void)assertOpenURLWhenSigninFromView:(OpenSigninMethod)openSigninMethod
+                        tapSettingsLink:(BOOL)tapSettingsLink {
+  ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
+  ios::FakeChromeIdentityService::GetInstanceFromChromeProvider()->AddIdentity(
+      identity);
+  [self openSigninFromView:openSigninMethod tapSettingsLink:tapSettingsLink];
   // Open the URL as if it was opened from another app.
   UIApplication* application = UIApplication.sharedApplication;
   id<UIApplicationDelegate> applicationDelegate = application.delegate;
diff --git a/ios/web_view/tools/build.py b/ios/web_view/tools/build.py
index f66fbe6..c876d0e 100755
--- a/ios/web_view/tools/build.py
+++ b/ios/web_view/tools/build.py
@@ -223,9 +223,6 @@
     extra_gn_options += 'ios_web_view_include_cronet=false '
   if options.enable_sync:
     extra_gn_options += 'ios_web_view_enable_sync=true '
-    # Used to differentiate //ios/web_view from //ios/chrome in the user agent
-    # product string passed to sync servers.
-    extra_gn_options += 'sync_user_agent_product="ChromeWebView" '
   else:
     extra_gn_options += 'ios_web_view_enable_sync=false '
   if options.enable_autofill:
diff --git a/ipc/ipc_message_start.h b/ipc/ipc_message_start.h
index 83460bdd..f69f0072 100644
--- a/ipc/ipc_message_start.h
+++ b/ipc/ipc_message_start.h
@@ -24,7 +24,6 @@
   GpuChannelMsgStart,
   MediaMsgStart,
   PpapiMsgStart,
-  ResourceMsgStart,
   ChromeMsgStart,
   DragMsgStart,
   PrintMsgStart,
@@ -36,9 +35,7 @@
   ChromotingMsgStart,
   BrowserPluginMsgStart,
   AndroidWebViewMsgStart,
-  MediaPlayerMsgStart,
   PeerConnectionTrackerMsgStart,
-  WebRtcLoggingMsgStart,
   NaClHostMsgStart,
   EncryptedMediaMsgStart,
   CastMsgStart,
@@ -47,20 +44,13 @@
   OzoneGpuMsgStart,
   WebTestMsgStart,
   NetworkHintsMsgStart,
-  CastMediaMsgStart,
-  SyncCompositorMsgStart,
   ExtensionsGuestViewMsgStart,
   GuestViewMsgStart,
-  // Note: CastCryptoMsgStart and CastChannelMsgStart reserved for Chromecast
-  // internal code. Contact gunsch@ before changing/removing.
-  CastCryptoMsgStart,
-  CastChannelMsgStart,
   IPCTestMsgStart,
   MediaPlayerDelegateMsgStart,
   SurfaceViewManagerMsgStart,
   ExtensionWorkerMsgStart,
   SubresourceFilterMsgStart,
-  ChromeAppsMsgStart,
   UnfreezableFrameMsgStart,
   LastIPCMsgStart  // Must come last.
 };
diff --git a/media/filters/fuchsia/fuchsia_video_decoder.cc b/media/filters/fuchsia/fuchsia_video_decoder.cc
index c16a96c..db34a38c 100644
--- a/media/filters/fuchsia/fuchsia_video_decoder.cc
+++ b/media/filters/fuchsia/fuchsia_video_decoder.cc
@@ -154,6 +154,11 @@
   DISALLOW_COPY_AND_ASSIGN(OutputMailbox);
 };
 
+struct InputDecoderPacket {
+  StreamProcessorHelper::IoPacket packet;
+  bool used_for_current_stream = true;
+};
+
 }  // namespace
 
 class FuchsiaVideoDecoder : public VideoDecoder,
@@ -277,8 +282,7 @@
   std::unique_ptr<SysmemBufferPool::Creator> input_buffer_collection_creator_;
   std::unique_ptr<SysmemBufferPool> input_buffer_collection_;
   size_t num_input_buffers_ = 0;
-  base::flat_map<size_t, StreamProcessorHelper::IoPacket>
-      in_flight_input_packets_;
+  base::flat_map<size_t, InputDecoderPacket> in_flight_input_packets_;
 
   // Output buffers for |decoder_|.
   fuchsia::media::VideoUncompressedFormat output_format_;
@@ -339,7 +343,7 @@
   output_cb_ = output_cb;
   container_pixel_aspect_ratio_ = config.GetPixelAspectRatio();
 
-  // If we already have |decoder_| that was initializes for the same codec then
+  // If we already have |decoder_| that was initialized for the same codec then
   // keep using it.
   if (decoder_ && current_codec_ == config.codec()) {
     bool have_decryptor = decryptor_ != nullptr;
@@ -515,6 +519,7 @@
 void FuchsiaVideoDecoder::OnDecryptorError() {
   OnError();
 }
+
 void FuchsiaVideoDecoder::OnDecryptorNoKey() {
   NOTIMPLEMENTED();
   OnError();
@@ -638,7 +643,8 @@
 
   DCHECK(in_flight_input_packets_.find(packet.index()) ==
          in_flight_input_packets_.end());
-  in_flight_input_packets_.insert_or_assign(packet.index(), std::move(packet));
+  in_flight_input_packets_.insert_or_assign(
+      packet.index(), InputDecoderPacket{std::move(packet)});
 }
 
 void FuchsiaVideoDecoder::ProcessEndOfStream() {
@@ -668,15 +674,17 @@
     return;
   }
 
-  // Call DecodeCB if this was a last packet for a Decode request.
-  bool call_decode_callback = it->second.unit_end();
+  // Call DecodeCB if this was a last packet for a Decode() request. Ignore
+  // packets from a previous stream.
+  bool call_decode_callback =
+      it->second.packet.unit_end() && it->second.used_for_current_stream;
 
   {
     // The packet should be destroyed only after it's removed from
     // |in_flight_input_packets_|. Otherwise SysmemBufferWriter may call
     // SendInputPacket() while the packet is still in
     // |in_flight_input_packets_|.
-    auto packet = std::move(it->second);
+    auto packet = std::move(it->second.packet);
     in_flight_input_packets_.erase(it);
   }
 
@@ -955,7 +963,9 @@
   if (decryptor_)
     decryptor_->Reset();
 
-  in_flight_input_packets_.clear();
+  for (auto& packet : in_flight_input_packets_) {
+    packet.second.used_for_current_stream = false;
+  }
 
   auto weak_this = weak_this_;
 
@@ -1019,6 +1029,7 @@
 }
 
 void FuchsiaVideoDecoder::ReleaseInputBuffers() {
+  in_flight_input_packets_.clear();
   input_writer_queue_.ResetBuffers();
   input_buffer_collection_creator_.reset();
   input_buffer_collection_.reset();
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn
index a9e3996b..3b62b3c5 100644
--- a/media/gpu/BUILD.gn
+++ b/media/gpu/BUILD.gn
@@ -242,6 +242,8 @@
   defines = [ "MEDIA_GPU_IMPLEMENTATION" ]
   sources = [
     "accelerated_video_decoder.h",
+    "buffer_validation.cc",
+    "buffer_validation.h",
     "codec_picture.cc",
     "codec_picture.h",
     "gpu_video_decode_accelerator_helpers.cc",
diff --git a/media/gpu/buffer_validation.cc b/media/gpu/buffer_validation.cc
new file mode 100644
index 0000000..ad278642
--- /dev/null
+++ b/media/gpu/buffer_validation.cc
@@ -0,0 +1,114 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/gpu/buffer_validation.h"
+
+#include "base/numerics/checked_math.h"
+#include "base/numerics/safe_conversions.h"
+#include "build/build_config.h"
+#include "media/base/video_frame.h"
+#include "media/gpu/macros.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/gpu_memory_buffer.h"
+
+#if defined(OS_LINUX)
+#include <sys/types.h>
+#include <unistd.h>
+#endif  // defined(OS_LINUX)
+
+namespace media {
+
+bool GetFileSize(const int fd, size_t* size) {
+#if defined(OS_LINUX)
+  if (fd < 0) {
+    VLOGF(1) << "Invalid file descriptor";
+    return false;
+  }
+
+  off_t fd_size = lseek(fd, 0, SEEK_END);
+  lseek(fd, 0, SEEK_SET);
+  if (fd_size < 0u) {
+    VPLOGF(1) << "Fail to find the size of fd";
+    return false;
+  }
+
+  if (!base::IsValueInRangeForNumericType<size_t>(fd_size)) {
+    VLOGF(1) << "fd_size is out of range of size_t"
+             << ", size=" << size
+             << ", size_t max=" << std::numeric_limits<size_t>::max()
+             << ", size_t min=" << std::numeric_limits<size_t>::min();
+    return false;
+  }
+
+  *size = static_cast<size_t>(fd_size);
+  return true;
+#else
+  NOTIMPLEMENTED();
+  return false;
+#endif  // defined(OS_LINUX)
+}
+
+bool VerifyGpuMemoryBufferHandle(media::VideoPixelFormat pixel_format,
+                                 const gfx::Size& coded_size,
+                                 const gfx::GpuMemoryBufferHandle& gmb_handle) {
+  if (gmb_handle.type != gfx::NATIVE_PIXMAP) {
+    VLOGF(1) << "Unexpected GpuMemoryBufferType: " << gmb_handle.type;
+    return false;
+  }
+#if defined(OS_LINUX)
+  const size_t num_planes = media::VideoFrame::NumPlanes(pixel_format);
+  if (num_planes != gmb_handle.native_pixmap_handle.planes.size() ||
+      num_planes == 0) {
+    VLOGF(1) << "Invalid number of dmabuf planes passed: "
+             << gmb_handle.native_pixmap_handle.planes.size()
+             << ", expected: " << num_planes;
+    return false;
+  }
+
+  // Strides monotonically decrease.
+  for (size_t i = 1; i < num_planes; i++) {
+    if (gmb_handle.native_pixmap_handle.planes[i - 1].stride <
+        gmb_handle.native_pixmap_handle.planes[i].stride) {
+      return false;
+    }
+  }
+
+  for (size_t i = 0; i < num_planes; i++) {
+    const auto& plane = gmb_handle.native_pixmap_handle.planes[i];
+    DVLOGF(4) << "Plane " << i << ", offset: " << plane.offset
+              << ", stride: " << plane.stride;
+
+    size_t file_size_in_bytes;
+    if (!plane.fd.is_valid() ||
+        !GetFileSize(plane.fd.get(), &file_size_in_bytes))
+      return false;
+
+    size_t plane_height =
+        media::VideoFrame::Rows(i, pixel_format, coded_size.height());
+    base::CheckedNumeric<size_t> min_plane_size =
+        base::CheckMul(plane.stride, plane_height);
+    if (!min_plane_size.IsValid() || min_plane_size.ValueOrDie() > plane.size) {
+      VLOGF(1) << "Invalid strides/sizes";
+      return false;
+    }
+
+    // Check |offset| + (the size of a plane) on each plane is not larger than
+    // |file_size_in_bytes|. This ensures we don't access out of a buffer
+    // referred by |fd|.
+    base::CheckedNumeric<size_t> min_buffer_size =
+        base::CheckAdd(plane.offset, plane.size);
+    if (!min_buffer_size.IsValid() ||
+        min_buffer_size.ValueOrDie() > file_size_in_bytes) {
+      VLOGF(1) << "Invalid strides/offsets";
+      return false;
+    }
+  }
+  return true;
+#else
+  NOTIMPLEMENTED();
+  return false;
+#endif  // defined(OS_LINUX)
+}
+
+}  // namespace media
diff --git a/media/gpu/buffer_validation.h b/media/gpu/buffer_validation.h
new file mode 100644
index 0000000..cf7b623
--- /dev/null
+++ b/media/gpu/buffer_validation.h
@@ -0,0 +1,27 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_GPU_BUFFER_VALIDATION_H_
+#define MEDIA_GPU_BUFFER_VALIDATION_H_
+
+#include "media/base/video_types.h"
+#include "media/gpu/media_gpu_export.h"
+
+namespace gfx {
+class Size;
+struct GpuMemoryBufferHandle;
+}  // namespace gfx
+
+namespace media {
+// Gets the file size of |fd| and writes in |size|. Returns false on failure.
+MEDIA_GPU_EXPORT bool GetFileSize(const int fd, size_t* size);
+
+// Verifies if GpuMemoryBufferHandle is valid.
+MEDIA_GPU_EXPORT bool VerifyGpuMemoryBufferHandle(
+    media::VideoPixelFormat pixel_format,
+    const gfx::Size& coded_size,
+    const gfx::GpuMemoryBufferHandle& gmb_handle);
+
+}  // namespace media
+#endif  // MEDIA_GPU_BUFFER_VALIDATION_H_
diff --git a/media/gpu/linux/platform_video_frame_pool.h b/media/gpu/linux/platform_video_frame_pool.h
index dea062c0..5cfa17a 100644
--- a/media/gpu/linux/platform_video_frame_pool.h
+++ b/media/gpu/linux/platform_video_frame_pool.h
@@ -90,10 +90,6 @@
       EXCLUSIVE_LOCKS_REQUIRED(lock_);
   bool IsExhausted_Locked() EXCLUSIVE_LOCKS_REQUIRED(lock_);
 
-  // Purges the stale frame. This method is executed periodically on
-  // |parent_task_runner_|.
-  void PurgeStaleFrames();
-
   // The function used to allocate new frames.
   const CreateFrameCB create_frame_cb_;
 
diff --git a/media/gpu/linux/platform_video_frame_utils.cc b/media/gpu/linux/platform_video_frame_utils.cc
index 4c060197..51821579 100644
--- a/media/gpu/linux/platform_video_frame_utils.cc
+++ b/media/gpu/linux/platform_video_frame_utils.cc
@@ -12,6 +12,7 @@
 #include "media/base/format_utils.h"
 #include "media/base/scopedfd_helper.h"
 #include "media/base/video_frame_layout.h"
+#include "media/gpu/buffer_validation.h"
 #include "media/gpu/macros.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 #include "ui/gfx/linux/native_pixmap_dmabuf.h"
@@ -126,7 +127,6 @@
     case VideoFrame::STORAGE_GPU_MEMORY_BUFFER:
       handle = video_frame->GetGpuMemoryBuffer()->CloneHandle();
       break;
-#if defined(OS_LINUX)
     case VideoFrame::STORAGE_DMABUFS: {
       handle.type = gfx::NATIVE_PIXMAP;
       std::vector<base::ScopedFD> duped_fds =
@@ -139,12 +139,16 @@
         handle.native_pixmap_handle.planes.emplace_back(
             plane.stride, plane.offset, plane.size, std::move(duped_fds[i]));
       }
-#endif  // defined(OS_LINUX)
     } break;
     default:
       NOTREACHED() << "Unsupported storage type: "
                    << video_frame->storage_type();
   }
+  if (!handle.is_null() && handle.type == gfx::NATIVE_PIXMAP &&
+      !VerifyGpuMemoryBufferHandle(video_frame->format(),
+                                   video_frame->coded_size(), handle)) {
+    VLOGF(1) << "Created GpuMemoryBufferHandle is invalid";
+  }
   return handle;
 }
 
diff --git a/media/gpu/test/image.cc b/media/gpu/test/image.cc
index 3a8de93e..da34a24 100644
--- a/media/gpu/test/image.cc
+++ b/media/gpu/test/image.cc
@@ -59,8 +59,8 @@
 Image::~Image() {}
 
 bool Image::Load() {
-  DCHECK(!file_path_.empty());
-  DCHECK(!IsLoaded());
+  CHECK(!file_path_.empty());
+  CHECK(!IsLoaded());
 
   ResolveTestFilePath(&file_path_);
 
diff --git a/media/gpu/test/video_frame_file_writer.cc b/media/gpu/test/video_frame_file_writer.cc
index 163a6473..1f1bd792 100644
--- a/media/gpu/test/video_frame_file_writer.cc
+++ b/media/gpu/test/video_frame_file_writer.cc
@@ -34,7 +34,7 @@
 
 VideoFrameFileWriter::~VideoFrameFileWriter() {
   base::AutoLock auto_lock(frame_writer_lock_);
-  DCHECK_EQ(0u, num_frames_writing_);
+  CHECK_EQ(0u, num_frames_writing_);
 
   frame_writer_thread_.Stop();
 }
@@ -147,7 +147,7 @@
     scoped_refptr<const VideoFrame> video_frame,
     const base::FilePath& filename) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(writer_thread_sequence_checker_);
-  DCHECK(video_frame_mapper_);
+  CHECK(video_frame_mapper_);
 
   auto mapped_frame = video_frame;
 #if defined(OS_CHROMEOS)
@@ -189,7 +189,7 @@
     scoped_refptr<const VideoFrame> video_frame,
     const base::FilePath& filename) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(writer_thread_sequence_checker_);
-  DCHECK(video_frame_mapper_);
+  CHECK(video_frame_mapper_);
 
   auto mapped_frame = video_frame;
 #if defined(OS_CHROMEOS)
diff --git a/media/gpu/test/video_frame_helpers.cc b/media/gpu/test/video_frame_helpers.cc
index 31aa838f3..a844e53 100644
--- a/media/gpu/test/video_frame_helpers.cc
+++ b/media/gpu/test/video_frame_helpers.cc
@@ -288,11 +288,11 @@
 }
 
 scoped_refptr<const VideoFrame> CreateVideoFrameFromImage(const Image& image) {
-  DCHECK(image.IsLoaded());
+  CHECK(image.IsLoaded());
   const auto format = image.PixelFormat();
   const auto& visible_size = image.Size();
   // Loaded image data must be tight.
-  DCHECK_EQ(image.DataSize(), VideoFrame::AllocationSize(format, visible_size));
+  CHECK_EQ(image.DataSize(), VideoFrame::AllocationSize(format, visible_size));
 
   // Create planes for layout. We cannot use WrapExternalData() because it
   // calls GetDefaultLayout() and it supports only a few pixel formats.
diff --git a/media/gpu/test/video_frame_validator.cc b/media/gpu/test/video_frame_validator.cc
index 7b193c4..b967a50 100644
--- a/media/gpu/test/video_frame_validator.cc
+++ b/media/gpu/test/video_frame_validator.cc
@@ -65,7 +65,7 @@
 void VideoFrameValidator::Destroy() {
   frame_validator_thread_.Stop();
   base::AutoLock auto_lock(frame_validator_lock_);
-  DCHECK_EQ(0u, num_frames_validating_);
+  CHECK_EQ(0u, num_frames_validating_);
 }
 
 std::vector<VideoFrameValidator::MismatchedFrameInfo>
diff --git a/media/gpu/test/video_player/frame_renderer_dummy.cc b/media/gpu/test/video_player/frame_renderer_dummy.cc
index 149c901..2669f644 100644
--- a/media/gpu/test/video_player/frame_renderer_dummy.cc
+++ b/media/gpu/test/video_player/frame_renderer_dummy.cc
@@ -69,7 +69,7 @@
   renderer_thread_.Stop();
 
   base::AutoLock auto_lock(renderer_lock_);
-  DCHECK(pending_frames_.empty());
+  CHECK(pending_frames_.empty());
 }
 
 bool FrameRendererDummy::AcquireGLContext() {
@@ -135,7 +135,7 @@
   // TODO(dstaessens): Remove this function when allocate mode is deprecated.
   base::Optional<VideoFrameLayout> layout =
       CreateVideoFrameLayout(pixel_format, size);
-  DCHECK(layout);
+  CHECK(layout);
   return VideoFrame::WrapExternalDataWithLayout(*layout, gfx::Rect(size), size,
                                                 nullptr, 0, base::TimeDelta());
 }
diff --git a/media/gpu/test/video_player/frame_renderer_thumbnail.cc b/media/gpu/test/video_player/frame_renderer_thumbnail.cc
index c6edff93..700411d 100644
--- a/media/gpu/test/video_player/frame_renderer_thumbnail.cc
+++ b/media/gpu/test/video_player/frame_renderer_thumbnail.cc
@@ -261,7 +261,7 @@
 
 void FrameRendererThumbnail::DestroyTask(base::WaitableEvent* done) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(renderer_sequence_checker_);
-  DCHECK(mailbox_texture_map_.empty());
+  CHECK(mailbox_texture_map_.empty());
 
   DestroyThumbnailImageTask();
 
diff --git a/media/gpu/test/video_player/test_vda_video_decoder.cc b/media/gpu/test/video_player/test_vda_video_decoder.cc
index e8bf41ba..06851df2 100644
--- a/media/gpu/test/video_player/test_vda_video_decoder.cc
+++ b/media/gpu/test/video_player/test_vda_video_decoder.cc
@@ -230,7 +230,7 @@
 
 #if BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION)
         handle = CreateGpuMemoryBufferHandle(video_frame.get());
-        DCHECK(!handle.is_null());
+        CHECK(!handle.is_null());
 #else
         NOTREACHED();
 #endif  // BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION)
@@ -305,7 +305,7 @@
         video_frame->natural_size(), video_frame->timestamp());
   }
 
-  DCHECK(wrapped_video_frame);
+  CHECK(wrapped_video_frame);
 
   // Flag that the video frame was decoded in a power efficient way.
   wrapped_video_frame->metadata()->SetBoolean(
@@ -327,7 +327,7 @@
 // Called when a picture buffer is ready to be re-used.
 void TestVDAVideoDecoder::ReusePictureBufferTask(int32_t picture_buffer_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(vda_wrapper_sequence_checker_);
-  DCHECK(decoder_);
+  CHECK(decoder_);
   DVLOGF(4) << "Picture buffer ID: " << picture_buffer_id;
 
   // Notify the decoder the picture buffer can be reused. The decoder will only
@@ -351,14 +351,14 @@
 
 void TestVDAVideoDecoder::NotifyFlushDone() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(vda_wrapper_sequence_checker_);
-  DCHECK(flush_cb_);
+  CHECK(flush_cb_);
 
   std::move(flush_cb_).Run(DecodeStatus::OK);
 }
 
 void TestVDAVideoDecoder::NotifyResetDone() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(vda_wrapper_sequence_checker_);
-  DCHECK(reset_cb_);
+  CHECK(reset_cb_);
 
   std::move(reset_cb_).Run();
 }
diff --git a/media/gpu/test/video_player/video.cc b/media/gpu/test/video_player/video.cc
index 8167820c..e99ef86 100644
--- a/media/gpu/test/video_player/video.cc
+++ b/media/gpu/test/video_player/video.cc
@@ -33,8 +33,8 @@
 bool Video::Load() {
   // TODO(dstaessens@) Investigate reusing existing infrastructure such as
   //                   DecoderBuffer.
-  DCHECK(!file_path_.empty());
-  DCHECK(data_.empty());
+  CHECK(!file_path_.empty());
+  CHECK(data_.empty());
 
   base::Optional<base::FilePath> resolved_path = ResolveFilePath(file_path_);
   if (!resolved_path) {
diff --git a/media/gpu/test/video_player/video_decoder_client.cc b/media/gpu/test/video_player/video_decoder_client.cc
index 65f38cbf..b290a07e 100644
--- a/media/gpu/test/video_player/video_decoder_client.cc
+++ b/media/gpu/test/video_player/video_decoder_client.cc
@@ -81,8 +81,8 @@
 
 bool VideoDecoderClient::CreateDecoder() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(video_player_sequence_checker_);
-  DCHECK(!decoder_client_thread_.IsRunning());
-  DCHECK(event_cb_ && frame_renderer_);
+  CHECK(!decoder_client_thread_.IsRunning());
+  CHECK(event_cb_ && frame_renderer_);
 
   if (!decoder_client_thread_.Start()) {
     VLOGF(1) << "Failed to start decoder thread";
@@ -126,7 +126,7 @@
 
 void VideoDecoderClient::Initialize(const Video* video) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(video_player_sequence_checker_);
-  DCHECK(video);
+  CHECK(video);
 
   base::WaitableEvent done;
   decoder_client_thread_.task_runner()->PostTask(
@@ -159,7 +159,7 @@
 void VideoDecoderClient::CreateDecoderTask(bool* success,
                                            base::WaitableEvent* done) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_);
-  DCHECK_EQ(decoder_client_state_, VideoDecoderClientState::kUninitialized);
+  CHECK_EQ(decoder_client_state_, VideoDecoderClientState::kUninitialized);
   LOG_ASSERT(!decoder_) << "Can't create decoder: already created";
 
   if (decoder_client_config_.use_vd) {
@@ -189,8 +189,8 @@
 void VideoDecoderClient::InitializeDecoderTask(const Video* video,
                                                base::WaitableEvent* done) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_);
-  DCHECK(decoder_client_state_ == VideoDecoderClientState::kUninitialized ||
-         decoder_client_state_ == VideoDecoderClientState::kIdle);
+  CHECK(decoder_client_state_ == VideoDecoderClientState::kUninitialized ||
+        decoder_client_state_ == VideoDecoderClientState::kIdle);
   LOG_ASSERT(decoder_) << "Can't initialize decoder: not created yet";
   LOG_ASSERT(video);
 
@@ -213,15 +213,15 @@
   decoder_->Initialize(config, false, nullptr, std::move(init_cb), output_cb,
                        WaitingCB());
 
-  DCHECK_LE(decoder_client_config_.max_outstanding_decode_requests,
-            static_cast<size_t>(decoder_->GetMaxDecodeRequests()));
+  CHECK_LE(decoder_client_config_.max_outstanding_decode_requests,
+           static_cast<size_t>(decoder_->GetMaxDecodeRequests()));
 
   done->Signal();
 }
 
 void VideoDecoderClient::DestroyDecoderTask(base::WaitableEvent* done) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_);
-  DCHECK_EQ(0u, num_outstanding_decode_requests_);
+  CHECK_EQ(0u, num_outstanding_decode_requests_);
   DVLOGF(4);
 
   // Invalidate all scheduled tasks.
@@ -324,8 +324,8 @@
 
 void VideoDecoderClient::DecoderInitializedTask(bool status) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_);
-  DCHECK(decoder_client_state_ == VideoDecoderClientState::kUninitialized ||
-         decoder_client_state_ == VideoDecoderClientState::kIdle);
+  CHECK(decoder_client_state_ == VideoDecoderClientState::kUninitialized ||
+        decoder_client_state_ == VideoDecoderClientState::kIdle);
   LOG_ASSERT(status) << "Initializing decoder failed";
 
   decoder_client_state_ = VideoDecoderClientState::kIdle;
@@ -334,7 +334,7 @@
 
 void VideoDecoderClient::DecodeDoneTask(media::DecodeStatus status) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_);
-  DCHECK_NE(VideoDecoderClientState::kIdle, decoder_client_state_);
+  CHECK_NE(VideoDecoderClientState::kIdle, decoder_client_state_);
   LOG_ASSERT(status != media::DecodeStatus::ABORTED ||
              decoder_client_state_ == VideoDecoderClientState::kResetting);
   DVLOGF(4);
@@ -366,7 +366,7 @@
 
 void VideoDecoderClient::FlushDoneTask(media::DecodeStatus status) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_);
-  DCHECK_EQ(0u, num_outstanding_decode_requests_);
+  CHECK_EQ(0u, num_outstanding_decode_requests_);
 
   // Send an EOS frame to the renderer, so it can reset any internal state it
   // might keep in preparation of the next stream of video frames.
@@ -377,7 +377,7 @@
 
 void VideoDecoderClient::ResetDoneTask() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_);
-  DCHECK_EQ(0u, num_outstanding_decode_requests_);
+  CHECK_EQ(0u, num_outstanding_decode_requests_);
 
   // We finished resetting to a different point in the stream, so we should
   // update the frame index. Currently only resetting to the start of the stream
diff --git a/media/gpu/test/video_player/video_player.cc b/media/gpu/test/video_player/video_player.cc
index e55ee1a..8438f3e 100644
--- a/media/gpu/test/video_player/video_player.cc
+++ b/media/gpu/test/video_player/video_player.cc
@@ -47,8 +47,8 @@
     std::unique_ptr<FrameRenderer> frame_renderer,
     std::vector<std::unique_ptr<VideoFrameProcessor>> frame_processors) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK_EQ(video_player_state_, VideoPlayerState::kUninitialized);
-  DCHECK(frame_renderer);
+  CHECK_EQ(video_player_state_, VideoPlayerState::kUninitialized);
+  CHECK(frame_renderer);
   DVLOGF(4);
 
   EventCallback event_cb =
@@ -66,7 +66,7 @@
 
 void VideoPlayer::Destroy() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK_NE(video_player_state_, VideoPlayerState::kDestroyed);
+  CHECK_NE(video_player_state_, VideoPlayerState::kDestroyed);
   DVLOGF(4);
 
   decoder_client_.reset();
@@ -82,9 +82,9 @@
 
 bool VideoPlayer::Initialize(const Video* video) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(video_player_state_ == VideoPlayerState::kUninitialized ||
-         video_player_state_ == VideoPlayerState::kIdle);
-  DCHECK(video);
+  CHECK(video_player_state_ == VideoPlayerState::kUninitialized ||
+        video_player_state_ == VideoPlayerState::kIdle);
+  CHECK(video);
   DVLOGF(4);
 
   decoder_client_->Initialize(video);
@@ -100,7 +100,7 @@
 
 void VideoPlayer::Play() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK_EQ(video_player_state_, VideoPlayerState::kIdle);
+  CHECK_EQ(video_player_state_, VideoPlayerState::kIdle);
   DVLOGF(4);
 
   // Play until the end of the video.
@@ -109,8 +109,8 @@
 
 void VideoPlayer::PlayUntil(VideoPlayerEvent event, size_t event_count) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK_EQ(video_player_state_, VideoPlayerState::kIdle);
-  DCHECK(video_);
+  CHECK_EQ(video_player_state_, VideoPlayerState::kIdle);
+  CHECK(video_);
   DVLOGF(4);
 
   // Start decoding the video.
@@ -156,7 +156,7 @@
 
 bool VideoPlayer::WaitForEvent(VideoPlayerEvent event, size_t times) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK_GE(times, 1u);
+  CHECK_GE(times, 1u);
   DVLOGF(4) << "Event ID: " << static_cast<size_t>(event);
 
   base::TimeDelta time_waiting;
diff --git a/media/gpu/test/video_player/video_player_test_environment.cc b/media/gpu/test/video_player/video_player_test_environment.cc
index 11715f8..c77f2be3 100644
--- a/media/gpu/test/video_player/video_player_test_environment.cc
+++ b/media/gpu/test/video_player/video_player_test_environment.cc
@@ -72,7 +72,7 @@
 #endif  // defined(OS_CHROMEOS)
 
   // VideoDecoders always require import mode to be supported.
-  DCHECK(!use_vd_ || import_supported_);
+  CHECK(!use_vd_ || import_supported_);
 }
 
 const media::test::Video* VideoPlayerTestEnvironment::Video() const {
diff --git a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc
index 64e33c7..7d4dd26b 100644
--- a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc
+++ b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.cc
@@ -1442,12 +1442,6 @@
     NOTIFY_ERROR(PLATFORM_FAILURE);
     return;
   }
-
-  // Put us in kIdle to allow further event processing.
-  // ProcessPendingEventsIfNeeded() will put us back into kDecoding after all
-  // other pending events are processed successfully.
-  state_ = kIdle;
-  ProcessPendingEventsIfNeeded();
 }
 
 void V4L2SliceVideoDecodeAccelerator::CreateGLImageFor(
@@ -1613,6 +1607,18 @@
   }
   DCHECK_EQ(gl_image_size_.width(), adjusted_coded_width);
 
+  // Put us in kIdle to allow further event processing.
+  // ProcessPendingEventsIfNeeded() will put us back into kDecoding after all
+  // other pending events are processed successfully.
+  if (state_ == kAwaitingPictureBuffers) {
+    state_ = kIdle;
+    decoder_thread_.task_runner()->PostTask(
+        FROM_HERE,
+        base::BindOnce(
+            &V4L2SliceVideoDecodeAccelerator::ProcessPendingEventsIfNeeded,
+            base::Unretained(this)));
+  }
+
   // If in import mode, build output_frame from the passed DMABUF FDs.
   if (output_mode_ == Config::OutputMode::IMPORT) {
     DCHECK_EQ(gl_image_planes_count_, passed_dmabuf_fds.size());
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
index f569a8d6..e9f2bce 100644
--- a/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.cc
@@ -399,9 +399,14 @@
       base::BindRepeating(&VaapiVideoEncodeAccelerator::RecycleVASurfaceID,
                           base::Unretained(this)));
 
+  // In native input mode, an input surface is needed only if scaling
+  // is not required. Since we cannot find the necessity of the scaling here,
+  // we allocate input surfaces always, which is redundant.
+  //
+  // TODO(hiroh): Think about moving this surface creation in the first
+  // Encode().
   va_surfaces_per_video_frame_ =
-      kNumSurfacesForOutputPicture +
-      (native_input_mode_ ? 0 : kNumSurfacesPerInputVideoFrame);
+      kNumSurfacesForOutputPicture + kNumSurfacesPerInputVideoFrame;
 
   if (!vaapi_wrapper_->CreateContextAndSurfaces(
           kVaSurfaceFormat, aligned_input_size_,
@@ -583,12 +588,46 @@
       return nullptr;
     }
   } else {
+    if (aligned_input_size_ != frame->coded_size()) {
+      NOTIFY_ERROR(kPlatformFailureError,
+                   "Expected frame size: " << aligned_input_size_.ToString()
+                                           << ", but got: "
+                                           << frame->coded_size().ToString());
+      return nullptr;
+    }
     input_surface =
         new VASurface(available_va_surface_ids_.back(), aligned_input_size_,
                       kVaSurfaceFormat, base::BindOnce(va_surface_release_cb_));
     available_va_surface_ids_.pop_back();
   }
 
+  if (aligned_input_size_ !=
+      gfx::Size(frame->stride(0), frame->coded_size().height())) {
+    // Do scaling.  Here the buffer size contained in |input_surface| is
+    // |frame->coded_size()|.
+    if (!vpp_vaapi_wrapper_) {
+      vpp_vaapi_wrapper_ =
+          VaapiWrapper::Create(VaapiWrapper::kVideoProcess, VAProfileNone,
+                               base::Bind(&ReportToUMA, VAAPI_ERROR));
+      if (!vpp_vaapi_wrapper_) {
+        NOTIFY_ERROR(kPlatformFailureError,
+                     "Failed to initialize VppVaapiWrapper");
+        return nullptr;
+      }
+    }
+    scoped_refptr<VASurface> scaled_surface =
+        new VASurface(available_va_surface_ids_.back(), aligned_input_size_,
+                      kVaSurfaceFormat, base::BindOnce(va_surface_release_cb_));
+    available_va_surface_ids_.pop_back();
+    // Scale frame->coded_size() -> |aligned_input_size_| here.
+    vpp_vaapi_wrapper_->BlitSurface(input_surface, scaled_surface);
+    // We can destroy the original |input_surface| because the buffer is alive
+    // as long as |frame| is alive.
+    input_surface = std::move(scaled_surface);
+  }
+
+  // Here, the size contained in |input_surface| is |aligned_input_size_|
+  // regardless of scaling.
   scoped_refptr<VASurface> reconstructed_surface =
       new VASurface(available_va_surface_ids_.back(), aligned_input_size_,
                     kVaSurfaceFormat, base::BindOnce(va_surface_release_cb_));
diff --git a/media/gpu/vaapi/vaapi_video_encode_accelerator.h b/media/gpu/vaapi/vaapi_video_encode_accelerator.h
index 0bc19a2f..8ba3d9d 100644
--- a/media/gpu/vaapi/vaapi_video_encode_accelerator.h
+++ b/media/gpu/vaapi/vaapi_video_encode_accelerator.h
@@ -206,6 +206,10 @@
   std::unique_ptr<base::WeakPtrFactory<Client>> client_ptr_factory_;
   base::WeakPtr<Client> client_;
 
+  // VaapiWrapper for VPP (Video Pre Processing). This is used for scale down
+  // for the picture send to vaapi encoder.
+  scoped_refptr<VaapiWrapper> vpp_vaapi_wrapper_;
+
   // WeakPtr to post from the encoder thread back to the ChildThread, as it may
   // outlive this. Posting from the ChildThread using base::Unretained(this)
   // to the encoder thread is safe, because |this| always outlives the encoder
diff --git a/media/mojo/services/mojo_video_encode_accelerator_service.cc b/media/mojo/services/mojo_video_encode_accelerator_service.cc
index 03d2d30..a8eb4ee 100644
--- a/media/mojo/services/mojo_video_encode_accelerator_service.cc
+++ b/media/mojo/services/mojo_video_encode_accelerator_service.cc
@@ -89,7 +89,8 @@
   if (!encoder_)
     return;
 
-  if (frame->coded_size() != input_coded_size_) {
+  if (frame->coded_size() != input_coded_size_ &&
+      frame->storage_type() != media::VideoFrame::STORAGE_GPU_MEMORY_BUFFER) {
     DLOG(ERROR) << __func__ << " wrong input coded size, expected "
                 << input_coded_size_.ToString() << ", got "
                 << frame->coded_size().ToString();
diff --git a/mojo/public/tools/fuzzers/fuzz.mojom b/mojo/public/tools/fuzzers/fuzz.mojom
index 53c8ac6a..c045fd3 100644
--- a/mojo/public/tools/fuzzers/fuzz.mojom
+++ b/mojo/public/tools/fuzzers/fuzz.mojom
@@ -1,3 +1,7 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
 module fuzz.mojom;
 
 [Extensible]
@@ -63,6 +67,7 @@
   Ping();
 };
 
+// A comprehensive Mojo interface used for fuzzing message dispatch and validation.
 interface FuzzInterface {
   FuzzBasic();
   FuzzBasicResp() => ();
@@ -74,5 +79,5 @@
   [Sync]
   FuzzArgsSyncResp(FuzzStruct a, FuzzStruct? b) => ();
 
-  FuzzAssociated(associated FuzzDummyInterface& request);
+  FuzzAssociated(pending_associated_receiver<FuzzDummyInterface> receiver);
 };
diff --git a/mojo/public/tools/fuzzers/fuzz_impl.cc b/mojo/public/tools/fuzzers/fuzz_impl.cc
index d3b1012..23816fd 100644
--- a/mojo/public/tools/fuzzers/fuzz_impl.cc
+++ b/mojo/public/tools/fuzzers/fuzz_impl.cc
@@ -38,8 +38,8 @@
 }
 
 void FuzzImpl::FuzzAssociated(
-    fuzz::mojom::FuzzDummyInterfaceAssociatedRequest req) {
-  associated_bindings_.AddBinding(this, std::move(req));
+    mojo::PendingAssociatedReceiver<fuzz::mojom::FuzzDummyInterface> receiver) {
+  associated_receivers_.Add(this, std::move(receiver));
 }
 
 void FuzzImpl::Ping() {}
diff --git a/mojo/public/tools/fuzzers/fuzz_impl.h b/mojo/public/tools/fuzzers/fuzz_impl.h
index d63a707..d8f7f566 100644
--- a/mojo/public/tools/fuzzers/fuzz_impl.h
+++ b/mojo/public/tools/fuzzers/fuzz_impl.h
@@ -5,8 +5,9 @@
 #ifndef MOJO_PUBLIC_TOOLS_FUZZERS_FUZZ_IMPL_H_
 #define MOJO_PUBLIC_TOOLS_FUZZERS_FUZZ_IMPL_H_
 
-#include "mojo/public/cpp/bindings/associated_binding_set.h"
+#include "mojo/public/cpp/bindings/associated_receiver_set.h"
 #include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
 #include "mojo/public/tools/fuzzers/fuzz.mojom.h"
 
 class FuzzImpl : public fuzz::mojom::FuzzInterface,
@@ -30,7 +31,8 @@
                         FuzzArgsSyncRespCallback callback) override;
 
   void FuzzAssociated(
-      fuzz::mojom::FuzzDummyInterfaceAssociatedRequest req) override;
+      mojo::PendingAssociatedReceiver<fuzz::mojom::FuzzDummyInterface> receiver)
+      override;
 
   // fuzz::mojom::FuzzDummyInterface:
   void Ping() override;
@@ -39,7 +41,7 @@
   mojo::Binding<FuzzInterface> binding_;
 
  private:
-  mojo::AssociatedBindingSet<FuzzDummyInterface> associated_bindings_;
+  mojo::AssociatedReceiverSet<FuzzDummyInterface> associated_receivers_;
 };
 
 #endif  // MOJO_PUBLIC_TOOLS_FUZZERS_FUZZ_IMPL_H_
diff --git a/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc b/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc
index 412ec5a..5981b6d 100644
--- a/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc
+++ b/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc
@@ -13,6 +13,7 @@
 #include "base/task/single_thread_task_executor.h"
 #include "base/task/thread_pool/thread_pool_instance.h"
 #include "mojo/core/embedder/embedder.h"
+#include "mojo/public/cpp/bindings/associated_remote.h"
 #include "mojo/public/tools/fuzzers/fuzz.mojom.h"
 #include "mojo/public/tools/fuzzers/fuzz_impl.h"
 
@@ -225,7 +226,7 @@
  * supplied directory. */
 void DumpMessages(std::string output_directory) {
   fuzz::mojom::FuzzInterfacePtr fuzz;
-  fuzz::mojom::FuzzDummyInterfaceAssociatedPtr dummy;
+  mojo::AssociatedRemote<fuzz::mojom::FuzzDummyInterface> dummy;
 
   /* Create the impl and add a MessageDumper to the filter chain. */
   env->impl = std::make_unique<FuzzImpl>(MakeRequest(&fuzz));
@@ -247,7 +248,7 @@
                          GetPopulatedFuzzStruct(), base::Bind(FuzzCallback));
   fuzz->FuzzArgsSyncResp(fuzz::mojom::FuzzStruct::New(),
                          GetPopulatedFuzzStruct(), base::Bind(FuzzCallback));
-  fuzz->FuzzAssociated(MakeRequest(&dummy));
+  fuzz->FuzzAssociated(dummy.BindNewEndpointAndPassReceiver());
   dummy->Ping();
 }
 
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc
index 86e25a6..ee9b0b3 100644
--- a/net/dns/host_resolver_manager.cc
+++ b/net/dns/host_resolver_manager.cc
@@ -951,10 +951,10 @@
                                    const HostCache::Entry& results,
                                    bool secure) = 0;
 
-    // Called when the first of two jobs succeeds.  If the first completed
-    // transaction fails, this is not called.  Also not called when the DnsTask
-    // only needs to run one transaction.
-    virtual void OnFirstDnsTransactionComplete() = 0;
+    // Called when a job succeeds and there are more transactions needed.  If
+    // the current completed transaction fails, this is not called.  Also not
+    // called when the DnsTask only needs to run one transaction.
+    virtual void OnIntermediateTransactionComplete() = 0;
 
     virtual RequestPriority priority() const = 0;
 
@@ -974,7 +974,6 @@
           const base::TickClock* tick_clock)
       : client_(client),
         hostname_(hostname),
-        query_type_(query_type),
         request_context_(request_context),
         secure_(secure),
         secure_dns_mode_(secure_dns_mode),
@@ -989,34 +988,39 @@
     else
       DCHECK(client_->CanUseInsecureDnsTransactions());
 
+    if (query_type != DnsQueryType::UNSPECIFIED) {
+      transactions_needed_.push(query_type);
+    } else {
+      transactions_needed_.push(DnsQueryType::A);
+      transactions_needed_.push(DnsQueryType::AAAA);
+    }
+    num_needed_transactions_ = transactions_needed_.size();
+
     DCHECK(delegate_);
   }
 
-  bool needs_two_transactions() const {
-    return query_type_ == DnsQueryType::UNSPECIFIED;
-  }
+  // The number of transactions required for the specified query type. Does not
+  // change as transactions are completed.
+  int num_needed_transactions() const { return num_needed_transactions_; }
 
   bool needs_another_transaction() const {
-    return needs_two_transactions() && !transaction2_;
+    return !transactions_needed_.empty();
   }
 
   bool secure() const { return secure_; }
 
-  void StartFirstTransaction() {
-    DCHECK_EQ(0u, num_completed_transactions_);
-    DCHECK(!transaction1_);
-
-    net_log_.BeginEvent(NetLogEventType::HOST_RESOLVER_IMPL_DNS_TASK);
-    transaction1_ = CreateTransaction(query_type_ == DnsQueryType::UNSPECIFIED
-                                          ? DnsQueryType::A
-                                          : query_type_);
-    transaction1_->Start();
-  }
-
-  void StartSecondTransaction() {
+  void StartNextTransaction() {
     DCHECK(needs_another_transaction());
-    transaction2_ = CreateTransaction(DnsQueryType::AAAA);
-    transaction2_->Start();
+
+    if (transactions_started_.empty())
+      net_log_.BeginEvent(NetLogEventType::HOST_RESOLVER_IMPL_DNS_TASK);
+
+    DnsQueryType type = transactions_needed_.front();
+    transactions_needed_.pop();
+
+    std::unique_ptr<DnsTransaction> transaction = CreateTransaction(type);
+    transaction->Start();
+    transactions_started_.insert(std::move(transaction));
   }
 
  private:
@@ -1082,8 +1086,8 @@
 
     // Merge results with saved results from previous transactions.
     if (saved_results_) {
-      DCHECK(needs_two_transactions());
-      DCHECK_GE(1u, num_completed_transactions_);
+      DCHECK_LE(2, num_needed_transactions());
+      DCHECK_LT(num_completed_transactions_, num_needed_transactions());
 
       switch (dns_query_type) {
         case DnsQueryType::A:
@@ -1107,9 +1111,9 @@
     // If not all transactions are complete, the task cannot yet be completed
     // and the results so far must be saved to merge with additional results.
     ++num_completed_transactions_;
-    if (needs_two_transactions() && num_completed_transactions_ == 1) {
+    if (num_completed_transactions_ < num_needed_transactions()) {
       saved_results_ = std::move(results);
-      delegate_->OnFirstDnsTransactionComplete();
+      delegate_->OnIntermediateTransactionComplete();
       return;
     }
 
@@ -1390,7 +1394,6 @@
 
   DnsClient* client_;
   std::string hostname_;
-  const DnsQueryType query_type_;
   URLRequestContext* const request_context_;
 
   // Whether lookups in this DnsTask should occur using DoH or plaintext.
@@ -1401,10 +1404,10 @@
   Delegate* delegate_;
   const NetLogWithSource net_log_;
 
-  std::unique_ptr<DnsTransaction> transaction1_;
-  std::unique_ptr<DnsTransaction> transaction2_;
-
-  unsigned num_completed_transactions_;
+  base::queue<DnsQueryType> transactions_needed_;
+  base::flat_set<std::unique_ptr<DnsTransaction>> transactions_started_;
+  int num_needed_transactions_;
+  int num_completed_transactions_;
 
   // Result from previously completed transactions. Only set if a transaction
   // has completed while others are still in progress.
@@ -1776,18 +1779,21 @@
 
   void KillDnsTask() {
     if (dns_task_) {
-      if (dispatcher_)
-        ReduceToOneJobSlot();
+      if (dispatcher_) {
+        while (num_occupied_job_slots_ > 1 || is_queued()) {
+          ReduceByOneJobSlot();
+        }
+      }
       dns_task_.reset();
     }
   }
 
-  // Reduce the number of job slots occupied and queued in the dispatcher
-  // to one. If the second Job slot is queued in the dispatcher, cancels the
-  // queued job. Otherwise, the second Job has been started by the
-  // PrioritizedDispatcher, so signals it is complete.
-  void ReduceToOneJobSlot() {
-    DCHECK_GE(num_occupied_job_slots_, 1u);
+  // Reduce the number of job slots occupied and queued in the dispatcher by
+  // one. If the next Job slot is queued in the dispatcher, cancels the queued
+  // job. Otherwise, the next Job has been started by the PrioritizedDispatcher,
+  // so signals it is complete.
+  void ReduceByOneJobSlot() {
+    DCHECK_GE(num_occupied_job_slots_, 1);
     DCHECK(dispatcher_);
     if (is_queued()) {
       dispatcher_->Cancel(handle_);
@@ -1795,8 +1801,9 @@
     } else if (num_occupied_job_slots_ > 1) {
       dispatcher_->OnJobFinished();
       --num_occupied_job_slots_;
+    } else {
+      NOTREACHED();
     }
-    DCHECK_EQ(1u, num_occupied_job_slots_);
   }
 
   void UpdatePriority() {
@@ -1806,13 +1813,19 @@
 
   // PriorityDispatch::Job:
   void Start() override {
-    DCHECK_LE(num_occupied_job_slots_, 1u);
-
     handle_.Reset();
     ++num_occupied_job_slots_;
 
-    if (num_occupied_job_slots_ == 2) {
-      StartSecondDnsTransaction();
+    if (num_occupied_job_slots_ >= 2) {
+      if (!dns_task_) {
+        dispatcher_->OnJobFinished();
+        return;
+      }
+      DCHECK(dns_task_);
+      StartNextDnsTransaction();
+      if (dns_task_->needs_another_transaction()) {
+        Schedule(true);
+      }
       return;
     }
 
@@ -1828,7 +1841,7 @@
   // PrioritizedDispatcher with tighter limits.
   void StartProcTask() {
     DCHECK(dispatcher_);
-    DCHECK_EQ(1u, num_occupied_job_slots_);
+    DCHECK_EQ(1, num_occupied_job_slots_);
     DCHECK(IsAddressType(query_type_));
 
     proc_task_ = std::make_unique<ProcTask>(
@@ -1897,30 +1910,30 @@
 
   void StartDnsTask(bool secure) {
     DCHECK_EQ(secure, !dispatcher_);
-    DCHECK_EQ(dispatcher_ ? 1u : 0, num_occupied_job_slots_);
+    DCHECK_EQ(dispatcher_ ? 1 : 0, num_occupied_job_slots_);
     DCHECK(!resolver_->HaveTestProcOverride());
     // Need to create the task even if we're going to post a failure instead of
     // running it, as a "started" job needs a task to be properly cleaned up.
     dns_task_.reset(new DnsTask(resolver_->dns_client_.get(), hostname_,
                                 query_type_, request_context_, secure,
                                 secure_dns_mode_, this, net_log_, tick_clock_));
-    dns_task_->StartFirstTransaction();
+    dns_task_->StartNextTransaction();
     // Schedule a second transaction, if needed. DoH queries can bypass the
-    // dispatcher and start immediately.
-    if (dns_task_->needs_two_transactions()) {
-      if (secure)
-        dns_task_->StartSecondTransaction();
-      else
-        Schedule(true);
+    // dispatcher and start all of their transactions immediately.
+    if (secure) {
+      while (dns_task_->needs_another_transaction())
+        dns_task_->StartNextTransaction();
+    } else if (dns_task_->needs_another_transaction()) {
+      Schedule(true);
     }
   }
 
-  void StartSecondDnsTransaction() {
+  void StartNextDnsTransaction() {
     DCHECK_EQ(dns_task_->secure(), !dispatcher_);
     DCHECK(!dispatcher_ || num_occupied_job_slots_ >= 1);
     DCHECK(dns_task_);
-    DCHECK(dns_task_->needs_two_transactions());
-    dns_task_->StartSecondTransaction();
+    DCHECK(dns_task_->needs_another_transaction());
+    dns_task_->StartNextTransaction();
   }
 
   // Called if DnsTask fails. It is posted from StartDnsTask, so Job may be
@@ -2004,18 +2017,28 @@
     CompleteRequests(results, bounded_ttl, true /* allow_cache */, secure);
   }
 
-  void OnFirstDnsTransactionComplete() override {
-    DCHECK(dns_task_->needs_two_transactions());
+  void OnIntermediateTransactionComplete() override {
+    DCHECK_LE(2, dns_task_->num_needed_transactions());
     DCHECK_EQ(dns_task_->needs_another_transaction(), is_queued());
-    // No longer need to occupy two dispatcher slots.
-    if (dispatcher_)
-      ReduceToOneJobSlot();
 
-    // We already have a job slot at the dispatcher, so if the second
-    // transaction hasn't started, reuse it now instead of waiting in the queue
-    // for the second slot.
-    if (dns_task_->needs_another_transaction())
-      dns_task_->StartSecondTransaction();
+    if (dispatcher_) {
+      // We already have a job slot at the dispatcher, so if the next
+      // transaction hasn't started, reuse it now instead of waiting in the
+      // queue for another slot.
+      if (!dns_task_->needs_another_transaction()) {
+        // The DnsTask has no more transactions, so we can relinquish this slot.
+        DCHECK(!is_queued());
+        ReduceByOneJobSlot();
+      } else {
+        dns_task_->StartNextTransaction();
+        if (!dns_task_->needs_another_transaction() && is_queued()) {
+          dispatcher_->Cancel(handle_);
+          handle_.Reset();
+        }
+      }
+    } else if (dns_task_->needs_another_transaction()) {
+      dns_task_->StartNextTransaction();
+    }
   }
 
   void StartMdnsTask() {
@@ -2189,7 +2212,7 @@
 
       if (dispatcher_) {
         // Signal dispatcher that a slot has opened.
-        DCHECK_EQ(1u, num_occupied_job_slots_);
+        DCHECK_EQ(1, num_occupied_job_slots_);
         dispatcher_->OnJobFinished();
       }
     } else if (is_queued()) {
@@ -2314,7 +2337,7 @@
 
   // Number of slots occupied by this Job in |dispatcher_|. Should be 0 when
   // the job is not registered with any dispatcher.
-  unsigned num_occupied_job_slots_;
+  int num_occupied_job_slots_;
 
   // The dispatcher with which this Job is currently registered. Is nullptr if
   // not registered with any dispatcher.
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json
index ab836bf..fa00348 100644
--- a/net/http/transport_security_state_static.json
+++ b/net/http/transport_security_state_static.json
@@ -5727,7 +5727,6 @@
     { "name": "detoxsinutritie.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "deuxsolutions.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "devopsconnected.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "diegerbers.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dighans.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "digitalnonplus.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dipconsultants.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -5806,7 +5805,6 @@
     { "name": "fikt.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "finfev.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "firebird.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "fireorbit.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fischers.cc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "flamingkeys.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "flocktofedora.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -5820,7 +5818,6 @@
     { "name": "fritzrepair.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "frly.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "frogatto.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "frontmin.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "funderburg.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "furry.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "futuretechnologi.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6285,7 +6282,6 @@
     { "name": "septakkordeon.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "seq.tf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "serverco.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "servercode.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sharepic.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shaunwheelhou.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shibe.club", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6331,7 +6327,6 @@
     { "name": "stefanovski.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sternplastic.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "stoianlawfirm.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "storefrontify.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "strobeto.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "studenttravel.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "studyhub.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6407,7 +6402,6 @@
     { "name": "tsumi.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tty.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tuvalie.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "ty2u.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "uat-activesg.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ukrgadget.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "unexpected.nu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6872,7 +6866,6 @@
     { "name": "noop.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "noxlogic.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nsweb.solutions", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "nutrienti.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nyyu.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "obsydian.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "oceandns.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -8268,7 +8261,6 @@
     { "name": "arlen.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "arnesolutions.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "arrowgrove.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "artisanhd.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "artistnetwork.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "arubasunsetbeach.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "arvid.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -8603,7 +8595,6 @@
     { "name": "datenreiter.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "david-corry.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "davidgouveia.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "davidhunter.scot", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dccoffeeproducts.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dckd.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dcmt.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -10640,7 +10631,6 @@
     { "name": "bunaken.asia", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "canadianchristianity.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cablemod.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "buildsaver.co.za", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "caps.is", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "casovi.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "catarsisvr.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -11643,7 +11633,6 @@
     { "name": "bchep.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "befundup.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "besixdouze.world", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "binaryfigments.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "binderapp.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "biophysik-ssl.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bitfasching.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -13098,7 +13087,6 @@
     { "name": "kuschku.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kwok.tv", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kyliehunt.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "kyy.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kzjnet.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "l2guru.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "la-cave-a-nodo.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -14066,7 +14054,6 @@
     { "name": "berasavocate.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "anastasia-shamara.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bettertest.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "benjaminjurke.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "aymericlagier.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "borderlinegroup.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "awaremi-tai.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -14142,7 +14129,6 @@
     { "name": "biteoftech.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "budger.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "buffaloautomation.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "bytesunlimited.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cheazey.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bueltge.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "businessimmigration-eu.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -14263,7 +14249,6 @@
     { "name": "darkcores.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "danielkoster.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cvtparking.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "dataskydd.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "conflux.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "brain-e.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "danielhochleitner.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -14360,7 +14345,6 @@
     { "name": "eam-gmbh.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "connect.dating", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ecos-ev.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "eimanavicius.lt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dhome.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ericisaweso.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "entourneebeetle.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -15970,7 +15954,6 @@
     { "name": "ebiografias.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dronexpertos.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "doyoulyft.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "craigbates.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dwtm.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "eduard-dopler.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "eglek.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -17065,7 +17048,6 @@
     { "name": "andymoore.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "anivar.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "amphibo.ly", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "amsportuk.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "armandsdiscount.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "alrait.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "agatheetraphael.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -17954,7 +17936,6 @@
     { "name": "isthefieldcontrolsystemdown.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "integralblue.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jackrusselterrier.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "irmtrudjurke.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "internaldh.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ikulist.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "it-fernau.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -18106,7 +18087,6 @@
     { "name": "laureltv.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lampegiganten.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lapolla.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "late.am", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "gorf.club", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "krizevackapajdasija.hr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kontakthuman.hu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -18761,7 +18741,6 @@
     { "name": "socialprize.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sikevux.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sh-heppelmann.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "shishkin.link", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sifreuret.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "snowplane.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "seogeek.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -21474,7 +21453,6 @@
     { "name": "treatprostatewithhifu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tulsameetingroom.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ugo.ninja", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "timeauction.hk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tremoureux.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "topanlage.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ultimate-garcinia-plus.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22154,7 +22132,6 @@
     { "name": "inceptionradionetwork.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "infinitioflynnwoodparts.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "infopagina.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "informaticapremium.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "inglesnarede.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "inobun.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "internetaanbieders.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22788,7 +22765,6 @@
     { "name": "21x9.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "24-7.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "256k.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "25reinyan25.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "2c-b.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "2c-d.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "2c-e.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -23839,7 +23815,6 @@
     { "name": "facealacrise.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "facesnf.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fairviewmotel-simcoe.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "falkhusemann.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "falkus.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fame-agency.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "familyreal.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -23928,7 +23903,6 @@
     { "name": "fossgruppen.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fotostravestisbr.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fourwheelpartloanssimple.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "foxquill.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fr33tux.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fragilesolar.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "franchini.email", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -25443,7 +25417,6 @@
     { "name": "rijnmondeg.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rile5.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rimcountrymuseum.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "rioshop.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "risingsun.red", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rivaforum.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "riversideradio.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -25887,7 +25860,6 @@
     { "name": "theblackknightsings.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thebte.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thecarolingconnection.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "thecloudrevolution.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thedrinks.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "theeducationdirectory.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "theelitebuzz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -26750,7 +26722,6 @@
     { "name": "bikerebel.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bobkoetsier.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bjtxl.cn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "bookingready.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bookmakersfreebets.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bitwrought.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bnin.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -32358,7 +32329,6 @@
     { "name": "viladochurrasco.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "visitkangaroovalley.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vitra-vcare.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "vividlumen.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vwsoft.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "webbx.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "webless.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -32424,7 +32394,6 @@
     { "name": "atelierssud.swiss", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "august.black", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "autozane.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "avidcruiser.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "aviv.nyc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ayatk.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "badai.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -32796,7 +32765,6 @@
     { "name": "renascentia.asia", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "report-incident.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "restoruns.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "rivercruiseadvisor.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "robinflikkema.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "roeldevries.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rosesciences.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -33859,7 +33827,6 @@
     { "name": "juergenspecht.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "juliaoantiguidades.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "juniperroots.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "jurke.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "justbelieverecovery.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "justzz.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "juventusmania1897.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -35187,7 +35154,6 @@
     { "name": "qualtrics.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "quasarelectronics.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ra.co.ke", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "rabotaescort.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "radicaloptimism.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ratebridge.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "real-digital.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -36402,7 +36368,6 @@
     { "name": "novecity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oakparkelectrical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "obud.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ocsr.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "octothorpe.ninja", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "officefundays.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ogrodywstudniach.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -38739,8 +38704,6 @@
     { "name": "alibababee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allenosgood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allenscaravans.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "allgrass.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "allgrass.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allgreenturf.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allincoin.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alljamin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40802,7 +40765,6 @@
     { "name": "joefixit.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "johansf.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jollygoodspudz.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jondowdle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jrabasco.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jsbevents.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jsblights.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40904,7 +40866,6 @@
     { "name": "mycuco.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mydentalplan.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mydna.bio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "myotopie.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myperfecthome.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myrewardspoints.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myvitalhealthsolutions.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -48990,7 +48951,6 @@
     { "name": "ibwc.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "icake.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ignitedlocal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "incigma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "incompliance.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inevitavelbrasil.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infosimmo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -49418,7 +49378,6 @@
     { "name": "distillery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diytechguides.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dmcglobaltravel.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dmitry.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dnlr.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dnscrypt.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doceamoraviverbem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -51565,7 +51524,6 @@
     { "name": "usweme.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "utterberry.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uw1008.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "uxp-it.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uziregister.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "valcardiesel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "valentin.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -52084,7 +52042,6 @@
     { "name": "plutiedev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pmheart.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "politicachubut.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "polska-robota.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "potzwonen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "poundwholesale.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "powerplaywashers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53477,7 +53434,6 @@
     { "name": "sellorbuy.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "semdynamics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sennase.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "seohouston.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sexymassageoil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sfaparish.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sgs-systems.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -56440,7 +56396,6 @@
     { "name": "sgs.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shadowping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shampoo63.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "shattered-souls.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shippercenter.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "showersnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shtaketniki.kz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -56656,7 +56611,6 @@
     { "name": "wba.or.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wcrca.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wcsi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "web-thinker.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webnetforce.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webstart.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wedg.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -57024,7 +56978,6 @@
     { "name": "corscanplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "couplay.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coworking-luzern.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cpap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cpgarmor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cpsq.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crackers4cheese.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -60018,13 +59971,11 @@
     { "name": "estefan.dyndns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "estonia.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eternalflame.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ethanchin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eurorecambios24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "exadime.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "explorebigideas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "expmind.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "express1040.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "eyejobs.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "facai666.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "facai888.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "facarospauls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -61713,11 +61664,6 @@
     { "name": "blogit.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "briograce.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buck-hydro.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "burakogun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "burakogun.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "burakogun.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "burakogun.net.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "burakogun.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "burzum.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cabanactf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "camping-le-pasquier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -61763,7 +61709,6 @@
     { "name": "dpsg-hohenlinden.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drros.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dubstep.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "e-webos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eallion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eblog.ink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "educacionvirtual.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -62898,7 +62843,6 @@
     { "name": "cycledownunder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cynicaloptimist.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "daddyfinger.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dan-nixon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "daniel-milnes.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "daniel.domains", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "daop.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -63666,7 +63610,6 @@
     { "name": "yuvaindia.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zeiw.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zhl123.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zinglix.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zocial.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zoptiks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0xff.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -64879,7 +64822,6 @@
     { "name": "danieljball.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dansaunders.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "davidzeegers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dawgtag.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dazzit.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deavel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deavel.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65327,7 +65269,6 @@
     { "name": "apunkt.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aquaterm72.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arctic.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ardia.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arena-lemgo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arjanenthijs.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "artofhomeorganizing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65366,7 +65307,6 @@
     { "name": "berlin-cuisine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "betor.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bevedo.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bewished.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beyerm.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beyondordinarylife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bfkcloud.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65785,7 +65725,6 @@
     { "name": "ks5000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks88.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ksoc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kumbayops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kumpulannamabayi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kunvn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kupferschmids.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66572,7 +66511,6 @@
     { "name": "gobytedesign.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goldsteinlawgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grabatt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "grandworldnghiduong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hapimiennam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "happychungus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "harms.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66655,7 +66593,6 @@
     { "name": "mindofmedia.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mistine.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mistine.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mobasuite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mobydog.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moneylance.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mongolie.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -67242,7 +67179,6 @@
     { "name": "k819.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaioken.bar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kandofu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kevinschreuder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kiczela.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kjfaudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "klev.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -67298,7 +67234,6 @@
     { "name": "mhurologytriad.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "midi-ctes.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mikemooresales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "miniwolke.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minmaxgame.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mistinecn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mm4447761.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70095,7 +70030,6 @@
     { "name": "werkenbijsherpa.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wervingenselectieamsterdam.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wikibuy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "winterparkphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "workingon.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wowin58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wowin88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70675,7 +70609,6 @@
     { "name": "acceptancerecoverycenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "activephoto.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "adrian2023.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "advancedpestspecialists.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag600.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ag978.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70807,7 +70740,6 @@
     { "name": "giaoxudongtri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "glexia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gobiz.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "goldenhostmyanmar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gordyf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "habbstars.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hallaminternet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70831,7 +70763,6 @@
     { "name": "idealize.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ilc666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ime-a-tolerancia-eredmenye.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "imedia.com.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "imediamyanmar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "imediasingapore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "immivest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70902,7 +70833,6 @@
     { "name": "k8dc17.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "k8md01.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "k8md12.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kebhanamyanmar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kf-59.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kf0000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kf388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -70993,7 +70923,6 @@
     { "name": "noop.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "notablepeeps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "o98.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "okmyanmartravels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ommcitalflex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onetwosweetatelier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "orchardnh.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72097,7 +72026,6 @@
     { "name": "ender.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enter.eco", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ergonova.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "erodvd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "est-keyman.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "etaxigraz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eternalparking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72635,24 +72563,6 @@
     { "name": "8230d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8809ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8830ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "886666z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "88btt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "918ddk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "918ui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72697,7 +72607,6 @@
     { "name": "athens-limousines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "autocadperfmon.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aviasalon.spb.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bandeiraimoveisitu.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bankapp.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bazqux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72719,7 +72628,6 @@
     { "name": "btt6262a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buysoft.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "byfeldt.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "c886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cadastroloteamento.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "calendriergn.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "careerdirectionsltd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72856,7 +72764,6 @@
     { "name": "jeroendev.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jigsawplanet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "josegdigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "k886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kanis.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kartikmohta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kashbet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72945,7 +72852,6 @@
     { "name": "mrnathanpowell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mysasiedzi.bialystok.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myunicornshops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nclf.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "negativeentropy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "negocios-imatore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72985,7 +72891,6 @@
     { "name": "pro-clean.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "profession.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pvpheroes.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "q886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qttransformation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quantumcrypto.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "raydolap.web.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73003,7 +72908,6 @@
     { "name": "rt1314.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rupostel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ryanfamily.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "s886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "safarimasaimara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saletzki.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "samandej.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73062,7 +72966,6 @@
     { "name": "tuzagtcs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "twoguyswhoblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tytocare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "u886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uboratz.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uix.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ultrasdesign.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73113,18 +73016,9 @@
     { "name": "xtremecoatingtechnologies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xyloefarmoges.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y0bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y1992.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y2212.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y2232.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y2242.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y2252.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y2272.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y2bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y3343.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y3353.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y3bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y4bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y5545.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y5bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y6bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y7bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73417,7 +73311,6 @@
     { "name": "buhex.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "burbankdental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "calbertsen.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "californialemonlaw.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "canavilage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "capillary.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cargoguard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73585,7 +73478,6 @@
     { "name": "kb8892.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kb9494.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kb957.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kidonng.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kieskundig.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kimkhisaigon.com.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kinderopvangthuis.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73930,11 +73822,7 @@
     { "name": "0123456789365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0138365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0139365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "0165365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "0175365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "0185365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "018663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "0195365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "038456.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "038663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0393ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73942,11 +73830,6 @@
     { "name": "0393hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0393ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "03region.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "040552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "041552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "042552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "046552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "049552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "050.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "050a1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "050a2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73954,8 +73837,6 @@
     { "name": "050a4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "050a5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "050a6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "051552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "054552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "065l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0681a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0681b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73981,15 +73862,11 @@
     { "name": "0681x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0681y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0681z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "068552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "068663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "071552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0737399.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "078663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "083832.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "084552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "085851.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "1004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "100pudov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "100visits.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "107996.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74006,31 +73883,8 @@
     { "name": "123456789365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "123seo.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "12n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "131365a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "131365aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "131365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "131365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "131365d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "131365e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "131365ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "131365f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "131365g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "131365h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "131365i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "131365j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "131365ll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "131365qq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "142552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "146552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "146773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "148663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "1517598.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "1517668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "1517669.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "1517883.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "1517886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "1517889.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "154552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "16-qw.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "16qw.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "16region.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74075,8 +73929,6 @@
     { "name": "2288bet.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "22b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "23454048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "241552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "242552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "246773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2484811.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "24848168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74137,7 +73989,6 @@
     { "name": "2evip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2kvn.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2lovebirdsblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3006789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "30n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "317811111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74181,7 +74032,6 @@
     { "name": "3178ww.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3178xx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3178yy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3265623.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "333b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3344985.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "335a.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74189,7 +74039,6 @@
     { "name": "33n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "348663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "351365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3539783.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "360365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "36588801.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "365888012.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74216,18 +74065,6 @@
     { "name": "3659867.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3659980.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "365b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "365eib.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "365eif.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "365eil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "365eiq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "365eis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "365eiv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "365eiw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "365nnn.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "365nnnn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "365r.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "365rr.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "365xxx.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "365y0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "365y00.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "365y1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74246,7 +74083,6 @@
     { "name": "365y99.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "365ypw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "365zg.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "365zzz.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "37987.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "380111000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "380111111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74258,7 +74094,6 @@
     { "name": "380111777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "380111888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3809955.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "382228.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3837b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3837c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3837d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74284,7 +74119,6 @@
     { "name": "3837y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3837z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "38irkutsk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "391231.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "392365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3957b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3957c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74336,7 +74170,6 @@
     { "name": "3w-solutions.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4001365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4002365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4025360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4025361.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4025362.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74412,15 +74245,6 @@
     { "name": "40n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "416365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "418663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4233330.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4233331.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4233332.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4233334.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4233335.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4233336.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4233337.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4233338.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "4233339.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "426773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4345.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "436773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74433,13 +74257,11 @@
     { "name": "458663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "476773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "486773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "497552.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "498663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4best.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4dillusion.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4evip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4tgw34.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "500wordessay.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5017503.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5055990.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74484,55 +74306,11 @@
     { "name": "55ks.app", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "55n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "56784048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5898657.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "59759vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "59759z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981611.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981622.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981644.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981655.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981667.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981669.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981677.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981699.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981811.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981822.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981833.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5981844.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981855.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981866.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981877.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981918.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5981h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5981m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981y.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "59859h.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "59859j.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "59859k.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74542,10 +74320,7 @@
     { "name": "598877.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "59rus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5ilg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "6004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "60n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "611121.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "611125.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "611165.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "611195.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "616675.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74614,7 +74389,6 @@
     { "name": "6396hhh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "6396iii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "6396jjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "657843.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "66321aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "66321bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "66321cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74681,21 +74455,13 @@
     { "name": "67894048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "67y7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "6863070.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "7004233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "70365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "70n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "71365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "733575.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "73365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "74365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "755204.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "755243.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "755245.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "755246.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "755249.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "755274.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "755284.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "755294.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "755a.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "76365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "769k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74846,16 +74612,12 @@
     { "name": "940365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "946773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "96002.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "961705.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "96678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "966ty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "97736.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "97737.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "97738.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "97739.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "9836952.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "988316.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "9977432.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9988551.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9988959.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "99994048.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75041,19 +74803,7 @@
     { "name": "b1111.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b3333.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b36510.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b36512.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b36513.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b36516.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b36517.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b36518.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b36519.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b36520.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b365cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b365ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b365h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b365k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b538.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b58365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b58app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b58appb58app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75082,10 +74832,6 @@
     { "name": "b83ii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b83jj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b83kk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b88aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b88cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b88dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b88ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b89ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b89gg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b89hh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75846,7 +75592,6 @@
     { "name": "hyhy98.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "i30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "i365365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "i36588.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "i51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "i7sas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iamwill.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76033,7 +75778,6 @@
     { "name": "kylie-pomada.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kyrylych.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "l30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "l3l365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "la-paco.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "labandadelamente.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lablnet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76334,7 +76078,6 @@
     { "name": "omretreats.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "one-news.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onlineautodealered.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "onurerhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ooo-santal.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "operanavigation.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "opncld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77083,21 +76826,12 @@
     { "name": "v55510.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v55520.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v55530.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v55565.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v55569.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v55580.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v55590.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v55593.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v55v55.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v6021.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v6170.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v6350.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v637.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v6506.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v66233.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v66255.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v66557.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v66615.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v66618.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v66619.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v66629.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77108,14 +76842,9 @@
     { "name": "v700a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v700b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v88299.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v88511.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v88559.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v88656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v88799.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v9285.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v9286.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v9289.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v9812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v9820.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v9821.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v9823.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77326,30 +77055,6 @@
     { "name": "xucha.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xx6396.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y09a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09app.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09f.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09q.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "y09x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y30365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y3650.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y36500.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77548,9 +77253,6 @@
     { "name": "zsoltbereczki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zumberak.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zverskij-site.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zzzz365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "015ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "031ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "050ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "05am8.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1080.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77583,7 +77285,6 @@
     { "name": "52062z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5536z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5539z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5981688.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "5goglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "65131a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "65131c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77716,7 +77417,6 @@
     { "name": "agaveandpine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agks02.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agrodronechile.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "agweili.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aimare-web.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "airmash.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ajaxtime.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77804,7 +77504,6 @@
     { "name": "b70661.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b70663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b70664.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b70665.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b70771.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b70772.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b70773.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -78217,7 +77916,6 @@
     { "name": "inlt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "innovationgarage.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "input.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "inspiringfuture.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "integ.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "integsystem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "interminsk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -78309,8 +78007,6 @@
     { "name": "krossakorven.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "krovatka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks015.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ks05.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ks19.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks410.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kudinilam.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kulthist.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -78568,14 +78264,6 @@
     { "name": "myresidence.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myreviews.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mystore24.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888-qieji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888388.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888599.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888677.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888699.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n88890.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888duchang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888go.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "n888ok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nadjabenaissa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nadoske.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79297,7 +78985,6 @@
     { "name": "w668899.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w668989.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w66hao.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "w6808.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w682w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w6863.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w7355.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79323,7 +79010,6 @@
     { "name": "websiteguider.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "websitemarketers.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webtaxi.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "weili.bet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weili1111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weili1120.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weili1121.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79331,7 +79017,6 @@
     { "name": "weili1123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weili1127.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weili1128.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "weili8888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weili88888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weilibet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weilibet.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79350,7 +79035,6 @@
     { "name": "wiskundeonderzoek.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wispmaeksmusic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wl.bet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wl511.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wl970.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wl971.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wl972.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79807,7 +79491,6 @@
     { "name": "dogandoganay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "domainstaff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dominictaylor.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "domsoty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dondiabolo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dracula.city", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "druzya.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79907,7 +79590,6 @@
     { "name": "jw66.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kajabutik.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kamagraerektion.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kf2000.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kocka.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kocka.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kp0808.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80147,10 +79829,6 @@
     { "name": "yugodi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yy366.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yzh8.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8892.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8895.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8920.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8921.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zeroanarchy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zerobajt.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zeusec.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80254,7 +79932,6 @@
     { "name": "cyberforensics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "d81818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "d88.cn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "d8846.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "d8855.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "d8877.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "d88agent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80382,7 +80059,6 @@
     { "name": "kasperstad.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kassarsoap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "katcr.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kf200.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "khojhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kireilign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "klocast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80392,7 +80068,6 @@
     { "name": "kodomo.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koflegend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "krillz.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ks36.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks6807.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks6812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ks6815.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80648,8 +80323,6 @@
     { "name": "yolocast.wtf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yourpocketbook.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yspa.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8891.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8926.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zeilenwind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zenideen.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zeta.hk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81053,10 +80726,8 @@
     { "name": "z-cert.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "z3u5.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "z81818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "z8950.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zombmage.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zoohaus.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "04d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "111plus.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "168fff.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "281ks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81139,7 +80810,6 @@
     { "name": "descargar-apk.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "desentupidorademais.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "desheng28.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "diananeves.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ds138.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dtinel.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dylnuge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81265,7 +80935,6 @@
     { "name": "lideradigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lighthouseglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lilianejuchli.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "linuxhub.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "locksmithfourways24-7.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "loli.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lonelypawn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81717,7 +81386,6 @@
     { "name": "myinsuranceauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myinsurancelife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myinsurancesource.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mylifeinsurancerates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myndighetermeddnssec.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myndighetermedipv6.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myroofandhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82290,7 +81958,6 @@
     { "name": "roisu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "roopakvenkatakrishnan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rotamap.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "roxxz.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "roys.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rrbts.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "run4gameplay.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82811,7 +82478,6 @@
     { "name": "parfumerie-de-grasse.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "parkeerbordenhuren.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paroisses-theix-surzur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "passa.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pcdbank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pfonks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "piektraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83303,7 +82969,6 @@
     { "name": "modelspoorprojecten.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "modernautorepairs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mont-thabor.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "morrellllc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mountainutilities.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mraag.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mrvnt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83317,7 +82982,6 @@
     { "name": "noahenco.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nocloud.website", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nogradhont.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nspireoutreach.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "objectif-securite.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "officezoneonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "okkhor52.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83720,7 +83384,6 @@
     { "name": "agendo.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ahsyg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aiva.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "alan.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alarelleimpresiones.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alko-centr.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allbestcbdoil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84023,7 +83686,6 @@
     { "name": "m4all.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "m51365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "madisoncountyhelps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "manuelpinto.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mariage-protestant.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "martinboerhof.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "masstercurssos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84876,14 +84538,6 @@
     { "name": "iosprivacy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isigmaonline.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "j00228.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "j70101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "j70102.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "j70103.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "j70104.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "j70105.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "j7051.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "j7052.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "j7053.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jaimesotelo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jamestown.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jebengotai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84894,7 +84548,6 @@
     { "name": "jtl-connect.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jtl-pos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kappershuis-meppel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kb88dc29.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kettlemetalbbq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kidsphysiotherapy.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kingnutrition.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84961,43 +84614,10 @@
     { "name": "murmu.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myinjuryattorney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mythoughtmachine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n16.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n18.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n29.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n32.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n37.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n48.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n56.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n69.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n78.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888010.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888101.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888118.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888131.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888151.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888158.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888161.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n88828.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888292.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888378.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888383.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888459.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888569.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888668.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888689.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888727.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n888909.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "n98.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "naidonline.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nccfa.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nei.st", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nemzetizaszlok.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ngonkitchen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "novonegoc.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nr-sputnik.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nutrizionista.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -85137,7 +84757,6 @@
     { "name": "v700cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v700dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v700w.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "v88522.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v9037.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "valx.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vandommelenart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -85209,7 +84828,6 @@
     { "name": "xn--80accdc8alelmbe9n.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--80aeczhjbkbcw0bk0h.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--80akcnmdfaffwoxl7h.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xp16.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xs00228.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y68aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "y68cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -85239,6 +84857,600 @@
     { "name": "zaledia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zijemvedu.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ziledelaultimagafaavioricai.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2017c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "222111.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "233ss.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2712aa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658880000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888001.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888002.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888003.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888004.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888005.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888006.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888007.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888008.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365888009.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658880123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658881111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658881234.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658882222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658882345.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658883333.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658883456.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658884444.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658884567.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658885555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658885678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658886666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658886789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658888888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3658889999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3970yes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6617365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6627365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6629365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6666sb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8602014.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8602015.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8602016.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8602017.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8602018.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8602019.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8602020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8602021.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "86086011.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "86086022.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "86086033.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "86086044.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "86086055.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "86086066.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "86086077.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "86086099.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "861365.vip", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8888209.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "889vip2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "889vip3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "889vip4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8914499.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "93cq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "about-ti.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adomicilio.com.gt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "advancedurologyswla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aecis.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "afrikmag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agencytsunami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airline-economy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ajs5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "akerboom.family", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "akerboom.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alphasib.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "americans.cam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amymabel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "andrey1p.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anna-dance.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apalancamiento.trade", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aravatul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arcadio.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arno-klein.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arno-klein.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arnoklein.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arnoklein.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artc.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arx-libertatis.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asianwebcams.webcam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asmarketero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asperger-ag.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atheit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aufwecken.dynu.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoglass.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avancen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avisofi-credit-immobilier.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b0hr.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b88vip2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b88vip3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b88vip4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b88vip5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99011.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99022.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99033.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9904.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99044.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9905.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99055.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99066.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99077.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99088.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99099.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99118.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9912.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99218.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99318.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99418.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9951.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99518.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9954.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9957.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9961.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99618.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9962.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9970.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99718.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9973.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b9976.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99818.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b99918.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bairuo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baiurl.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bekolite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "benjamin-mary.herokuapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet44401.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet44402.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet44403.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet44404.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet44405.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet44406.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet44407.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet44409.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet44410.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bienhacerlimpiezas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bionezis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blaargh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bloggingtipsfornewblogger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bongocams.webcam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "botsiah.fail", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "breizh.pm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bryandesrosiers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bureaugoodwork.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buriramradio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buyplaytix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "byrnesagency.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cakesbyzoey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cargosapiens.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carpet---cleaning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casaasia.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casaasia.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cdemi.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cedric-bour.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "censys.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "centraldoencanador.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "centurion-consulting.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "certisoncologysolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chainge-re.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "change-coaching-gmbh.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chicjrajeevalochana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chmc.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chris-siedler.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "citationranker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ckpl.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cldejessey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clean-mailbox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cncn.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "colombianas.webcam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "compassleaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "connectme.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "conservativenewsandviews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "consteval.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "constexpr.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "constinit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "consultinghero.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "contact.inc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cooljv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "craft-beer.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crafters.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "craftsandsweets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crtalleres.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cuir-lipari.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cvo-group.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyberpcforum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "d4designstudios.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "d4designstudios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dafassl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "darkhunter.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "davidje13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dbb.wtf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dearstackexchange.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "debarras-diogene.paris", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "decarrouseloss.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "delosgaia.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deltna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deped.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deshobi.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "desklite.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diamgroup.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digirechnung.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digital-eastside.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dilibel.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "divup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diyibo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "docupaymentuat.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domeindns.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "donpanda.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dottore.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ds.lol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dscharrer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtcp8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtnx.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dyxe.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dyxe.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "earlybetter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eazyproject.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ebooknetworking.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eco-repair.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "editionsnoiretrouge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eficsolar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elitedns.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elvendrim.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emoxie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "endbox.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enghost.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "erichoekstra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "erichoekstra.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "erkiss.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "errolstambler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "essays.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euroexpres.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exploithe.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eyedesignuniversity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eziwine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88qin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip102.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip103.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip104.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip105.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip106.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip19.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip20.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip21.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip22.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip23.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f8cp3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f8cp6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fabslabour.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "facemd.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fh999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fhyl789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fhyl888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fidoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fitequilibrio.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flatfix.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foreignxchange.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freddieleeman.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freelancebest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freevst.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frsra.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fryergroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fx-rating.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gampa.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geluleminceur.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genealogiegazet.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gentoocn.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ghostsupreme.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gluhov-ss.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gotowebsites.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "graficasantana.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greenpark.uz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greenpathscience.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grupog2i.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hackingvision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hairfitwolvega.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hardcoen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hasst.schule", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hif88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hitsbola.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "houseofpertijs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hrpage.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "igap.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ikaria.com.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ilgiornaledelticino.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imiix.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "incrom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inflatiecalculator.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "influencerchampions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infoprosnetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inkbunny.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "innovum.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "instagc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "institutointersistemico.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "internetzonei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "interstateremovalists.sydney", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inu.codes", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "investigatore.torino.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itvaatlik.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ixit.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jaisiam.co.th", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jamesusandra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "janeymac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jasminlive.cam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jesusthegoodshepherd.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jonglvab.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "journalof.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "js636.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "js637.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "js638.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "js6868.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "juliaknightly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "justimports.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jyoba.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kas.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kbst.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kelis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "key-form.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "keysso.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kjkmail.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "klikacc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kneppe.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "knulla.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "knulle.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koef.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kolkinn.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kpntdolive.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kraftpc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kunzesoftware.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kupriy-coach.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuretru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kycisrael.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lanzalex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "latinoramarecords.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "le-fumoir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lesptitstutos.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lg2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liborburda.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lightyear.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liypoi.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lms-luch.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lojapos.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lomaem-nsk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "londonlegaltranslation.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "londonseedcentre.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lostandfound.mu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loxal.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lucyhancock.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ludofantasy.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "macha.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maephorncurry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maisvitaminas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maisy.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mandilabeachhotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "manitaggarwal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marjonruns.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marvin.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marvnet.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maydn.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mbardot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meayne.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meditarenargentina.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "megapixelweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "megapixelweb.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "megatravel.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "menthiere.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mijngiftshop.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mindmusic.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mispromo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miss.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mizoey.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mooremetrics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mountaintree.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mpoonamchandpearls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "musthinsider.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "my-sex-cam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mywindscreen.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nbclinic.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neilsonmarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nfl.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ng911services.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nickkallis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nicolettajennings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nicoobank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nielsbohr.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nilahue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nlpdiscovery.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nobreinox.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nrthcdn.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nutextonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nyan.kim", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nyerjanegroval.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "obra.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ohbabybean.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ok7779.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ondiet.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlysim.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oumyshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "overwatchss.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oxfordbio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p4g.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paguponku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paiementdp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paradigma-med.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "partenopei.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pazerandepstein.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pbwebdev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "personadecoded.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pfstaging.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pimichi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pixelumin3d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pizza-calzone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pjax.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "points-pote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "poolvilla-margarita.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pornleg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "postmistress.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pragma-solution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "premium-computer.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "previousmagazine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prodampro.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "profritual.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "psychiatrie-ricany.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "puntaprop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pytradebot.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qnected.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quatulo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quik.legal", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qurplus.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rabbitcallcenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ravelin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redmoon.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redworks.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "referat.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "referat.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "renanoliveira.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "restaurantedonono.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "revampweb-staging.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "revistasomos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rexfinland.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rfid-schutz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ripp-it.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "romanian.cam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rotate4all.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "royalaubar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruvinroshan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rw2.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rythm.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saiyans.com.ve", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saledump.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "salonderecepcionessjl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "salto.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sarkaariseva.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scenari-community.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scenari.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scenari.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sdebitati.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seishinchuo-lawoffice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sendzik.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sex-sex-cam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shahzaibm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shoemakerywc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shokureach.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "signaturechannel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simonssh.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slc.gd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sleep-go.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sm.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "socaliente.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soccers.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sockfetish.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "softwarepara.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soulcraft-cracked.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "southpointcollision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spacehighways.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spiritualites.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sportticino.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "st42.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stacktrace.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stamboomgids.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sth.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stopyhrdinu.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "storiesbysign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stripe.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stripecdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stronku-gaming.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stroyka-iz-brusa.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "studio678.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sukherchador.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "svtr.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sydneychillies.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sztoriboljeles.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t39.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t3hty.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techaraby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "televotia.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "temp.hopto.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thebasicstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thefestivals.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theo-andreou.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theorioncorrelation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thetwistedrabbit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thomasecookedds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thundercloud.onthewifi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timacdonald.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timeless-spirit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tixel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tls.blue", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toddexler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "todotecnohoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toorl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "torrentgalaxy.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toudum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tupeuxpastest.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tussier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "twtr.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ubezpieczenia-poznan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uborka-812.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ukriate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ultimateappreviews.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "upholsterycleanerslondon.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urkult.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "username.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "usjunkyardsnearme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uv.uy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v05666.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v06999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v12555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v67555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v68777.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v700ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v76555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "v78555.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "veg.lv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verbmaestro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vertretungsplan.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "videolabsinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vinhodragao.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visuri.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "voidancerecords.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vostok-zapad54.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "voyagewonders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs106.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs107.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs301.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs302.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs303.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs313.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs601.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs603.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs677.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vs680.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vz.al", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w3app.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wajs1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wajs2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waterheaterirvingtx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "watthasawang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wbuhs.ac.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webkam-sex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webshaped.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "websitecyber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weeklydcoupgen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weldotherm.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "werxus.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whiteeagleca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wibness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wikileaks.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "williamvds.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "winckelmann2020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "woodwo.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wossl.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wtfbryan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wulala.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xahbspl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xprometheus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ya.mk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yachtfolio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yanik.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yeswecan.co.bw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ygm.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yl8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yugodi.team", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yvb.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zalure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zdenekpasek.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zenassociates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     // END OF 1-YEAR BULK HSTS ENTRIES
 
     // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/net/quic/quic_connection_logger.cc b/net/quic/quic_connection_logger.cc
index 9150434..6eb8e53 100644
--- a/net/quic/quic_connection_logger.cc
+++ b/net/quic/quic_connection_logger.cc
@@ -51,7 +51,8 @@
     quic::TransmissionType transmission_type,
     quic::QuicTime sent_time) {
   base::Value dict(base::Value::Type::DICTIONARY);
-  dict.SetIntKey("transmission_type", transmission_type);
+  dict.SetStringKey("transmission_type",
+                    quic::TransmissionTypeToString(transmission_type));
   dict.SetKey("packet_number",
               NetLogNumberValue(serialized_packet.packet_number.ToUint64()));
   dict.SetIntKey("size", serialized_packet.encrypted_length);
@@ -77,7 +78,8 @@
                                        quic::TransmissionType transmission_type,
                                        quic::QuicTime detection_time) {
   base::Value dict(base::Value::Type::DICTIONARY);
-  dict.SetIntKey("transmission_type", transmission_type);
+  dict.SetStringKey("transmission_type",
+                    quic::TransmissionTypeToString(transmission_type));
   dict.SetKey("packet_number", NetLogNumberValue(packet_number.ToUint64()));
   dict.SetKey("detection_time_us",
               NetLogNumberValue(detection_time.ToDebuggingValue()));
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index 64c7e8b..4321c306 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -997,7 +997,7 @@
 
 void NetworkContext::CreateUDPSocket(
     mojo::PendingReceiver<mojom::UDPSocket> receiver,
-    mojom::UDPSocketListenerPtr listener) {
+    mojo::PendingRemote<mojom::UDPSocketListener> listener) {
   socket_factory_->CreateUDPSocket(std::move(receiver), std::move(listener));
 }
 
diff --git a/services/network/network_context.h b/services/network/network_context.h
index 859d673..29d9c39 100644
--- a/services/network/network_context.h
+++ b/services/network/network_context.h
@@ -242,8 +242,9 @@
   void GetExpectCTState(const std::string& domain,
                         GetExpectCTStateCallback callback) override;
 #endif  // BUILDFLAG(IS_CT_SUPPORTED)
-  void CreateUDPSocket(mojo::PendingReceiver<mojom::UDPSocket> receiver,
-                       mojom::UDPSocketListenerPtr listener) override;
+  void CreateUDPSocket(
+      mojo::PendingReceiver<mojom::UDPSocket> receiver,
+      mojo::PendingRemote<mojom::UDPSocketListener> listener) override;
   void CreateTCPServerSocket(
       const net::IPEndPoint& local_addr,
       uint32_t backlog,
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc
index b2fdbe5..de293093 100644
--- a/services/network/network_context_unittest.cc
+++ b/services/network/network_context_unittest.cc
@@ -2384,21 +2384,20 @@
 
   // Create a server socket to listen for incoming datagrams.
   test::UDPSocketListenerImpl listener;
-  mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener);
-  mojom::UDPSocketListenerPtr listener_interface_ptr;
-  listener_binding.Bind(mojo::MakeRequest(&listener_interface_ptr));
+  mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener);
 
   net::IPEndPoint server_addr(GetLocalHostWithAnyPort());
   mojo::Remote<mojom::UDPSocket> server_socket;
-  network_context->CreateUDPSocket(server_socket.BindNewPipeAndPassReceiver(),
-                                   std::move(listener_interface_ptr));
+  network_context->CreateUDPSocket(
+      server_socket.BindNewPipeAndPassReceiver(),
+      listener_receiver.BindNewPipeAndPassRemote());
   test::UDPSocketTestHelper helper(&server_socket);
   ASSERT_EQ(net::OK, helper.BindSync(server_addr, nullptr, &server_addr));
 
   // Create a client socket to send datagrams.
   mojo::Remote<mojom::UDPSocket> client_socket;
   network_context->CreateUDPSocket(client_socket.BindNewPipeAndPassReceiver(),
-                                   nullptr);
+                                   mojo::NullRemote());
 
   net::IPEndPoint client_addr(GetLocalHostWithAnyPort());
   test::UDPSocketTestHelper client_helper(&client_socket);
diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom
index 8632b57..20b2a70 100644
--- a/services/network/public/mojom/network_context.mojom
+++ b/services/network/public/mojom/network_context.mojom
@@ -939,7 +939,7 @@
   // Any sockets that are created but are yet to be destroyed will be destroyed
   // when NetworkContext goes away.
   CreateUDPSocket(pending_receiver<UDPSocket> receiver,
-                  UDPSocketListener? listener);
+                  pending_remote<UDPSocketListener>? listener);
 
   // Creates a TCP server socket that listens on |local_addr|. The socket
   // created can only be used for the purpose specified in |traffic_annotation|,
diff --git a/services/network/socket_factory.cc b/services/network/socket_factory.cc
index 0131efc..6e4475df 100644
--- a/services/network/socket_factory.cc
+++ b/services/network/socket_factory.cc
@@ -42,7 +42,7 @@
 
 void SocketFactory::CreateUDPSocket(
     mojo::PendingReceiver<mojom::UDPSocket> receiver,
-    mojom::UDPSocketListenerPtr listener) {
+    mojo::PendingRemote<mojom::UDPSocketListener> listener) {
   udp_socket_receivers_.Add(
       std::make_unique<UDPSocket>(std::move(listener), net_log_),
       std::move(receiver));
diff --git a/services/network/socket_factory.h b/services/network/socket_factory.h
index 5a22a29..7c70eb0 100644
--- a/services/network/socket_factory.h
+++ b/services/network/socket_factory.h
@@ -11,6 +11,7 @@
 #include "base/component_export.h"
 #include "base/macros.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/strong_binding_set.h"
 #include "mojo/public/cpp/bindings/unique_receiver_set.h"
 #include "net/socket/ssl_client_socket.h"
@@ -45,7 +46,7 @@
 
   // These all correspond to the NetworkContext methods of the same name.
   void CreateUDPSocket(mojo::PendingReceiver<mojom::UDPSocket> receiver,
-                       mojom::UDPSocketListenerPtr listener);
+                       mojo::PendingRemote<mojom::UDPSocketListener> listener);
   void CreateTCPServerSocket(
       const net::IPEndPoint& local_addr,
       int backlog,
diff --git a/services/network/test/test_network_context.h b/services/network/test/test_network_context.h
index 77028b4..978d40f7 100644
--- a/services/network/test/test_network_context.h
+++ b/services/network/test/test_network_context.h
@@ -13,6 +13,7 @@
 #include "base/optional.h"
 #include "base/time/time.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "net/base/address_list.h"
 #include "net/base/ip_endpoint.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
@@ -120,8 +121,9 @@
   void GetExpectCTState(const std::string& domain,
                         GetExpectCTStateCallback callback) override {}
 #endif  // BUILDFLAG(IS_CT_SUPPORTED)
-  void CreateUDPSocket(mojo::PendingReceiver<mojom::UDPSocket> receiver,
-                       mojom::UDPSocketListenerPtr listener) override {}
+  void CreateUDPSocket(
+      mojo::PendingReceiver<mojom::UDPSocket> receiver,
+      mojo::PendingRemote<mojom::UDPSocketListener> listener) override {}
   void CreateTCPServerSocket(
       const net::IPEndPoint& local_addr,
       uint32_t backlog,
diff --git a/services/network/udp_socket.cc b/services/network/udp_socket.cc
index 2fefb8f..4c66a285 100644
--- a/services/network/udp_socket.cc
+++ b/services/network/udp_socket.cc
@@ -153,7 +153,8 @@
 
 UDPSocket::PendingSendRequest::~PendingSendRequest() {}
 
-UDPSocket::UDPSocket(mojom::UDPSocketListenerPtr listener, net::NetLog* net_log)
+UDPSocket::UDPSocket(mojo::PendingRemote<mojom::UDPSocketListener> listener,
+                     net::NetLog* net_log)
     : net_log_(net_log),
       is_bound_(false),
       is_connected_(false),
diff --git a/services/network/udp_socket.h b/services/network/udp_socket.h
index 55a0a0a..f5edb2c 100644
--- a/services/network/udp_socket.h
+++ b/services/network/udp_socket.h
@@ -13,6 +13,8 @@
 #include "base/containers/span.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "net/base/address_family.h"
 #include "net/base/completion_once_callback.h"
 #include "net/base/ip_endpoint.h"
@@ -71,7 +73,8 @@
                          net::CompletionOnceCallback callback) = 0;
   };
 
-  UDPSocket(mojom::UDPSocketListenerPtr listener, net::NetLog* net_log);
+  UDPSocket(mojo::PendingRemote<mojom::UDPSocketListener> listener,
+            net::NetLog* net_log);
   ~UDPSocket() override;
 
   // UDPSocket implementation.
@@ -147,7 +150,7 @@
   bool is_connected_;
 
   // The interface which gets data from fulfilled receive requests.
-  mojom::UDPSocketListenerPtr listener_;
+  mojo::Remote<mojom::UDPSocketListener> listener_;
 
   std::unique_ptr<SocketWrapper> wrapped_socket_;
 
diff --git a/services/network/udp_socket_unittest.cc b/services/network/udp_socket_unittest.cc
index 02c0506c2..f6cc0b9 100644
--- a/services/network/udp_socket_unittest.cc
+++ b/services/network/udp_socket_unittest.cc
@@ -16,7 +16,8 @@
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
 #include "build/build_config.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "net/base/net_errors.h"
 #include "net/socket/udp_socket.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
@@ -216,7 +217,7 @@
 TEST_F(UDPSocketTest, Settings) {
   mojo::Remote<mojom::UDPSocket> socket_remote;
   factory()->CreateUDPSocket(socket_remote.BindNewPipeAndPassReceiver(),
-                             nullptr);
+                             mojo::NullRemote());
   net::IPEndPoint server_addr;
   net::IPEndPoint any_port(GetLocalHostWithAnyPort());
 
@@ -235,7 +236,7 @@
 TEST_F(UDPSocketTest, TestSendWithBind) {
   mojo::Remote<mojom::UDPSocket> socket_remote;
   factory()->CreateUDPSocket(socket_remote.BindNewPipeAndPassReceiver(),
-                             nullptr);
+                             mojo::NullRemote());
 
   net::IPEndPoint server_addr(GetLocalHostWithAnyPort());
 
@@ -254,13 +255,11 @@
 TEST_F(UDPSocketTest, TestSendToWithConnect) {
   // Create a server socket to listen for incoming datagrams.
   test::UDPSocketListenerImpl listener;
-  mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener);
-  mojom::UDPSocketListenerPtr listener_interface_ptr;
-  listener_binding.Bind(mojo::MakeRequest(&listener_interface_ptr));
+  mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener);
 
   mojo::Remote<mojom::UDPSocket> server_socket;
   factory()->CreateUDPSocket(server_socket.BindNewPipeAndPassReceiver(),
-                             std::move(listener_interface_ptr));
+                             listener_receiver.BindNewPipeAndPassRemote());
 
   net::IPEndPoint server_addr(GetLocalHostWithAnyPort());
   test::UDPSocketTestHelper helper(&server_socket);
@@ -269,7 +268,7 @@
   // Create a client socket to send datagrams.
   mojo::Remote<mojom::UDPSocket> client_socket;
   factory()->CreateUDPSocket(client_socket.BindNewPipeAndPassReceiver(),
-                             nullptr);
+                             mojo::NullRemote());
   net::IPEndPoint client_addr(GetLocalHostWithAnyPort());
   test::UDPSocketTestHelper client_helper(&client_socket);
   ASSERT_EQ(net::OK,
@@ -285,7 +284,7 @@
 TEST_F(UDPSocketTest, TestUnexpectedSequences) {
   mojo::Remote<mojom::UDPSocket> socket_remote;
   factory()->CreateUDPSocket(socket_remote.BindNewPipeAndPassReceiver(),
-                             nullptr);
+                             mojo::NullRemote());
   test::UDPSocketTestHelper helper(&socket_remote);
   net::IPEndPoint local_addr(GetLocalHostWithAnyPort());
 
@@ -316,7 +315,7 @@
 // ERR_IO_PENDING, udp_socket.cc doesn't free the send buffer.
 TEST_F(UDPSocketTest, TestBufferValid) {
   mojo::Remote<mojom::UDPSocket> socket_remote;
-  UDPSocket impl(nullptr /*listener*/, nullptr /*net_log*/);
+  UDPSocket impl(mojo::NullRemote() /*listener*/, nullptr /*net_log*/);
   mojo::Receiver<mojom::UDPSocket> receiver(&impl);
   receiver.Bind(socket_remote.BindNewPipeAndPassReceiver());
 
@@ -356,7 +355,7 @@
 // ERR_INSUFFICIENT_RESOURCES is returned appropriately.
 TEST_F(UDPSocketTest, TestInsufficientResources) {
   mojo::Remote<mojom::UDPSocket> socket_remote;
-  UDPSocket impl(nullptr /*listener*/, nullptr /*net_log*/);
+  UDPSocket impl(mojo::NullRemote() /*listener*/, nullptr /*net_log*/);
   mojo::Receiver<mojom::UDPSocket> receiver(&impl);
   receiver.Bind(socket_remote.BindNewPipeAndPassReceiver());
 
@@ -400,12 +399,11 @@
 TEST_F(UDPSocketTest, TestReceiveMoreOverflow) {
   // Create a server socket to listen for incoming datagrams.
   test::UDPSocketListenerImpl listener;
-  mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener);
-  mojom::UDPSocketListenerPtr listener_interface_ptr;
-  listener_binding.Bind(mojo::MakeRequest(&listener_interface_ptr));
+  mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener);
 
   mojo::Remote<mojom::UDPSocket> server_socket;
-  UDPSocket impl(std::move(listener_interface_ptr), nullptr /*net_log*/);
+  UDPSocket impl(listener_receiver.BindNewPipeAndPassRemote(),
+                 nullptr /*net_log*/);
   mojo::Receiver<mojom::UDPSocket> receiver(&impl);
   receiver.Bind(server_socket.BindNewPipeAndPassReceiver());
 
@@ -424,13 +422,11 @@
 TEST_F(UDPSocketTest, TestReadSend) {
   // Create a server socket to listen for incoming datagrams.
   test::UDPSocketListenerImpl listener;
-  mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener);
-  mojom::UDPSocketListenerPtr listener_interface_ptr;
-  listener_binding.Bind(mojo::MakeRequest(&listener_interface_ptr));
+  mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener);
 
   mojo::Remote<mojom::UDPSocket> server_socket;
   factory()->CreateUDPSocket(server_socket.BindNewPipeAndPassReceiver(),
-                             std::move(listener_interface_ptr));
+                             listener_receiver.BindNewPipeAndPassRemote());
 
   net::IPEndPoint server_addr(GetLocalHostWithAnyPort());
   test::UDPSocketTestHelper helper(&server_socket);
@@ -439,7 +435,7 @@
   // Create a client socket to send datagrams.
   mojo::Remote<mojom::UDPSocket> client_socket;
   factory()->CreateUDPSocket(client_socket.BindNewPipeAndPassReceiver(),
-                             nullptr);
+                             mojo::NullRemote());
   net::IPEndPoint client_addr(GetLocalHostWithAnyPort());
   test::UDPSocketTestHelper client_helper(&client_socket);
   ASSERT_EQ(net::OK,
@@ -495,7 +491,7 @@
   // Create a server socket to send data.
   mojo::Remote<mojom::UDPSocket> server_socket;
   factory()->CreateUDPSocket(server_socket.BindNewPipeAndPassReceiver(),
-                             nullptr);
+                             mojo::NullRemote());
 
   net::IPEndPoint server_addr(GetLocalHostWithAnyPort());
   test::UDPSocketTestHelper helper(&server_socket);
@@ -503,13 +499,11 @@
 
   // Create a client socket to send datagrams.
   test::UDPSocketListenerImpl listener;
-  mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener);
-  mojom::UDPSocketListenerPtr client_listener_ptr;
-  listener_binding.Bind(mojo::MakeRequest(&client_listener_ptr));
+  mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener);
 
   mojo::Remote<mojom::UDPSocket> client_socket;
   factory()->CreateUDPSocket(client_socket.BindNewPipeAndPassReceiver(),
-                             std::move(client_listener_ptr));
+                             listener_receiver.BindNewPipeAndPassRemote());
   net::IPEndPoint client_addr(GetLocalHostWithAnyPort());
   test::UDPSocketTestHelper client_helper(&client_socket);
   ASSERT_EQ(net::OK,
@@ -561,13 +555,11 @@
 TEST_F(UDPSocketTest, TestReceiveMoreWithBufferSize) {
   // Create a server socket to listen for incoming datagrams.
   test::UDPSocketListenerImpl listener;
-  mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener);
-  mojom::UDPSocketListenerPtr listener_interface_ptr;
-  listener_binding.Bind(mojo::MakeRequest(&listener_interface_ptr));
+  mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener);
 
   mojo::Remote<mojom::UDPSocket> server_socket;
   factory()->CreateUDPSocket(server_socket.BindNewPipeAndPassReceiver(),
-                             std::move(listener_interface_ptr));
+                             listener_receiver.BindNewPipeAndPassRemote());
 
   net::IPEndPoint server_addr(GetLocalHostWithAnyPort());
   test::UDPSocketTestHelper helper(&server_socket);
@@ -576,7 +568,7 @@
   // Create a client socket to send datagrams.
   mojo::Remote<mojom::UDPSocket> client_socket;
   factory()->CreateUDPSocket(client_socket.BindNewPipeAndPassReceiver(),
-                             nullptr);
+                             mojo::NullRemote());
   net::IPEndPoint client_addr(GetLocalHostWithAnyPort());
   test::UDPSocketTestHelper client_helper(&client_socket);
   ASSERT_EQ(net::OK,
@@ -613,7 +605,7 @@
 TEST_F(UDPSocketTest, TestSendToInvalidAddress) {
   mojo::Remote<mojom::UDPSocket> server_socket;
   factory()->CreateUDPSocket(server_socket.BindNewPipeAndPassReceiver(),
-                             nullptr);
+                             mojo::NullRemote());
 
   net::IPEndPoint server_addr(GetLocalHostWithAnyPort());
   test::UDPSocketTestHelper helper(&server_socket);
@@ -640,12 +632,11 @@
 // 0 byte payload.
 TEST_F(UDPSocketTest, TestReadZeroByte) {
   test::UDPSocketListenerImpl listener;
-  mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener);
-  mojom::UDPSocketListenerPtr listener_interface_ptr;
-  listener_binding.Bind(mojo::MakeRequest(&listener_interface_ptr));
+  mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener);
 
   mojo::Remote<mojom::UDPSocket> socket_remote;
-  UDPSocket impl(std::move(listener_interface_ptr), nullptr /*net_log*/);
+  UDPSocket impl(listener_receiver.BindNewPipeAndPassRemote(),
+                 nullptr /*net_log*/);
   mojo::Receiver<mojom::UDPSocket> receiver(&impl);
   receiver.Bind(socket_remote.BindNewPipeAndPassReceiver());
 
@@ -680,12 +671,10 @@
   net::IPAddress group_ip;
   EXPECT_TRUE(group_ip.AssignFromIPLiteral(kGroup));
   mojo::Remote<mojom::UDPSocket> socket_remote;
-  mojom::UDPSocketListenerPtr listener_ptr;
   test::UDPSocketListenerImpl listener;
-  mojo::Binding<mojom::UDPSocketListener> listener_binding(&listener);
-  listener_binding.Bind(mojo::MakeRequest(&listener_ptr));
+  mojo::Receiver<mojom::UDPSocketListener> listener_receiver(&listener);
   factory()->CreateUDPSocket(socket_remote.BindNewPipeAndPassReceiver(),
-                             std::move(listener_ptr));
+                             listener_receiver.BindNewPipeAndPassRemote());
 
   test::UDPSocketTestHelper helper(&socket_remote);
 
@@ -724,7 +713,7 @@
   // Create a second socket to send a packet to multicast group.
   mojo::Remote<mojom::UDPSocket> second_socket_remote;
   factory()->CreateUDPSocket(second_socket_remote.BindNewPipeAndPassReceiver(),
-                             nullptr);
+                             mojo::NullRemote());
   test::UDPSocketTestHelper second_socket_helper(&second_socket_remote);
   net::IPEndPoint second_socket_address(bind_ip_address, 0);
   ASSERT_EQ(net::OK,
@@ -757,7 +746,7 @@
 TEST_F(UDPSocketTest, ErrorHappensDuringSocketOptionsConfiguration) {
   mojo::Remote<mojom::UDPSocket> server_socket_remote;
   factory()->CreateUDPSocket(server_socket_remote.BindNewPipeAndPassReceiver(),
-                             nullptr);
+                             mojo::NullRemote());
   test::UDPSocketTestHelper server_helper(&server_socket_remote);
   net::IPEndPoint server_addr(GetLocalHostWithAnyPort());
   ASSERT_EQ(net::OK,
@@ -765,7 +754,7 @@
 
   mojo::Remote<mojom::UDPSocket> socket_remote;
   factory()->CreateUDPSocket(socket_remote.BindNewPipeAndPassReceiver(),
-                             nullptr);
+                             mojo::NullRemote());
   test::UDPSocketTestHelper helper(&socket_remote);
 
   // Invalid options.
diff --git a/services/test/user_id/user_id_service.cc b/services/test/user_id/user_id_service.cc
index a07d7aba..0f564430 100644
--- a/services/test/user_id/user_id_service.cc
+++ b/services/test/user_id/user_id_service.cc
@@ -9,8 +9,8 @@
 
 UserIdService::UserIdService(service_manager::mojom::ServiceRequest request)
     : service_binding_(this, std::move(request)) {
-  registry_.AddInterface<mojom::UserId>(
-      base::Bind(&UserIdService::BindUserIdRequest, base::Unretained(this)));
+  registry_.AddInterface<mojom::UserId>(base::BindRepeating(
+      &UserIdService::BindUserIdRequest, base::Unretained(this)));
 }
 
 UserIdService::~UserIdService() = default;
diff --git a/services/tracing/public/cpp/traced_process.cc b/services/tracing/public/cpp/traced_process.cc
index 56b9f602..b94f322 100644
--- a/services/tracing/public/cpp/traced_process.cc
+++ b/services/tracing/public/cpp/traced_process.cc
@@ -16,10 +16,10 @@
 
 // static
 void TracedProcess::OnTracedProcessRequest(
-    mojom::TracedProcessRequest request) {
+    mojo::PendingReceiver<mojom::TracedProcess> receiver) {
 #if !defined(OS_NACL) && !defined(OS_IOS)
   tracing::TracedProcessImpl::GetInstance()->OnTracedProcessRequest(
-      std::move(request));
+      std::move(receiver));
 #endif
 }
 
diff --git a/services/tracing/public/cpp/traced_process.h b/services/tracing/public/cpp/traced_process.h
index 94f586b..25146d4 100644
--- a/services/tracing/public/cpp/traced_process.h
+++ b/services/tracing/public/cpp/traced_process.h
@@ -11,7 +11,8 @@
 
 class TracedProcess {
  public:
-  static void OnTracedProcessRequest(mojom::TracedProcessRequest request);
+  static void OnTracedProcessRequest(
+      mojo::PendingReceiver<mojom::TracedProcess> receiver);
 };
 
 }  // namespace tracing
diff --git a/services/tracing/public/cpp/traced_process_impl.cc b/services/tracing/public/cpp/traced_process_impl.cc
index 707343e38..2d9734700 100644
--- a/services/tracing/public/cpp/traced_process_impl.cc
+++ b/services/tracing/public/cpp/traced_process_impl.cc
@@ -22,7 +22,7 @@
   return traced_process.get();
 }
 
-TracedProcessImpl::TracedProcessImpl() : binding_(this) {
+TracedProcessImpl::TracedProcessImpl() {
   DETACH_FROM_SEQUENCE(sequence_checker_);
 }
 
@@ -31,29 +31,29 @@
 // OnTracedProcessRequest can be called concurrently from
 // multiple threads, as we get one call per service.
 void TracedProcessImpl::OnTracedProcessRequest(
-    mojom::TracedProcessRequest request) {
+    mojo::PendingReceiver<mojom::TracedProcess> receiver) {
   if (task_runner_ && !task_runner_->RunsTasksInCurrentSequence()) {
     task_runner_->PostTask(
         FROM_HERE, base::BindOnce(&TracedProcessImpl::OnTracedProcessRequest,
-                                  base::Unretained(this), std::move(request)));
+                                  base::Unretained(this), std::move(receiver)));
     return;
   }
 
   // We only need one binding per process.
   base::AutoLock lock(lock_);
-  if (binding_.is_bound()) {
+  if (receiver_.is_bound()) {
     return;
   }
 
   DETACH_FROM_SEQUENCE(sequence_checker_);
-  binding_.Bind(std::move(request));
+  receiver_.Bind(std::move(receiver));
 }
 
 // SetTaskRunner must be called before we start receiving
 // any OnTracedProcessRequest calls.
 void TracedProcessImpl::SetTaskRunner(
     scoped_refptr<base::SequencedTaskRunner> task_runner) {
-  DCHECK(!binding_.is_bound());
+  DCHECK(!receiver_.is_bound());
   DCHECK(!task_runner_);
   task_runner_ = task_runner;
 }
@@ -100,7 +100,7 @@
         // again.
         base::AutoLock lock(traced_process->lock_);
         traced_process->agent_registry_.reset();
-        traced_process->binding_.Close();
+        traced_process->receiver_.reset();
       },
       base::Unretained(this)));
 
diff --git a/services/tracing/public/cpp/traced_process_impl.h b/services/tracing/public/cpp/traced_process_impl.h
index 946d3b87..da7e382 100644
--- a/services/tracing/public/cpp/traced_process_impl.h
+++ b/services/tracing/public/cpp/traced_process_impl.h
@@ -29,7 +29,8 @@
  public:
   static TracedProcessImpl* GetInstance();
 
-  void OnTracedProcessRequest(mojom::TracedProcessRequest request);
+  void OnTracedProcessRequest(
+      mojo::PendingReceiver<mojom::TracedProcess> receiver);
 
   // Set which taskrunner to bind any incoming requests on.
   void SetTaskRunner(scoped_refptr<base::SequencedTaskRunner> task_runner);
@@ -54,7 +55,7 @@
   base::Lock lock_;
   std::set<BaseAgent*> agents_;
   mojo::Remote<tracing::mojom::AgentRegistry> agent_registry_;
-  mojo::Binding<tracing::mojom::TracedProcess> binding_;
+  mojo::Receiver<tracing::mojom::TracedProcess> receiver_{this};
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
   SEQUENCE_CHECKER(sequence_checker_);
diff --git a/storage/browser/test/mock_blob_util.h b/storage/browser/test/mock_blob_util.h
index a985ec22..8c3adb7c 100644
--- a/storage/browser/test/mock_blob_util.h
+++ b/storage/browser/test/mock_blob_util.h
@@ -5,6 +5,7 @@
 #ifndef STORAGE_BROWSER_TEST_MOCK_BLOB_UTIL_H_
 #define STORAGE_BROWSER_TEST_MOCK_BLOB_UTIL_H_
 
+#include <memory>
 #include <string>
 
 #include "base/macros.h"
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index cca2d337..873d84b7 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -2623,6 +2623,23 @@
             ]
         }
     ],
+    "ForceDiceMigration": [
+        {
+            "platforms": [
+                "windows",
+                "mac",
+                "linux"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "ForceDiceMigration"
+                    ]
+                }
+            ]
+        }
+    ],
     "FreezeBackgroundTabOnNetworkIdle": [
         {
             "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index f323616..6e5d810 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -400,7 +400,7 @@
     base::FEATURE_ENABLED_BY_DEFAULT};
 
 const base::Feature kHtmlImportsRequestInitiatorLock{
-    "HtmlImportsRequestInitiatorLock", base::FEATURE_ENABLED_BY_DEFAULT};
+    "HtmlImportsRequestInitiatorLock", base::FEATURE_DISABLED_BY_DEFAULT};
 
 }  // namespace features
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/style_engine.cc b/third_party/blink/renderer/core/css/style_engine.cc
index be39a00..78e31941 100644
--- a/third_party/blink/renderer/core/css/style_engine.cc
+++ b/third_party/blink/renderer/core/css/style_engine.cc
@@ -1581,8 +1581,8 @@
           *element);
       continue;
     }
-      DCHECK(!element->NeedsStyleRecalc());
-      DCHECK(!element->ChildNeedsStyleRecalc());
+    DCHECK(!element->NeedsStyleRecalc());
+    DCHECK(!element->ChildNeedsStyleRecalc());
     if (Node* first_child = LayoutTreeBuilderTraversal::FirstChild(*element))
       first_child->MarkAncestorsWithChildNeedsReattachLayoutTree();
   }
diff --git a/third_party/blink/renderer/core/css/style_engine_test.cc b/third_party/blink/renderer/core/css/style_engine_test.cc
index 318d3f97..1f4f17e 100644
--- a/third_party/blink/renderer/core/css/style_engine_test.cc
+++ b/third_party/blink/renderer/core/css/style_engine_test.cc
@@ -69,6 +69,10 @@
         DocumentLifecycle::LifecycleUpdateReason::kTest);
   }
 
+  Node* GetStyleRecalcRoot() {
+    return GetStyleEngine().style_recalc_root_.GetRootNode();
+  }
+
  private:
   std::unique_ptr<DummyPageHolder> dummy_page_holder_;
 };
@@ -2256,4 +2260,21 @@
   EXPECT_TRUE(GetStyleEngine().NeedsLayoutTreeRebuild());
 }
 
+TEST_F(StyleEngineTest, ForceReattachLayoutTreeStyleRecalcRoot) {
+  GetDocument().body()->SetInnerHTMLFromString(R"HTML(
+    <div id="outer">
+      <div id="inner"></div>
+    </div>
+  )HTML");
+  UpdateAllLifecyclePhases();
+
+  Element* outer = GetDocument().getElementById("outer");
+  Element* inner = GetDocument().getElementById("inner");
+
+  outer->SetForceReattachLayoutTree();
+  inner->SetInlineStyleProperty(CSSPropertyID::kColor, "blue");
+
+  EXPECT_EQ(outer, GetStyleRecalcRoot());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/style_recalc_root.cc b/third_party/blink/renderer/core/css/style_recalc_root.cc
index 69d8004a..c94c76e 100644
--- a/third_party/blink/renderer/core/css/style_recalc_root.cc
+++ b/third_party/blink/renderer/core/css/style_recalc_root.cc
@@ -45,7 +45,7 @@
 #endif  // DCHECK_IS_ON()
 
 bool StyleRecalcRoot::IsDirty(const Node& node) const {
-  return node.NeedsStyleRecalc();
+  return node.IsDirtyForStyleRecalc();
 }
 
 void StyleRecalcRoot::ClearChildDirtyForAncestors(ContainerNode& parent) const {
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index 431079a..f8ddaaf8 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -2944,8 +2944,9 @@
       }
     } else if (auto* slot = ToHTMLSlotElementIfSupportsAssignmentOrNull(this)) {
       slot->RecalcStyleForSlotChildren(child_change);
-    } else if (auto* insertion_point = DynamicTo<V0InsertionPoint>(this)) {
-      insertion_point->RecalcStyleForInsertionPointChildren(child_change);
+    } else if (IsActiveV0InsertionPoint(*this)) {
+      To<V0InsertionPoint>(this)->RecalcStyleForInsertionPointChildren(
+          child_change);
     } else {
       RecalcDescendantStyles(child_change);
     }
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc
index 4b4d6a6..0f60dfa 100644
--- a/third_party/blink/renderer/core/dom/node.cc
+++ b/third_party/blink/renderer/core/dom/node.cc
@@ -1209,13 +1209,13 @@
 
 void Node::MarkAncestorsWithChildNeedsStyleRecalc() {
   ContainerNode* ancestor = GetStyleRecalcParent();
-  bool parent_dirty = ancestor && ancestor->NeedsStyleRecalc();
+  bool parent_dirty = ancestor && ancestor->IsDirtyForStyleRecalc();
   for (; ancestor && !ancestor->ChildNeedsStyleRecalc();
        ancestor = ancestor->GetStyleRecalcParent()) {
     if (!ancestor->isConnected())
       return;
     ancestor->SetChildNeedsStyleRecalc();
-    if (ancestor->NeedsStyleRecalc())
+    if (ancestor->IsDirtyForStyleRecalc())
       break;
     // If we reach a locked ancestor, we should abort since the ancestor marking
     // will be done when the lock is committed.
diff --git a/third_party/blink/renderer/core/dom/node.h b/third_party/blink/renderer/core/dom/node.h
index 7493a2f..3772c430 100644
--- a/third_party/blink/renderer/core/dom/node.h
+++ b/third_party/blink/renderer/core/dom/node.h
@@ -497,6 +497,10 @@
     return GetFlag(kForceReattachLayoutTree);
   }
 
+  bool IsDirtyForStyleRecalc() const {
+    return NeedsStyleRecalc() || GetForceReattachLayoutTree();
+  }
+
   bool NeedsDistributionRecalc() const;
 
   bool ChildNeedsDistributionRecalc() const {
diff --git a/third_party/blink/renderer/core/events/touch_event_test.cc b/third_party/blink/renderer/core/events/touch_event_test.cc
index 71d5b0ee2..ef62cd7 100644
--- a/third_party/blink/renderer/core/events/touch_event_test.cc
+++ b/third_party/blink/renderer/core/events/touch_event_test.cc
@@ -7,6 +7,7 @@
 #include "base/time/time.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h"
 #include "third_party/blink/renderer/core/frame/frame_console.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/loader/empty_clients.h"
diff --git a/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css b/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css
index a47d3db7..1ba883d 100644
--- a/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css
+++ b/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css
@@ -253,6 +253,7 @@
   .month-button.selected,
   .week-number-cell.selected {
     background-color: Highlight;
+    color: Window;
   }
 
   .day-cell.highlighted.today,
@@ -260,6 +261,7 @@
   .month-button.today {
     background-color: Highlight;
     border: 2px solid Window !important;
+    color: Window;
   }
 
   .day-cell.selected.today,
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index dcf0685f..4f68e18c 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -2054,6 +2054,7 @@
         overlay_scrollbar_clip_behavior);
     rect.size.height -= scrollable_area->HorizontalScrollbarHeight(
         overlay_scrollbar_clip_behavior);
+    rect.size.ClampNegativeToZero();
   }
 }
 
diff --git a/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc b/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc
index a5d5157..d75037a4 100644
--- a/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc
+++ b/third_party/blink/renderer/core/loader/loader_factory_for_frame.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/core/loader/loader_factory_for_frame.h"
 
 #include "base/single_thread_task_runner.h"
+#include "services/network/public/mojom/url_loader_factory.mojom-blink.h"
 #include "third_party/blink/public/common/blob/blob_utils.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h"
 #include "third_party/blink/public/platform/platform.h"
diff --git a/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc b/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc
index 65a616b..088efc2 100644
--- a/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc
+++ b/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.h"
 
+#include "services/network/public/mojom/ip_address_space.mojom-blink.h"
 #include "services/network/public/mojom/referrer_policy.mojom-blink.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
 #include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h"
diff --git a/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.cc b/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.cc
index d65e705..483df84 100644
--- a/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.cc
+++ b/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.cc
@@ -7,6 +7,7 @@
 #include "base/callback.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
+#include "services/network/public/mojom/url_loader_factory.mojom-blink.h"
 #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/task_type.h"
diff --git a/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.h b/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.h
index 88df341..a0fb7fc6 100644
--- a/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.h
+++ b/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_PREFETCHED_SIGNED_EXCHANGE_MANAGER_H_
 
 #include "base/macros.h"
-#include "services/network/public/mojom/url_loader_factory.mojom-blink.h"
+#include "services/network/public/mojom/url_loader_factory.mojom-blink-forward.h"
 #include "third_party/blink/public/web/web_navigation_params.h"
 #include "third_party/blink/renderer/core/loader/preload_helper.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
diff --git a/third_party/blink/renderer/core/loader/worker_fetch_context.h b/third_party/blink/renderer/core/loader/worker_fetch_context.h
index b71d3919b..2b19280 100644
--- a/third_party/blink/renderer/core/loader/worker_fetch_context.h
+++ b/third_party/blink/renderer/core/loader/worker_fetch_context.h
@@ -7,8 +7,8 @@
 
 #include <memory>
 #include "base/single_thread_task_runner.h"
-#include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom-blink.h"
+#include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink-forward.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom-blink-forward.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/loader/base_fetch_context.h"
 #include "third_party/blink/renderer/platform/wtf/forward.h"
diff --git a/third_party/blink/renderer/core/page/chrome_client.h b/third_party/blink/renderer/core/page/chrome_client.h
index a0b1cf8..aff7c9a 100644
--- a/third_party/blink/renderer/core/page/chrome_client.h
+++ b/third_party/blink/renderer/core/page/chrome_client.h
@@ -32,7 +32,7 @@
 #include "cc/trees/paint_holding_commit_trigger.h"
 #include "third_party/blink/public/common/dom_storage/session_storage_namespace_id.h"
 #include "third_party/blink/public/common/feature_policy/feature_policy.h"
-#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h"
+#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink-forward.h"
 #include "third_party/blink/public/platform/blame_context.h"
 #include "third_party/blink/public/platform/web_drag_operation.h"
 #include "third_party/blink/public/platform/web_focus_type.h"
diff --git a/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.h b/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.h
index 4587ec3..69f964c 100644
--- a/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.h
+++ b/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_FETCH_CLIENT_SETTINGS_OBJECT_IMPL_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_FETCH_CLIENT_SETTINGS_OBJECT_IMPL_H_
 
-#include "services/network/public/mojom/referrer_policy.mojom-blink.h"
+#include "services/network/public/mojom/referrer_policy.mojom-blink-forward.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/heap/member.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object.h"
diff --git a/third_party/blink/renderer/core/script/import_map.cc b/third_party/blink/renderer/core/script/import_map.cc
index 8183804..5788ae64 100644
--- a/third_party/blink/renderer/core/script/import_map.cc
+++ b/third_party/blink/renderer/core/script/import_map.cc
@@ -18,6 +18,19 @@
 #include "third_party/blink/renderer/platform/weborigin/scheme_registry.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 
+// We implement two variants of specs:
+// - When |support_builtin_modules| is false, import maps without built-in
+//   module & fallback supports are implemented.
+//   This follows the ToT spec https://wicg.github.io/import-maps/, which is
+//   marked by <spec> tags.
+// - When |support_builtin_modules| is true, import maps with built-in module &
+//   fallback supports are implemented.
+//   This basically follows the spec before
+//   https://github.com/WICG/import-maps/pull/176, which is marked as
+//   [Spec w/ Built-in].
+//   This is needed for the fallback mechanism for built-in modules, which was
+//   temporarily removed from the spec but is still implemented behind the flag.
+
 namespace blink {
 
 namespace {
@@ -76,7 +89,7 @@
   }
 }
 
-// Step 3.3 of
+// Step 2.4-2.7 of
 // <specdef
 // href="https://wicg.github.io/import-maps/#sort-and-normalize-a-specifier-map">
 KURL NormalizeValue(const String& key,
@@ -84,19 +97,19 @@
                     const KURL& base_url,
                     bool support_builtin_modules,
                     ConsoleLogger& logger) {
-  // <spec step="3.3.2">Let addressURL be the result of parsing a URL-like
-  // import specifier given potentialAddress and baseURL.</spec>
+  // <spec step="2.4">Let addressURL be the result of parsing a URL-like import
+  // specifier given value and baseURL.</spec>
   ParsedSpecifier value =
       ParsedSpecifier::Create(value_string, base_url, support_builtin_modules);
 
   switch (value.GetType()) {
     case ParsedSpecifier::Type::kInvalid:
-      // <spec step="3.3.3">If addressURL is null, then:</spec>
+      // <spec step="2.5">If addressURL is null, then:</spec>
       //
-      // <spec step="3.3.3.1">Report a warning to the console that the address
-      // was invalid.</spec>
+      // <spec step="2.5.1">Report a warning to the console that the address was
+      // invalid.</spec>
       AddIgnoredValueMessage(logger, key, "Invalid URL: " + value_string);
-      // <spec step="3.3.1.2">Continue.</spec>
+      // <spec step="2.5.2">Continue.</spec>
       return NullURL();
 
     case ParsedSpecifier::Type::kBare:
@@ -104,10 +117,10 @@
       return NullURL();
 
     case ParsedSpecifier::Type::kURL:
-      // <spec step="3.3.4">If specifierKey ends with U+002F (/), and the
+      // <spec step="2.6">If specifierKey ends with U+002F (/), and the
       // serialization of addressURL does not end with U+002F (/), then:</spec>
       if (key.EndsWith("/") && !value.GetUrl().GetString().EndsWith("/")) {
-        // <spec step="3.3.4.1">Report a warning to the console that an invalid
+        // <spec step="2.6.1">Report a warning to the console that an invalid
         // address was given for the specifier key specifierKey; since
         // specifierKey ended in a slash, so must the address.</spec>
         AddIgnoredValueMessage(
@@ -115,12 +128,10 @@
             "Since specifierKey ended in a slash, so must the address: " +
                 value_string);
 
-        // <spec step="3.3.4.2">Continue.</spec>
+        // <spec step="2.6.2">Continue.</spec>
         return NullURL();
       }
 
-      // <spec step="3.3.5">Append addressURL to
-      // validNormalizedAddresses.</spec>
       return value.GetUrl();
   }
 }
@@ -201,22 +212,24 @@
     // <spec step="6.2">Set sortedAndNormalizedScopes to the result of sorting
     // and normalizing scopes given parsed["scopes"] and baseURL.</spec>
 
-    // <specdef
+    // <specdef label="sort-and-normalize-scopes"
     // href="https://wicg.github.io/import-maps/#sort-and-normalize-scopes">
 
-    // <spec step="1">Let normalized be an empty map.</spec>
+    // <spec label="sort-and-normalize-scopes" step="1">Let normalized be an
+    // empty map.</spec>
     ScopeType normalized;
 
-    // <spec step="2">For each scopePrefix -> potentialSpecifierMap of
-    // originalMap,</spec>
+    // <spec label="sort-and-normalize-scopes" step="2">For each scopePrefix →
+    // potentialSpecifierMap of originalMap,</spec>
     for (wtf_size_t i = 0; i < scopes->size(); ++i) {
       const JSONObject::Entry& entry = scopes->at(i);
 
       JSONObject* specifier_map = scopes->GetJSONObject(entry.first);
       if (!specifier_map) {
-        // <spec step="2.1">If potentialSpecifierMap is not a map, then throw a
-        // TypeError indicating that the value of the scope with prefix
-        // scopePrefix must be a JSON object.</spec>
+        // <spec label="sort-and-normalize-scopes" step="2.1">If
+        // potentialSpecifierMap is not a map, then throw a TypeError indicating
+        // that the value of the scope with prefix scopePrefix must be a JSON
+        // object.</spec>
         *error_to_rethrow = modulator.CreateTypeError(
             "Failed to parse import map: the value of the scope with prefix "
             "\"" +
@@ -224,37 +237,40 @@
         return MakeGarbageCollected<ImportMap>();
       }
 
-      // <spec step="2.2">Let scopePrefixURL be the result of parsing
-      // scopePrefix with baseURL as the base URL.</spec>
+      // <spec label="sort-and-normalize-scopes" step="2.2">Let scopePrefixURL
+      // be the result of parsing scopePrefix with baseURL as the base
+      // URL.</spec>
       const KURL prefix_url(base_url, entry.first);
 
-      // <spec step="2.3">If scopePrefixURL is failure, then:</spec>
+      // <spec label="sort-and-normalize-scopes" step="2.3">If scopePrefixURL is
+      // failure, then:</spec>
       if (!prefix_url.IsValid()) {
-        // <spec step="2.3.1">Report a warning to the console that the scope
-        // prefix URL was not parseable.</spec>
+        // <spec label="sort-and-normalize-scopes" step="2.3.1">Report a warning
+        // to the console that the scope prefix URL was not parseable.</spec>
         logger.AddConsoleMessage(
             mojom::ConsoleMessageSource::kOther,
             mojom::ConsoleMessageLevel::kWarning,
             "Ignored scope \"" + entry.first + "\": not parsable as a URL.");
 
-        // <spec step="2.3.2">Continue.</spec>
+        // <spec label="sort-and-normalize-scopes" step="2.3.2">Continue.</spec>
         continue;
       }
 
-      // <spec step="2.5">Let normalizedScopePrefix be the serialization of
-      // scopePrefixURL.</spec>
+      // <spec label="sort-and-normalize-scopes" step="2.5">Let
+      // normalizedScopePrefix be the serialization of scopePrefixURL.</spec>
       //
-      // <spec step="2.6">Set normalized[normalizedScopePrefix] to the result of
-      // sorting and normalizing a specifier map given potentialSpecifierMap and
+      // <spec label="sort-and-normalize-scopes" step="2.6">Set
+      // normalized[normalizedScopePrefix] to the result of sorting and
+      // normalizing a specifier map given potentialSpecifierMap and
       // baseURL.</spec>
       sorted_and_normalized_scopes.push_back(std::make_pair(
           prefix_url.GetString(),
           SortAndNormalizeSpecifierMap(specifier_map, base_url,
                                        support_builtin_modules, logger)));
     }
-    // <spec step="3">Return the result of sorting normalized, with an entry a
-    // being less than an entry b if b's key is code unit less than a's
-    // key.</spec>
+    // <spec label="sort-and-normalize-scopes" step="3">Return the result of
+    // sorting normalized, with an entry a being less than an entry b if a’s key
+    // is longer or code unit less than b’s key.</spec>
     std::sort(sorted_and_normalized_scopes.begin(),
               sorted_and_normalized_scopes.end(),
               [](const ScopeEntryType& a, const ScopeEntryType& b) {
@@ -283,8 +299,7 @@
   // <spec step="1">Let normalized be an empty map.</spec>
   SpecifierMap normalized;
 
-  // <spec step="2">First, normalize all entries so that their values are lists.
-  // For each specifierKey → value of originalMap,</spec>
+  // <spec step="2">For each specifierKey → value of originalMap,</spec>
   for (wtf_size_t i = 0; i < imports->size(); ++i) {
     const JSONObject::Entry& entry = imports->at(i);
 
@@ -300,25 +315,28 @@
     Vector<KURL> values;
     switch (entry.second->GetType()) {
       case JSONValue::ValueType::kTypeNull:
-        // <spec step="2.4">Otherwise, if value is null, then set
-        // normalized[normalizedSpecifierKey] to a new empty list.</spec>
+        // [Spec w/ Built-in] Otherwise, if value is null, then set
+        // normalized[normalizedSpecifierKey] to a new empty list.
         break;
 
       case JSONValue::ValueType::kTypeBoolean:
       case JSONValue::ValueType::kTypeInteger:
       case JSONValue::ValueType::kTypeDouble:
       case JSONValue::ValueType::kTypeObject:
-        // <spec step="2.6">Otherwise, report a warning to the console that
-        // addresses must be strings, arrays, or null.</spec>
+        // <spec step="2.3">If value is not a string, then:</spec>
+        //
+        // <spec step="2.3.1">Report a warning to the console that addresses
+        // must be strings.</spec>
         AddIgnoredValueMessage(logger, entry.first, "Invalid value type.");
 
+        // <spec step="2.3.2">Continue.</spec>
+        //
         // By continuing here, we leave |normalized[normalized_specifier_key]|
         // unset, and continue processing.
         continue;
 
       case JSONValue::ValueType::kTypeString: {
-        // <spec step="2.3">If value is a string, then set
-        // normalized[normalizedSpecifierKey] to «value».</spec>
+        // Steps 2.4-2.6 are implemented in NormalizeValue().
         String value_string;
         if (!imports->GetString(entry.first, &value_string)) {
           AddIgnoredValueMessage(logger, entry.first,
@@ -328,16 +346,15 @@
         KURL value = NormalizeValue(entry.first, value_string, base_url,
                                     support_builtin_modules, logger);
 
-        // <spec step="3.3.5">Append addressURL to
-        // validNormalizedAddresses.</spec>
+        // <spec step="2.7">Set normalized[specifierKey] to addressURL.</spec>
         if (value.IsValid())
           values.push_back(value);
         break;
       }
 
       case JSONValue::ValueType::kTypeArray: {
-        // <spec step="2.5">Otherwise, if value is a list, then set
-        // normalized[normalizedSpecifierKey] to value.</spec>
+        // [Spec w/ Built-in] Otherwise, if value is a list, then set
+        // normalized[normalizedSpecifierKey] to value.
         JSONArray* array = imports->GetArray(entry.first);
         if (!array) {
           AddIgnoredValueMessage(logger, entry.first,
@@ -345,25 +362,21 @@
           break;
         }
 
-        // <spec step="3.3">For each potentialAddress of
-        // potentialAddresses,</spec>
+        // <spec step="2">For each specifierKey → value of ...</spec>
         for (wtf_size_t j = 0; j < array->size(); ++j) {
-          // <spec step="3.3.1">If potentialAddress is not a string,
-          // then:</spec>
+          // <spec step="2.3">If value is not a string, then:</spec>
           String value_string;
           if (!array->at(j)->AsString(&value_string)) {
-            // <spec step="3.3.1.1">Report a warning to the console that the
-            // contents of address arrays must be strings.</spec>
+            // <spec step="2.3.1">Report a warning to the console that addresses
+            // must be strings.</spec>
             AddIgnoredValueMessage(logger, entry.first,
                                    "Non-string in the value.");
-            // <spec step="3.3.1.2">Continue.</spec>
+            // <spec step="2.3.2">Continue.</spec>
             continue;
           }
           KURL value = NormalizeValue(entry.first, value_string, base_url,
                                       support_builtin_modules, logger);
 
-          // <spec step="3.3.5">Append addressURL to
-          // validNormalizedAddresses.</spec>
           if (value.IsValid())
             values.push_back(value);
         }
@@ -390,8 +403,7 @@
       }
     }
 
-    // <spec step="3.4">Set normalized[specifierKey] to
-    // validNormalizedAddresses.</spec>
+    // <spec step="2.7">Set normalized[specifierKey] to addressURL.</spec>
     normalized.Set(normalized_specifier_key, values);
   }
 
@@ -420,7 +432,7 @@
   // https://github.com/WICG/import-maps/issues/102
   base::Optional<MatchResult> best_match;
 
-  // <spec step="1">For each specifierKey → addresses of specifierMap,</spec>
+  // <spec step="1">For each specifierKey → address of specifierMap,</spec>
   for (auto it = specifier_map.begin(); it != specifier_map.end(); ++it) {
     // <spec step="1.2">If specifierKey ends with U+002F (/) and
     // normalizedSpecifier starts with specifierKey, then:</spec>
@@ -461,7 +473,7 @@
                                         String* debug_message) const {
   DCHECK(debug_message);
 
-  // <spec step="8">For each scopePrefix -> scopeImports of importMap's
+  // <spec step="8">For each scopePrefix → scopeImports of importMap’s
   // scopes,</spec>
   for (const auto& entry : scopes_) {
     // <spec step="8.1">If scopePrefix is baseURLString, or if scopePrefix ends
@@ -497,7 +509,7 @@
   DCHECK(debug_message);
   const String key = parsed_specifier.GetImportMapKeyString();
 
-  // <spec step="1.1">If specifierKey is normalizedSpecifier, then:</spec>
+  // <spec step="1.1">If specifierKey is normalizedSpecifier, then ...</spec>
   MatchResult exact = specifier_map.find(key);
   if (exact != specifier_map.end()) {
     return ResolveImportsMatchInternal(key, exact, debug_message);
@@ -519,36 +531,23 @@
     const String& key,
     const MatchResult& matched,
     String* debug_message) const {
-  // <spec step="1.2.2.1">Let afterPrefix be the portion of normalizedSpecifier
-  // after the initial specifierKey prefix.</spec>
-  //
-  // <spec step="1.2.3.1">Let afterPrefix be the portion of normalizedSpecifier
+  // <spec step="1.2.1">Let afterPrefix be the portion of normalizedSpecifier
   // after the initial specifierKey prefix.</spec>
   const String after_prefix = key.Substring(matched->key.length());
 
-  // <spec step="1.1.3">If addresses’s size is 2, and addresses[0]'s scheme is
-  // "std", and addresses[1]'s scheme is not "std", then:</spec>
-  //
-  // <spec step="1.2.3">If addresses’s size is 2, and addresses[0]'s scheme is
-  // "std", and addresses[1]'s scheme is not "std", then:</spec>
-  //
-  // TODO(hiroshige): Add these checks here. Currently they are checked at
-  // parsing.
-
   for (const KURL& value : matched->value) {
-    // <spec step="1.2.2.3">Let url be the result of parsing the concatenation
-    // of the serialization of addresses[0] with afterPrefix.</spec>
+    // <spec step="1.1">If specifierKey is normalizedSpecifier, then return
+    // address.</spec>
     //
-    // <spec step="1.2.3.3">Let url0 be the result of parsing the concatenation
-    // of the serialization of addresses[0] with afterPrefix; similarly, let
-    // url1 be the result of parsing the concatenation of the serialization of
-    // addresses[1] with afterPrefix.</spec>
+    // <spec step="1.2">If specifierKey ends with U+002F (/) and
+    // normalizedSpecifier starts with specifierKey, then:</spec>
     //
-    // TODO(hiroshige): Update this according to the spec.
+    // <spec step="1.2.3">Let url be the result of parsing afterPrefix relative
+    // to the base URL address.</spec>
     const KURL url = after_prefix.IsEmpty() ? value : KURL(value, after_prefix);
 
-    // <spec step="1.2.3.5">Return url0, if moduleMap[url0] exists; otherwise,
-    // return url1.</spec>
+    // [Spec w/ Built-in] Return url0, if moduleMap[url0] exists; otherwise,
+    // return url1.
     //
     // Note: Here we filter out non-existing built-in modules in all cases.
     if (!support_builtin_modules_ ||
@@ -557,12 +556,16 @@
       *debug_message = "Import Map: \"" + key + "\" matches with \"" +
                        matched->key + "\" and is mapped to " +
                        url.ElidedString();
+
+      // <spec step="1.2.4">If url is failure, then return null.</spec>
+      //
+      // <spec step="1.2.5">Return url.</spec>
       return url;
     }
   }
 
-  // <spec step="1.1.1">If addresses’s size is 0, then throw a TypeError
-  // indicating that normalizedSpecifier was mapped to no addresses.</spec>
+  // [Spec w/ Built-in] If addresses’s size is 0, then throw a TypeError
+  // indicating that normalizedSpecifier was mapped to no addresses.
   *debug_message = "Import Map: \"" + key + "\" matches with \"" +
                    matched->key + "\" but fails to be mapped (no viable URLs)";
   return NullURL();
diff --git a/third_party/blink/renderer/core/script/modulator.h b/third_party/blink/renderer/core/script/modulator.h
index 04d5c75..39b6255 100644
--- a/third_party/blink/renderer/core/script/modulator.h
+++ b/third_party/blink/renderer/core/script/modulator.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_MODULATOR_H_
 
 #include "base/single_thread_task_runner.h"
-#include "services/network/public/mojom/referrer_policy.mojom-blink.h"
+#include "services/network/public/mojom/referrer_policy.mojom-blink-forward.h"
 #include "third_party/blink/public/platform/web_url_request.h"
 #include "third_party/blink/renderer/bindings/core/v8/module_record.h"
 #include "third_party/blink/renderer/bindings/core/v8/sanitize_script_errors.h"
diff --git a/third_party/blink/renderer/core/script/pending_script.h b/third_party/blink/renderer/core/script/pending_script.h
index 2b58285..8ba0a5d 100644
--- a/third_party/blink/renderer/core/script/pending_script.h
+++ b/third_party/blink/renderer/core/script/pending_script.h
@@ -27,7 +27,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_PENDING_SCRIPT_H_
 
 #include "base/macros.h"
-#include "third_party/blink/public/mojom/script/script_type.mojom-blink.h"
+#include "third_party/blink/public/mojom/script/script_type.mojom-blink-forward.h"
 #include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/script/script.h"
diff --git a/third_party/blink/renderer/core/script/resources/layered_api/elements/virtual-scroller/visibility-manager.mjs b/third_party/blink/renderer/core/script/resources/layered_api/elements/virtual-scroller/visibility-manager.mjs
index 2d520284..b9a67e4 100644
--- a/third_party/blink/renderer/core/script/resources/layered_api/elements/virtual-scroller/visibility-manager.mjs
+++ b/third_party/blink/renderer/core/script/resources/layered_api/elements/virtual-scroller/visibility-manager.mjs
@@ -320,18 +320,8 @@
    */
   #unlock =
       element => {
-        if (element.style.contentSize === undefined) {
-          // TODO(crbug.com/1001293) delete the old code-path.
-          element.displayLock.commit().catch(reason => {
-            // Only warn if the unlocked failed and we should be revealed.
-            if (this.#revealed.has(element)) {
-              this.#logLockingError('Commit', reason, element);
-            }
-          });
-        } else {
-          element.removeAttribute('rendersubtree');
-          element.style.contentSize = '';
-        }
+        element.removeAttribute('rendersubtree');
+        element.style.contentSize = '';
       }
 
   /**
@@ -343,24 +333,8 @@
       element => {
         this.#revealed.delete(element);
         const size = this.#sizeManager.getHopefulSize(element);
-        if (element.style.contentSize === undefined) {
-          // TODO(crbug.com/1001293) delete the old code-path.
-          element.displayLock
-              .acquire({
-                timeout: Infinity,
-                activatable: true,
-                size: [LOCKED_WIDTH_PX, size],
-              })
-              .catch(reason => {
-                // Only warn if the lock failed and we should be locked.
-                if (!this.#revealed.has(element)) {
-                  this.#logLockingError('Acquire', reason, element);
-                }
-              });
-        } else {
-          element.setAttribute('rendersubtree', 'invisible activatable');
-          element.style.contentSize = `${LOCKED_WIDTH_PX}px ${size}px`;
-        }
+        element.setAttribute('rendersubtree', 'invisible activatable');
+        element.style.contentSize = `${LOCKED_WIDTH_PX}px ${size}px`;
       }
 
   /**
diff --git a/third_party/blink/renderer/core/script/script_loader.h b/third_party/blink/renderer/core/script/script_loader.h
index c0cbbaf9..22b6838 100644
--- a/third_party/blink/renderer/core/script/script_loader.h
+++ b/third_party/blink/renderer/core/script/script_loader.h
@@ -21,7 +21,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_SCRIPT_LOADER_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_SCRIPT_LOADER_H_
 
-#include "third_party/blink/public/mojom/script/script_type.mojom-blink.h"
+#include "third_party/blink/public/mojom/script/script_type.mojom-blink-forward.h"
 #include "third_party/blink/public/platform/web_url_request.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_source_location_type.h"
 #include "third_party/blink/renderer/core/core_export.h"
diff --git a/third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.h b/third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.h
index 6e0d088..f00a018a 100644
--- a/third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.h
+++ b/third_party/blink/renderer/core/testing/document_interface_broker_test_helpers.h
@@ -9,7 +9,7 @@
 
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver.h"
-#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink.h"
+#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/frame/frame_host_test_interface.mojom-blink.h"
 #include "third_party/blink/renderer/core/testing/test_document_interface_broker.h"
 
diff --git a/third_party/blink/renderer/core/workers/abstract_worker.h b/third_party/blink/renderer/core/workers/abstract_worker.h
index 7b21022..aa6cd7d 100644
--- a/third_party/blink/renderer/core/workers/abstract_worker.h
+++ b/third_party/blink/renderer/core/workers/abstract_worker.h
@@ -31,7 +31,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_ABSTRACT_WORKER_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_ABSTRACT_WORKER_H_
 
-#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink-forward.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/dom/events/event_listener.h"
 #include "third_party/blink/renderer/core/dom/events/event_target.h"
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker.cc b/third_party/blink/renderer/core/workers/dedicated_worker.cc
index 73c8c4b..b0d498d 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker.cc
+++ b/third_party/blink/renderer/core/workers/dedicated_worker.cc
@@ -12,6 +12,7 @@
 #include "services/service_manager/public/mojom/interface_provider.mojom-blink.h"
 #include "third_party/blink/public/common/blob/blob_utils.h"
 #include "third_party/blink/public/common/features.h"
+#include "third_party/blink/public/mojom/browser_interface_broker.mojom-blink.h"
 #include "third_party/blink/public/mojom/script/script_type.mojom-blink.h"
 #include "third_party/blink/public/mojom/worker/dedicated_worker_host_factory.mojom-blink.h"
 #include "third_party/blink/public/platform/web_content_settings_client.h"
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker.h b/third_party/blink/renderer/core/workers/dedicated_worker.h
index 72d5bbc..a3291d7dec 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker.h
+++ b/third_party/blink/renderer/core/workers/dedicated_worker.h
@@ -7,7 +7,7 @@
 
 #include <memory>
 #include "base/memory/scoped_refptr.h"
-#include "third_party/blink/public/mojom/browser_interface_broker.mojom-blink.h"
+#include "third_party/blink/public/mojom/browser_interface_broker.mojom-blink-forward.h"
 #include "third_party/blink/public/platform/web_dedicated_worker.h"
 #include "third_party/blink/public/platform/web_dedicated_worker_host_factory_client.h"
 #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
index e662ef7a..8f2775e 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
@@ -280,9 +280,17 @@
   // Step 12. "If the algorithm asynchronously completes with null, then:"
   if (classic_script_loader->Failed()) {
     // Step 12.1. "Queue a task to fire an event named error at worker."
-    // Step 12.2. "Run the environment discarding steps for inside settings."
-    // Step 12.3. "Return."
+    // DidFailToFetchClassicScript() will asynchronously fire the event.
     ReportingProxy().DidFailToFetchClassicScript();
+
+    // Step 12.2. "Run the environment discarding steps for inside settings."
+    // Do nothing because the HTML spec doesn't define these steps for web
+    // workers.
+
+    // Schedule worker termination.
+    close();
+
+    // Step 12.3. "Return."
     return;
   }
   ReportingProxy().DidFetchScript();
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.h b/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.h
index 0347fe0d..c43b26d5 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.h
+++ b/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.h
@@ -9,8 +9,8 @@
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/optional.h"
-#include "services/network/public/mojom/referrer_policy.mojom-blink.h"
-#include "third_party/blink/public/mojom/messaging/transferable_message.mojom-blink.h"
+#include "services/network/public/mojom/referrer_policy.mojom-blink-forward.h"
+#include "third_party/blink/public/mojom/messaging/transferable_message.mojom-blink-forward.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/messaging/message_port.h"
 #include "third_party/blink/renderer/core/workers/global_scope_creation_params.h"
diff --git a/third_party/blink/renderer/core/workers/global_scope_creation_params.cc b/third_party/blink/renderer/core/workers/global_scope_creation_params.cc
index 27cabe55..0ad228d9 100644
--- a/third_party/blink/renderer/core/workers/global_scope_creation_params.cc
+++ b/third_party/blink/renderer/core/workers/global_scope_creation_params.cc
@@ -8,6 +8,7 @@
 
 #include "base/feature_list.h"
 #include "third_party/blink/public/common/features.h"
+#include "third_party/blink/public/mojom/script/script_type.mojom-blink.h"
 #include "third_party/blink/renderer/platform/network/content_security_policy_parsers.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/workers/global_scope_creation_params.h b/third_party/blink/renderer/core/workers/global_scope_creation_params.h
index b77a367..6b3e731 100644
--- a/third_party/blink/renderer/core/workers/global_scope_creation_params.h
+++ b/third_party/blink/renderer/core/workers/global_scope_creation_params.h
@@ -9,12 +9,12 @@
 #include "base/macros.h"
 #include "base/optional.h"
 #include "base/unguessable_token.h"
-#include "services/network/public/mojom/ip_address_space.mojom-blink.h"
-#include "services/network/public/mojom/referrer_policy.mojom-blink.h"
-#include "services/service_manager/public/mojom/interface_provider.mojom-blink.h"
+#include "services/network/public/mojom/ip_address_space.mojom-blink-forward.h"
+#include "services/network/public/mojom/referrer_policy.mojom-blink-forward.h"
+#include "services/service_manager/public/mojom/interface_provider.mojom-blink-forward.h"
 #include "third_party/blink/public/common/feature_policy/feature_policy.h"
-#include "third_party/blink/public/mojom/browser_interface_broker.mojom-blink.h"
-#include "third_party/blink/public/mojom/script/script_type.mojom-blink.h"
+#include "third_party/blink/public/mojom/browser_interface_broker.mojom-blink-forward.h"
+#include "third_party/blink/public/mojom/script/script_type.mojom-blink-forward.h"
 #include "third_party/blink/public/platform/web_content_settings_client.h"
 #include "third_party/blink/public/platform/web_worker_fetch_context.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_cache_options.h"
diff --git a/third_party/blink/renderer/core/workers/installed_scripts_manager.cc b/third_party/blink/renderer/core/workers/installed_scripts_manager.cc
index ecc4c90..3925620 100644
--- a/third_party/blink/renderer/core/workers/installed_scripts_manager.cc
+++ b/third_party/blink/renderer/core/workers/installed_scripts_manager.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/workers/installed_scripts_manager.h"
 
+#include "services/network/public/mojom/ip_address_space.mojom-blink.h"
 #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
 #include "third_party/blink/renderer/core/origin_trials/origin_trial_context.h"
 #include "third_party/blink/renderer/platform/network/http_names.h"
diff --git a/third_party/blink/renderer/core/workers/installed_scripts_manager.h b/third_party/blink/renderer/core/workers/installed_scripts_manager.h
index 7f21620..bdb32e3d 100644
--- a/third_party/blink/renderer/core/workers/installed_scripts_manager.h
+++ b/third_party/blink/renderer/core/workers/installed_scripts_manager.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_INSTALLED_SCRIPTS_MANAGER_H_
 
 #include "base/optional.h"
-#include "services/network/public/mojom/ip_address_space.mojom-blink.h"
+#include "services/network/public/mojom/ip_address_space.mojom-blink-forward.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/network/content_security_policy_response_headers.h"
 #include "third_party/blink/renderer/platform/network/http_header_map.h"
diff --git a/third_party/blink/renderer/core/workers/shared_worker.cc b/third_party/blink/renderer/core/workers/shared_worker.cc
index 55a4189..9b69f968 100644
--- a/third_party/blink/renderer/core/workers/shared_worker.cc
+++ b/third_party/blink/renderer/core/workers/shared_worker.cc
@@ -33,6 +33,7 @@
 
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "third_party/blink/public/common/blob/blob_utils.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/fileapi/public_url_manager.h"
 #include "third_party/blink/renderer/core/messaging/message_channel.h"
diff --git a/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc b/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc
index fea6b94..1214ae54 100644
--- a/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc
+++ b/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc
@@ -36,6 +36,7 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/common/messaging/message_port_channel.h"
+#include "third_party/blink/public/mojom/blob/blob_url_store.mojom-blink.h"
 #include "third_party/blink/public/mojom/loader/fetch_client_settings_object.mojom-blink.h"
 #include "third_party/blink/public/mojom/worker/shared_worker_info.mojom-blink.h"
 #include "third_party/blink/public/platform/web_content_security_policy.h"
diff --git a/third_party/blink/renderer/core/workers/shared_worker_client_holder.h b/third_party/blink/renderer/core/workers/shared_worker_client_holder.h
index 5153e2c..af9da612 100644
--- a/third_party/blink/renderer/core/workers/shared_worker_client_holder.h
+++ b/third_party/blink/renderer/core/workers/shared_worker_client_holder.h
@@ -38,8 +38,8 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/unique_receiver_set.h"
-#include "third_party/blink/public/mojom/blob/blob_url_store.mojom-blink.h"
-#include "third_party/blink/public/mojom/worker/shared_worker_client.mojom-blink.h"
+#include "third_party/blink/public/mojom/blob/blob_url_store.mojom-blink-forward.h"
+#include "third_party/blink/public/mojom/worker/shared_worker_client.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/worker/shared_worker_connector.mojom-blink.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/dom/document.h"
diff --git a/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.cc b/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.cc
index 5e67fd0a..05990b0 100644
--- a/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.cc
+++ b/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 #include <utility>
+#include "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom-blink.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.h b/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.h
index 856298fd..4c343ab 100644
--- a/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.h
+++ b/third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.h
@@ -7,7 +7,7 @@
 
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote.h"
-#include "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom-blink.h"
+#include "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom-blink-forward.h"
 #include "third_party/blink/public/platform/web_content_settings_client.h"
 #include "third_party/blink/public/platform/web_security_origin.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
diff --git a/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.h b/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.h
index ffa5aa4..a6136d72 100644
--- a/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.h
+++ b/third_party/blink/renderer/core/workers/threaded_messaging_proxy_base.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_THREADED_MESSAGING_PROXY_BASE_H_
 
 #include "base/optional.h"
-#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h"
+#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink-forward.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/frame/web_feature_forward.h"
 #include "third_party/blink/renderer/core/workers/parent_execution_context_task_runners.h"
diff --git a/third_party/blink/renderer/core/workers/worker_classic_script_loader.h b/third_party/blink/renderer/core/workers/worker_classic_script_loader.h
index 44b1c01e..7574f30 100644
--- a/third_party/blink/renderer/core/workers/worker_classic_script_loader.h
+++ b/third_party/blink/renderer/core/workers/worker_classic_script_loader.h
@@ -31,7 +31,7 @@
 #include <memory>
 #include "base/memory/scoped_refptr.h"
 #include "services/network/public/mojom/fetch_api.mojom-blink-forward.h"
-#include "services/network/public/mojom/ip_address_space.mojom-blink.h"
+#include "services/network/public/mojom/ip_address_space.mojom-blink-forward.h"
 #include "third_party/blink/public/platform/web_url_request.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/loader/threadable_loader.h"
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.h b/third_party/blink/renderer/core/workers/worker_global_scope.h
index 22f96807..f11a137e 100644
--- a/third_party/blink/renderer/core/workers/worker_global_scope.h
+++ b/third_party/blink/renderer/core/workers/worker_global_scope.h
@@ -29,11 +29,11 @@
 
 #include <memory>
 #include "services/network/public/mojom/fetch_api.mojom-blink-forward.h"
-#include "services/network/public/mojom/ip_address_space.mojom-blink.h"
+#include "services/network/public/mojom/ip_address_space.mojom-blink-forward.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
-#include "services/service_manager/public/mojom/interface_provider.mojom-blink.h"
+#include "services/service_manager/public/mojom/interface_provider.mojom-blink-forward.h"
 #include "third_party/blink/public/common/browser_interface_broker_proxy.h"
-#include "third_party/blink/public/mojom/script/script_type.mojom-blink.h"
+#include "third_party/blink/public/mojom/script/script_type.mojom-blink-forward.h"
 #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/dom/frame_request_callback_collection.h"
diff --git a/third_party/blink/renderer/core/workers/worker_module_tree_client.cc b/third_party/blink/renderer/core/workers/worker_module_tree_client.cc
index 09c770c..7bd745d 100644
--- a/third_party/blink/renderer/core/workers/worker_module_tree_client.cc
+++ b/third_party/blink/renderer/core/workers/worker_module_tree_client.cc
@@ -26,10 +26,20 @@
   blink::WorkerReportingProxy& worker_reporting_proxy =
       worker_global_scope->ReportingProxy();
 
+  // Step 12. "If the algorithm asynchronously completes with null, then:"
   if (!module_script) {
-    // Step 12: "If the algorithm asynchronously completes with null, queue
-    // a task to fire an event named error at worker, and return."
+    // Step 12.1. "Queue a task to fire an event named error at worker."
+    // DidFailToFetchModuleScript() will asynchronously fire the event.
     worker_reporting_proxy.DidFailToFetchModuleScript();
+
+    // Step 12.2. "Run the environment discarding steps for inside settings."
+    // Do nothing because the HTML spec doesn't define these steps for web
+    // workers.
+
+    // Schedule worker termination.
+    worker_global_scope->close();
+
+    // Step 12.3. "Return."
     return;
   }
   worker_reporting_proxy.DidFetchScript();
diff --git a/third_party/blink/renderer/core/workers/worker_reporting_proxy.h b/third_party/blink/renderer/core/workers/worker_reporting_proxy.h
index d40ede8..dfedeec0 100644
--- a/third_party/blink/renderer/core/workers/worker_reporting_proxy.h
+++ b/third_party/blink/renderer/core/workers/worker_reporting_proxy.h
@@ -32,7 +32,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_WORKER_REPORTING_PROXY_H_
 
 #include <memory>
-#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h"
+#include "third_party/blink/public/mojom/devtools/console_message.mojom-blink-forward.h"
 #include "third_party/blink/renderer/bindings/core/v8/source_location.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/frame/web_feature_forward.h"
diff --git a/third_party/blink/renderer/core/workers/worker_thread_test_helper.h b/third_party/blink/renderer/core/workers/worker_thread_test_helper.h
index cbb54419..e537c41 100644
--- a/third_party/blink/renderer/core/workers/worker_thread_test_helper.h
+++ b/third_party/blink/renderer/core/workers/worker_thread_test_helper.h
@@ -9,7 +9,7 @@
 
 #include "base/macros.h"
 #include "base/synchronization/waitable_event.h"
-#include "services/network/public/mojom/ip_address_space.mojom-blink.h"
+#include "services/network/public/mojom/ip_address_space.mojom-blink-forward.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "third_party/blink/renderer/bindings/core/v8/source_location.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_cache_options.h"
diff --git a/third_party/blink/renderer/core/workers/worklet_global_scope.cc b/third_party/blink/renderer/core/workers/worklet_global_scope.cc
index 5e09dc10..8076e3c 100644
--- a/third_party/blink/renderer/core/workers/worklet_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/worklet_global_scope.cc
@@ -228,13 +228,11 @@
   // moduleURLRecord, moduleResponsesMap, credentialOptions, outsideSettings,
   // and insideSettings when it asynchronously completes."
 
-  Modulator* modulator = Modulator::From(ScriptController()->GetScriptState());
-
   // Step 3 to 5 are implemented in
   // WorkletModuleTreeClient::NotifyModuleTreeLoadFinished.
-  WorkletModuleTreeClient* client =
-      MakeGarbageCollected<WorkletModuleTreeClient>(
-          modulator, std::move(outside_settings_task_runner), pending_tasks);
+  auto* client = MakeGarbageCollected<WorkletModuleTreeClient>(
+      ScriptController()->GetScriptState(),
+      std::move(outside_settings_task_runner), pending_tasks);
 
   // TODO(nhiroki): Pass an appropriate destination defined in each worklet
   // spec (e.g., "paint worklet", "audio worklet") (https://crbug.com/843980,
diff --git a/third_party/blink/renderer/core/workers/worklet_module_tree_client.cc b/third_party/blink/renderer/core/workers/worklet_module_tree_client.cc
index 7cda3b9..00c0eaf 100644
--- a/third_party/blink/renderer/core/workers/worklet_module_tree_client.cc
+++ b/third_party/blink/renderer/core/workers/worklet_module_tree_client.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/core/workers/worklet_module_tree_client.h"
 
 #include "third_party/blink/public/platform/task_type.h"
+#include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h"
 #include "third_party/blink/renderer/core/script/module_script.h"
 #include "third_party/blink/renderer/core/workers/worker_reporting_proxy.h"
 #include "third_party/blink/renderer/core/workers/worklet_global_scope.h"
@@ -14,10 +15,10 @@
 namespace blink {
 
 WorkletModuleTreeClient::WorkletModuleTreeClient(
-    Modulator* modulator,
+    ScriptState* script_state,
     scoped_refptr<base::SingleThreadTaskRunner> outside_settings_task_runner,
     WorkletPendingTasks* pending_tasks)
-    : modulator_(modulator),
+    : script_state_(script_state),
       outside_settings_task_runner_(std::move(outside_settings_task_runner)),
       pending_tasks_(pending_tasks) {}
 
@@ -29,45 +30,57 @@
   // TODO(nhiroki): Call reporting proxy functions appropriately (e.g.,
   // DidFailToFetchModuleScript(), WillEvaluateModuleScript()).
 
-  if (!module_script) {
-    // Step 3: "If script is null, then queue a task on outsideSettings's
-    // responsible event loop to run these steps:"
-    // The steps are implemented in WorkletPendingTasks::Abort().
-    PostCrossThreadTask(
-        *outside_settings_task_runner_, FROM_HERE,
-        CrossThreadBindOnce(&WorkletPendingTasks::Abort,
-                            WrapCrossThreadPersistent(pending_tasks_.Get())));
-    return;
-  }
-
   // "Note: Specifically, if a script fails to parse or fails to load over the
   // network, it will reject the promise. If the script throws an error while
   // first evaluating the promise it will resolve as classes may have been
   // registered correctly."
   // https://drafts.css-houdini.org/worklets/#fetch-a-worklet-script
   //
-  // When a network failure happens, |module_script| should be nullptr and the
-  // case should already be handled above.
-  //
-  // Check whether a syntax error happens.
-  if (module_script->HasErrorToRethrow()) {
+  // When a network failure happens, |module_script| should be nullptr, and the
+  // case will be handled by the step 3.
+  // When a parse failure happens, |module_script| has an error to rethrow, and
+  // the case will be handled by the step 4.
+
+  // Step 3: "If script is null, then queue a task on outsideSettings's
+  // responsible event loop to run these steps:"
+  if (!module_script) {
+    // Null |error_to_rethrow| will be replaced with AbortError.
     PostCrossThreadTask(
         *outside_settings_task_runner_, FROM_HERE,
         CrossThreadBindOnce(&WorkletPendingTasks::Abort,
-                            WrapCrossThreadPersistent(pending_tasks_.Get())));
+                            WrapCrossThreadPersistent(pending_tasks_.Get()),
+                            /*error_to_rethrow=*/nullptr));
     return;
   }
 
-  // Step 4: "Run a module script given script."
-  ScriptValue error = modulator_->ExecuteModule(
-      module_script, Modulator::CaptureEvalErrorFlag::kReport);
+  // Step 4: "If script's error to rethrow is not null, then queue a task on
+  // outsideSettings's responsible event loop given script's error to rethrow to
+  // run these steps:
+  if (module_script->HasErrorToRethrow()) {
+    ScriptState::Scope scope(script_state_);
+    PostCrossThreadTask(
+        *outside_settings_task_runner_, FROM_HERE,
+        CrossThreadBindOnce(
+            &WorkletPendingTasks::Abort,
+            WrapCrossThreadPersistent(pending_tasks_.Get()),
+            SerializedScriptValue::SerializeAndSwallowExceptions(
+                script_state_->GetIsolate(),
+                module_script->CreateErrorToRethrow().V8Value())));
+    return;
+  }
 
-  WorkletGlobalScope* global_scope = To<WorkletGlobalScope>(
-      ExecutionContext::From(modulator_->GetScriptState()));
+  // Step 5: "Run a module script given script."
+  ScriptValue error =
+      Modulator::From(script_state_)
+          ->ExecuteModule(module_script,
+                          Modulator::CaptureEvalErrorFlag::kReport);
+
+  auto* global_scope =
+      To<WorkletGlobalScope>(ExecutionContext::From(script_state_));
 
   global_scope->ReportingProxy().DidEvaluateModuleScript(error.IsEmpty());
 
-  // Step 5: "Queue a task on outsideSettings's responsible event loop to run
+  // Step 6: "Queue a task on outsideSettings's responsible event loop to run
   // these steps:"
   // The steps are implemented in WorkletPendingTasks::DecrementCounter().
   PostCrossThreadTask(
@@ -77,7 +90,7 @@
 }
 
 void WorkletModuleTreeClient::Trace(blink::Visitor* visitor) {
-  visitor->Trace(modulator_);
+  visitor->Trace(script_state_);
   ModuleTreeClient::Trace(visitor);
 }
 
diff --git a/third_party/blink/renderer/core/workers/worklet_module_tree_client.h b/third_party/blink/renderer/core/workers/worklet_module_tree_client.h
index 371e044..deb69727 100644
--- a/third_party/blink/renderer/core/workers/worklet_module_tree_client.h
+++ b/third_party/blink/renderer/core/workers/worklet_module_tree_client.h
@@ -13,12 +13,13 @@
 namespace blink {
 
 class ModuleScript;
+class ScriptState;
 
 // A ModuleTreeClient that lives on the worklet context's thread.
 class WorkletModuleTreeClient final : public ModuleTreeClient {
  public:
   WorkletModuleTreeClient(
-      Modulator*,
+      ScriptState*,
       scoped_refptr<base::SingleThreadTaskRunner> outside_settings_task_runner,
       WorkletPendingTasks*);
 
@@ -28,7 +29,7 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  Member<Modulator> modulator_;
+  Member<ScriptState> script_state_;
   scoped_refptr<base::SingleThreadTaskRunner> outside_settings_task_runner_;
   CrossThreadPersistent<WorkletPendingTasks> pending_tasks_;
 };
diff --git a/third_party/blink/renderer/core/workers/worklet_pending_tasks.cc b/third_party/blink/renderer/core/workers/worklet_pending_tasks.cc
index 6bf787cc..2b967c9 100644
--- a/third_party/blink/renderer/core/workers/worklet_pending_tasks.cc
+++ b/third_party/blink/renderer/core/workers/worklet_pending_tasks.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/workers/worklet_pending_tasks.h"
 
+#include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/workers/worklet.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
@@ -22,18 +23,35 @@
   counter_ = counter;
 }
 
-void WorkletPendingTasks::Abort() {
+void WorkletPendingTasks::Abort(
+    scoped_refptr<SerializedScriptValue> error_to_rethrow) {
   DCHECK(IsMainThread());
+  // This function can be called from the following steps. See
+  // WorkletModuleTreeClient::NotifyModuleTreeLoadFinished().
+  //
   // Step 3: "If script is null, then queue a task on outsideSettings's
   // responsible event loop to run these steps:"
   //   1: "If pendingTaskStruct's counter is not -1, then run these steps:"
   //     1: "Set pendingTaskStruct's counter to -1."
   //     2: "Reject promise with an "AbortError" DOMException."
+  //
+  // Step 4: "If script's error to rethrow is not null, then queue a task on
+  // outsideSettings's responsible event loop given script's error to rethrow to
+  // run these steps:
+  //   1: "If pendingTaskStruct's counter is not -1, then run these steps:"
+  //     1: "Set pendingTaskStruct's counter to -1."
+  //     2: "Reject promise with error to rethrow."
   if (counter_ != -1) {
     counter_ = -1;
     worklet_->FinishPendingTasks(this);
-    resolver_->Reject(
-        MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError));
+    if (error_to_rethrow) {
+      ScriptState::Scope scope(resolver_->GetScriptState());
+      resolver_->Reject(error_to_rethrow->Deserialize(
+          resolver_->GetScriptState()->GetIsolate()));
+    } else {
+      resolver_->Reject(
+          MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError));
+    }
   }
 }
 
diff --git a/third_party/blink/renderer/core/workers/worklet_pending_tasks.h b/third_party/blink/renderer/core/workers/worklet_pending_tasks.h
index c511d14..8fcfa79 100644
--- a/third_party/blink/renderer/core/workers/worklet_pending_tasks.h
+++ b/third_party/blink/renderer/core/workers/worklet_pending_tasks.h
@@ -11,6 +11,7 @@
 
 namespace blink {
 
+class SerializedScriptValue;
 class Worklet;
 
 // Implementation of the "pending tasks struct":
@@ -31,7 +32,7 @@
   void InitializeCounter(int counter);
 
   // Sets |counter_| to -1 and rejects the promise.
-  void Abort();
+  void Abort(scoped_refptr<SerializedScriptValue> error_to_rethrow);
 
   // Decrements |counter_| and resolves the promise if the counter becomes 0.
   void DecrementCounter();
diff --git a/third_party/blink/renderer/devtools/OWNERS b/third_party/blink/renderer/devtools/OWNERS
index bd5734f..f49aea9 100644
--- a/third_party/blink/renderer/devtools/OWNERS
+++ b/third_party/blink/renderer/devtools/OWNERS
@@ -1,8 +1,11 @@
+aerotwist@chromium.org
+bmeurer@chromium.org
 dgozman@chromium.org
-pfeldman@chromium.org
-lushnikov@chromium.org
 einbinder@chromium.org
+lomitch@microsoft.com
 luoe@chromium.org
+lushnikov@chromium.org
+pfeldman@chromium.org
 yangguo@chromium.org
 
 per-file BUILD.gn=*
diff --git a/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js b/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js
index 59919119..afc8e748 100644
--- a/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js
+++ b/third_party/blink/renderer/devtools/front_end/timeline/TimelineUIUtils.js
@@ -273,13 +273,13 @@
 
   /**
    * @param {!SDK.TracingModel.Event} event
-   * @return {!{title: string, category: !Timeline.TimelineCategory}}
+   * @return {!Timeline.TimelineRecordStyle}
    */
   static eventStyle(event) {
     const eventStyles = Timeline.TimelineUIUtils._initEventStyles();
     if (event.hasCategory(TimelineModel.TimelineModel.Category.Console) ||
         event.hasCategory(TimelineModel.TimelineModel.Category.UserTiming)) {
-      return {title: event.name, category: Timeline.TimelineUIUtils.categories()['scripting']};
+      return new Timeline.TimelineRecordStyle(event.name, Timeline.TimelineUIUtils.categories()['scripting']);
     }
 
     if (event.hasCategory(TimelineModel.TimelineModel.Category.LatencyInfo)) {
@@ -288,7 +288,8 @@
       const inputEventType = event.name.startsWith(prefix) ? event.name.substr(prefix.length) : event.name;
       const displayName = Timeline.TimelineUIUtils.inputEventDisplayName(
           /** @type {!TimelineModel.TimelineIRModel.InputEvents} */ (inputEventType));
-      return {title: displayName || inputEventType, category: Timeline.TimelineUIUtils.categories()['scripting']};
+      return new Timeline.TimelineRecordStyle(
+          displayName || inputEventType, Timeline.TimelineUIUtils.categories()['scripting']);
     }
     let result = eventStyles[event.name];
     if (!result) {
@@ -2051,19 +2052,16 @@
   }
 };
 
-/**
- * @unrestricted
- */
 Timeline.TimelineRecordStyle = class {
   /**
    * @param {string} title
    * @param {!Timeline.TimelineCategory} category
    * @param {boolean=} hidden
    */
-  constructor(title, category, hidden) {
+  constructor(title, category, hidden = false) {
     this.title = title;
     this.category = category;
-    this.hidden = !!hidden;
+    this.hidden = hidden;
   }
 };
 
diff --git a/third_party/blink/renderer/modules/accessibility/DEPS b/third_party/blink/renderer/modules/accessibility/DEPS
index 44011c4a..7f78b77 100644
--- a/third_party/blink/renderer/modules/accessibility/DEPS
+++ b/third_party/blink/renderer/modules/accessibility/DEPS
@@ -1,6 +1,7 @@
 include_rules = [
     "+mojo/public/cpp/bindings/binding.h",
     "+ui/accessibility/ax_enums.mojom-blink.h",
+    "+ui/accessibility/ax_enums.mojom-blink-forward.h",
     "-third_party/blink/renderer/modules",
     "+third_party/blink/renderer/modules/accessibility",
     "+third_party/blink/renderer/modules/media_controls",
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
index 2ca263cb..c387aae9 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -36,7 +36,7 @@
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/blink/public/mojom/permissions/permission.mojom-blink.h"
-#include "third_party/blink/public/mojom/permissions/permission_status.mojom-blink.h"
+#include "third_party/blink/public/mojom/permissions/permission_status.mojom-blink-forward.h"
 #include "third_party/blink/renderer/core/accessibility/ax_object_cache_base.h"
 #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h"
 #include "third_party/blink/renderer/core/frame/local_frame_view.h"
@@ -45,7 +45,7 @@
 #include "third_party/blink/renderer/platform/wtf/hash_map.h"
 #include "third_party/blink/renderer/platform/wtf/hash_set.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
-#include "ui/accessibility/ax_enums.mojom-blink.h"
+#include "ui/accessibility/ax_enums.mojom-blink-forward.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_event.h b/third_party/blink/renderer/modules/background_fetch/background_fetch_event.h
index 5f50663e..d41ace1 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_event.h
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_event.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_EVENT_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_EVENT_H_
 
-#include "third_party/blink/public/mojom/background_fetch/background_fetch.mojom-blink.h"
+#include "third_party/blink/public/mojom/background_fetch/background_fetch.mojom-blink-forward.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/modules/service_worker/extendable_event.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.h b/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.h
index 7e5aba3..8a491c15 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.h
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_update_ui_event.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_UPDATE_UI_EVENT_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_BACKGROUND_FETCH_BACKGROUND_FETCH_UPDATE_UI_EVENT_H_
 
-#include "third_party/blink/public/mojom/background_fetch/background_fetch.mojom-blink.h"
+#include "third_party/blink/public/mojom/background_fetch/background_fetch.mojom-blink-forward.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/modules/background_fetch/background_fetch_event.h"
 #include "third_party/blink/renderer/modules/service_worker/service_worker_registration.h"
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth.h b/third_party/blink/renderer/modules/bluetooth/bluetooth.h
index 237111f..2162844 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth.h
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth.h
@@ -8,7 +8,7 @@
 #include "mojo/public/cpp/bindings/associated_receiver_set.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
 #include "mojo/public/cpp/bindings/remote.h"
-#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink.h"
+#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink-forward.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/core/page/page_visibility_observer.h"
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_device.h"
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_device.h b/third_party/blink/renderer/modules/bluetooth/bluetooth_device.h
index 985e4b43..8daeae6 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_device.h
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_device.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_BLUETOOTH_BLUETOOTH_DEVICE_H_
 
 #include <memory>
-#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink.h"
+#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink-forward.h"
 #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h"
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_server.h"
 #include "third_party/blink/renderer/modules/event_target_modules.h"
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_error.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_error.cc
index a4027a7..842bc68 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_error.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_error.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_error.h"
 
+#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_error.h b/third_party/blink/renderer/modules/bluetooth/bluetooth_error.h
index a884500..2a6ba1e1 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_error.h
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_error.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_BLUETOOTH_BLUETOOTH_ERROR_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_BLUETOOTH_BLUETOOTH_ERROR_H_
 
-#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink.h"
+#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink-forward.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.h b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.h
index 7bd75f2..fbe7df6 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.h
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_BLUETOOTH_BLUETOOTH_REMOTE_GATT_CHARACTERISTIC_H_
 
 #include "mojo/public/cpp/bindings/associated_receiver_set.h"
-#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink.h"
+#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink-forward.h"
 #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
 #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h"
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_service.h b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_service.h
index 9feec686..4b351c0c 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_service.h
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_service.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_BLUETOOTH_BLUETOOTH_REMOTE_GATT_SERVICE_H_
 
 #include <memory>
-#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink.h"
+#include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-blink-forward.h"
 #include "third_party/blink/renderer/bindings/modules/v8/string_or_unsigned_long.h"
 #include "third_party/blink/renderer/modules/bluetooth/bluetooth_device.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
diff --git a/third_party/blink/renderer/modules/cache_storage/cache_storage.h b/third_party/blink/renderer/modules/cache_storage/cache_storage.h
index e636871..f09b31e0 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache_storage.h
+++ b/third_party/blink/renderer/modules/cache_storage/cache_storage.h
@@ -9,7 +9,7 @@
 #include "base/macros.h"
 #include "base/optional.h"
 #include "mojo/public/cpp/bindings/remote.h"
-#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
+#include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink-forward.h"
 #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h"
diff --git a/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc b/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc
index 50fdf34..1d8e4d8b 100644
--- a/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc
+++ b/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc
@@ -35,6 +35,7 @@
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "services/network/public/mojom/referrer_policy.mojom-blink.h"
+#include "third_party/blink/public/mojom/browser_interface_broker.mojom-blink.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom-blink.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_provider.h"
diff --git a/third_party/blink/renderer/modules/hid/DEPS b/third_party/blink/renderer/modules/hid/DEPS
index 98e4a1c..003ec94 100644
--- a/third_party/blink/renderer/modules/hid/DEPS
+++ b/third_party/blink/renderer/modules/hid/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
     "+mojo/public/cpp/bindings",
     "+services/device/public/mojom/hid.mojom-blink.h",
+    "+services/device/public/mojom/hid.mojom-blink-forward.h",
 ]
diff --git a/third_party/blink/renderer/modules/hid/hid.h b/third_party/blink/renderer/modules/hid/hid.h
index efeccf9..8bc43fa 100644
--- a/third_party/blink/renderer/modules/hid/hid.h
+++ b/third_party/blink/renderer/modules/hid/hid.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_H_
 
 #include "mojo/public/cpp/bindings/remote.h"
-#include "services/device/public/mojom/hid.mojom-blink.h"
+#include "services/device/public/mojom/hid.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/hid/hid.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/core/dom/events/event_target.h"
diff --git a/third_party/blink/renderer/modules/hid/hid_collection_info.cc b/third_party/blink/renderer/modules/hid/hid_collection_info.cc
index c95e753..e46dd0e 100644
--- a/third_party/blink/renderer/modules/hid/hid_collection_info.cc
+++ b/third_party/blink/renderer/modules/hid/hid_collection_info.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/modules/hid/hid_collection_info.h"
 
+#include "services/device/public/mojom/hid.mojom-blink.h"
 #include "third_party/blink/renderer/modules/hid/hid_report_info.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/modules/hid/hid_collection_info.h b/third_party/blink/renderer/modules/hid/hid_collection_info.h
index 5883758..aada3a6 100644
--- a/third_party/blink/renderer/modules/hid/hid_collection_info.h
+++ b/third_party/blink/renderer/modules/hid/hid_collection_info.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_COLLECTION_INFO_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_COLLECTION_INFO_H_
 
-#include "services/device/public/mojom/hid.mojom-blink.h"
+#include "services/device/public/mojom/hid.mojom-blink-forward.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
diff --git a/third_party/blink/renderer/modules/hid/hid_device.h b/third_party/blink/renderer/modules/hid/hid_device.h
index f419c3c..3c6eaf79 100644
--- a/third_party/blink/renderer/modules/hid/hid_device.h
+++ b/third_party/blink/renderer/modules/hid/hid_device.h
@@ -8,7 +8,7 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
-#include "services/device/public/mojom/hid.mojom-blink.h"
+#include "services/device/public/mojom/hid.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/hid/hid.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/array_buffer_or_array_buffer_view.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
diff --git a/third_party/blink/renderer/modules/hid/hid_report_info.cc b/third_party/blink/renderer/modules/hid/hid_report_info.cc
index a10eb44..672a73c 100644
--- a/third_party/blink/renderer/modules/hid/hid_report_info.cc
+++ b/third_party/blink/renderer/modules/hid/hid_report_info.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/modules/hid/hid_report_info.h"
 
+#include "services/device/public/mojom/hid.mojom-blink.h"
 #include "third_party/blink/renderer/modules/hid/hid_report_item.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/modules/hid/hid_report_info.h b/third_party/blink/renderer/modules/hid/hid_report_info.h
index e7b0d3ca..05e8847 100644
--- a/third_party/blink/renderer/modules/hid/hid_report_info.h
+++ b/third_party/blink/renderer/modules/hid/hid_report_info.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_REPORT_INFO_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_REPORT_INFO_H_
 
-#include "services/device/public/mojom/hid.mojom-blink.h"
+#include "services/device/public/mojom/hid.mojom-blink-forward.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
diff --git a/third_party/blink/renderer/modules/hid/hid_report_item.cc b/third_party/blink/renderer/modules/hid/hid_report_item.cc
index a8e98ee3..514b4c2f 100644
--- a/third_party/blink/renderer/modules/hid/hid_report_item.cc
+++ b/third_party/blink/renderer/modules/hid/hid_report_item.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/modules/hid/hid_report_item.h"
 
+#include "services/device/public/mojom/hid.mojom-blink.h"
+
 namespace blink {
 
 namespace {
diff --git a/third_party/blink/renderer/modules/hid/hid_report_item.h b/third_party/blink/renderer/modules/hid/hid_report_item.h
index 63085652..223e351a 100644
--- a/third_party/blink/renderer/modules/hid/hid_report_item.h
+++ b/third_party/blink/renderer/modules/hid/hid_report_item.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_REPORT_ITEM_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_HID_HID_REPORT_ITEM_H_
 
-#include "services/device/public/mojom/hid.mojom-blink.h"
+#include "services/device/public/mojom/hid.mojom-blink-forward.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
diff --git a/third_party/blink/renderer/modules/idle/idle_detector.h b/third_party/blink/renderer/modules/idle/idle_detector.h
index 95786de..5ad49150 100644
--- a/third_party/blink/renderer/modules/idle/idle_detector.h
+++ b/third_party/blink/renderer/modules/idle/idle_detector.h
@@ -8,7 +8,7 @@
 #include "base/macros.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
-#include "third_party/blink/public/mojom/idle/idle_manager.mojom-blink.h"
+#include "third_party/blink/public/mojom/idle/idle_manager.mojom-blink-forward.h"
 #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/core/dom/events/event_target.h"
diff --git a/third_party/blink/renderer/modules/image_downloader/multi_resolution_image_resource_fetcher.h b/third_party/blink/renderer/modules/image_downloader/multi_resolution_image_resource_fetcher.h
index 1bb3321..eef1acfd 100644
--- a/third_party/blink/renderer/modules/image_downloader/multi_resolution_image_resource_fetcher.h
+++ b/third_party/blink/renderer/modules/image_downloader/multi_resolution_image_resource_fetcher.h
@@ -10,7 +10,7 @@
 
 #include "base/callback.h"
 #include "base/macros.h"
-#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink-forward.h"
 #include "third_party/blink/public/platform/web_url_request.h"
 #include "third_party/blink/public/web/web_associated_url_loader_options.h"
 #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h"
diff --git a/third_party/blink/renderer/modules/imagecapture/DEPS b/third_party/blink/renderer/modules/imagecapture/DEPS
index 8328eae..d9f3687 100644
--- a/third_party/blink/renderer/modules/imagecapture/DEPS
+++ b/third_party/blink/renderer/modules/imagecapture/DEPS
@@ -1,5 +1,6 @@
 include_rules = [
   "+media/capture/mojom/image_capture.mojom-blink.h",
+  "+media/capture/mojom/image_capture.mojom-blink-forward.h",
 
   "+media/base",
   "+skia/ext/platform_canvas.h",
diff --git a/third_party/blink/renderer/modules/imagecapture/photo_capabilities.h b/third_party/blink/renderer/modules/imagecapture/photo_capabilities.h
index f1c0095d..314509c5 100644
--- a/third_party/blink/renderer/modules/imagecapture/photo_capabilities.h
+++ b/third_party/blink/renderer/modules/imagecapture/photo_capabilities.h
@@ -5,7 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_IMAGECAPTURE_PHOTO_CAPABILITIES_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_IMAGECAPTURE_PHOTO_CAPABILITIES_H_
 
-#include "media/capture/mojom/image_capture.mojom-blink.h"
+#include "media/capture/mojom/image_capture.mojom-blink-forward.h"
 #include "third_party/blink/renderer/modules/imagecapture/media_settings_range.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_index.h b/third_party/blink/renderer/modules/indexeddb/idb_index.h
index 0c09700a..0d628fc 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_index.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_index.h
@@ -27,7 +27,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_IDB_INDEX_H_
 
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
-#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_cursor.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_key_path.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_observation.h b/third_party/blink/renderer/modules/indexeddb/idb_observation.h
index 831fae9..bc668d0ea 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_observation.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_observation.h
@@ -8,7 +8,7 @@
 #include <memory>
 
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
-#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request.h b/third_party/blink/renderer/modules/indexeddb/idb_request.h
index d3f1132..48a337ea 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_request.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_request.h
@@ -34,7 +34,7 @@
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
-#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h"
 #include "third_party/blink/public/platform/web_blob_info.h"
 #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_transaction.h b/third_party/blink/renderer/modules/indexeddb/idb_transaction.h
index 11fd9efb..f73fb13 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_transaction.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_transaction.h
@@ -29,7 +29,7 @@
 #include <memory>
 
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
-#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h"
 #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
 #include "third_party/blink/renderer/core/dom/dom_string_list.h"
 #include "third_party/blink/renderer/core/dom/events/event_listener.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.h b/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.h
index 850b3fc..3f803a7 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.h
@@ -28,7 +28,7 @@
 
 #include "base/optional.h"
 #include "third_party/blink/public/common/indexeddb/web_idb_types.h"
-#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h"
 #include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h"
 #include "third_party/blink/renderer/modules/event_modules.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_any.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h
index 118199a7d..c89042a 100644
--- a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h
+++ b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h
@@ -9,7 +9,7 @@
 #include "base/optional.h"
 #include "mojo/public/cpp/bindings/pending_associated_remote.h"
 #include "testing/gmock/include/gmock/gmock.h"
-#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h"
 #include "third_party/blink/public/platform/web_blob_info.h"
 #include "third_party/blink/public/web/web_heap.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_database_error.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_transaction.h b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_transaction.h
index aca1e9a..a1e3449 100644
--- a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_transaction.h
+++ b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_transaction.h
@@ -9,7 +9,7 @@
 #include <memory>
 
 #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
-#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_key_path.h"
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_transaction.h"
 
diff --git a/third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.h b/third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.h
index bc23ccee01..aaec596 100644
--- a/third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.h
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_factory_impl.h
@@ -9,7 +9,7 @@
 #include "mojo/public/cpp/bindings/pending_associated_remote.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote.h"
-#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h"
 #include "third_party/blink/renderer/modules/indexeddb/idb_key_range.h"
 #include "third_party/blink/renderer/modules/indexeddb/indexed_db_database_callbacks_impl.h"
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_callbacks.h"
diff --git a/third_party/blink/renderer/modules/indexeddb/web_idb_transaction.h b/third_party/blink/renderer/modules/indexeddb/web_idb_transaction.h
index a1a0fb6..9638494 100644
--- a/third_party/blink/renderer/modules/indexeddb/web_idb_transaction.h
+++ b/third_party/blink/renderer/modules/indexeddb/web_idb_transaction.h
@@ -30,7 +30,7 @@
 #include <memory>
 
 #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
-#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h"
+#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink-forward.h"
 #include "third_party/blink/renderer/modules/indexeddb/web_idb_callbacks.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 
diff --git a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.cc b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.cc
index 444834b..5f30971 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl_compressed_texture_etc.cc
@@ -12,7 +12,7 @@
     WebGLRenderingContextBase* context)
     : WebGLExtension(context) {
   context->ExtensionsUtil()->EnsureExtensionEnabled(
-      "GL_CHROMIUM_compressed_texture_etc");
+      "GL_ANGLE_compressed_texture_etc");
   context->AddCompressedTextureFormat(GL_COMPRESSED_R11_EAC);
   context->AddCompressedTextureFormat(GL_COMPRESSED_SIGNED_R11_EAC);
   context->AddCompressedTextureFormat(GL_COMPRESSED_RGB8_ETC2);
@@ -38,8 +38,7 @@
 
 bool WebGLCompressedTextureETC::Supported(WebGLRenderingContextBase* context) {
   Extensions3DUtil* extensions_util = context->ExtensionsUtil();
-  return extensions_util->SupportsExtension(
-      "GL_CHROMIUM_compressed_texture_etc");
+  return extensions_util->SupportsExtension("GL_ANGLE_compressed_texture_etc");
 }
 
 const char* WebGLCompressedTextureETC::ExtensionName() {
diff --git a/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc b/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc
index b6a167c..af1fb2a 100644
--- a/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc
+++ b/third_party/blink/renderer/modules/webgpu/dawn_conversions.cc
@@ -711,7 +711,7 @@
   char* entry_point_ptr = entry_point_keepalive.get();
   memcpy(entry_point_ptr, entry_point.c_str(), byte_size);
 
-  DawnPipelineStageDescriptor dawn_stage = {};
+  DawnProgrammableStageDescriptor dawn_stage = {};
   dawn_stage.module = webgpu_stage->module()->GetHandle();
   dawn_stage.entryPoint = entry_point_ptr;
 
diff --git a/third_party/blink/renderer/modules/webgpu/dawn_conversions.h b/third_party/blink/renderer/modules/webgpu/dawn_conversions.h
index e6592f7c..7411163 100644
--- a/third_party/blink/renderer/modules/webgpu/dawn_conversions.h
+++ b/third_party/blink/renderer/modules/webgpu/dawn_conversions.h
@@ -45,7 +45,7 @@
 DawnOrigin3D AsDawnType(const UnsignedLongSequenceOrGPUOrigin3DDict*);
 
 using OwnedProgrammableStageDescriptor =
-    std::tuple<DawnPipelineStageDescriptor, std::unique_ptr<char[]>>;
+    std::tuple<DawnProgrammableStageDescriptor, std::unique_ptr<char[]>>;
 OwnedProgrammableStageDescriptor AsDawnType(
     const GPUProgrammableStageDescriptor*);
 
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.h b/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.h
index 01924b00..5c922e7 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.h
@@ -14,7 +14,6 @@
 
  public:
   // gpu_buffer_usage.idl
-  static constexpr uint32_t kNone = 0;
   static constexpr uint32_t kMapRead = 1;
   static constexpr uint32_t kMapWrite = 2;
   static constexpr uint32_t kCopySrc = 4;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.idl b/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.idl
index e664b348..b49cc104 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.idl
+++ b/third_party/blink/renderer/modules/webgpu/gpu_buffer_usage.idl
@@ -8,7 +8,6 @@
 [
     RuntimeEnabled=WebGPU
 ] interface GPUBufferUsage {
-    const GPUBufferUsageFlags NONE = 0;
     const GPUBufferUsageFlags MAP_READ = 1;
     const GPUBufferUsageFlags MAP_WRITE = 2;
     const GPUBufferUsageFlags COPY_SRC = 4;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_color_write.h b/third_party/blink/renderer/modules/webgpu/gpu_color_write.h
index 429220b..4df070ed6 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_color_write.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_color_write.h
@@ -14,7 +14,6 @@
 
  public:
   // gpu_color_write.idl
-  static constexpr uint32_t kNone = 0;
   static constexpr uint32_t kRed = 1;
   static constexpr uint32_t kGreen = 2;
   static constexpr uint32_t kBlue = 4;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_color_write.idl b/third_party/blink/renderer/modules/webgpu/gpu_color_write.idl
index 0c79c6d..a71fbafd 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_color_write.idl
+++ b/third_party/blink/renderer/modules/webgpu/gpu_color_write.idl
@@ -8,7 +8,6 @@
 [
     RuntimeEnabled=WebGPU
 ] interface GPUColorWrite {
-    const GPUColorWriteFlags NONE = 0;
     const GPUColorWriteFlags RED = 1;
     const GPUColorWriteFlags GREEN = 2;
     const GPUColorWriteFlags BLUE = 4;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.h b/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.h
index 6ab71b9..07b6649 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.h
@@ -14,7 +14,6 @@
 
  public:
   // gpu_shader_stage.idl
-  static constexpr uint32_t kNone = 0;
   static constexpr uint32_t kVertex = 1;
   static constexpr uint32_t kFragment = 2;
   static constexpr uint32_t kCompute = 4;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.idl b/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.idl
index 54fd4163..546221e2 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.idl
+++ b/third_party/blink/renderer/modules/webgpu/gpu_shader_stage.idl
@@ -8,7 +8,6 @@
 [
     RuntimeEnabled=WebGPU
 ] interface GPUShaderStage {
-    const GPUShaderStageFlags NONE = 0;
     const GPUShaderStageFlags VERTEX = 1;
     const GPUShaderStageFlags FRAGMENT = 2;
     const GPUShaderStageFlags COMPUTE = 4;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.h b/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.h
index 30ec2618..4455467 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.h
@@ -14,7 +14,6 @@
 
  public:
   // gpu_texture_usage.idl
-  static constexpr uint32_t kNone = 0;
   static constexpr uint32_t kCopySrc = 1;
   static constexpr uint32_t kCopyDst = 2;
   static constexpr uint32_t kSampled = 4;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.idl b/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.idl
index 4fe824d..d8139ba 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.idl
+++ b/third_party/blink/renderer/modules/webgpu/gpu_texture_usage.idl
@@ -8,7 +8,6 @@
 [
     RuntimeEnabled=WebGPU
 ] interface GPUTextureUsage {
-    const GPUTextureUsageFlags NONE = 0;
     const GPUTextureUsageFlags COPY_SRC = 1;
     const GPUTextureUsageFlags COPY_DST = 2;
     const GPUTextureUsageFlags SAMPLED = 4;
diff --git a/third_party/blink/renderer/modules/websockets/websocket_stream.cc b/third_party/blink/renderer/modules/websockets/websocket_stream.cc
index 053fb14..c33cdbc2 100644
--- a/third_party/blink/renderer/modules/websockets/websocket_stream.cc
+++ b/third_party/blink/renderer/modules/websockets/websocket_stream.cc
@@ -468,8 +468,6 @@
     return;
   common_.SetState(WebSocketCommon::kOpen);
   was_ever_connected_ = true;
-  // Don't read all of a huge initial message before read() has been called.
-  channel_->ApplyBackpressure();
   auto* connection = MakeGarbageCollected<WebSocketConnection>();
   connection->setProtocol(subprotocol);
   connection->setExtensions(extensions);
@@ -599,6 +597,9 @@
   DVLOG(1) << "WebSocketStream " << this << " Connect() url=" << url
            << " options=" << options;
 
+  // Don't read all of a huge initial message before read() has been called.
+  channel_->ApplyBackpressure();
+
   auto* signal = options->signal();
   if (signal && signal->aborted()) {
     auto exception = V8ThrowDOMException::CreateOrEmpty(
diff --git a/third_party/blink/renderer/modules/websockets/websocket_stream_test.cc b/third_party/blink/renderer/modules/websockets/websocket_stream_test.cc
index 554ed594..59527e2 100644
--- a/third_party/blink/renderer/modules/websockets/websocket_stream_test.cc
+++ b/third_party/blink/renderer/modules/websockets/websocket_stream_test.cc
@@ -63,6 +63,9 @@
 TEST_F(WebSocketStreamTest, ConstructWithBadURL) {
   V8TestingScope scope;
   auto& exception_state = scope.GetExceptionState();
+
+  EXPECT_CALL(Channel(), ApplyBackpressure());
+
   auto* stream = Create(scope.GetScriptState(), "bad-scheme:", exception_state);
 
   EXPECT_FALSE(stream);
@@ -72,7 +75,7 @@
   EXPECT_EQ(
       "The URL's scheme must be either 'ws' or 'wss'. 'bad-scheme' is not "
       "allowed.",
-      scope.GetExceptionState().Message());
+      exception_state.Message());
 }
 
 // Most coverage for bad constructor arguments is provided by
@@ -84,6 +87,7 @@
 
   {
     InSequence s;
+    EXPECT_CALL(Channel(), ApplyBackpressure());
     EXPECT_CALL(Channel(), Connect(KURL("ws://example.com/hoge"), String()))
         .WillOnce(Return(true));
   }
@@ -100,6 +104,7 @@
 
   {
     InSequence s;
+    EXPECT_CALL(Channel(), ApplyBackpressure());
     EXPECT_CALL(Channel(),
                 Connect(KURL("ws://example.com/chat"), String("chat0, chat1")))
         .WillOnce(Return(true));
@@ -119,6 +124,7 @@
 
   {
     InSequence s;
+    EXPECT_CALL(Channel(), ApplyBackpressure());
     EXPECT_CALL(Channel(), Connect(KURL("ws://example.com/chat"), String()))
         .WillOnce(Return(true));
     EXPECT_CALL(Channel(), Disconnect());
@@ -143,10 +149,10 @@
 
   {
     InSequence s;
+    EXPECT_CALL(Channel(), ApplyBackpressure());
     EXPECT_CALL(Channel(),
                 Connect(KURL("ws://example.com/chat"), String("chat")))
         .WillOnce(Return(true));
-    EXPECT_CALL(Channel(), ApplyBackpressure());
     EXPECT_CALL(checkpoint, Call(1));
     EXPECT_CALL(Channel(), Close(1001, String()));
   }
@@ -172,9 +178,9 @@
 
   {
     InSequence s;
+    EXPECT_CALL(Channel(), ApplyBackpressure());
     EXPECT_CALL(Channel(), Connect(KURL("ws://example.com/echo"), String()))
         .WillOnce(Return(true));
-    EXPECT_CALL(Channel(), ApplyBackpressure());
     EXPECT_CALL(Channel(), Close(-1, String("")));
     EXPECT_CALL(Channel(), Disconnect());
   }
@@ -195,6 +201,7 @@
 
   {
     InSequence s;
+    EXPECT_CALL(Channel(), ApplyBackpressure());
     EXPECT_CALL(Channel(), Connect(KURL("ws://example.com/echo"), String()))
         .WillOnce(Return(true));
     EXPECT_CALL(
diff --git a/third_party/blink/renderer/modules/webusb/usb.cc b/third_party/blink/renderer/modules/webusb/usb.cc
index 2585c1b..cbe336a 100644
--- a/third_party/blink/renderer/modules/webusb/usb.cc
+++ b/third_party/blink/renderer/modules/webusb/usb.cc
@@ -9,7 +9,7 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "services/device/public/mojom/usb_device.mojom-blink.h"
 #include "services/device/public/mojom/usb_enumeration_options.mojom-blink.h"
-#include "services/service_manager/public/cpp/interface_provider.h"
+#include "third_party/blink/public/common/browser_interface_broker_proxy.h"
 #include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
@@ -299,7 +299,7 @@
   // See https://bit.ly/2S0zRAS for task types.
   auto task_runner =
       GetExecutionContext()->GetTaskRunner(TaskType::kMiscPlatformAPI);
-  GetExecutionContext()->GetInterfaceProvider()->GetInterface(
+  GetExecutionContext()->GetBrowserInterfaceBroker().GetInterface(
       service_.BindNewPipeAndPassReceiver(task_runner));
   service_.set_disconnect_handler(
       WTF::Bind(&USB::OnServiceConnectionError, WrapWeakPersistent(this)));
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index 645b54b6..76b82656 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -728,6 +728,10 @@
     "fonts/web_font_typeface_factory.h",
     "fonts/win/dwrite_font_format_support.cc",
     "fonts/win/dwrite_font_format_support.h",
+    "fonts/win/fallback_family_style_cache_win.cc",
+    "fonts/win/fallback_family_style_cache_win.h",
+    "fonts/win/fallback_lru_cache_win.cc",
+    "fonts/win/fallback_lru_cache_win.h",
     "fonts/win/font_cache_skia_win.cc",
     "fonts/win/font_fallback_win.cc",
     "fonts/win/font_fallback_win.h",
@@ -1867,6 +1871,7 @@
 
   if (is_win) {
     sources += [ "text/locale_win_test.cc" ]
+    sources += [ "fonts/win/fallback_lru_cache_win_test.cc" ]
   } else if (is_mac) {
     sources += [
       "fonts/opentype/open_type_caps_support_test.mm",
diff --git a/third_party/blink/renderer/platform/DEPS b/third_party/blink/renderer/platform/DEPS
index cbc4b78..9a37cb5 100644
--- a/third_party/blink/renderer/platform/DEPS
+++ b/third_party/blink/renderer/platform/DEPS
@@ -6,6 +6,7 @@
     "+base/bind.h",
     "+base/bind_helpers.h",
     "+base/bit_cast.h",
+    "+base/command_line.h",
     "+base/compiler_specific.h",
     "+base/cpu.h",
     "+base/feature_list.h",
diff --git a/third_party/blink/renderer/platform/fonts/font_cache.h b/third_party/blink/renderer/platform/fonts/font_cache.h
index be25d9e..4025c77 100644
--- a/third_party/blink/renderer/platform/fonts/font_cache.h
+++ b/third_party/blink/renderer/platform/fonts/font_cache.h
@@ -60,6 +60,7 @@
 
 #if defined(OS_WIN)
 #include "third_party/blink/public/mojom/dwrite_font_proxy/dwrite_font_proxy.mojom-blink.h"
+#include "third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.h"
 #endif
 
 class SkString;
@@ -356,6 +357,7 @@
   // to ensure it's not happening in the production from the crash log.
   bool is_test_font_mgr_ = false;
   mojo::Remote<mojom::blink::DWriteFontProxy> service_;
+  std::unique_ptr<FallbackFamilyStyleCache> fallback_params_cache_;
 #endif  // defined(OS_WIN)
 
 #if defined(OS_LINUX) || defined(OS_CHROMEOS)
diff --git a/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.cc b/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.cc
new file mode 100644
index 0000000..a563a8007
--- /dev/null
+++ b/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.cc
@@ -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.
+
+#include "third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.h"
+
+#include "third_party/blink/renderer/platform/fonts/font_platform_data.h"
+
+namespace blink {
+
+namespace {
+
+const wtf_size_t kMaxCacheSlots = 16;
+
+String makeCacheKey(FontDescription::GenericFamilyType generic_family,
+                    String bcp47_language_tag,
+                    FontFallbackPriority fallback_priority) {
+  StringBuilder cache_key;
+  cache_key.Append(bcp47_language_tag);
+  cache_key.AppendNumber(
+      static_cast<
+          std::underlying_type<FontDescription::GenericFamilyType>::type>(
+          generic_family));
+  cache_key.AppendNumber(
+      static_cast<std::underlying_type<FontFallbackPriority>::type>(
+          fallback_priority));
+  return cache_key.ToString();
+}
+
+void getFallbackFamilyAndStyle(SkTypeface* typeface,
+                               String* fallback_family,
+                               SkFontStyle* fallback_style) {
+  SkString family;
+  typeface->getFamilyName(&family);
+  *fallback_family = family.c_str();
+
+  *fallback_style = typeface->fontStyle();
+}
+}  // namespace
+
+FallbackFamilyStyleCache::FallbackFamilyStyleCache()
+    : recent_fallback_fonts_(kMaxCacheSlots) {}
+
+void FallbackFamilyStyleCache::Put(
+    FontDescription::GenericFamilyType generic_family,
+    String bcp47_language_tag,
+    FontFallbackPriority fallback_priority,
+    SkTypeface* typeface) {
+  String cache_key =
+      makeCacheKey(generic_family, bcp47_language_tag, fallback_priority);
+
+  FallbackLruCache::TypefaceVector* existing_typefaces =
+      recent_fallback_fonts_.Get(cache_key);
+  if (existing_typefaces) {
+    existing_typefaces->insert(0, sk_ref_sp(typeface));
+  } else {
+    FallbackLruCache::TypefaceVector typefaces;
+    typefaces.push_back(sk_ref_sp(typeface));
+    recent_fallback_fonts_.Put(std::move(cache_key), std::move(typefaces));
+  }
+}
+
+void FallbackFamilyStyleCache::Get(
+    FontDescription::GenericFamilyType generic_family,
+    String bcp47_language_tag,
+    FontFallbackPriority fallback_priority,
+    UChar32 character,
+    String* fallback_family,
+    SkFontStyle* fallback_style) {
+  FallbackLruCache::TypefaceVector* typefaces = recent_fallback_fonts_.Get(
+      makeCacheKey(generic_family, bcp47_language_tag, fallback_priority));
+  if (!typefaces)
+    return;
+
+  for (wtf_size_t i = 0; i < typefaces->size(); ++i) {
+    sk_sp<SkTypeface>& typeface = typefaces->at(i);
+    if (typeface->unicharToGlyph(character)) {
+      getFallbackFamilyAndStyle(typeface.get(), fallback_family,
+                                fallback_style);
+      sk_sp<SkTypeface> tmp_typeface(typeface);
+      // For the vector of typefaces for this specific language tag, since this
+      // SkTypeface had a glyph, move it to the beginning to accelerate
+      // subsequent lookups.
+      typefaces->EraseAt(i);
+      typefaces->insert(0, std::move(tmp_typeface));
+      return;
+    }
+  }
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.h b/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.h
new file mode 100644
index 0000000..5e8f86eb
--- /dev/null
+++ b/third_party/blink/renderer/platform/fonts/win/fallback_family_style_cache_win.h
@@ -0,0 +1,56 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_WIN_FALLBACK_FAMILY_STYLE_CACHE_WIN_H_
+#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_WIN_FALLBACK_FAMILY_STYLE_CACHE_WIN_H_
+
+#include "third_party/blink/renderer/platform/fonts/font_description.h"
+#include "third_party/blink/renderer/platform/fonts/font_fallback_priority.h"
+#include "third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
+#include "third_party/skia/include/core/SkTypeface.h"
+
+namespace blink {
+
+class FallbackFamilyStyleCache {
+  USING_FAST_MALLOC(FallbackFamilyStyleCache);
+
+ public:
+  FallbackFamilyStyleCache();
+
+  // Places a SkTypeface object in the cache for specified language tag and
+  // fallback priority, taking a reference on SkTypeface. Adds the |SkTypeface|
+  // to the beginning of a list of typefaces if previous |SkTypefaces| objects
+  // where added for this set of parameters. Note, the internal list of
+  // typefaces for a language tag and fallback priority is not checked for
+  // duplicates when adding a |typeface| object.
+  void Put(FontDescription::GenericFamilyType generic_family,
+           String bcp47_language_tag,
+           FontFallbackPriority fallback_priority,
+           SkTypeface* typeface);
+
+  // Fetches a |fallback_family| and |fallback_style| for a given language tag,
+  // fallback priority and codepoint. Checks the internal cache for whether a
+  // fallback font with glyph coverage for |character| is available for the
+  // given parameters, then returns its family name and style.
+  void Get(FontDescription::GenericFamilyType generic_family,
+           String bcp47_language_tag,
+           FontFallbackPriority fallback_priority,
+           UChar32 character,
+           String* fallback_family,
+           SkFontStyle* fallback_style);
+
+  // Empties the internal cache, deleting keys and unrefing the typefaces that
+  // were placed in the cache.
+  void Clear();
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(FallbackFamilyStyleCache);
+
+  FallbackLruCache recent_fallback_fonts_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_WIN_FALLBACK_FAMILY_STYLE_CACHE_WIN_H_
diff --git a/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.cc b/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.cc
new file mode 100644
index 0000000..37b6a15
--- /dev/null
+++ b/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.cc
@@ -0,0 +1,57 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.h"
+
+#include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+
+namespace blink {
+
+FallbackLruCache::FallbackLruCache(size_t max_size) : max_size_(max_size) {
+  DCHECK_GT(max_size_, 0u);
+}
+
+FallbackLruCache::TypefaceVector* FallbackLruCache::Get(const String& key) {
+  HashMapType::iterator find_result = map_.find(key);
+  if (find_result == map_.end())
+    return nullptr;
+
+  // Move result to beginning of list.
+  KeyListNode* node = find_result->value.ListNode();
+  ordering_.Remove(node);
+  ordering_.Push(node);
+  return find_result->value.value();
+}
+
+void FallbackLruCache::Put(String&& key, TypefaceVector&& arg) {
+  HashMapType::iterator find_result = map_.find(key);
+  if (find_result != map_.end()) {
+    ordering_.Remove(find_result->value.ListNode());
+    map_.erase(find_result);
+  }
+
+  if (map_.size() >= max_size_) {
+    RemoveLeastRecentlyUsed();
+  }
+
+  std::unique_ptr<KeyListNode> list_node = std::make_unique<KeyListNode>(key);
+  HashMapType::AddResult add_result = map_.insert(
+      std::move(key), MappedWithListNode(std::move(arg), std::move(list_node)));
+  DCHECK(add_result.is_new_entry);
+  ordering_.Push(add_result.stored_value->value.ListNode());
+}
+
+void FallbackLruCache::Clear() {
+  map_.clear();
+  ordering_.Clear();
+}
+
+void FallbackLruCache::RemoveLeastRecentlyUsed() {
+  KeyListNode* tail = ordering_.Tail();
+  ordering_.Remove(tail);
+  map_.erase(tail->key());
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.h b/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.h
new file mode 100644
index 0000000..90048e3
--- /dev/null
+++ b/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.h
@@ -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.
+
+#include "third_party/blink/renderer/platform/platform_export.h"
+#include "third_party/blink/renderer/platform/wtf/doubly_linked_list.h"
+#include "third_party/blink/renderer/platform/wtf/hash_map.h"
+#include "third_party/blink/renderer/platform/wtf/hash_table_deleted_value_type.h"
+#include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
+#include "third_party/skia/include/core/SkTypeface.h"
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_WIN_FALLBACK_LRU_CACHE_WIN_H_
+#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_WIN_FALLBACK_LRU_CACHE_WIN_H_
+
+namespace blink {
+
+/* A LRU cache for storing a a vector of typefaces for a particular key string,
+ * which would usually be a locale plus potential additional parameters. Uses a
+ * HashMap for storage and access and a DoublyLinkedList for managing age of
+ * entries. TODO(https://crbug.com/1010925): Potentially move this to a generic
+ * LRU Cache implementation once we have such in WTF. */
+class PLATFORM_EXPORT FallbackLruCache {
+  USING_FAST_MALLOC(FallbackLruCache);
+
+ public:
+  FallbackLruCache(size_t max_size);
+
+  using TypefaceVector = Vector<sk_sp<SkTypeface>>;
+
+  TypefaceVector* Get(const String& key);
+  void Put(String&& key, TypefaceVector&& arg);
+
+  void Clear();
+
+  size_t size() const { return map_.size(); }
+
+ private:
+  class KeyListNode final : public DoublyLinkedListNode<KeyListNode> {
+    USING_FAST_MALLOC(KeyListNode);
+
+   public:
+    friend class DoublyLinkedListNode<KeyListNode>;
+    KeyListNode(const String& key) : key_(key) {}
+
+    const String& key() const { return key_; }
+
+   private:
+    String key_;
+    KeyListNode* prev_{nullptr};
+    KeyListNode* next_{nullptr};
+  };
+
+  class MappedWithListNode {
+    USING_FAST_MALLOC(MappedWithListNode);
+
+   public:
+    MappedWithListNode(TypefaceVector&& mapped_arg,
+                       std::unique_ptr<KeyListNode>&& list_node)
+        : mapped_value_(std::move(mapped_arg)),
+          list_node_(std::move(list_node)) {}
+
+    MappedWithListNode(WTF::HashTableDeletedValueType) {
+      list_node_.reset(reinterpret_cast<KeyListNode*>(-1));
+    }
+
+    TypefaceVector* value() { return &mapped_value_; }
+    KeyListNode* ListNode() { return list_node_.get(); }
+
+   private:
+    TypefaceVector mapped_value_;
+    std::unique_ptr<KeyListNode> list_node_;
+  };
+
+  void RemoveLeastRecentlyUsed();
+
+  using HashMapType = HashMap<String,
+                              MappedWithListNode,
+                              DefaultHash<String>::Hash,
+                              HashTraits<String>,
+                              SimpleClassHashTraits<MappedWithListNode>>;
+
+  HashMapType map_;
+  DoublyLinkedList<KeyListNode> ordering_;
+  size_t max_size_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_WIN_FALLBACK_LRU_CACHE_WIN_H_
diff --git a/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win_test.cc b/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win_test.cc
new file mode 100644
index 0000000..92f78aa
--- /dev/null
+++ b/third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win_test.cc
@@ -0,0 +1,97 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/platform/fonts/win/fallback_lru_cache_win.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/skia/include/core/SkFontMgr.h"
+#include "third_party/skia/include/core/SkRefCnt.h"
+#include "third_party/skia/include/core/SkTypeface.h"
+
+namespace {
+
+const char kHanSimplifiedLocale[] = "zh-Hans";
+const size_t kLruCacheTestSize = 5;
+const char kFontFamilyNameArial[] = "Arial";
+const UChar32 kFirstCJKIdeograph = 0x4E00;
+const UChar32 kSecondCJKIdeograph = kFirstCJKIdeograph + 1;
+
+sk_sp<SkTypeface> fallbackForLocale(String locale, UChar32 codepoint) {
+  sk_sp<SkFontMgr> font_mgr = SkFontMgr::RefDefault();
+  std::string locale_string(locale.Ascii());
+  const char* locale_char = locale_string.c_str();
+  return sk_sp<SkTypeface>(font_mgr->matchFamilyStyleCharacter(
+      kFontFamilyNameArial, SkFontStyle(), &locale_char, 1, codepoint));
+}
+
+void fillCacheWithDummies(blink::FallbackLruCache& lru_cache,
+                          const char* format_string,
+                          size_t count) {
+  for (size_t i = 0; i < count; ++i) {
+    blink::FallbackLruCache::TypefaceVector dummy_typefaces;
+    dummy_typefaces.push_back(
+        SkTypeface::MakeFromName(kFontFamilyNameArial, SkFontStyle()));
+    lru_cache.Put(String::Format(format_string, i), std::move(dummy_typefaces));
+  }
+}
+
+}  // namespace
+
+namespace blink {
+
+TEST(FallbackLruCacheTest, KeepChineseWhenFetched) {
+  // Put a Chinese font in the cache, add size - 1 more dummy fallback fonts so
+  // that the cache is full. Get() and verify typeface for Chinese to move them
+  // up to the top of the cache. Then fill again with size - 1 items and verify
+  // that Chinese is still in the cache. Then fill with # size items to evict
+  // the Chinese font and ensure it's gone.
+  FallbackLruCache lru_cache(kLruCacheTestSize);
+  EXPECT_EQ(lru_cache.size(), 0u);
+  FallbackLruCache::TypefaceVector fallback_typefaces_zh;
+  fallback_typefaces_zh.push_back(
+      fallbackForLocale(kHanSimplifiedLocale, kFirstCJKIdeograph));
+  lru_cache.Put(kHanSimplifiedLocale, std::move(fallback_typefaces_zh));
+
+  EXPECT_EQ(lru_cache.size(), 1u);
+
+  fillCacheWithDummies(lru_cache, "dummy_locale_%zu", kLruCacheTestSize - 1);
+  FallbackLruCache::TypefaceVector* chinese_typefaces =
+      lru_cache.Get(kHanSimplifiedLocale);
+  EXPECT_TRUE(chinese_typefaces);
+  EXPECT_TRUE(chinese_typefaces->at(0)->unicharToGlyph(0x4E01));
+  EXPECT_EQ(lru_cache.size(), kLruCacheTestSize);
+
+  fillCacheWithDummies(lru_cache, "dummy_locale_2nd_%zu",
+                       kLruCacheTestSize - 1);
+  chinese_typefaces = nullptr;
+  chinese_typefaces = lru_cache.Get(kHanSimplifiedLocale);
+  EXPECT_TRUE(chinese_typefaces);
+  EXPECT_EQ(chinese_typefaces->size(), 1u);
+  EXPECT_TRUE(chinese_typefaces->at(0)->unicharToGlyph(kSecondCJKIdeograph));
+  EXPECT_EQ(lru_cache.size(), kLruCacheTestSize);
+
+  fillCacheWithDummies(lru_cache, "dummy_locale_3rd_%zu", kLruCacheTestSize);
+  chinese_typefaces = nullptr;
+  chinese_typefaces = lru_cache.Get(kHanSimplifiedLocale);
+  EXPECT_FALSE(chinese_typefaces);
+  EXPECT_EQ(lru_cache.size(), kLruCacheTestSize);
+}
+
+TEST(FallbackLruCacheTest, LargeFillAndClear) {
+  FallbackLruCache lru_cache(kLruCacheTestSize);
+  EXPECT_EQ(lru_cache.size(), 0u);
+  fillCacheWithDummies(lru_cache, "dummy_locale_%zu", 1000);
+  EXPECT_EQ(lru_cache.size(), kLruCacheTestSize);
+  lru_cache.Clear();
+  EXPECT_EQ(lru_cache.size(), 0u);
+}
+
+TEST(FallbackLruCacheTest, KeyOverride) {
+  FallbackLruCache lru_cache(kLruCacheTestSize);
+  EXPECT_EQ(lru_cache.size(), 0u);
+  fillCacheWithDummies(lru_cache, "same_locale", 10);
+  EXPECT_EQ(lru_cache.size(), 1u);
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/win/font_cache_skia_win.cc b/third_party/blink/renderer/platform/fonts/win/font_cache_skia_win.cc
index 0f25432e..53273cd 100644
--- a/third_party/blink/renderer/platform/fonts/win/font_cache_skia_win.cc
+++ b/third_party/blink/renderer/platform/fonts/win/font_cache_skia_win.cc
@@ -329,24 +329,36 @@
   // character + language tag and call matchFamilyStyleCharacter on the browser
   // side, where we can do that.
   if (!use_skia_font_fallback_) {
-    EnsureServiceConnected();
-
-    // After Mojo IPC, on the browser side, this ultimately reaches
-    // Skia's matchFamilyStyleCharacter for Windows, which does not implement
-    // traversing the language tag stack but only processes the most important
-    // one, so we use FallbackLocaleForCharacter() to determine what locale to
-    // choose to achieve the best possible result.
-
     String fallback_family;
     SkFontStyle fallback_style;
-    if (!GetOutOfProcessFallbackFamily(
-            codepoint, font_description.GenericFamily(),
-            fallback_locale->LocaleForSkFontMgr(), fallback_priority, service_,
-            &fallback_family, &fallback_style))
-      return nullptr;
 
-    if (fallback_family.IsEmpty())
-      return nullptr;
+    if (UNLIKELY(!fallback_params_cache_)) {
+      fallback_params_cache_ = std::make_unique<FallbackFamilyStyleCache>();
+    }
+
+    fallback_params_cache_->Get(
+        font_description.GenericFamily(), fallback_locale->LocaleForSkFontMgr(),
+        fallback_priority, codepoint, &fallback_family, &fallback_style);
+    bool result_from_cache = !fallback_family.IsNull();
+
+    if (!result_from_cache) {
+      EnsureServiceConnected();
+
+      // After Mojo IPC, on the browser side, this ultimately reaches
+      // Skia's matchFamilyStyleCharacter for Windows, which does not implement
+      // traversing the language tag stack but only processes the most important
+      // one, so we use FallbackLocaleForCharacter() to determine what locale to
+      // choose to achieve the best possible result.
+
+      if (!GetOutOfProcessFallbackFamily(
+              codepoint, font_description.GenericFamily(),
+              fallback_locale->LocaleForSkFontMgr(), fallback_priority,
+              service_, &fallback_family, &fallback_style))
+        return nullptr;
+
+      if (fallback_family.IsEmpty())
+        return nullptr;
+    }
 
     FontFaceCreationParams create_by_family((AtomicString(fallback_family)));
     FontDescription fallback_updated_font_description(font_description);
@@ -355,6 +367,12 @@
         fallback_updated_font_description, create_by_family);
     if (!data || !data->FontContainsCharacter(codepoint))
       return nullptr;
+
+    if (!result_from_cache) {
+      fallback_params_cache_->Put(font_description.GenericFamily(),
+                                  fallback_locale->LocaleForSkFontMgr(),
+                                  fallback_priority, data->Typeface());
+    }
     return FontDataFromFontPlatformData(data, kDoNotRetain);
   } else {
     std::string family_name = font_description.Family().Family().Utf8();
diff --git a/third_party/blink/renderer/platform/mojo/geometry_mojom_traits_test.cc b/third_party/blink/renderer/platform/mojo/geometry_mojom_traits_test.cc
index e33ef64..7ae4b5727 100644
--- a/third_party/blink/renderer/platform/mojo/geometry_mojom_traits_test.cc
+++ b/third_party/blink/renderer/platform/mojo/geometry_mojom_traits_test.cc
@@ -5,7 +5,8 @@
 #include <utility>
 
 #include "base/test/task_environment.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/geometry/mojom/geometry.mojom-blink.h"
 #include "ui/gfx/geometry/mojom/geometry_traits_test_service.mojom-blink.h"
@@ -21,9 +22,10 @@
   GeometryStructTraitsTest() {}
 
  protected:
-  gfx::mojom::blink::GeometryTraitsTestServicePtr GetTraitsTestProxy() {
-    gfx::mojom::blink::GeometryTraitsTestServicePtr proxy;
-    traits_test_bindings_.AddBinding(this, mojo::MakeRequest(&proxy));
+  mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService>
+  GetTraitsTestProxy() {
+    mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService> proxy;
+    traits_test_receivers_.Add(this, proxy.BindNewPipeAndPassReceiver());
     return proxy;
   }
 
@@ -93,8 +95,8 @@
     std::move(callback).Run(q);
   }
 
-  mojo::BindingSet<gfx::mojom::blink::GeometryTraitsTestService>
-      traits_test_bindings_;
+  mojo::ReceiverSet<gfx::mojom::blink::GeometryTraitsTestService>
+      traits_test_receivers_;
 
   base::test::TaskEnvironment task_environment_;
 
@@ -107,7 +109,8 @@
   const int32_t kWidth = 1234;
   const int32_t kHeight = 5678;
   WebSize input(kWidth, kHeight);
-  gfx::mojom::blink::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService> proxy =
+      GetTraitsTestProxy();
   WebSize output;
   proxy->EchoSize(input, &output);
   EXPECT_EQ(input, output);
@@ -117,7 +120,8 @@
   const float kX = 1234;
   const float kY = 5678;
   WebPoint input(kX, kY);
-  gfx::mojom::blink::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService> proxy =
+      GetTraitsTestProxy();
   WebPoint output;
   proxy->EchoPoint(input, &output);
   EXPECT_EQ(input, output);
@@ -127,7 +131,8 @@
   const float kX = 1.234;
   const float kY = 5.678;
   WebFloatPoint input(kX, kY);
-  gfx::mojom::blink::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService> proxy =
+      GetTraitsTestProxy();
   WebFloatPoint output;
   proxy->EchoPointF(input, &output);
   EXPECT_EQ(input, output);
@@ -138,7 +143,8 @@
   const float kY = 5.678;
   const float kZ = 9.098;
   WebFloatPoint3D input(kX, kY, kZ);
-  gfx::mojom::blink::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService> proxy =
+      GetTraitsTestProxy();
   WebFloatPoint3D output;
   proxy->EchoPoint3F(input, &output);
   EXPECT_EQ(input, output);
@@ -150,7 +156,8 @@
   const float kWidth = 3;
   const float kHeight = 4;
   WebRect input(kX, kY, kWidth, kHeight);
-  gfx::mojom::blink::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService> proxy =
+      GetTraitsTestProxy();
   WebRect output;
   proxy->EchoRect(input, &output);
   EXPECT_EQ(input, output);
@@ -162,7 +169,8 @@
   const float kWidth = 3.456;
   const float kHeight = 4.567;
   WebFloatRect input(kX, kY, kWidth, kHeight);
-  gfx::mojom::blink::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<gfx::mojom::blink::GeometryTraitsTestService> proxy =
+      GetTraitsTestProxy();
   WebFloatRect output;
   proxy->EchoRectF(input, &output);
   EXPECT_EQ(input, output);
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
index 3167040..cd34c21 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
@@ -8,6 +8,9 @@
 #include <memory>
 #include <vector>
 
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/command_line.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/memory/unsafe_shared_memory_region.h"
@@ -22,6 +25,7 @@
 #include "base/time/time.h"
 #include "media/base/bind_to_current_loop.h"
 #include "media/base/bitstream_buffer.h"
+#include "media/base/media_switches.h"
 #include "media/base/video_bitrate_allocation.h"
 #include "media/base/video_frame.h"
 #include "media/base/video_util.h"
@@ -211,6 +215,12 @@
   // Perform encoding on an input frame from the input queue.
   void EncodeOneFrame();
 
+  // Perform encoding on an input frame from the input queue using VEA native
+  // input mode.  The input frame must be backed with GpuMemoryBuffer buffers.
+  void EncodeOneFrameWithNativeInput();
+
+  void CreateBlackGpuMemoryBufferFrame(const gfx::Size& natural_size);
+
   // Notify that an input frame is finished for encoding.  |index| is the index
   // of the completed frame in |input_buffers_|.
   void EncodeFrameFinished(int index);
@@ -289,6 +299,13 @@
   // encoder.
   int output_buffers_free_count_;
 
+  // Whether to send the frames to VEA as native buffer. Native buffer allows
+  // VEA to pass the buffer to the encoder directly without further processing.
+  bool use_native_input_;
+
+  // A black GpuMemoryBuffer frame used when the video track is disabled.
+  scoped_refptr<media::VideoFrame> black_gmb_frame_;
+
   // webrtc::VideoEncoder encode complete callback.
   webrtc::EncodedImageCallback* encoded_image_callback_;
 
@@ -321,6 +338,7 @@
       input_next_frame_(nullptr),
       input_next_frame_keyframe_(false),
       output_buffers_free_count_(0),
+      use_native_input_(false),
       encoded_image_callback_(nullptr),
       video_codec_type_(video_codec_type),
       video_content_type_(video_content_type),
@@ -351,9 +369,21 @@
     return;
   }
   input_visible_size_ = input_visible_size;
+  media::VideoPixelFormat pixel_format = media::PIXEL_FORMAT_I420;
+  auto storage_type =
+      media::VideoEncodeAccelerator::Config::StorageType::kShmem;
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kVideoCaptureUseGpuMemoryBuffer) &&
+      video_content_type_ != webrtc::VideoContentType::SCREENSHARE) {
+    // Use import mode for camera when GpuMemoryBuffer-based video capture is
+    // enabled.
+    pixel_format = media::PIXEL_FORMAT_NV12;
+    storage_type = media::VideoEncodeAccelerator::Config::StorageType::kDmabuf;
+    use_native_input_ = true;
+  }
   const media::VideoEncodeAccelerator::Config config(
-      media::PIXEL_FORMAT_I420, input_visible_size_, profile, bitrate * 1000,
-      base::nullopt, base::nullopt, base::nullopt, base::nullopt,
+      pixel_format, input_visible_size_, profile, bitrate * 1000, base::nullopt,
+      base::nullopt, base::nullopt, storage_type,
       video_content_type_ == webrtc::VideoContentType::SCREENSHARE
           ? media::VideoEncodeAccelerator::Config::ContentType::kDisplay
           : media::VideoEncodeAccelerator::Config::ContentType::kCamera);
@@ -382,10 +412,10 @@
   }
 
   // If there are no free input and output buffers, drop the frame to avoid a
-  // deadlock. If there is a free input buffer, EncodeOneFrame will run and
-  // unblock Encode(). If there are no free input buffers but there is a free
-  // output buffer, EncodeFrameFinished will be called later to unblock
-  // Encode().
+  // deadlock. If there is a free input buffer and |use_native_input_| is false,
+  // EncodeOneFrame will run and unblock Encode(). If there are no free input
+  // buffers but there is a free output buffer, EncodeFrameFinished will be
+  // called later to unblock Encode().
   //
   // The caller of Encode() holds a webrtc lock. The deadlock happens when:
   // (1) Encode() is waiting for the frame to be encoded in EncodeOneFrame().
@@ -399,7 +429,8 @@
   // buffers. Returning an error in Encode() is not fatal and WebRTC will just
   // continue. If this is a key frame, WebRTC will request a key frame again.
   // Besides, webrtc will drop a frame if Encode() blocks too long.
-  if (input_buffers_free_.IsEmpty() && output_buffers_free_count_ == 0) {
+  if (!use_native_input_ && input_buffers_free_.IsEmpty() &&
+      output_buffers_free_count_ == 0) {
     DVLOG(2) << "Run out of input and output buffers. Drop the frame.";
     SignalAsyncWaiter(WEBRTC_VIDEO_CODEC_ERROR);
     return;
@@ -407,6 +438,13 @@
   input_next_frame_ = input_frame;
   input_next_frame_keyframe_ = force_keyframe;
 
+  // If |use_native_input_| is true, then we always queue the frame to the
+  // encoder since no intermediate buffer is needed in RTCVideoEncoder.
+  if (use_native_input_) {
+    EncodeOneFrameWithNativeInput();
+    return;
+  }
+
   if (!input_buffers_free_.IsEmpty())
     EncodeOneFrame();
 }
@@ -757,9 +795,97 @@
   SignalAsyncWaiter(WEBRTC_VIDEO_CODEC_OK);
 }
 
+void RTCVideoEncoder::Impl::EncodeOneFrameWithNativeInput() {
+  DVLOG(3) << "Impl::EncodeOneFrameWithNativeInput()";
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK(input_next_frame_);
+
+  // EncodeOneFrameWithNativeInput() may re-enter EncodeFrameFinished() if
+  // VEA::Encode() fails, we receive a VEA::NotifyError(), and the
+  // media::VideoFrame we pass to Encode() gets destroyed early.  Handle this by
+  // resetting our input_next_frame_* state before we hand off the VideoFrame to
+  // the VEA.
+  const webrtc::VideoFrame* next_frame = input_next_frame_;
+  const bool next_frame_keyframe = input_next_frame_keyframe_;
+  input_next_frame_ = nullptr;
+  input_next_frame_keyframe_ = false;
+
+  if (!video_encoder_) {
+    SignalAsyncWaiter(WEBRTC_VIDEO_CODEC_ERROR);
+    return;
+  }
+
+  scoped_refptr<media::VideoFrame> frame;
+  if (next_frame->video_frame_buffer()->type() !=
+      webrtc::VideoFrameBuffer::Type::kNative) {
+    // If we get a non-native frame it's because the video track is disabled and
+    // WebRTC VideoBroadcaster replaces the camera frame with a black YUV frame.
+    if (!black_gmb_frame_) {
+      gfx::Size natural_size(next_frame->width(), next_frame->height());
+      CreateBlackGpuMemoryBufferFrame(natural_size);
+    }
+    frame = media::VideoFrame::WrapVideoFrame(
+        black_gmb_frame_, black_gmb_frame_->format(),
+        black_gmb_frame_->visible_rect(), black_gmb_frame_->natural_size());
+    frame->set_timestamp(
+        base::TimeDelta::FromMilliseconds(next_frame->ntp_time_ms()));
+  } else {
+    frame = static_cast<blink::WebRtcVideoFrameAdapter*>(
+                next_frame->video_frame_buffer().get())
+                ->getMediaVideoFrame();
+  }
+  DCHECK_EQ(frame->storage_type(),
+            media::VideoFrame::STORAGE_GPU_MEMORY_BUFFER);
+
+  constexpr int kDummyIndex = -1;
+  frame->AddDestructionObserver(media::BindToCurrentLoop(base::BindOnce(
+      &RTCVideoEncoder::Impl::EncodeFrameFinished, this, kDummyIndex)));
+  if (!failed_timestamp_match_) {
+    DCHECK(std::find_if(pending_timestamps_.begin(), pending_timestamps_.end(),
+                        [&frame](const RTCTimestamps& entry) {
+                          return entry.media_timestamp_ == frame->timestamp();
+                        }) == pending_timestamps_.end());
+    pending_timestamps_.emplace_back(frame->timestamp(),
+                                     next_frame->timestamp(),
+                                     next_frame->render_time_ms());
+  }
+  video_encoder_->Encode(frame, next_frame_keyframe);
+  SignalAsyncWaiter(WEBRTC_VIDEO_CODEC_OK);
+}
+
+void RTCVideoEncoder::Impl::CreateBlackGpuMemoryBufferFrame(
+    const gfx::Size& natural_size) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  auto gmb = gpu_factories_->CreateGpuMemoryBuffer(
+      natural_size, gfx::BufferFormat::YUV_420_BIPLANAR,
+      gfx::BufferUsage::SCANOUT_VEA_READ_CAMERA_AND_CPU_READ_WRITE);
+
+  // Fills the NV12 frame with YUV black (0x00, 0x80, 0x80).
+  const auto gmb_size = gmb->GetSize();
+  gmb->Map();
+  memset(static_cast<uint8_t*>(gmb->memory(0)), 0x0,
+         gmb->stride(0) * gmb_size.height());
+  memset(static_cast<uint8_t*>(gmb->memory(1)), 0x80,
+         gmb->stride(1) * gmb_size.height());
+  gmb->Unmap();
+
+  gpu::MailboxHolder empty_mailboxes[media::VideoFrame::kMaxPlanes];
+  black_gmb_frame_ = media::VideoFrame::WrapExternalGpuMemoryBuffer(
+      gfx::Rect(gmb_size), natural_size, std::move(gmb), empty_mailboxes,
+      base::NullCallback(), base::TimeDelta());
+}
+
 void RTCVideoEncoder::Impl::EncodeFrameFinished(int index) {
   DVLOG(3) << "Impl::EncodeFrameFinished(): index=" << index;
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  if (use_native_input_) {
+    if (input_next_frame_)
+      EncodeOneFrameWithNativeInput();
+    return;
+  }
+
   DCHECK_GE(index, 0);
   DCHECK_LT(index, static_cast<int>(input_buffers_.size()));
   input_buffers_free_.push_back(index);
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNGFragmentItem b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNGFragmentItem
new file mode 100644
index 0000000..7575ac9
--- /dev/null
+++ b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNGFragmentItem
@@ -0,0 +1,2329 @@
+crbug.com/982194 accessibility/adjacent-continuations-cause-assertion-failure.html [ Failure ]
+crbug.com/982194 accessibility/aom-focus-action.html [ Crash ]
+crbug.com/982194 accessibility/aria-combo-box-with-delay-add.html [ Crash ]
+crbug.com/982194 accessibility/aria-combo-box-with-delay.html [ Crash ]
+crbug.com/982194 accessibility/aria-combo-box.html [ Crash ]
+crbug.com/982194 accessibility/aria-tables.html [ Failure ]
+crbug.com/982194 accessibility/aria1.1-combo-box-with-delay.html [ Crash ]
+crbug.com/982194 accessibility/aria1.1-combo-box.html [ Crash ]
+crbug.com/982194 accessibility/bounds-calc.html [ Failure ]
+crbug.com/982194 accessibility/canvas-fallback-content-2.html [ Crash ]
+crbug.com/982194 accessibility/canvas-fallback-content.html [ Crash ]
+crbug.com/982194 accessibility/click-event.html [ Timeout ]
+crbug.com/982194 accessibility/dimensions-include-descendants.html [ Failure ]
+crbug.com/982194 accessibility/disabled-controls-not-focusable.html [ Crash ]
+crbug.com/982194 accessibility/ellipsis-text.html [ Failure ]
+crbug.com/982194 accessibility/first-letter-text-transform-causes-crash.html [ Failure ]
+crbug.com/982194 accessibility/first-letter-text-transform.html [ Failure ]
+crbug.com/982194 accessibility/get-selection-images.html [ Crash ]
+crbug.com/982194 accessibility/inline-text-bounds-for-range.html [ Failure ]
+crbug.com/982194 accessibility/inline-text-change-style.html [ Failure ]
+crbug.com/982194 accessibility/inline-text-changes.html [ Failure ]
+crbug.com/982194 accessibility/inline-text-word-boundaries.html [ Failure ]
+crbug.com/982194 accessibility/label-for-control-hittest.html [ Failure ]
+crbug.com/982194 accessibility/listitem-presentation-inherited.html [ Failure ]
+crbug.com/982194 accessibility/menu-list-open.html [ Crash ]
+crbug.com/982194 accessibility/presentation-owned-elements.html [ Failure ]
+crbug.com/982194 accessibility/role-attribute.html [ Failure ]
+crbug.com/982194 accessibility/selection-affinity.html [ Failure ]
+crbug.com/982194 accessibility/selection-change-notification-aria-textbox.html [ Crash ]
+crbug.com/982194 accessibility/selection-change-notification-input.html [ Crash ]
+crbug.com/982194 accessibility/selection-change-notification-statictext.html [ Crash ]
+crbug.com/982194 accessibility/selection-change-notification-textarea.html [ Crash ]
+crbug.com/982194 accessibility/selection-dom-events.html [ Crash ]
+crbug.com/982194 accessibility/set-selection-child-offset.html [ Crash ]
+crbug.com/982194 accessibility/set-selection-images.html [ Crash ]
+crbug.com/982194 accessibility/set-selection-link.html [ Crash ]
+crbug.com/982194 accessibility/table-header-column-row.html [ Failure ]
+crbug.com/982194 accessibility/table-with-empty-thead-causes-crash.html [ Failure ]
+crbug.com/982194 animations/inline-transform.html [ Failure ]
+crbug.com/982194 animations/rotate-transform-equivalent.html [ Failure ]
+crbug.com/982194 compositing/flex-composited-animated-table-row-background.html [ Failure ]
+crbug.com/982194 compositing/geometry/fixed-in-composited.html [ Failure ]
+crbug.com/982194 compositing/geometry/foreground-offset-change.html [ Failure ]
+crbug.com/982194 compositing/geometry/limit-layer-bounds-opacity-transition.html [ Failure ]
+crbug.com/982194 compositing/geometry/limit-layer-bounds-positioned.html [ Failure ]
+crbug.com/982194 compositing/geometry/outline-change.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-iframe-composited-scrolled-late-noncomposite.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-iframe-composited-scrolled.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-iframe-composited.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-overflow-div-composited-scrolled.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-overflow-div-composited.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-composite.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-1-overflow-div-scrolled-late-noncomposite.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-form-input-text.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-img-and-text-2.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-img-and-text.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-img-transformed.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-img.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-invisible-inline-squashing.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-invisible-inline.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-on-promoted-overflow-div-scrolled.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-pixel-rotated-link.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-pixel-transparent.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-background.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-cancel.html [ Failure ]
+crbug.com/309675 compositing/gestures/gesture-tapHighlight-simple-longPress.html [ Failure Crash ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-margin.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-multi-line.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-nested.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple-window-scroll.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-simple.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-with-box-shadow.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-with-filter.html [ Failure ]
+crbug.com/982194 compositing/gestures/gesture-tapHighlight-with-squashing.html [ Failure ]
+crbug.com/982194 compositing/iframes/crash-mouse-event.html [ Crash ]
+crbug.com/982194 compositing/iframes/invisible-nested-iframe-hide.html [ Crash ]
+crbug.com/982194 compositing/iframes/invisible-nested-iframe-show.html [ Crash ]
+crbug.com/982194 compositing/iframes/layout-on-compositing-change.html [ Crash ]
+crbug.com/982194 compositing/layer-creation/fixed-position-out-of-view-positioning.html [ Crash ]
+crbug.com/982194 compositing/overflow/ancestor-overflow.html [ Failure ]
+crbug.com/982194 compositing/overflow/get-transform-from-non-box-container.html [ Failure ]
+crbug.com/982194 compositing/overflow/overflow-scroll-with-negative-offset-translucent-outline.html [ Failure ]
+crbug.com/982194 compositing/overflow/scroll-children-do-not-paint-comp-scroll-phase.html [ Failure ]
+crbug.com/982194 compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers.html [ Crash ]
+crbug.com/982194 compositing/reflections/nested-reflection-animated.html [ Failure ]
+crbug.com/982194 compositing/reflections/remove-reflection.html [ Crash ]
+crbug.com/982194 compositing/squashing/no-squashing-into-another-clip-layer.html [ Failure ]
+crbug.com/982194 compositing/squashing/selection-repaint-with-gaps.html [ Crash ]
+crbug.com/982194 compositing/squashing/squash-above-fixed-2.html [ Crash ]
+crbug.com/982194 compositing/squashing/squash-transform-repainting-child.html [ Failure ]
+crbug.com/982194 compositing/squashing/squash-transform-repainting-transformed-child.html [ Failure ]
+crbug.com/982194 compositing/squashing/vertical-writing-mode-squashed.html [ Failure ]
+crbug.com/982194 compositing/video/video-neg-offset-outline.html [ Failure ]
+crbug.com/982194 css1/basic/containment.html [ Failure ]
+crbug.com/982194 css1/basic/contextual_selectors.html [ Failure ]
+crbug.com/982194 css1/basic/id_as_selector.html [ Failure ]
+crbug.com/982194 css1/box_properties/acid_test.html [ Failure ]
+crbug.com/982194 css1/box_properties/border_bottom.html [ Failure ]
+crbug.com/982194 css1/box_properties/border_left.html [ Failure ]
+crbug.com/982194 css1/box_properties/border_right_inline.html [ Failure ]
+crbug.com/982194 css1/box_properties/border_top.html [ Failure ]
+crbug.com/982194 css1/box_properties/clear.html [ Failure ]
+crbug.com/982194 css1/box_properties/clear_float.html [ Failure ]
+crbug.com/982194 css1/box_properties/float_margin.html [ Failure ]
+crbug.com/982194 css1/box_properties/float_on_text_elements.html [ Failure ]
+crbug.com/982194 css1/box_properties/margin_left.html [ Failure ]
+crbug.com/982194 css1/box_properties/margin_right.html [ Failure ]
+crbug.com/982194 css1/box_properties/padding_left.html [ Failure ]
+crbug.com/982194 css1/box_properties/padding_right.html [ Failure ]
+crbug.com/982194 css1/cascade/cascade_order.html [ Failure ]
+crbug.com/982194 css1/classification/display.html [ Failure ]
+crbug.com/982194 css1/classification/list_style.html [ Failure ]
+crbug.com/982194 css1/classification/list_style_image.html [ Failure ]
+crbug.com/982194 css1/classification/list_style_position.html [ Failure ]
+crbug.com/982194 css1/classification/list_style_type.html [ Failure ]
+crbug.com/982194 css1/formatting_model/floating_elements.html [ Failure ]
+crbug.com/982194 css1/formatting_model/inline_elements.html [ Failure ]
+crbug.com/982194 css1/pseudo/anchor.html [ Failure ]
+crbug.com/982194 css2.1/t040105-atkeyw-00-b.html [ Failure ]
+crbug.com/982194 css2.1/t040105-import-10-b.html [ Failure ]
+crbug.com/982194 css2.1/t0402-c71-fwd-parsing-02-f.html [ Failure ]
+crbug.com/982194 css2.1/t040304-c64-uri-00-a-g.html [ Failure ]
+crbug.com/982194 css2.1/t0505-c16-descendant-01-e.html [ Failure ]
+crbug.com/982194 css2.1/t050803-c14-classes-00-e.html [ Failure ]
+crbug.com/982194 css2.1/t0509-c15-ids-01-e.html [ Failure ]
+crbug.com/982194 css2.1/t0510-c25-pseudo-elmnt-00-c.html [ Failure ]
+crbug.com/982194 css2.1/t0603-c11-import-00-b.html [ Failure ]
+crbug.com/982194 css2.1/t0805-c5518-brdr-t-01-e.html [ Failure ]
+crbug.com/982194 css2.1/t0805-c5519-brdr-r-02-e.html [ Failure ]
+crbug.com/982194 css2.1/t0805-c5520-brdr-b-01-e.html [ Failure ]
+crbug.com/982194 css2.1/t0805-c5521-brdr-l-02-e.html [ Failure ]
+crbug.com/982194 css2.1/t09-c5526c-display-00-e.html [ Failure ]
+crbug.com/982194 css2.1/t0905-c414-flt-00-d.html [ Failure ]
+crbug.com/982194 css2.1/t0905-c414-flt-01-d-g.html [ Failure ]
+crbug.com/982194 css2.1/t0905-c414-flt-02-c.html [ Failure ]
+crbug.com/982194 css2.1/t0905-c414-flt-03-c.html [ Failure ]
+crbug.com/982194 css2.1/t0905-c414-flt-04-c.html [ Failure ]
+crbug.com/982194 css2.1/t0905-c414-flt-fit-00-d.html [ Failure ]
+crbug.com/982194 css2.1/t0905-c414-flt-fit-01-d-g.html [ Failure ]
+crbug.com/982194 css2.1/t0905-c414-flt-wrap-00-e.html [ Failure ]
+crbug.com/982194 css2.1/t0905-c414-flt-wrap-01-d-g.html [ Failure ]
+crbug.com/982194 css2.1/t0905-c5525-fltcont-00-d-g.html [ Failure ]
+crbug.com/982194 css2.1/t0905-c5525-fltinln-00-c-ag.html [ Failure ]
+crbug.com/982194 css2.1/t0905-c5525-fltmrgn-00-c-ag.html [ Failure ]
+crbug.com/982194 css2.1/t0905-c5525-fltwidth-01-c-g.html [ Failure ]
+crbug.com/982194 css2.1/t0905-c5525-fltwidth-02-c-g.html [ Failure ]
+crbug.com/982194 css2.1/t0905-c5525-fltwidth-03-c-g.html [ Failure ]
+crbug.com/982194 css2.1/t090501-c414-flt-00-d.html [ Failure ]
+crbug.com/982194 css2.1/t090501-c414-flt-01-b.html [ Failure ]
+crbug.com/982194 css2.1/t090501-c414-flt-02-d-g.html [ Failure ]
+crbug.com/982194 css2.1/t090501-c414-flt-03-b-g.html [ Failure ]
+crbug.com/982194 css2.1/t090501-c414-flt-ln-00-d.html [ Failure ]
+crbug.com/982194 css2.1/t090501-c414-flt-ln-01-d-g.html [ Failure ]
+crbug.com/982194 css2.1/t090501-c414-flt-ln-02-d.html [ Failure ]
+crbug.com/982194 css2.1/t090501-c414-flt-ln-03-d.html [ Failure ]
+crbug.com/982194 css2.1/t090501-c5525-flt-l-00-b-g.html [ Failure ]
+crbug.com/982194 css2.1/t090501-c5525-flt-r-00-b-g.html [ Failure ]
+crbug.com/982194 css2.1/t100801-c544-valgn-00-a-ag.html [ Failure ]
+crbug.com/982194 css2.1/t100801-c544-valgn-03-d-agi.html [ Failure ]
+crbug.com/982194 css2.1/t1205-c563-list-type-00-b.html [ Failure ]
+crbug.com/982194 css2.1/t1205-c563-list-type-01-b.html [ Failure ]
+crbug.com/982194 css2.1/t1205-c564-list-img-00-b-g.html [ Failure ]
+crbug.com/982194 css2.1/20110323/at-import-006.htm [ Failure ]
+crbug.com/982194 css2.1/20110323/eof-005.htm [ Failure ]
+crbug.com/982194 css2.1/20110323/height-applies-to-010a.htm [ Failure ]
+crbug.com/982194 css2.1/20110323/margin-applies-to-010.htm [ Failure ]
+crbug.com/982194 css2.1/20110323/outline-color-001.htm [ Failure ]
+crbug.com/982194 css2.1/20110323/outline-color-applies-to-007.htm [ Failure ]
+crbug.com/982194 css2.1/20110323/outline-color-applies-to-008.htm [ Failure ]
+crbug.com/982194 css2.1/20110323/outline-color-applies-to-009.htm [ Failure ]
+crbug.com/982194 css2.1/20110323/outline-color-applies-to-012.htm [ Failure ]
+crbug.com/982194 css2.1/20110323/outline-color-applies-to-015.htm [ Failure ]
+crbug.com/982194 css2.1/20110323/overflow-applies-to-013.htm [ Failure ]
+crbug.com/982194 css2.1/20110323/overflow-applies-to-014.htm [ Failure ]
+crbug.com/982194 css3/tab-size-complex-path.html [ Failure ]
+crbug.com/982194 css3/blending/background-blend-mode-crossfade-image-gradient.html [ Failure ]
+crbug.com/982194 css3/blending/background-blend-mode-gif-color.html [ Failure ]
+crbug.com/982194 css3/blending/background-blend-mode-gradient-color.html [ Failure ]
+crbug.com/982194 css3/blending/background-blend-mode-gradient-gradient.html [ Failure ]
+crbug.com/982194 css3/blending/background-blend-mode-gradient-image.html [ Failure ]
+crbug.com/982194 css3/blending/background-blend-mode-image-color.html [ Failure ]
+crbug.com/982194 css3/blending/background-blend-mode-image-image.html [ Failure ]
+crbug.com/982194 css3/blending/background-blend-mode-image-svg.html [ Failure ]
+crbug.com/982194 css3/blending/background-blend-mode-svg-color.html [ Failure ]
+crbug.com/982194 css3/blending/background-blend-mode-tiled-gradient.html [ Failure ]
+crbug.com/982194 css3/blending/effect-background-blend-mode-stacking.html [ Failure ]
+crbug.com/982194 css3/blending/effect-background-blend-mode-tiled.html [ Failure ]
+crbug.com/982194 css3/blending/effect-background-blend-mode.html [ Failure ]
+crbug.com/982194 css3/blending/mix-blend-mode-has-ancestor-clipping-layer.html [ Failure ]
+crbug.com/982194 css3/blending/mix-blend-mode-simple-text.html [ Failure ]
+crbug.com/982194 css3/blending/mix-blend-mode-simple.html [ Failure ]
+crbug.com/982194 css3/filters/filter-region.html [ Failure ]
+crbug.com/982194 css3/filters/filtered-inline.html [ Failure ]
+crbug.com/982194 css3/filters/nested-filters.html [ Failure ]
+crbug.com/982194 css3/filters/null-effect-check.html [ Failure ]
+crbug.com/982194 css3/flexbox/flexbox-baseline-margins.html [ Failure ]
+crbug.com/982194 css3/flexbox/flexbox-baseline.html [ Failure ]
+crbug.com/982194 css3/flexbox/multiline-shrink-to-fit.html [ Failure ]
+crbug.com/982194 css3/flexbox/percentage-height-replaced-element.html [ Failure ]
+crbug.com/982194 css3/masking/clip-path-reference-box-inline.html [ Failure ]
+crbug.com/982194 css3/masking/clip-path-selection.html [ Crash ]
+crbug.com/982194 css3/masking/inline-in-vertical-rl.html [ Failure ]
+crbug.com/982194 css3/masking/mask-not-clipped.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-1.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-13.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-15.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-167.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-167a.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-22.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-28.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-28b.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-29.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-29b.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-38.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-3a.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-73.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-73b.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-74.html [ Failure ]
+crbug.com/982194 css3/selectors3/html/css3-modsel-74b.html [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-1.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-13.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-15.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-167.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-167a.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-22.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-28.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-28b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-29.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-29b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-3.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-38.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-3a.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-73.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-73b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-74.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xhtml/css3-modsel-74b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-1.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-13.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-14.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-14c.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-14d.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-14e.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-15.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-15b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-15c.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-167.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-167a.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-170.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-170a.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-170b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-170c.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-171.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-175a.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-175c.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-176.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-177b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-181.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-182.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-183.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-184a.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-184b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-184c.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-184d.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-184e.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-184f.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-18c.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-22.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-27b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-28.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-28b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-29.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-29b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-3.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-35.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-38.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-3a.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-44c.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-47.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-51.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-52.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-53.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-54.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-55.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-56.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-59.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-60.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-64.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-73.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-73b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-74.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-74b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-80.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-86.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-87.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-87b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-88b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-89.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-90.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-90b.xml [ Failure ]
+crbug.com/982194 css3/selectors3/xml/css3-modsel-d4.xml [ Failure ]
+crbug.com/982194 custom-elements/form-validation-bubble-anchor.html [ Crash ]
+crbug.com/982194 custom-elements/form-validation-bubble-appearance.html [ Failure ]
+crbug.com/982194 dom/node/mutation-blur.html [ Crash ]
+crbug.com/982194 editing/assert_selection.html [ Crash ]
+crbug.com/982194 editing/caret/caret-direction-auto.html [ Crash ]
+crbug.com/982194 editing/caret/caret_affinity_mouse_perturbation.html [ Crash ]
+crbug.com/982194 editing/caret/selection-with-caret-type-progress.html [ Crash ]
+crbug.com/982194 editing/deleting/460938.html [ Crash ]
+crbug.com/982194 editing/deleting/delete-all-text-in-text-field-assertion.html [ Crash ]
+crbug.com/982194 editing/deleting/delete-character-002.html [ Crash ]
+crbug.com/982194 editing/deleting/delete-ligature-001.html [ Crash ]
+crbug.com/982194 editing/deleting/move-nodes-001.html [ Failure ]
+crbug.com/982194 editing/deleting/password-delete-contents.html [ Crash ]
+crbug.com/982194 editing/execCommand/35791.html [ Crash ]
+crbug.com/982194 editing/execCommand/clipboard-access-with-userGesture.html [ Crash ]
+crbug.com/982194 editing/execCommand/delete-hidden-crash.html [ Crash ]
+crbug.com/982194 editing/execCommand/delete-textarea-readonly-removed.html [ Crash ]
+crbug.com/982194 editing/execCommand/dispatch-text-event-crash.html [ Crash ]
+crbug.com/982194 editing/execCommand/findString-3.html [ Crash ]
+crbug.com/982194 editing/execCommand/findString-diacriticals.html [ Crash ]
+crbug.com/982194 editing/execCommand/insertNewLineInQuotedContent-outside-quote.html [ Crash ]
+crbug.com/982194 editing/execCommand/queryCommandState-list.html [ Crash ]
+crbug.com/982194 editing/input/div-first-child-rule-input.html [ Crash ]
+crbug.com/982194 editing/input/div-first-child-rule-textarea.html [ Crash ]
+crbug.com/982194 editing/input/editable-container-with-word-wrap-normal.html [ Crash ]
+crbug.com/982194 editing/input/insert-wrapping-space-in-textarea.html [ Crash ]
+crbug.com/982194 editing/input/keyboard-ctrl-enter-no-newline.html [ Crash ]
+crbug.com/982194 editing/input/paste-text-ending-with-interchange-newline.html [ Crash ]
+crbug.com/982194 editing/input/reveal-caret-of-transformed-input-scrollable-parent.html [ Crash ]
+crbug.com/982194 editing/input/scroll-with-tab-to-input-regression.html [ Crash ]
+crbug.com/982194 editing/input/setting-input-value-cancel-ime-composition.html [ Crash ]
+crbug.com/982194 editing/input/textcontrol-doubleclick-at-end.html [ Crash ]
+crbug.com/982194 editing/inserting/insert-character-in-overflow-crash.html [ Crash ]
+crbug.com/982194 editing/inserting/insert-newline-into-dynamically-created-textarea.html [ Crash ]
+crbug.com/982194 editing/inserting/insert-paragraph-empty-textarea.html [ Crash ]
+crbug.com/982194 editing/inserting/insert-paragraph-selection-outside-contenteditable.html [ Crash ]
+crbug.com/982194 editing/pasteboard/copy-crash.html [ Timeout ]
+crbug.com/982194 editing/pasteboard/copy-cut-paste-keyevent.html [ Crash ]
+crbug.com/982194 editing/pasteboard/copy-display-none.html [ Crash ]
+crbug.com/982194 editing/pasteboard/copy-paste-white-space.html [ Crash ]
+crbug.com/982194 editing/pasteboard/copy-summary-crash.html [ Crash ]
+crbug.com/982194 editing/pasteboard/data-transfer-items-drag-drop-string.html [ Crash ]
+crbug.com/663585 editing/pasteboard/data-transfer-items-image-png.html [ Pass Failure Crash ]
+crbug.com/982194 editing/pasteboard/dataTransfer-setData-getData.html [ Crash ]
+crbug.com/982194 editing/pasteboard/drag-drop-copy-text.html [ Crash ]
+crbug.com/982194 editing/pasteboard/drag-drop-dead-frame.html [ Crash ]
+crbug.com/982194 editing/pasteboard/drag-drop-iframe-refresh-crash.html [ Crash ]
+crbug.com/982194 editing/pasteboard/drag-drop-input-textarea.html [ Crash ]
+crbug.com/982194 editing/pasteboard/drag-drop-modifies-page.html [ Crash ]
+crbug.com/982194 editing/pasteboard/drag-drop-to-data-url.html [ Crash ]
+crbug.com/982194 editing/pasteboard/drag-drop-url-text.html [ Crash ]
+crbug.com/982194 editing/pasteboard/drag-drop-url-with-style.html [ Crash ]
+crbug.com/982194 editing/pasteboard/drag-image-in-about-blank-frame.html [ Crash ]
+crbug.com/982194 editing/pasteboard/drag-image-to-contenteditable-in-iframe.html [ Crash ]
+crbug.com/982194 editing/pasteboard/drag-list-item.html [ Crash ]
+crbug.com/982194 editing/pasteboard/drag-prioritizes-draggable-container-over-image.html [ Crash ]
+crbug.com/982194 editing/pasteboard/dragstart-contains-default-content.html [ Crash ]
+crbug.com/982194 editing/pasteboard/drop-file-svg.html [ Timeout ]
+crbug.com/982194 editing/pasteboard/drop-text-without-selection.html [ Crash ]
+crbug.com/982194 editing/pasteboard/file-input-files-access.html [ Failure ]
+crbug.com/982194 editing/pasteboard/files-during-page-drags.html [ Crash ]
+crbug.com/982194 editing/pasteboard/mixed_editability.html [ Crash ]
+crbug.com/982194 editing/pasteboard/no-clipboard-event-to-hidden-selection.html [ Crash ]
+crbug.com/982194 editing/pasteboard/onpaste-text-html-types.html [ Crash ]
+crbug.com/982194 editing/pasteboard/paste-plaintext-user-select-none.html [ Crash ]
+crbug.com/982194 editing/pasteboard/paste-when-over-link.html [ Crash ]
+crbug.com/982194 editing/pasteboard/paste-xml.xhtml [ Crash ]
+crbug.com/982194 editing/pasteboard/pasteboard_with_unfocused_selection.html [ Crash ]
+crbug.com/982194 editing/pasteboard/selection-paste-crash.html [ Crash ]
+crbug.com/982194 editing/pasteboard/smart-drag-drop.html [ Crash ]
+crbug.com/982194 editing/pasteboard/smart-paste-in-text-control.html [ Crash ]
+crbug.com/982194 editing/pasteboard/smart_paste.html [ Crash ]
+crbug.com/982194 editing/pasteboard/subframe-dragndrop-1.html [ Crash ]
+crbug.com/982194 editing/pasteboard/text-selection.html [ Crash ]
+crbug.com/982194 editing/selection/4402375.html [ Crash ]
+crbug.com/982194 editing/selection/5131716-1.html [ Crash ]
+crbug.com/982194 editing/selection/5136696.html [ Crash ]
+crbug.com/982194 editing/selection/5209984.html [ Crash ]
+crbug.com/982194 editing/selection/5232159.html [ Crash ]
+crbug.com/982194 editing/selection/5354455-1.html [ Crash ]
+crbug.com/982194 editing/selection/5714333.html [ Crash ]
+crbug.com/982194 editing/selection/addRange-failures.html [ Crash ]
+crbug.com/982194 editing/selection/addrange-crash.html [ Crash ]
+crbug.com/982194 editing/selection/anchor-focus3.html [ Crash ]
+crbug.com/982194 editing/selection/button-right-click.html [ Crash ]
+crbug.com/982194 editing/selection/clear-selection.html [ Failure ]
+crbug.com/982194 editing/selection/click-in-focusable-link-should-not-clear-selection.html [ Crash ]
+crbug.com/982194 editing/selection/click-in-padding-with-multiple-line-boxes.html [ Crash ]
+crbug.com/982194 editing/selection/click-on-anonymous-content-crash.html [ Crash ]
+crbug.com/982194 editing/selection/collapseto_in_text_fields.html [ Crash ]
+crbug.com/982194 editing/selection/commit-pending-selection-crash.html [ Crash ]
+crbug.com/982194 editing/selection/containsNode.html [ Crash ]
+crbug.com/982194 editing/selection/context-menu-on-text.html [ Crash ]
+crbug.com/982194 editing/selection/context-menu-text-selection.html [ Crash ]
+crbug.com/982194 editing/selection/continuations-with-move-caret-to-boundary.html [ Crash ]
+crbug.com/982194 editing/selection/delete-word-granularity-text-control.html [ Crash ]
+crbug.com/982194 editing/selection/deleteFromDocument-scoped-dispatch-event-crash.html [ Crash ]
+crbug.com/982194 editing/selection/deletefromdocument-shadow-leak.html [ Crash ]
+crbug.com/982194 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-ltr-mixed.html [ Crash ]
+crbug.com/982194 editing/selection/dont-select-text-overflow-ellipsis-when-wrapping.html [ Crash ]
+crbug.com/982194 editing/selection/double_click_and_modify.html [ Crash ]
+crbug.com/982194 editing/selection/doubleclick-whitespace-crash.html [ Crash ]
+crbug.com/982194 editing/selection/doubleclick-whitespace-img-crash.html [ Crash ]
+crbug.com/982194 editing/selection/doubleclick-whitespace.html [ Crash ]
+crbug.com/982194 editing/selection/drag-drop-events.html [ Crash ]
+crbug.com/982194 editing/selection/drag-drop-restore.html [ Crash ]
+crbug.com/982194 editing/selection/drag-input-text-nested-in-draggable-element.html [ Failure ]
+crbug.com/982194 editing/selection/drag-select-rapidly.html [ Crash ]
+crbug.com/982194 editing/selection/drag-selection-nodes.html [ Crash ]
+crbug.com/982194 editing/selection/drag-text-delay.html [ Crash ]
+crbug.com/982194 editing/selection/drag-to-contenteditable-iframe.html [ Crash ]
+crbug.com/982194 editing/selection/drag_with_unfocused_selection.html [ Crash ]
+crbug.com/982194 editing/selection/extend-by-line-anonymous-content-crash.html [ Crash ]
+crbug.com/982194 editing/selection/extend-by-line-in-empty-document.html [ Crash ]
+crbug.com/982194 editing/selection/extend-by-sentence-002.html [ Crash ]
+crbug.com/982194 editing/selection/extend-over-file-input-by-drag-crash.html [ Crash ]
+crbug.com/982194 editing/selection/extend-selection-after-double-click.html [ Crash ]
+crbug.com/982194 editing/selection/extend.html [ Crash ]
+crbug.com/982194 editing/selection/first-letter-mouse-select-full-text.html [ Crash ]
+crbug.com/982194 editing/selection/first-letter-selection-crash.html [ Crash ]
+crbug.com/982194 editing/selection/firstRect-crash.html [ Crash ]
+crbug.com/982194 editing/selection/focus-and-display-none.html [ Crash ]
+crbug.com/982194 editing/selection/focus-crash.html [ Crash ]
+crbug.com/982194 editing/selection/home-inside-noneditable-table.html [ Crash ]
+crbug.com/982194 editing/selection/inline-closest-leaf-child.html [ Crash ]
+crbug.com/982194 editing/selection/japanese-lr-selection.html [ Crash ]
+crbug.com/982194 editing/selection/last-empty-inline.html [ Crash ]
+crbug.com/982194 editing/selection/legal-positions.html [ Crash ]
+crbug.com/982194 editing/selection/line-wrap-1.html [ Crash ]
+crbug.com/982194 editing/selection/line-wrap-2.html [ Crash ]
+crbug.com/982194 editing/selection/longpress-selection-in-iframe-removed-crash.html [ Crash ]
+crbug.com/982194 editing/selection/mixed-editability-10.html [ Crash ]
+crbug.com/982194 editing/selection/modify-crash.html [ Crash ]
+crbug.com/982194 editing/selection/move-into-empty-root-inline-box.html [ Crash ]
+crbug.com/982194 editing/selection/move-node-in-selection-crash.html [ Crash ]
+crbug.com/982194 editing/selection/move-paragraph-document-edges.html [ Crash ]
+crbug.com/982194 editing/selection/offset-from-point-complex-scripts.html [ Failure ]
+crbug.com/982194 editing/selection/offset-from-point.html [ Failure ]
+crbug.com/591099 editing/selection/paint-hyphen.html [ Pass Failure Crash ]
+crbug.com/982194 editing/selection/range-between-block-and-inline.html [ Crash ]
+crbug.com/982194 editing/selection/readonly-disabled-hittest.html [ Crash ]
+crbug.com/982194 editing/selection/readonly-disabled-text-selection.html [ Crash ]
+crbug.com/982194 editing/selection/root-inlinebox-selected-children-crash.html [ Crash ]
+crbug.com/982194 editing/selection/select-crash-001.html [ Crash ]
+crbug.com/982194 editing/selection/select-crash-002.html [ Crash ]
+crbug.com/982194 editing/selection/select-from-textfield-outwards.html [ Failure ]
+crbug.com/982194 editing/selection/select-line-break-with-opposite-directionality.html [ Crash ]
+crbug.com/982194 editing/selection/select-out-of-floated-contenteditable.html [ Crash ]
+crbug.com/982194 editing/selection/select-out-of-floated-textarea.html [ Crash ]
+crbug.com/982194 editing/selection/select-text-overflow-ellipsis-mixed-in-ltr.html [ Crash ]
+crbug.com/982194 editing/selection/select-text-overflow-ellipsis-mixed-in-rtl-2.html [ Crash ]
+crbug.com/982194 editing/selection/select-text-overflow-ellipsis-mixed-in-rtl.html [ Crash ]
+crbug.com/982194 editing/selection/select-text-overflow-ellipsis.html [ Crash ]
+crbug.com/982194 editing/selection/selectNode.html [ Failure ]
+crbug.com/982194 editing/selection/selectNodeContents.html [ Failure ]
+crbug.com/982194 editing/selection/selectallchildren-crash.html [ Crash ]
+crbug.com/982194 editing/selection/selection-after-split-text-node.html [ Crash ]
+crbug.com/982194 editing/selection/selection-after-text-normalize.html [ Crash ]
+crbug.com/982194 editing/selection/selection-background.html [ Crash ]
+crbug.com/982194 editing/selection/selection-button-text.html [ Crash ]
+crbug.com/982194 editing/selection/selection-exceptions.html [ Crash ]
+crbug.com/982194 editing/selection/selection-modify-crash.html [ Crash ]
+crbug.com/982194 editing/selection/shift-click.html [ Crash ]
+crbug.com/982194 editing/selection/table-element-crash.html [ Crash ]
+crbug.com/982194 editing/selection/thai-word-at-document-end.html [ Crash ]
+crbug.com/982194 editing/selection/toString.html [ Crash ]
+crbug.com/982194 editing/selection/transformed-selection-rects.html [ Crash ]
+crbug.com/982194 editing/selection/undo-crash.html [ Crash ]
+crbug.com/982194 editing/selection/user-select-all-with-shift.html [ Crash ]
+crbug.com/982194 editing/selection/vertical-lr-replaced-selection.html [ Crash ]
+crbug.com/982194 editing/selection/vertical-rl-replaced-selection.html [ Crash ]
+crbug.com/982194 editing/selection/word-granularity.html [ Crash ]
+crbug.com/982194 editing/selection/modify_extend/extend_by_word_002.html [ Crash ]
+crbug.com/982194 editing/selection/modify_extend/extend_forward_line_crash.html [ Crash ]
+crbug.com/245154 editing/selection/modify_move/move-by-character-brute-force.html [ Timeout Crash ]
+crbug.com/982194 editing/selection/modify_move/move-by-word-visually-crash-test-1.html [ Crash ]
+crbug.com/982194 editing/selection/modify_move/move-by-word-visually-crash-test-4.html [ Crash ]
+crbug.com/24182 editing/selection/modify_move/move-by-word-visually-crash-test-5.html [ Timeout Crash ]
+crbug.com/982194 editing/selection/modify_move/move_backward_line_import_crash.html [ Crash ]
+crbug.com/982194 editing/selection/modify_move/move_by_sentence_boundary.html [ Crash ]
+crbug.com/982194 editing/selection/modify_move/move_by_word_with_underscore.html [ Crash ]
+crbug.com/982194 editing/selection/modify_move/move_page_down_inline_block_hang.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/click-left-of-rtl-wrapping-text.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/click-user-select-all-contenteditable.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/click-user-select-all-textarea.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/doubleclick-inline-first-last-contenteditable.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/drag-selects-culled-inlines.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/drag-user-select-all-textarea.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/drag_focus_node.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/drag_over_text_transform.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/drag_selects_bidi_image.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/drag_selects_rtl_inline_block.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/drag_user_select_none.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/expanding-selections.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/extend_by_word_with_base_is_end.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/mouse-selection-horizontal.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/mouse-selection-vertical-rl.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/overidden_user_select_in_dom_tree.html [ Failure ]
+crbug.com/982194 editing/selection/mouse/overriden_user_select_in_shadow_tree.html [ Failure ]
+crbug.com/982194 editing/selection/mouse/select_across_readonly_input.html [ Crash ]
+crbug.com/982194 editing/selection/mouse/user-drag-element-and-user-select-none.html [ Failure ]
+crbug.com/982194 editing/selection/select_all/select_all_details_crash.html [ Crash ]
+crbug.com/982194 editing/selection/select_all/select_all_iframe.html [ Crash ]
+crbug.com/982194 editing/selection/select_all/select_all_iframe_crash.html [ Crash ]
+crbug.com/982194 editing/selection/select_all/select_all_in_contenteditable.html [ Crash ]
+crbug.com/982194 editing/selection/select_all/select_all_readonly_textarea.html [ Crash ]
+crbug.com/982194 editing/selection/select_all/select_all_textarea.html [ Crash ]
+crbug.com/982194 editing/selection/select_all/select_all_user_select_none.html [ Crash ]
+crbug.com/982194 editing/selection/select_all/select_all_with_unfocused_selection.html [ Crash ]
+crbug.com/982194 editing/selection/set_base_and_extent/set_null.html [ Crash ]
+crbug.com/982194 editing/selection/user-select/user-select-all.html [ Crash ]
+crbug.com/982194 editing/shadow/505092-fieldset-is-not-ua-shadow-crash.html [ Crash ]
+crbug.com/982194 editing/shadow/compare-positions-in-nested-shadow.html [ Crash ]
+crbug.com/982194 editing/shadow/selection-across-shadows.html [ Crash ]
+crbug.com/982194 editing/shadow/selection-after-remove-children.html [ Crash ]
+crbug.com/982194 editing/shadow/selection-rangecount.html [ Crash ]
+crbug.com/982194 editing/shadow/selection-shadow-mouse-drag.html [ Crash ]
+crbug.com/982194 editing/shadow/shadow-selection-not-exported.html [ Crash ]
+crbug.com/982194 editing/spelling/right-click-no-renderer-crash.html [ Crash ]
+crbug.com/982194 editing/spelling/spellcheck-async-mutation.html [ Crash ]
+crbug.com/982194 editing/spelling/spellcheck-input-search-crash.html [ Crash ]
+crbug.com/982194 editing/spelling/spelling-changed-text.html [ Crash ]
+crbug.com/982194 editing/style/apply-style-crash2.html [ Crash ]
+crbug.com/982194 editing/style/text-indent.html [ Crash ]
+crbug.com/982194 editing/text-iterator/backward-textiterator-first-letter-crash.html [ Crash ]
+crbug.com/982194 editing/text-iterator/findString-restarts-at-last-position.html [ Crash ]
+crbug.com/982194 editing/text-iterator/findString-selection-disabled.html [ Crash ]
+crbug.com/982194 editing/text-iterator/findString-start-search-after-selection.html [ Crash ]
+crbug.com/982194 editing/text-iterator/first_letter_find_string_crash.html [ Crash ]
+crbug.com/982194 editing/text-iterator/selection-to-string-with-auto-fill.html [ Crash ]
+crbug.com/982194 external/wpt/2dcontext/transformations/canvas_transformations_reset_001.html [ Failure ]
+crbug.com/982194 external/wpt/compat/webkit-text-fill-color-property-002.html [ Crash ]
+crbug.com/982194 external/wpt/contacts/contacts-select.https.window.html [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/cascade-import/cascade-import-dynamic-002.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/cascade-import/cascade-import-dynamic-004.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats/float-nowrap-5.html [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats/floats-placement-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats/floats-placement-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats/intrinsic-size-float-and-line.html [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats/new-fc-beside-adjoining-float-2.html [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats/new-fc-beside-adjoining-float.html [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats/new-fc-separates-from-float.html [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats/remove-block-between-inline-and-float.html [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/adjacent-floats-001.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/adjoining-float-before-clearance.html [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/clear-float-006.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/clear-float-008.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/clear-float-009.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/clear-inline-001.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/float-applies-to-009.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/float-non-replaced-height-001.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-001.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-004.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-009.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-029.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-030.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-031.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-040.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-114.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-122.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-123.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-124.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-133.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-134.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-136.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-139.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-141.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-144.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/floats-clear/floats-146.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-002.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-004.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-013.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-015.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-016.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-024.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-027.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-035.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-037.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-038.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-046.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-049.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-057.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-068.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-070.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-082.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-090.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-092.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-093.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-103.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-104.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-129.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-bleed-001.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/linebox/line-height-bleed-002.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001g.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002e.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002i.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/blocks-013.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-002.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-004.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-013.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-015.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-023.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-024.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-026.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-027.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-034.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-035.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-037.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-038.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-045.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-049.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-067.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-068.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-070.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-078.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-081.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-082.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-090.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-092.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/height-093.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/inline-non-replaced-width-001.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/inline-non-replaced-width-002.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/inlines-013.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-005.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-013.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-016.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-024.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-037.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-038.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-057.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-059.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-060.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-068.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-070.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-079.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-090.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/max-height-092.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-001.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-002.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-012.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-024.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-026.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-027.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-038.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-045.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-056.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-059.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-070.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-071.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-078.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-082.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-089.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-092.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-100.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/normal-flow/min-height-101.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-024.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/abspos-inline-008.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/position-relative-001.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/position-relative-027.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/position-relative-028.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/position-relative-032.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/positioning-float-001.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/positioning-float-002.xht [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/positioning/toogle-abspos-on-relpos-inline-child.html [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/text/bidi-span-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/CSS2/text/text-align-white-space-006.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-align/baseline-of-scrollable-1b.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-backgrounds/background-image-first-line.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-break/hit-test-inline-fragmentation-with-border-radius.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-break/line-after-unbreakable-float-after-padding.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-cascade/all-prop-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-011.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-012.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-024.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-047.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-cell-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-clip-011.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-clip-013.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-contain/contain-paint-table-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-contain/contain-size-056.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-003-inline.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-dynamic-flex-003-none.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-flex-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-flex-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-display/display-contents-shadow-dom-1.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/css-flexbox-column-reverse-wrap-reverse.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/css-flexbox-column.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flex-flexitem-percentage-prescation.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flex-flow-010.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flex-vertical-align-effect.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_align-items-stretch-2.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_align-self-stretch.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-0-unitless.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-0.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-N.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-Npercent-shrink.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0-auto.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-0.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-0-unitless.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-1-unitless-basis.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-N.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-Npercent.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1-auto-shrink.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-1.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-0-unitless.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-N.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-Npercent.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-auto-shrink.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N-auto.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-N.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-0-auto.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-N.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-Npercent-shrink.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-0-auto.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-N.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent-shrink.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1-auto.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-1.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-0-unitless.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-N-shrink.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-N.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-Npercent-shrink.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N-auto-shrink.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-1-N.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-0-unitless.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-0.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-N.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-0-Npercent.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-0-unitless.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-0.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-N-shrink.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-N.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-Npercent.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-1-auto-shrink.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-N.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-Npercent.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-auto-shrink.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N-auto.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-N-N.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-auto.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-basis.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-initial.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural-mixed-basis.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural-variable-zero-basis.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-natural.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_flex-none.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-center.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween-negative.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_margin-auto-overflow-2.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_margin-auto-overflow.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_margin-left-ex.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_nested-flex.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flexbox_order-abspos-space-around.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/percentage-heights-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/scrollbars-auto.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-reverse-row-reverse.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-with-row-reverse.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-flexbox/order/order-with-row-reverse.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-fonts/font-display/font-display.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/abspos/orthogonal-positioned-grid-items-007.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-definition/fr-unit-with-percentage.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-layout-auto-tracks.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-definition/grid-layout-basic.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-items/grid-inline-z-axis-ordering-overlapped-items-006.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-items/grid-layout-z-order-b.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-container-scrollbar-vertical-lr-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-first-letter-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-inline-first-letter-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-inline-first-letter-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-inline-first-line-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-inline-first-line-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-inline-margins-no-collapse-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/grid-model/grid-margins-no-collapse-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/placement/grid-layout-lines-shorthands.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/placement/grid-layout-lines.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-grid/placement/grid-layout-placement-shorthands.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-fill-auto-001.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-multicol/multicol-span-all-list-item-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-overflow/overflow-inline-transform-relative.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-paint-api/style-before-pseudo.https.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-dynamic-static-position-floats-004.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-position/position-absolute-in-inline-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-position/position-sticky-input-box-gets-focused-after-scroll.html [ Crash ]
+crbug.com/982194 external/wpt/css/css-position/position-sticky-writing-modes.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-position/static-position/htb-rtl-rtl.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-pseudo/first-letter-opacity-float-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-scoping/slotted-with-pseudo-element.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-scroll-anchoring/start-edge-in-block-layout-direction.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-scroll-anchoring/wrapped-text.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-005.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-007.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-008.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-014.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-016.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-017.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-022.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-radial-gradient-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/spec-examples/shape-outside-010.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/spec-examples/shape-outside-012.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/spec-examples/shape-outside-014.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/spec-examples/shape-outside-016.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/spec-examples/shape-outside-017.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/spec-examples/shape-outside-018.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-shapes/spec-examples/shape-outside-019.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-sizing/orthogonal-writing-mode-float-in-inline.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-in-loose.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-normal.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/i18n/ja/css-text-line-break-ja-pr-strict.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-in-loose.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-loose.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/i18n/other-lang/css-text-line-break-de-pr-normal.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-cj-strict.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-iteration-loose.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-loose.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/i18n/unknown-lang/css-text-line-break-pr-strict.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/i18n/zh/css-text-line-break-zh-in-loose.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/line-break/line-break-anywhere-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-015.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-atomic-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-atomic-005.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/line-breaking/line-breaking-replaced-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/overflow-wrap/overflow-wrap-cluster-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/shaping/shaping-000.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/shaping/shaping-004.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/shaping/shaping-005.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/shaping/shaping-007.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/shaping/shaping_lig-000.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/tab-size/tab-size.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/text-align/text-align-last-empty-inline.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/text-encoding/shaping-tatweel-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/text-transform/text-transform-shaping-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/white-space/seg-break-transformation-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-000.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-break-all-004.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-keep-all-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-keep-all-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-en-000.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-hi-000.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-ja-000.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-ja-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-ja-004.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-km-000.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-text/word-break/word-break-normal-th-000.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-ui/outline-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-ui/outline-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-ui/outline-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-ui/outline-010.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-ui/outline-011.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-ui/outline-019.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-ui/outline-020.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-ui/outline-022.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-ui/outline-style-013.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-ui/outline-style-014.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-ui/text-overflow-012.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-ui/text-overflow-020.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-ui/text-overflow-027.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-ui/text-overflow-029.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-006.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-024.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-042.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-060.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-066.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-084.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-090.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-106.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-162.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-170.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-194.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/abs-pos-non-replaced-vrl-202.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/bidi-embed-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/bidi-embed-005.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/bidi-embed-009.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/bidi-isolate-override-009.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/bidi-normal-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/bidi-normal-004.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/bidi-normal-008.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/bidi-override-005.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/bidi-override-009.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/bidi-plaintext-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/bidi-plaintext-005.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/bidi-plaintext-009.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/bidi-plaintext-011.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/bidi-unset-008.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/bidi-unset-009.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/block-embed-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/block-embed-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/block-flow-direction-vrl-005.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/float-contiguous-vlr-007.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/float-lft-orthog-htb-in-vrl-002.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/float-vlr-005.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/float-vlr-007.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/float-vlr-013.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/float-vrl-010.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/horizontal-rule-vrl-002.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/line-box-direction-vlr-008.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/line-box-direction-vrl-005.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/line-box-direction-vrl-006.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/line-box-height-vlr-023.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/normal-flow-overconstrained-vrl-004.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001e.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001h.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001j.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001l.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/orthogonal-parent-shrink-to-fit-001n.html [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/overconstrained-rel-pos-ltr-top-bottom-vrl-002.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/overconstrained-rel-pos-rtl-left-right-vrl-008.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/overconstrained-rel-pos-rtl-top-bottom-vrl-006.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-010.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-018.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vlr-023.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vrl-018.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/sizing-orthog-htb-in-vrl-024.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/text-indent-vrl-010.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/text-indent-vrl-014.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/vertical-alignment-003.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/vertical-alignment-005.xht [ Failure ]
+crbug.com/982194 external/wpt/css/css-writing-modes/vertical-alignment-009.xht [ Failure ]
+crbug.com/982194 external/wpt/css/cssom-view/DOMRectList.html [ Failure ]
+crbug.com/982194 external/wpt/css/cssom-view/elementFromPoint-dynamic-anon-box.html [ Failure ]
+crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-inline-htb-ltr.html [ Failure ]
+crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-inline-htb-rtl.html [ Failure ]
+crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-inline-vrl-rtl.html [ Failure ]
+crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-svg-text.html [ Failure ]
+crbug.com/982194 external/wpt/css/cssom-view/elementsFromPoint-svg.html [ Failure ]
+crbug.com/982194 external/wpt/css/cssom-view/getBoundingClientRect-empty-inline.html [ Failure ]
+crbug.com/982194 external/wpt/css/cssom-view/getClientRects-br-vrl-ltr.html [ Failure ]
+crbug.com/982194 external/wpt/css/cssom-view/getClientRects-inline.html [ Failure ]
+crbug.com/982194 external/wpt/css/cssom-view/offsetTopLeft-border-box.html [ Failure ]
+crbug.com/982194 external/wpt/css/cssom-view/offsetTopLeft-inline.html [ Failure ]
+crbug.com/982194 external/wpt/css/cssom-view/scrollIntoView-svg-shape.html [ Failure ]
+crbug.com/982194 external/wpt/css/filter-effects/filter-cb-abspos-inline-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/filter-effects/filtered-inline-is-container.html [ Failure ]
+crbug.com/982194 external/wpt/css/selectors/focus-within-display-none-001.html [ Crash ]
+crbug.com/982194 external/wpt/css/selectors/selection-image-001.html [ Crash ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-fallback-justify-content-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-justify-self-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-margin-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-clip-006.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-001-table.xhtml [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-002.xhtml [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-vert-rtl-001.xhtml [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-horiz-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-multi-line-vert-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-baseline-single-item-001b.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-canvas-horiz-001.xhtml [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-fieldset-horiz-001.xhtml [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-iframe-horiz-001.xhtml [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-img-horiz-001.xhtml [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-basic-textarea-horiz-001.xhtml [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-003b.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-sizing-horiz-002.xhtml [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-035.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-042.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-044.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-048.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-054.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-content-box-border-radius-001.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-content-box-border-radius-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-034.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-035.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-038.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-039.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-017.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-020.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-024.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-025.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-002.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-003.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-004.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-margin-box-border-radius-006.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-polygon-020.html [ Failure ]
+crbug.com/982194 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-polygon-021.html [ Failure ]
+crbug.com/982194 external/wpt/custom-elements/reactions/Selection.html [ Crash ]
+crbug.com/982194 external/wpt/dom/events/shadow-relatedTarget.html [ Crash ]
+crbug.com/982194 external/wpt/dom/ranges/Range-mutations-appendData.html [ Crash ]
+crbug.com/982194 external/wpt/dom/ranges/Range-mutations-insertBefore.html [ Crash ]
+crbug.com/982194 external/wpt/dom/ranges/Range-mutations-insertData.html [ Crash ]
+crbug.com/982194 external/wpt/dom/ranges/Range-mutations-splitText.html [ Crash ]
+crbug.com/982194 external/wpt/element-timing/background-image-multiple-elements.html [ Timeout ]
+crbug.com/982194 external/wpt/element-timing/css-generated-text.html [ Timeout ]
+crbug.com/982194 external/wpt/element-timing/fixed-id-identifier.html [ Timeout ]
+crbug.com/982194 external/wpt/event-timing/buffered-flag.html [ Timeout ]
+crbug.com/982194 external/wpt/event-timing/retrieve-firstInput.html [ Timeout ]
+crbug.com/982194 external/wpt/feature-policy/experimental-features/focus-without-user-activation-tentative.sub.html [ Crash ]
+crbug.com/982194 external/wpt/feature-policy/reporting/camera-report-only.https.html [ Failure ]
+crbug.com/982194 external/wpt/feature-policy/reporting/fullscreen-report-only.html [ Failure ]
+crbug.com/982194 external/wpt/fullscreen/api/element-request-fullscreen-and-exit-iframe-manual.html [ Crash ]
+crbug.com/852645 external/wpt/fullscreen/api/element-request-fullscreen-two-iframes-manual.html [ Failure Timeout Crash ]
+crbug.com/982194 external/wpt/fullscreen/api/element-request-fullscreen.html [ Failure ]
+crbug.com/982194 external/wpt/html/dom/elements/requirements-relating-to-bidirectional-algorithm-formatting-characters/dir-isolation-001a.html [ Failure ]
+crbug.com/982194 external/wpt/html/dom/elements/requirements-relating-to-bidirectional-algorithm-formatting-characters/dir-isolation-006a.html [ Failure ]
+crbug.com/982194 external/wpt/html/dom/elements/requirements-relating-to-bidirectional-algorithm-formatting-characters/dir-isolation-007b.html [ Failure ]
+crbug.com/982194 external/wpt/html/dom/elements/requirements-relating-to-bidirectional-algorithm-formatting-characters/dir-isolation-007c.html [ Failure ]
+crbug.com/982194 external/wpt/html/interaction/focus/the-autofocus-attribute/skip-document-with-fragment.html [ Crash ]
+crbug.com/982194 external/wpt/html/semantics/forms/constraints/form-validation-reportValidity.html [ Crash ]
+crbug.com/982194 external/wpt/html/semantics/forms/textfieldselection/selection-after-content-change.html [ Crash ]
+crbug.com/982194 external/wpt/html/semantics/selectors/pseudo-classes/focus-autofocus.html [ Crash ]
+crbug.com/982194 external/wpt/html/user-activation/activation-thru-contextmenu-event-manual.html [ Crash ]
+crbug.com/928838 external/wpt/html/user-activation/activation-transfer-cross-origin-with-click-two-child-frames.sub.tentative.html [ Failure Crash ]
+crbug.com/982194 external/wpt/html/user-activation/no-activation-thru-escape-key-manual.html [ Crash ]
+crbug.com/982194 http/tests/css/css-image-valued-shape.html [ Failure ]
+crbug.com/982194 http/tests/devtools/command-line-api-inspect.js [ Crash ]
+webkit.org/b/90488 http/tests/devtools/compiler-source-mapping-debug.js [ Timeout Crash ]
+crbug.com/982194 http/tests/devtools/console-resource-errors.js [ Crash ]
+crbug.com/982194 http/tests/devtools/copy-network-request.js [ Crash ]
+crbug.com/982194 http/tests/devtools/fragment.js [ Crash ]
+crbug.com/336481 http/tests/devtools/jump-to-previous-editing-location.js [ Timeout Crash ]
+crbug.com/831673 http/tests/devtools/reveal-objects.js [ Pass Timeout Crash ]
+crbug.com/982194 http/tests/devtools/sourcemap-section-warning.js [ Crash ]
+crbug.com/982194 http/tests/devtools/user-agent-setting-major-version.js [ Crash ]
+crbug.com/982194 http/tests/devtools/user-metrics-perf.js [ Crash ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/console-a11y-test.js [ Crash ]
+crbug.com/1000336 http/tests/devtools/a11y-axe-core/devices-a11y-test.js [ Pass Failure Crash ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/quick-open-a11y-test.js [ Crash ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/performance/performance-pane-a11y-test.js [ Crash ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/settings/blackbox-a11y-test.js [ Crash ]
+crbug.com/982194 http/tests/devtools/a11y-axe-core/settings/emulated-device-a11y-test.js [ Crash ]
+crbug.com/1000336 http/tests/devtools/a11y-axe-core/settings/geolocations-a11y-test.js [ Pass Failure Crash ]
+crbug.com/1000336 http/tests/devtools/a11y-axe-core/sources/sources-editor-pane-a11y-test.js [ Pass Failure Crash ]
+crbug.com/982194 http/tests/devtools/application-panel/resources-panel-websql.js [ Crash ]
+crbug.com/982194 http/tests/devtools/components/linkifier.js [ Crash ]
+crbug.com/982194 http/tests/devtools/components/widget-focus.js [ Crash ]
+crbug.com/451577 http/tests/devtools/console/alert-toString-exception.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/argument-hints.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/command-line-api-getEventListeners.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/command-line-api.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-api-on-call-frame.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-assert.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-big-array.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-call-getter-on-proto.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-clear-function.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-clear.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-context-selector.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-copy-treeoutline.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-copy-truncated-text.js [ Timeout Crash ]
+crbug.com/874695 crbug.com/869364 http/tests/devtools/console/console-correct-suggestions.js [ Pass Timeout Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-custom-formatters.js [ Timeout Crash ]
+crbug.com/451577 crbug.com/924308 http/tests/devtools/console/console-dir-es6.js [ Pass Failure Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-dir-global.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-dir.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-dirxml.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-edit-expanded-tree.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-edit-property-value.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-error-on-call-frame.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-eval-object-literal.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-eval-scoped.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-eval-throw.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-expand-removed-node.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-external-array.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-focus.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-format-array-prototype.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-format-broken-unicode.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-format-collections.js [ Timeout Crash ]
+crbug.com/451577 crbug.com/924308 http/tests/devtools/console/console-format-es6-2.js [ Pass Failure Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-format-es6.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-format-style-whitelist.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-functions.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-group-similar.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-last-result.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-link-to-snippet.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-linkify-message-location.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-links-in-errors-with-trace.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-links-on-messages-before-inspection.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-log-eval-syntax-error.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-log-linkify-stack-in-errors.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-log-object-with-getter.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-message-contains-async-stack.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-native-function.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-object-preview.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-pins.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-preserve-scroll.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-prompt-keyboard.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-proxy.js [ Timeout Crash ]
+crbug.com/916975 crbug.com/451577 http/tests/devtools/console/console-repeat-count.js [ Pass Failure Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-retain-autocomplete-on-typing.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-revoke-error-in-worker.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-revoke-error.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-save-to-temp-var.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-search-reveals-messages.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-search.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-smart-enter.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-stack-overflow.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-substituted.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-tainted-globals.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-top-level-await.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-trim-long-traces.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-truncate-long-messages.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-uncaught-exception-in-eval.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-uncaught-exception.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-uncaught-promise-in-worker.js [ Timeout Crash ]
+crbug.com/967526 http/tests/devtools/console/console-uncaught-promise.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-viewport-control.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-viewport-indices.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-viewport-selection.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-viewport-stick-to-bottom-onload.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-viewport-stick-to-bottom.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-worker-nested-imports-syntax-error.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-xml-document.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/console-xpath.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/exception-objects.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/function-name-in-console-message-stack.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/nested-worker-eval-contains-stack.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/paintworklet-console-selector.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/shadow-element.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/worker-eval-contains-stack.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/viewport-testing/console-clicking-messages.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/viewport-testing/console-key-expand.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/viewport-testing/console-key-links.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/viewport-testing/console-key-navigation.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/viewport-testing/console-runtime-result-below-prompt.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/viewport-testing/console-stick-to-bottom-expand-object.js [ Timeout Crash ]
+crbug.com/451577 http/tests/devtools/console/viewport-testing/console-stick-to-bottom-with-large-prompt.js [ Timeout Crash ]
+crbug.com/982194 http/tests/devtools/console-sidebar/console-filter-sidebar.js [ Crash ]
+crbug.com/982194 http/tests/devtools/coverage/decorations-after-script-formatter.js [ Crash ]
+crbug.com/982194 http/tests/devtools/coverage/gutter-css.js [ Crash ]
+crbug.com/982194 http/tests/devtools/coverage/gutter-html.js [ Crash ]
+crbug.com/982194 http/tests/devtools/coverage/gutter-js.js [ Crash ]
+crbug.com/982194 http/tests/devtools/coverage/multiple-instances-merge.js [ Crash ]
+crbug.com/846471 http/tests/devtools/coverage/reveal-autoformat.js [ Pass Timeout Crash ]
+crbug.com/678482 http/tests/devtools/debugger/fetch-breakpoints.js [ Pass Timeout Crash ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-accessibility.js [ Crash ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-auto-whitespace-removing.js [ Crash ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-block-indent.js [ Crash ]
+crbug.com/850358 http/tests/devtools/editor/text-editor-enter-behaviour.js [ Pass Failure Timeout Crash ]
+crbug.com/846982 crbug.com/874695 http/tests/devtools/editor/text-editor-formatter.js [ Pass Timeout Timeout Crash ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-goto-matching-bracket.js [ Crash ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-home-button.js [ Crash ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-search-replace.js [ Crash ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-selection-to-search.js [ Crash ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-smart-braces.js [ Crash ]
+crbug.com/982194 http/tests/devtools/editor/text-editor-toggle-tab-moves-focus.js [ Crash ]
+crbug.com/749738 crbug.com/420008 http/tests/devtools/editor/text-editor-word-jumps.js [ Pass Timeout Timeout Crash ]
+crbug.com/982194 http/tests/devtools/elements/elements-inspect-iframe-from-different-domain.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/elements-save-to-temp-var.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/elements-tab-stops.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/elements-treeoutline-copy.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/event-listener-sidebar-custom-framework.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/inspect-pseudo-element.js [ Failure ]
+crbug.com/982194 http/tests/devtools/elements/navigate-styles-sidebar-with-arrow-keys.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/accessibility/autocomplete-attribute.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/accessibility/edit-aria-attributes.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/css-variables/color-swatch.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/edit/blur-while-edit-as-html.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-after-model-changed.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-1.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-2.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-3.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-4.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-shadow-1.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-dom-actions-shadow-2.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/edit/edit-trimmed-attribute-value.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/edit/switch-panels-while-editing-as-html.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/highlight/highlight-node-vertical-rl.js [ Failure ]
+crbug.com/982194 http/tests/devtools/elements/styles/cancel-upon-invalid-property.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles/edit-css-with-source-url.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles/styles-mouse-test.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles/stylesheet-tracking.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles/undo-after-cancelled-editing.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles/undo-set-selector-text.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles/up-down-numerics-and-colors.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-inline-style-csp.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-invalid-selector.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-keyboard.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/add-new-rule-with-style-after-body.js [ Crash ]
+crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-1/color-aware-property-value-edit.js [ Pass Timeout Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/commit-selector-mark-matching.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/commit-selector.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/css-live-edit.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/disable-property-workingcopy-update.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/edit-inspector-stylesheet.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/edit-media-text.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/edit-name-with-trimmed-value.js [ Crash ]
+crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-1/edit-resource-referred-by-multiple-styletags.js [ Pass Timeout Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/edit-value-inside-property.js [ Crash ]
+crbug.com/510337 http/tests/devtools/elements/styles-1/edit-value-url-with-color.js [ Timeout Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-1/edit-value-with-trimmed-url.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/metrics-box-sizing.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-2/page-reload-update-sidebar.js [ Crash ]
+crbug.com/938884 http/tests/devtools/elements/styles-3/styles-add-blank-property.js [ Pass Timeout Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/styles-add-invalid-property.js [ Crash ]
+crbug.com/994034 http/tests/devtools/elements/styles-3/styles-add-new-rule-colon.js [ Pass Failure Crash ]
+crbug.com/945665 http/tests/devtools/elements/styles-3/styles-add-new-rule-tab.js [ Pass Failure Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/styles-add-new-rule-to-stylesheet.js [ Crash ]
+crbug.com/945665 http/tests/devtools/elements/styles-3/styles-add-new-rule.js [ Pass Failure Timeout Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/styles-cancel-editing.js [ Crash ]
+crbug.com/945665 http/tests/devtools/elements/styles-3/styles-change-node-while-editing.js [ Pass Failure Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/styles-commit-editing.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-3/styles-disable-property-after-selector-edit.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-do-not-detach-sourcemap-on-edits.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-edit-slow-completions.js [ Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-grid-template.js [ Crash ]
+crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-4/styles-keyframes.js [ Pass Timeout Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/styles-update-links-2.js [ Crash ]
+crbug.com/849978 http/tests/devtools/elements/styles-4/stylesheet-source-url-comment.js [ Pass Failure Timeout Crash ]
+crbug.com/959002 crbug.com/959042 http/tests/devtools/elements/styles-4/undo-add-new-rule.js [ Pass Timeout Crash ]
+crbug.com/982194 http/tests/devtools/elements/styles-4/undo-add-rule-crash.js [ Crash ]
+crbug.com/941860 http/tests/devtools/extensions/extensions-events.js [ Timeout Crash ]
+crbug.com/988298 http/tests/devtools/extensions/extensions-panel.js [ Pass Timeout Crash ]
+crbug.com/246190 http/tests/devtools/indexeddb/resources-panel.js [ Timeout Crash ]
+crbug.com/982194 http/tests/devtools/network/async-xhr-json-mime-type.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/cached-resource-destroyed-moved-to-storage.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/cached-resource-destroyed-too-big-discarded.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/download.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/failed-request-preview.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/failed-request-response-mimetype.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/font-face.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/from-disk-cache-timing.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/har-content.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/har-post.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/html-preview-encoding.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/json-preview.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/load-resource-for-frontend.js [ Crash ]
+crbug.com/327078 http/tests/devtools/network/long-script-content.js [ Timeout Crash ]
+crbug.com/938200 http/tests/devtools/network/network-blocked-reason.js [ Pass Timeout Crash ]
+crbug.com/982194 http/tests/devtools/network/network-cachedresources-with-same-urls.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-choose-preview-view.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-close-request-view.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-columns-sorted.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-columns-visible.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-content-replacement-xhr.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-cookies-pane.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-cyrillic-xhr.js [ Crash ]
+crbug.com/762529 crbug.com/679833 http/tests/devtools/network/network-datareceived.js [ Failure Timeout Crash ]
+crbug.com/759632 http/tests/devtools/network/network-datasaver-warning.js [ Failure Crash ]
+crbug.com/982194 http/tests/devtools/network/network-disable-cache-memory.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-disable-cache-preloads-twice.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-disable-cache-preloads.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-disable-cache-xhrs.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-disabling-check-no-memory-leak.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-document-initiator.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-domain-filter.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-empty-xhr.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-eventsource.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-fetch-post-payload.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-fetch.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-filmstrip-overview-showing.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-filter-http-requests.js [ Crash ]
+crbug.com/946699 http/tests/devtools/network/network-filter-service-worker.js [ Pass Timeout Crash ]
+crbug.com/982194 http/tests/devtools/network/network-filter-updated-requests.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-filters-internals.js [ Crash ]
+crbug.com/945629 http/tests/devtools/network/network-filters.js [ Pass Failure Timeout Crash ]
+crbug.com/982194 http/tests/devtools/network/network-iframe-load-and-delete.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-image-404.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-imported-resource-content.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-initiator-chain.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-initiator-from-console.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-initiator.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-json-parser.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-log-service-worker-navigate.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-memory-cached-resource.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-prefetch.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-recording-after-reload-with-screenshots-enabled.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-request-parse-query-params.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-request-query-string.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-request-revision-content.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-request-type.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-search.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-status-non-http.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-timing.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-toggle-type-filter.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-update-calculator-for-all-requests.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-worker-fetch-blocked.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-worker-fetch-parallel.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-worker-fetch.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-async-double.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-async-response-type-blob.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-async.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-binary-content.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-data-received-async-response-type-blob.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-post-payload.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-redirect-body.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-redirect-method.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-replay.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-same-url-as-main-resource.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-xhr-sync.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/network-xsl-content.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/oopif-content.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/parse-form-data.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/ping-response.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/ping.js [ Crash ]
+crbug.com/962831 http/tests/devtools/network/preview-searchable.js [ Timeout Crash ]
+crbug.com/982194 http/tests/devtools/network/request-name-path.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/request-parameters-decoding.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/request-preview-uri-escaping.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/resource-priority.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/script-as-text-loading-long-url.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/script-as-text-loading-with-caret.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/subresource-integrity-number-of-requests-for-script.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/subresource-integrity-number-of-requests-for-stylesheet.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/warning-for-long-cookie.js [ Crash ]
+crbug.com/982194 http/tests/devtools/network/waterfall-header-height-updates.js [ Crash ]
+crbug.com/982194 http/tests/devtools/oopif/oopif-console-preserves-log-on-frame-navigation.js [ Crash ]
+crbug.com/817167 crbug.com/874695 http/tests/devtools/oopif/oopif-cookies-refresh.js [ Pass Failure Timeout Timeout Crash ]
+crbug.com/982194 http/tests/devtools/persistence/persistence-external-change-breakpoints.js [ Crash ]
+crbug.com/982194 http/tests/devtools/persistence/persistence-go-to-file-dialog.js [ Crash ]
+crbug.com/982194 http/tests/devtools/persistence/persistence-merge-editor-tabs.js [ Crash ]
+crbug.com/874695 http/tests/devtools/persistence/persistence-mimetype-on-rename.js [ Timeout Crash ]
+crbug.com/981267 http/tests/devtools/persistence/persistence-move-breakpoints-on-reload.js [ Pass Failure Crash ]
+crbug.com/982194 http/tests/devtools/persistence/persistence-move-breakpoints.js [ Crash ]
+crbug.com/982194 http/tests/devtools/persistence/persistence-sourceframe-highlight.js [ Crash ]
+crbug.com/982194 http/tests/devtools/persistence/persistence-sourceframe-messages.js [ Crash ]
+crbug.com/982194 http/tests/devtools/persistence/persistence-switch-editor-tab.js [ Crash ]
+crbug.com/982194 http/tests/devtools/persistence/persistence-tabbed-editor-keeps-selected-tab.js [ Crash ]
+crbug.com/982194 http/tests/devtools/persistence/persistence-tabbed-editor-opens-filesystem-uisourcecode.js [ Crash ]
+crbug.com/982194 http/tests/devtools/persistence/persistence-tabbed-editor-tabs-order.js [ Crash ]
+crbug.com/982194 http/tests/devtools/portals/portals-console.js [ Crash ]
+crbug.com/450493 crbug.com/971262 http/tests/devtools/profiler/live-line-level-heap-profile.js [ Pass Timeout Timeout Crash ]
+crbug.com/982194 http/tests/devtools/runtime/evaluate-timeout.js [ Crash ]
+crbug.com/982194 http/tests/devtools/runtime/evaluate-without-side-effects.js [ Crash ]
+crbug.com/982194 http/tests/devtools/search/search-in-script.js [ Crash ]
+crbug.com/982194 http/tests/devtools/search/source-frame-replace-1.js [ Crash ]
+crbug.com/982194 http/tests/devtools/search/source-frame-replace-2.js [ Crash ]
+crbug.com/982194 http/tests/devtools/search/source-frame-replace-3.js [ Crash ]
+crbug.com/982194 http/tests/devtools/search/source-frame-replace-4.js [ Crash ]
+crbug.com/982194 http/tests/devtools/search/source-frame-search.js [ Crash ]
+crbug.com/982194 http/tests/devtools/search/sources-search-scope.js [ Crash ]
+crbug.com/982194 http/tests/devtools/service-workers/service-worker-network-fetch-blocked.js [ Crash ]
+crbug.com/982194 http/tests/devtools/service-workers/service-worker-network-fetch.js [ Crash ]
+crbug.com/849670 http/tests/devtools/service-workers/service-worker-v8-cache.js [ Pass Failure Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/autocomplete-css.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/autocomplete-general.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/autocomplete-hide-on-smart-brace.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/autocomplete-scss.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/bezier-swatch-position.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/color-swatch-position.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/compile-javascript.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/css-inline-sourcemap.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/css-outline-dialog.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/dont-diverge-script-evaluated-twice.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/inline-script-with-source-map.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/inspect-function.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/javascript-outline-dialog.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/pretty-print-css-1.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/pretty-print-javascript-5.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/sass-highlighter.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/snippet-module.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/snippet-overrides.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/source-code-diff.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/source-frame-toolbar-items.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/sources-panel-focus-editor-on-select.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/sources-pretty-print.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/anonymous-script-with-source-map-breakpoint.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debug-inlined-scripts-fragment-id.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debug-inlined-scripts.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-completions-on-call-frame.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-disable-enable.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-es6-harmony-scopes.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-minified-variables-evalution.js [ Timeout Crash ]
+crbug.com/874695 http/tests/devtools/sources/debugger/debugger-proto-property.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-scope-minified-variables.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-scope-resolve-identifiers.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/debugger-scope-resolve-this.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/js-with-inline-stylesheets.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/live-edit-breakpoints.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/live-edit-original-content.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/live-edit.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/mutation-observer-suspend-while-paused.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/rethrow-error-from-bindings-crash.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/skip-pause-during-navigation.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/source-frame-breakpoint-decorations.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger/source-frame-inline-breakpoint-decorations.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-indexed-db.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-post-message.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-promises.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-web-sql.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-async/async-callstack-xhrs.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-async/async-await/async-callstack-async-await3.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-async/async-await/async-pause-on-exception.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-in-collected-function.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-manager-listeners-count.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-one-target-with-source-map.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-with-sourcemap-dart.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoint-with-sourcemap.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoints-in-anonymous-script-with-two-targets.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoints-in-ui-source-frame.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoints-sidebar-pane.js [ Timeout Crash ]
+crbug.com/874695 crbug.com/954319 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-in-multiple-workers.js [ Pass Timeout Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-navigation.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-restored-breakpoint.js [ Timeout Crash ]
+crbug.com/874695 http/tests/devtools/sources/debugger-breakpoints/breakpoints-ui-shifted-breakpoint.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/debugger-breakpoints-not-activated-on-reload.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/debugger-disable-add-breakpoint.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/debugger-reload-breakpoints-with-source-maps.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/disable-breakpoints.js [ Timeout Crash ]
+crbug.com/874695 http/tests/devtools/sources/debugger-breakpoints/dom-breakpoints.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/dynamic-scripts-breakpoints.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/inline-breakpoint-with-sourcemap.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/no-pause-on-disabled-breakpoint.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/possible-breakpoints.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/provisional-breakpoints.js [ Timeout Crash ]
+crbug.com/450493 crbug.com/912793 http/tests/devtools/sources/debugger-breakpoints/restore-locations-for-breakpoint-with-broken-source-map.js [ Pass Failure Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/set-breakpoint.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/set-conditional-breakpoint.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/use-possible-breakpoints-to-resolve-breakpoint.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-breakpoints/xhr-breakpoints.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-console/debug-console-command.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-console/debugger-command-line-api.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-blackbox-by-source-code.js [ Timeout Crash ]
+crbug.com/874695 http/tests/devtools/sources/debugger-frameworks/frameworks-dom-xhr-event-breakpoints.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-skip-break-program.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-skip-step-in.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-step-into-skips-setTimeout.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-steppings.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-frameworks/frameworks-with-worker.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-change-variable.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-eval-on-call-frame.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-eval-while-paused-throws.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-mute-exception.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-no-nested-pause.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-in-eval-script.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-in-internal.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-infinite-loop.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-on-exception.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/debugger-pause-on-failed-assertion.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/eval-on-pause-blocked.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/pause-in-inline-script.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/pause-in-internal-script.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/set-return-value.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-pause/skip-pauses-until-reload.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-into-document-write.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-into-event-listener.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-into-inlined-scripts.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-out-document-write.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-over-document-write.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-over-inlined-scripts.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-step/debugger-step-through-promises.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-step/step-through-event-listeners.js [ Timeout Crash ]
+crbug.com/916975 crbug.com/450493 http/tests/devtools/sources/debugger-ui/call-stack-show-more.js [ Pass Failure Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/callstack-placards-discarded.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/click-gutter-breakpoint.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/continue-to-location-markers-in-top-level-function.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/continue-to-location-markers.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/copy-stack-trace.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/custom-element-lifecycle-events.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/debugger-inline-values.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/debugger-save-to-temp-var.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/inline-scope-variables.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/monitor-console-command.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/popover-for-spread-operator.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/reveal-execution-line.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/reveal-not-skipped.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/script-formatter-breakpoints-2.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/script-formatter-breakpoints-3.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/script-formatter-search.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/selected-call-frame-after-formatting-source.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/show-function-definition.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/show-generator-location.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/snippet-edit-breakpoint.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/source-frame.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/sources/debugger-ui/watch-expressions-panel-switch.js [ Timeout Crash ]
+crbug.com/450493 http/tests/devtools/startup/sources/debugger/script-formatter-console.js [ Timeout Crash ]
+crbug.com/874695 http/tests/devtools/sxg/sxg-cert-not-found.js [ Timeout Crash ]
+crbug.com/982194 http/tests/devtools/sxg/sxg-navigation-redirect.js [ Crash ]
+crbug.com/851363 http/tests/devtools/sxg/sxg-prefetch-fail.js [ Pass Failure Crash ]
+crbug.com/982194 http/tests/devtools/sxg/sxg-transfer-size.js [ Crash ]
+crbug.com/420008 http/tests/devtools/tracing/console-timeline.js [ Timeout Crash ]
+crbug.com/420008 http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile-no-url-end-to-end.js [ Timeout Crash ]
+crbug.com/420008 http/tests/devtools/tracing/timeline-js/timeline-js-line-level-profile.js [ Timeout Crash ]
+crbug.com/420008 http/tests/devtools/tracing/timeline-network/timeline-network-resource-details.js [ Timeout Crash ]
+crbug.com/420008 http/tests/devtools/tracing/timeline-time/timeline-usertiming.js [ Timeout Crash ]
+crbug.com/982194 http/tests/devtools/unit/filtered-item-selection-dialog-filtering.js [ Crash ]
+crbug.com/982194 http/tests/devtools/unit/text-prompt-hint.js [ Crash ]
+crbug.com/982194 http/tests/download/default-encoding.html [ Crash ]
+crbug.com/982194 http/tests/filesystem/input-display.html [ Timeout ]
+crbug.com/982194 http/tests/inspector-protocol/target/target-expose-devtools-protocol.js [ Failure ]
+crbug.com/982194 http/tests/local/fileapi/select-dragged-file-input.html [ Failure ]
+crbug.com/982194 http/tests/local/formdata/form-data-with-unknown-file-extension.html [ Failure ]
+crbug.com/982194 http/tests/local/formdata/send-form-data-with-filename.html [ Failure ]
+crbug.com/982194 http/tests/local/formdata/upload-events.html [ Failure ]
+crbug.com/982194 http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-disabled.html [ Crash ]
+crbug.com/982194 http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-header.html [ Crash ]
+crbug.com/982194 http/tests/media/autoplay/document-user-activation-feature-policy-same-origin.html [ Crash ]
+crbug.com/982194 http/tests/media/autoplay/document-user-activation-navigation-click.html [ Crash ]
+crbug.com/982194 http/tests/misc/acid2.html [ Failure ]
+crbug.com/874695 http/tests/misc/drag-not-loaded-image.html [ Timeout Crash ]
+crbug.com/982194 http/tests/misc/drag-over-iframe-invalid-source-crash.html [ Crash ]
+crbug.com/982194 http/tests/misc/image-input-type-outlives-gc-without-crashing.html [ Failure ]
+crbug.com/982194 http/tests/misc/javascript-url-location-change.html [ Crash ]
+crbug.com/982194 http/tests/misc/lock-renderer-for-middle-click-autoscroll.html [ Crash ]
+crbug.com/982194 http/tests/misc/selectionAsMarkup.html [ Crash ]
+crbug.com/982194 http/tests/navigation/anchor-frames-shifting-focus.html [ Crash ]
+crbug.com/982194 http/tests/navigation/document-location-click-timeout.html [ Crash ]
+crbug.com/982194 http/tests/navigation/document-location-click.html [ Crash ]
+crbug.com/982194 http/tests/navigation/document-location-mouseover.html [ Timeout ]
+crbug.com/982194 http/tests/navigation/javascriptlink-basic.html [ Crash ]
+crbug.com/982194 http/tests/navigation/javascriptlink-frames.html [ Crash ]
+crbug.com/982194 http/tests/navigation/javascriptlink-goback.html [ Crash ]
+crbug.com/982194 http/tests/navigation/javascriptlink-subframeload.html [ Crash ]
+crbug.com/982194 http/tests/navigation/no-referrer-reset.html [ Crash ]
+crbug.com/982194 http/tests/navigation/no-referrer-same-window.html [ Crash ]
+crbug.com/982194 http/tests/navigation/no-referrer-subframe.html [ Crash ]
+crbug.com/982194 http/tests/navigation/no-referrer-target-blank.html [ Crash ]
+crbug.com/982194 http/tests/navigation/parsed-iframe-dynamic-form-back-entry-user-gesture.html [ Crash ]
+crbug.com/982194 http/tests/navigation/ping-cookie.html [ Crash ]
+crbug.com/982194 http/tests/navigation/ping-cross-origin-from-https.html [ Crash ]
+crbug.com/982194 http/tests/navigation/ping-cross-origin.html [ Crash ]
+crbug.com/982194 http/tests/navigation/ping-same-origin.html [ Crash ]
+crbug.com/982194 http/tests/navigation/post-with-modifier.html [ Crash ]
+crbug.com/982194 http/tests/navigation/redirect-preserves-referrer.html [ Crash ]
+crbug.com/982194 http/tests/navigation/same-document-scroll-position-restore.html [ Crash ]
+crbug.com/982194 http/tests/notifications/serviceworker-notification-properties.html [ Timeout ]
+crbug.com/982194 http/tests/security/anchor-download-allow-blob.html [ Crash ]
+crbug.com/982194 http/tests/security/anchor-download-allow-data.html [ Crash ]
+crbug.com/982194 http/tests/security/anchor-download-allow-sameorigin.html [ Crash ]
+crbug.com/982194 http/tests/security/cross-frame-access-selection.html [ Crash ]
+crbug.com/982194 http/tests/security/drag-drop-different-origin.html [ Crash ]
+crbug.com/982194 http/tests/security/drag-drop-same-unique-origin.html [ Crash ]
+crbug.com/982194 http/tests/security/drag-over-remote-content-iframe.html [ Crash ]
+crbug.com/982194 http/tests/security/referrer-policy-redirect-link.html [ Crash ]
+crbug.com/982194 http/tests/security/referrer-policy-rel-noreferrer.html [ Crash ]
+crbug.com/982194 http/tests/security/contentSecurityPolicy/frame-src-vs-shift-click.html [ Crash ]
+crbug.com/982194 http/tests/security/contentSecurityPolicy/register-bypassing-scheme-partial.html [ Failure ]
+crbug.com/982194 http/tests/security/cookies/third-party-cookie-blocking-user-action.html [ Crash ]
+crbug.com/982194 http/tests/security/frameNavigation/sandbox-ALLOWED-top-navigation-with-two-flags.html [ Crash ]
+crbug.com/982194 http/tests/security/frameNavigation/sandbox-ALLOWED-top-navigation-with-user-gesture.html [ Crash ]
+crbug.com/982194 http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change-async.html [ Timeout ]
+crbug.com/982194 http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change.html [ Timeout ]
+crbug.com/982194 http/tests/security/frameNavigation/xss-ALLOWED-top-navigation-after-postMessage.html [ Timeout ]
+crbug.com/982194 http/tests/security/frameNavigation/xss-DENIED-top-navigation-user-gesture-in-parent.html [ Crash ]
+crbug.com/982194 http/tests/security/isolatedWorld/events.html [ Failure ]
+crbug.com/982194 http/tests/security/isolatedWorld/userGestureEvents.html [ Timeout ]
+crbug.com/982194 http/tests/security/listener/xss-window-onclick-addEventListener.html [ Crash ]
+crbug.com/982194 http/tests/security/listener/xss-window-onclick-shortcut.html [ Crash ]
+crbug.com/982194 http/tests/security/vibration/vibrate-in-same-origin-iframe-with-user-gesture-allowed.html [ Crash ]
+crbug.com/982194 http/tests/security/vibration/vibrate-on-top-page-before-during-after-user-gesture.html [ Crash ]
+crbug.com/982194 http/tests/uri/css-href.php [ Failure ]
+crbug.com/982194 http/tests/xmlhttprequest/origin-exact-matching/07.html [ Failure ]
+crbug.com/982194 http/tests/xmlhttprequest/origin-exact-matching/14.html [ Failure ]
+crbug.com/982194 http/tests/xmlhttprequest/origin-exact-matching/29.html [ Failure ]
+crbug.com/982194 http/tests/xmlhttprequest/origin-exact-matching/36.html [ Failure ]
+crbug.com/982194 http/tests/xmlhttprequest/origin-exact-matching/47.html [ Failure ]
+crbug.com/982194 http/tests/xmlhttprequest/workers/shared-worker-close.html [ Crash ]
+crbug.com/982194 virtual/android/fullscreen/enter-exit-full-screen-hover.html [ Timeout ]
+crbug.com/982194 virtual/android/fullscreen/exit-full-screen-iframe.html [ Crash ]
+crbug.com/982194 virtual/android/fullscreen/full-screen-iframe-allowed-nested.html [ Crash ]
+crbug.com/982194 virtual/android/fullscreen/full-screen-iframe-allowed.html [ Crash ]
+crbug.com/718155 virtual/android/fullscreen/full-screen-iframe-not-allowed.html [ Failure Crash ]
+crbug.com/982194 virtual/android/fullscreen/full-screen-iframe-ua-style.html [ Timeout ]
+crbug.com/982194 virtual/android/fullscreen/full-screen-is-in-top-layer.html [ Timeout ]
+crbug.com/982194 virtual/android/fullscreen/full-screen-placeholder.html [ Failure ]
+crbug.com/982194 virtual/android/fullscreen/full-screen-ruleset-crash.html [ Crash ]
+crbug.com/982194 virtual/android/fullscreen/full-screen-with-css-reference-filter.html [ Timeout ]
+crbug.com/982194 virtual/android/fullscreen/keyboard-focus.html [ Crash ]
+crbug.com/982194 virtual/android/fullscreen/model/fully-exit-fullscreen-nested-iframe.html [ Crash ]
+crbug.com/982194 virtual/android/fullscreen/rendering/overflow.html [ Crash ]
+crbug.com/982194 virtual/android/rootscroller/keyboard-scroll-document-not-root-scroller.html [ Crash ]
+crbug.com/982194 virtual/audio-service/http/tests/media/video-buffered-range-contains-currentTime.html [ Failure ]
+crbug.com/982194 virtual/audio-service/http/tests/media/video-frame-size-change.html [ Failure ]
+crbug.com/982194 virtual/audio-service/http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-delegation.html [ Crash ]
+crbug.com/987269 virtual/audio-service/http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-disabled.html [ Pass Failure Crash ]
+crbug.com/982194 virtual/audio-service/http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-gesture.html [ Crash ]
+crbug.com/987269 virtual/audio-service/http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-header.html [ Pass Failure Crash ]
+crbug.com/982194 virtual/audio-service/http/tests/media/autoplay/document-user-activation-feature-policy-same-origin.html [ Crash ]
+crbug.com/982194 virtual/audio-service/http/tests/media/autoplay/document-user-activation-navigation-click.html [ Crash ]
+crbug.com/982194 virtual/audio-service/media/audio-controls-rendering.html [ Failure ]
+crbug.com/982194 virtual/audio-service/media/audio-delete-while-slider-thumb-clicked.html [ Crash ]
+crbug.com/874695 crbug.com/936165 virtual/audio-service/media/autoplay-muted.html [ Pass Timeout Timeout Crash ]
+crbug.com/982194 virtual/audio-service/media/controls-layout-direction.html [ Failure ]
+crbug.com/982194 virtual/audio-service/media/media-controls-clone.html [ Failure ]
+crbug.com/982194 virtual/audio-service/media/media-document-audio-repaint.html [ Failure ]
+crbug.com/982194 virtual/audio-service/media/video-controls-attribute-fullscreen.html [ Crash ]
+crbug.com/982194 virtual/audio-service/media/video-controls-overflow-menu-closed-captions-list-hide-on-click-outside.html [ Crash ]
+crbug.com/988248 virtual/audio-service/media/video-persistence.html [ Pass Failure Crash ]
+crbug.com/982194 virtual/audio-service/media/video-prefixed-fullscreen.html [ Crash ]
+crbug.com/982194 virtual/audio-service/media/video-src-blob.html [ Timeout ]
+crbug.com/982194 virtual/audio-service/media/autoplay/document-user-activation.html [ Crash ]
+crbug.com/982194 virtual/audio-service/media/autoplay/webaudio-audio-context-init.html [ Crash ]
+crbug.com/908347 virtual/audio-service/media/autoplay/webaudio-audio-context-resume.html [ Pass Failure Crash ]
+crbug.com/982194 virtual/audio-service/media/autoplay/webaudio-node-start.html [ Crash ]
+crbug.com/942951 virtual/audio-service/media/controls/controls-layout-in-different-size.html [ Timeout Crash ]
+crbug.com/982194 virtual/audio-service/media/controls/overflow-menu-animation.html [ Crash ]
+crbug.com/982194 virtual/audio-service/media/controls/progress-bar-repaint-on-size-change.html [ Crash ]
+crbug.com/982194 virtual/audio-service/media/controls/resizing-changes-css-class.html [ Crash ]
+crbug.com/982194 virtual/audio-service/media/controls/toggle-class-with-state-fullscreen.html [ Crash ]
+crbug.com/982194 virtual/audio-service/media/controls/volumechange-muted-attribute.html [ Failure ]
+crbug.com/982194 virtual/audio-service/media/picture-in-picture/detached-iframe.html [ Failure ]
+crbug.com/982194 virtual/audio-service/media/picture-in-picture/picture-in-picture-enabled.html [ Failure ]
+crbug.com/982194 virtual/audio-service/media/picture-in-picture/picture-in-picture-service-error.html [ Failure ]
+crbug.com/982194 virtual/audio-service/media/picture-in-picture/v2/detached-iframe.html [ Failure ]
+crbug.com/982194 virtual/audio-service/media/picture-in-picture/v2/request-picture-in-picture-twice.html [ Failure ]
+crbug.com/982194 virtual/audio-service/media/picture-in-picture/v2/request-picture-in-picture.html [ Failure ]
+crbug.com/874695 virtual/audio-service/media/remoteplayback/prompt-twice-throws.html [ Timeout Timeout ]
+crbug.com/982194 virtual/audio-service/media/track/track-cue-rendering-position-auto-rtl.html [ Failure ]
+crbug.com/982194 virtual/audio-service/media/track/track-cue-rendering-position-auto.html [ Failure ]
+crbug.com/982194 virtual/cache-storage-sequence/external/wpt/service-workers/service-worker/claim-fetch.https.html [ Failure ]
+crbug.com/982194 virtual/cascade/external/wpt/css/css-cascade/all-prop-001.html [ Failure ]
+crbug.com/982194 virtual/cascade/external/wpt/css/css-paint-api/style-before-pseudo.https.html [ Failure ]
+crbug.com/982194 virtual/cascade/external/wpt/css/css-paint-api/style-first-letter-pseudo.https.html [ Failure ]
+crbug.com/982194 virtual/cascade/external/wpt/css/css-scoping/slotted-with-pseudo-element.html [ Failure ]
+Bug(none) virtual/composite-after-paint/compositing/geometry/outline-change.html [ Failure ]
+Bug(none) virtual/composite-after-paint/compositing/gestures/gesture-tapHighlight-img.html [ Failure ]
+Bug(none) virtual/composite-after-paint/paint/background/background-clip-text-inline.html [ Failure ]
+Bug(none) virtual/composite-after-paint/paint/frames/frameset-with-stacking-context-and-not-stacking-context-children.html [ Failure ]
+Bug(none) virtual/composite-after-paint/paint/frames/frameset-with-stacking-contexts.html [ Failure ]
+crbug.com/980290 virtual/composite-after-paint/scrollingcoordinator/non-fast-scrollable-visibility-change.html [ Failure Crash ]
+crbug.com/982194 virtual/compositor_threaded_scrollbar_scrolling/fast/scrolling/scrollbars/scrollbar-occluded-by-div.html [ Crash ]
+crbug.com/982194 virtual/compositor_threaded_scrollbar_scrolling_hidpi_nozoomfordsf/fast/scrolling/scrollbars/scrollbar-occluded-by-div.html [ Crash ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/button/button-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-rtl.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-appearance-zoom150.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/calendar-picker/date-picker-month-appearance.html [ Timeout ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/checkbox/checkbox-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance-empty-list.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance-one-row.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance-two-rows.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance-value-attribute.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance-with-scrollbar.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance-zoom125.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance-zoom200.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/color/color-suggestion-picker-appearance.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/file/file-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-today.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-disabled-values.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-highlight.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-rtl.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-value-not-in-interval.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance-zoom150.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/month-picker/month-picker-appearance.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/radio/radio-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/range/range-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/range/slider-vertical-no-shadow-root.html [ Crash ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/select/select-inpage-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/text/input-basic-box-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic.html [ Failure ]
+crbug.com/982194 virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance.html [ Failure ]
+crbug.com/982194 virtual/disable-deferred-rendering/fast/canvas/canvas-measure-bidi-text.html [ Failure ]
+crbug.com/982194 virtual/disable-deferred-rendering/fast/canvas/canvas-text-ideographic-space.html [ Failure ]
+crbug.com/982194 virtual/disable-deferred-rendering/fast/canvas/webgl/draw-webgl-to-canvas-2d-after-to-data-url-without-context.html [ Crash ]
+crbug.com/982194 virtual/disable-deferred-rendering/fast/canvas/webgl/draw-webgl-to-canvas-2d.html [ Crash ]
+crbug.com/982194 virtual/disable-deferred-rendering/fast/canvas/webgl/webgl-with-neg-outline-offset.html [ Failure ]
+crbug.com/982194 virtual/exotic-color-space/images/55.html [ Failure ]
+crbug.com/982194 virtual/exotic-color-space/images/alt-text-wrapping.html [ Failure ]
+crbug.com/982194 virtual/exotic-color-space/images/color-profile-drag-image.html [ Crash ]
+crbug.com/982194 virtual/exotic-color-space/images/color-profile-munsell-adobe-to-srgb-webgl.html [ Crash ]
+crbug.com/982194 virtual/exotic-color-space/images/content-url-image-with-alt-text-dynamic.html [ Failure ]
+crbug.com/982194 virtual/exotic-color-space/images/drag-image.html [ Crash ]
+crbug.com/982194 virtual/exotic-color-space/images/drag-pdf-as-image.html [ Crash ]
+crbug.com/982194 virtual/exotic-color-space/images/drag-svg-image.html [ Crash ]
+crbug.com/982194 virtual/exotic-color-space/images/exif-orientation-image-document.html [ Failure ]
+crbug.com/982194 virtual/exotic-color-space/images/exif-orientation.html [ Failure ]
+crbug.com/982194 virtual/exotic-color-space/images/image-change-src.html [ Failure ]
+crbug.com/982194 virtual/exotic-color-space/images/image-hover-display-alt.html [ Failure ]
+crbug.com/982194 virtual/exotic-color-space/images/image-in-map.html [ Failure ]
+crbug.com/982194 virtual/exotic-color-space/images/image-map-multiple-xhtml.xhtml [ Crash ]
+crbug.com/982194 virtual/exotic-color-space/images/image-map-multiple.html [ Crash ]
+crbug.com/982194 virtual/exotic-color-space/images/imagemap-duplicate-outlines-crash.html [ Failure ]
+crbug.com/982194 virtual/exotic-color-space/images/missing-image-border-zoom.html [ Failure ]
+crbug.com/982194 virtual/exotic-color-space/images/server-side-imagemap.html [ Crash ]
+crbug.com/982194 virtual/exotic-color-space/images/png-suite/test.html [ Failure ]
+crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-avoids-document-and-body.html [ Failure ]
+crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-button-negative-tabindex.html [ Failure ]
+crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-checkbox-radio.html [ Failure ]
+crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-disconnected-document.html [ Failure ]
+crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-disconnected-editable.html [ Failure ]
+crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-display-none-editable.html [ Failure ]
+crbug.com/985520 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-enter-from-interest-a11y.html [ Crash Failure ]
+crbug.com/985520 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-enter-from-interest.html [ Crash Failure ]
+crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-escape-uninterested-focus.html [ Crash ]
+crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-focused-editable-blocks-movement.html [ Failure ]
+crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-does-not-submit-a11y.html [ Timeout ]
+crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-does-not-submit.html [ Timeout ]
+crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-state-on-click-a11y.html [ Timeout ]
+crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-state-on-click.html [ Timeout ]
+crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-form-state.html [ Crash ]
+crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-fully-contained-input.html [ Failure ]
+crbug.com/982194 virtual/focusless-spat-nav/fast/spatial-navigation/focusless/snav-focusless-mouse-enter-leave.html [ Failure ]
+crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/forced-colors-mode-14.html [ Crash ]
+crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-01.html [ Failure ]
+crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-02.html [ Failure ]
+crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-03.html [ Failure ]
+crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-04.html [ Failure ]
+crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-05.html [ Failure ]
+crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-06.html [ Failure ]
+crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-08.html [ Failure ]
+crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-09.html [ Failure ]
+crbug.com/982194 virtual/forced-colors/external/wpt/forced-colors-mode/backplate/forced-colors-mode-backplate-10.html [ Failure ]
+crbug.com/982194 virtual/forced-colors/fast/css/forced-colors-mode/forced-colors-mode-15.html [ Crash ]
+crbug.com/982194 virtual/forced-colors/fast/css/forced-colors-mode/backplate/forced-colors-mode-backplate-07.html [ Failure ]
+crbug.com/982194 virtual/gpu/fast/canvas/canvas-measure-bidi-text.html [ Failure ]
+crbug.com/982194 virtual/gpu/fast/canvas/canvas-pattern-video.html [ Failure ]
+crbug.com/982194 virtual/gpu/fast/canvas/canvas-text-ideographic-space.html [ Failure ]
+crbug.com/982194 virtual/gpu/fast/canvas/webgl/draw-webgl-to-canvas-2d-after-to-data-url-without-context.html [ Crash ]
+crbug.com/982194 virtual/gpu/fast/canvas/webgl/draw-webgl-to-canvas-2d.html [ Crash ]
+crbug.com/982194 virtual/gpu/fast/canvas/webgl/webgl-with-neg-outline-offset.html [ Failure ]
+crbug.com/982194 virtual/gpu-rasterization/images/55.html [ Failure ]
+crbug.com/982194 virtual/gpu-rasterization/images/alt-text-wrapping.html [ Failure ]
+crbug.com/982194 virtual/gpu-rasterization/images/color-profile-drag-image.html [ Crash ]
+crbug.com/982194 virtual/gpu-rasterization/images/color-profile-munsell-adobe-to-srgb-webgl.html [ Crash ]
+crbug.com/982194 virtual/gpu-rasterization/images/content-url-image-with-alt-text.html [ Failure ]
+crbug.com/982194 virtual/gpu-rasterization/images/drag-image.html [ Crash ]
+crbug.com/982194 virtual/gpu-rasterization/images/drag-pdf-as-image.html [ Crash ]
+crbug.com/982194 virtual/gpu-rasterization/images/drag-svg-image.html [ Crash ]
+crbug.com/982194 virtual/gpu-rasterization/images/exif-orientation-image-document.html [ Failure ]
+crbug.com/982194 virtual/gpu-rasterization/images/exif-orientation.html [ Failure ]
+crbug.com/982194 virtual/gpu-rasterization/images/image-hover-display-alt.html [ Failure ]
+crbug.com/982194 virtual/gpu-rasterization/images/image-in-map.html [ Failure ]
+crbug.com/982194 virtual/gpu-rasterization/images/image-map-multiple-xhtml.xhtml [ Crash ]
+crbug.com/982194 virtual/gpu-rasterization/images/image-map-multiple.html [ Crash ]
+crbug.com/982194 virtual/gpu-rasterization/images/imagemap-duplicate-outlines-crash.html [ Failure ]
+crbug.com/982194 virtual/gpu-rasterization/images/missing-image-border-zoom.html [ Failure ]
+crbug.com/982194 virtual/gpu-rasterization/images/server-side-imagemap.html [ Crash ]
+crbug.com/982194 virtual/gpu-rasterization/images/png-suite/test.html [ Failure ]
+crbug.com/982194 virtual/isolated_world_csp/http/tests/security/isolatedWorld/events.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/css3/flexbox/multiline-shrink-to-fit.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-layout-016.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-002.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-011.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-012.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-020.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-024.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-047.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-cell-001.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-cell-002.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-clip-011.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-clip-012.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-clip-013.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-clip-014.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-table-001.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-paint-table-002.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-contain/contain-size-056.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/css-flexbox-column-wrap-reverse.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/css-flexbox-column-wrap.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/css-flexbox-column.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-box-wrap.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-flow-007.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-vertical-align-effect.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-content-stretch-2.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-items-stretch-2.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_align-items-stretch.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-0-unitless.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-0.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-1-unitless-basis.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-N-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-N-unitless-basis.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-N.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-Npercent-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-Npercent.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-auto-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0-auto.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-0.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-0-unitless.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-0.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-1-unitless-basis.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-N-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-N-unitless-basis.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-N.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-Npercent-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-Npercent.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-auto-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1-auto.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-1.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-0-unitless.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-0.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-N-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-N.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-Npercent-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-Npercent.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-auto-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N-auto.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-N.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-0-auto.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-0-unitless.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-0.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-N-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-N.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-Npercent-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-Npercent.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-auto-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0-auto.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-0.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-0-unitless.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-0.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-N-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-N.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-Npercent.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-auto-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1-auto.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-1.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-0-unitless.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-0.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-N-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-N.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-Npercent-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-Npercent.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-auto-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N-auto.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-1-N.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-0-unitless.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-0.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-N-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-N.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-Npercent-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-Npercent.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-auto-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0-auto.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-0.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-0-unitless.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-0.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-N-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-N.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-Npercent-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-Npercent.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-auto-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1-auto.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-1.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-0-unitless.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-0.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-N-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-N.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-Npercent-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-Npercent.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-auto-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N-auto.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-N-N.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-auto.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-basis-shrink.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-basis.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-initial-2.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-initial.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-natural.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_flex-none.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-center.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-flex-end.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-flex-start.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound-negative.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound-only.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-spacearound.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween-negative.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween-only.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_justifycontent-spacebetween.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_margin-auto-overflow-2.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_margin-auto-overflow.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_margin-auto.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flexbox_margin-left-ex.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/percentage-heights-002.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/percentage-heights-004.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-reverse-row-reverse.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-lines/multi-line-wrap-with-row-reverse.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-break-000.xht [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-break-001.xht [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-paint-clip-006.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-block-004.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/forms/fieldset/fieldset-disabled.html [ Crash ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/balance-breakafter-before-nested-block.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/border-radius-clipped-layer-second-column.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/composited-relpos-in-clipped.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/float-truncation.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/focus-outline.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/paginate-block-replaced.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/recursive-split-flow-crash.html [ Crash ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/relpos-inside-inline-block.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/table-multicolumn-caption.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/unbreakable-block-too-tall-to-fit.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-float-after-content-in-spanner.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/dynamic/insert-float-before-content-in-spanner.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/newmulticol/table-cell.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/vertical-lr/float-truncation.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fast/multicol/vertical-rl/float-truncation.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fragmentation/fragmented-table-cell.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fragmentation/single-line-cells-paginated-with-text.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fragmentation/table-row-page-break-collapsed-border.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/fragmentation/transformed-clip-before-second-column.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/printing/ellipsis-printing-style.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/printing/list-item-with-empty-first-line.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/printing/page-count-layout-overflow.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/printing/return-from-printing-mode.html [ Failure ]
+crbug.com/982194 virtual/layout_ng_experimental/printing/css2.1/page-break-inside-000.html [ Failure ]
+crbug.com/982194 virtual/main_thread_scrollbar_gestures/fast/scrolling/scrollbars/scrollbar-occluded-by-div.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/anchor-image-scrolled-x-y.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/attribute-listener-deletion-crash.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-disabled-in-fix.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-iframe-no-scrolling.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-in-overflow-hidden-html.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-nonscrollable-iframe-in-scrollable-div.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-overflow-hidden-longhands.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-select-crash.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-should-not-stop-on-keypress.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-upwards-propagation-no-scroll-iframe.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-upwards-propagation-overflow-hidden-body.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-upwards-propagation-overflow-hidden-iframe-body.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-upwards-propagation.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll-with-non-scrollable-parent.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/autoscroll.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/background-tab-on-ctrl-click.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/background-tab-on-submit-ctrl-click.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/before-unload-reloads.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/button-mouse-active.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/capture-on-target.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/check-defocus-event-order-when-triggered-by-mouse-click.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-after-mousedown-cancel.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-anchor-blur-refocus-window.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-anchor-refocus-window.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-checkbox-blur-refocus-window.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-checkbox-refocus-window.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-focus-anchor-has-ring.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-focus-anchor-no-ring.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-focus-keydown-no-ring.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-focus-svganchor-has-ring.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-over-descendant-elements.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-range-slider.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-svganchor-blur-refocus-window.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-svganchor-refocus-window.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/click-with-large-negative-text-indent.html [ Timeout ]
+crbug.com/779170 virtual/mouseevent_fractional/fast/events/clientXY-in-zoom-and-scroll.html [ Failure Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/content-changed-during-drop.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/context-menu-key-shift-f10-modifiers.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/context-menu-key-shift-f10-prevent-default.html [ Failure ]
+crbug.com/663847 virtual/mouseevent_fractional/fast/events/context-no-deselect.html [ Pass Failure Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/context-nodrag.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/context-onmousedown-event.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/dispatch-mouse-events-to-window-always.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/display-none-on-focus-crash.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/domactivate-sets-underlying-click-event-as-handled.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/download-on-alt-click.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-and-drop-subframe-dataTransfer.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-and-drop-thresholds.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-dataTransferItemList-file-handling.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-dragend-detaches.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-image-filename.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-in-frames.html [ Crash ]
+crbug.com/346473 virtual/mouseevent_fractional/fast/events/drag-on-mouse-move-cancelled.html [ Failure Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-outside-window.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-remove-iframe-crash.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-svg-image-crash.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag-text-with-clear.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/drag_and_drop_into_removed_on_focus.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/dragging-mouse-moves.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/event-fire-disconnected-shadow-dom-crash.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/event-hit-testing-fallback-to-iframe.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/event-on-culled-inline-with-pseudo.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/event-on-culled_inline.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/event-trusted.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/event-view-toString.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/file-input-hidden-in-ondrop.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/focus-change-assertion.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/focus-change-crash.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/focus-change-crash2.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/focus-click-on-non-mouse-focusable-element.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/focus-event-source-device-from-mouse.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/focus-event-source-device-from-touch.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/frame-click-clear-focus.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/frame-click-focus.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/frame-detached-in-mousedown.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/hit-test-counts.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/iframe-mousewheel.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/iframe-onmousemove.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/input-image-scrolled-x-y.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/keyboard-scroll-use-count.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/keydown-1.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/keypress-removed-node.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/max-tabindex-focus.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/menu-key-context-menu-document-pinch-zoom.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/menu-key-context-menu-document.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/menu-key-context-menu-position.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/menu-key-context-menu-reveal-focus.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/menu-key-context-menu.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/menu-key-no-mouse-down.html [ Crash ]
+crbug.com/851090 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-click-hyperlink.html [ Pass Failure Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-click.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-drag-scrollable-iframe-div.html [ Crash ]
+crbug.com/891155 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-drag.html [ Pass Failure Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-in-iframe.html [ Crash ]
+crbug.com/827209 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-latching.html [ Pass Failure Timeout Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-modal-scrollable-iframe-div.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-nested-divs.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-panIcon.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/middleClickAutoscroll-use-count.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-click-events-pseudo-element.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-click-events.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-cursor-multiframecur.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-cursor-style-change-iframe.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-down-on-pseudo-element-remove-crash.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-drag-from-frame-to-other-frame.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-drag-from-frame.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-event-from-touch-source-device-event-sender.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-event-source-device-event-sender.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-events-on-textarea-resize.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-events-within-no-element.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-focus-imagemap.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-layerXY-scrolled.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-moved-remove-frame-crash.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-relative-position-zoomed.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-relative-position.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouse-up-preventDefault-dragstate.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseclick-target-and-positioning.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mousedown-in-subframe-scrollbar.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mousedown-inside-dragstart-should-not-cause-crash.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseenter-mouseleave-on-drag.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mousemove-after-drag-over-scrollbar.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mousemove-to-resizer-changes-cursor.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseover-button.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseover-mouseout.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseover-mouseout2.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseup-outside-button.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/mouseup-outside-document.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/new-tab-on-middle-click.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/node-event-anchor-lock.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/onblur-remove.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/onchange-click-hang.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/onchange-range-slider.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/onclick-list-marker.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/open-window-from-another-frame.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/page-scaled-mouse-click-iframe.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/page-scaled-mouse-click.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointer-events-2.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointer-events.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-allowed-from-gesture-initiated-event.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-allowed-from-gesture-initiated-form-submit.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-allowed-from-gesture-only-once-iframes.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-allowed-from-gesture-only-once-two-events.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-allowed-from-gesture-only-once.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-allowed-from-pointerup-exactly-once.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocked-from-different-frames.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocked-from-fake-focus.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocked-from-fake-user-gesture.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocked-from-wrong-event.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocking-click-in-iframe.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocking-timers1.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocking-timers2.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocking-timers3.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocking-timers4.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocking-timers5.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-blocking-timers6.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-forwarded-gesture-blocked.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/popup-forwarded-gesture.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/relative-offset-of-simulated-click.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/remove-target-in-mouseup-deep.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/remove-target-in-mouseup-insertback.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/remove-target-in-mouseup-twice.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/remove-target-in-mouseup.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/remove-target-with-shadow-in-drag.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/remove-text-node-in-mouseup.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/reveal-link-when-focused.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/right-click-focus.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/scroll-after-click-on-tab-index.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/scroll-div-with-prevent-default-in-subframe.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/scroll-to-anchor-in-overflow-hidden.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/select-onchange-mouse-released-outside.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/selection-autoscroll-borderbelt.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/selectionchange-iframe.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/selectstart-by-double-triple-clicks.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/selectstart-by-drag-stylus.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/selectstart-by-single-click-with-shift.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/selectstart-on-selectall.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/selectstart-prevent-selection-on-right-click.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/sequential-focus-navigation-starting-point.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/shift-click-user-select-none.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/shift-drag-selection-no-drag-n-drop.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/shift-drag-selection-on-image-triggers-drag-n-drop.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/shift-drag-selection-on-link-triggers-drag-n-drop.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/simulated-click-coords.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/simulated-click-disabled.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/standalone-image-drag-to-editable.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/update-hover-when-mouse-press.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/update-mouse-cursor-after-layout-change.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/updateLayoutForHitTest.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/update_hover_after_layout_change.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/window-events-bubble.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/window-events-bubble2.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/window-events-capture.html [ Crash ]
+crbug.com/779170 virtual/mouseevent_fractional/fast/events/zoom-dblclick.html [ Failure Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/hr-timestamp/generated-events.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/inputevents/beforeinput-remove-iframe-crash.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/inputevents/input-event-event-listener.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/inputevents/inputevent-ime.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-node-remove.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-on-object.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-boundary-events-for-shadowdom.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-capture-transition-events.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-capture.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-chorded-buttons.html [ Crash ]
+crbug.com/722212 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-event-properties.html [ Pass Failure Timeout Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-haspointercapture.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-preventdefault.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-transition-events.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-updown-events.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/mouseevent_key_pressed.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/multi-pointer-event-in-slop-region.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/multi-pointer-preventdefault.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/pointer-event-in-slop-region.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/pointer-event-mouse-coords-in-zoom-and-scroll.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/pointer-event-pen-coords-in-zoom-and-scroll.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/pointerevent_mouse_pointercapture_inactivate_pointer.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/pointerevent_touch-adjustment_click_target.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/touch-capture.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/touch-pointer-events.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/pointerevents/touch-pointer-long-press.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/page-scaled-touch-gesture-click.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/touch-action-range-input-csp.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/touch-action-range-input.html [ Timeout ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/touch-before-pressing-spin-button.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/touch-fractional-coordinates.html [ Failure ]
+crbug.com/874695 virtual/mouseevent_fractional/fast/events/touch/touch-slider-no-js-touch-listener.html [ Timeout Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/touch-slider.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/context-menu-on-two-finger-tap.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/double-tap-zoom-touch-action-none.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/focus-selectionchange-on-tap.html [ Crash ]
+crbug.com/874695 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-click.html [ Timeout Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-dblclick.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-active-state-hidden-iframe.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-active-state-iframe.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-active-state.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-click-common-ancestor.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-div-removed.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-frame-move.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-frame-overlap.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-frame-removed.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-frame-scrollbar.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-frame-scrolled.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-hover-clear.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-hover-state-iframe.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-input-after-composition.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-mouse-events-between-frames.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-mouse-events.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-near-iframe.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-on-hover-element.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-paragraph-end.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-reset-selection-range.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-result.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-scrolled.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/gesture-tap-setrangetext-with-events.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/long-press-drag-drop-touch-editing-combined-in-iframe.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/long-press-drag-drop-touch-editing-combined.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/long-press-focuses-frame.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/long-press-on-draggable-element-in-iframe-triggers-drag.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/long-press-on-draggable-element-in-nested-iframes-triggers-drag.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/long-press-selects-word-when-touch-editing-enabled.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/right-click-gestures-set-cursor-at-correct-position.html [ Crash ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/touch-gesture-scroll-iframe-editable.html [ Failure ]
+crbug.com/982194 virtual/mouseevent_fractional/fast/events/touch/gesture/touch-gesture-scroll-iframe-past-extent.html [ Failure ]
+crbug.com/982194 virtual/not-site-per-process/external/wpt/html/user-activation/message-event-activation-api-iframe-cross-origin.sub.tentative.html [ Timeout ]
+crbug.com/902685 virtual/not-site-per-process/http/tests/devtools/isolated-code-cache/cross-origin-test.js [ Timeout Crash ]
+crbug.com/982194 virtual/not-site-per-process/http/tests/local/drag-over-remote-content.html [ Crash ]
+crbug.com/982194 virtual/not-site-per-process/http/tests/media/autoplay/webaudio-autoplay-iframe-with-gesture.html [ Crash ]
+crbug.com/982194 virtual/not-site-per-process/http/tests/webaudio/autoplay-crossorigin.html [ Crash ]
+crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/iframe.tentative.https.sub.html [ Timeout ]
+crbug.com/982194 virtual/omt-worker-fetch/external/wpt/fetch/metadata/window-open.tentative.https.sub.html [ Timeout ]
+crbug.com/982194 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/claim-shared-worker-fetch.https.html [ Crash ]
+crbug.com/982194 virtual/omt-worker-fetch/external/wpt/workers/SharedWorker-detach-frame-in-error-event.html [ Crash ]
+crbug.com/982194 virtual/omt-worker-fetch/fast/workers/chromium/close-context-messageport-crash.html [ Crash ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/ancestor-overflow.html [ Failure ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/composited-nested-sticky-deep.html [ Failure ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/get-transform-from-non-box-container.html [ Failure ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/overflow-scroll-with-negative-offset-translucent-outline.html [ Failure ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/scroll-children-do-not-paint-comp-scroll-phase.html [ Failure ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers.html [ Crash ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollable-iframe-click-gets-focus.html [ Crash ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-click-does-not-blur-content.html [ Crash ]
+crbug.com/982194 virtual/prefer_compositing_to_lcd_text/scrollbars/scrollbar-middleclick-nopaste.html [ Crash ]
+crbug.com/982194 virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance.html [ Failure ]
+crbug.com/982194 virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance.html [ Failure ]
+crbug.com/982194 virtual/scalefactor150/fast/hidpi/static/drag-image.html [ Crash ]
+crbug.com/982194 virtual/scalefactor150/fast/hidpi/static/pointerevents/pointerevent_touch-adjustment_click_target.html [ Crash ]
+crbug.com/982194 virtual/scalefactor200/css3/filters/filter-region.html [ Failure ]
+crbug.com/982194 virtual/scalefactor200/css3/filters/filtered-inline.html [ Failure ]
+crbug.com/982194 virtual/scalefactor200/css3/filters/nested-filters.html [ Failure ]
+crbug.com/982194 virtual/scalefactor200/css3/filters/null-effect-check.html [ Failure ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filter-cb-abspos-inline-002.html [ Failure ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filter-cb-abspos-inline-003.html [ Failure ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/css/filter-effects/filtered-inline-is-container.html [ Failure ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/background-image-multiple-elements.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/css-generated-text.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/element-only-when-fully-active.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/first-letter-background.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/fixed-id-identifier.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/observe-text.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/element-timing/text-with-display-style.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/largest-contentful-paint/first-letter-background.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/largest-contentful-paint/larger-image.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/largest-contentful-paint/larger-text.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/largest-contentful-paint/observe-text.html [ Failure ]
+crbug.com/982194 virtual/scalefactor200/external/wpt/largest-contentful-paint/text-with-display-style.html [ Failure ]
+crbug.com/982194 virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance.html [ Failure ]
+crbug.com/982194 virtual/scalefactor200/fast/hidpi/static/drag-image.html [ Crash ]
+crbug.com/982194 virtual/scalefactor200/fast/hidpi/static/validation-bubble-appearance-hidpi.html [ Failure ]
+crbug.com/982194 virtual/scalefactor200/fast/hidpi/static/pointerevents/pointerevent_touch-adjustment_click_target.html [ Crash ]
+crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/background-image-multiple-elements.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/css-generated-text.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/element-only-when-fully-active.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/first-letter-background.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/fixed-id-identifier.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/observe-text.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/element-timing/text-with-display-style.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/largest-contentful-paint/first-letter-background.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/largest-contentful-paint/larger-image.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/largest-contentful-paint/larger-text.html [ Timeout ]
+crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/largest-contentful-paint/observe-text.html [ Failure ]
+crbug.com/982194 virtual/scalefactor200withoutzoom/external/wpt/largest-contentful-paint/text-with-display-style.html [ Failure ]
+crbug.com/982194 virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance.html [ Failure ]
+crbug.com/982194 virtual/scalefactor200withzoom/fast/hidpi/static/drag-image.html [ Crash ]
+crbug.com/982194 virtual/scalefactor200withzoom/fast/hidpi/static/pointerevents/pointerevent_touch-adjustment_click_target.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-continuation.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects-list-translate.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/page-scaled-touch-gesture-click.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/touch-action-range-input-csp.html [ Timeout ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/touch-action-range-input.html [ Timeout ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/touch-before-pressing-spin-button.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/touch-fractional-coordinates.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/touch-slider-no-js-touch-listener.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/touch-slider.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/context-menu-on-two-finger-tap.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/double-tap-zoom-touch-action-none.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/focus-selectionchange-on-tap.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-click.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-dblclick.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-active-state-hidden-iframe.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-active-state-iframe.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-active-state.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-click-common-ancestor.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-div-removed.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-frame-move.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-frame-overlap.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-frame-removed.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-frame-scrollbar.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-frame-scrolled.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-hover-clear.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-hover-state-iframe.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-input-after-composition.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-mouse-events-between-frames.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-mouse-events.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-near-iframe.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-on-hover-element.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-paragraph-end.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-reset-selection-range.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-result.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-scrolled.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/gesture-tap-setrangetext-with-events.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/long-press-drag-drop-touch-editing-combined-in-iframe.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/long-press-drag-drop-touch-editing-combined.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/long-press-focuses-frame.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/long-press-on-draggable-element-in-iframe-triggers-drag.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/long-press-on-draggable-element-in-nested-iframes-triggers-drag.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/long-press-selects-word-when-touch-editing-enabled.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/right-click-gestures-set-cursor-at-correct-position.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/touch-gesture-scroll-iframe-editable.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/events/touch/gesture/touch-gesture-scroll-iframe-past-extent.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/scroll-behavior/middleclick-autoscroll-use-count.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/scroll-behavior/scroll-over-resizer.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/scroll-behavior/subframe-interrupted-scroll.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/scroll-behavior/smooth-scroll/scroll-during-selection.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/scrolling/hashtag-autoscroll.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/scrolling/middle-click-autoscroll-latching-clicked-node.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/scrolling/scroll-into-view-ignores-invisible-selection.html [ Crash ]
+crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollable-area-frame-overflow-hidden.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollable-area-frame-overried-inherited-visibility-hidden.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollable-area-frame-scrolling-yes.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollable-area-frame-visibility-hidden-child.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollable-area-frame.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollbar-tickmarks-styled-after-onload.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollbar-tickmarks-styled.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/scrolling/wheel-scrolling-over-custom-scrollbar.html [ Failure ]
+crbug.com/982194 virtual/scroll_customization/fast/scrolling/scrollbars/scrollbar-occluded-by-div.html [ Crash ]
+crbug.com/902685 virtual/site-isolated-code-cache/http/tests/devtools/isolated-code-cache/cross-origin-test.js [ Timeout Crash ]
+crbug.com/982194 virtual/speech-with-unified-autoplay/external/wpt/speech-api/SpeechSynthesis-speak-ownership.html [ Timeout ]
+crbug.com/982194 virtual/stable/http/tests/navigation/anchor-frames-shifting-focus.html [ Crash ]
+crbug.com/982194 virtual/stable/http/tests/navigation/document-location-click-timeout.html [ Crash ]
+crbug.com/982194 virtual/stable/http/tests/navigation/document-location-mouseover.html [ Timeout ]
+crbug.com/982194 virtual/stable/http/tests/navigation/javascriptlink-basic.html [ Crash ]
+crbug.com/982194 virtual/stable/http/tests/navigation/javascriptlink-subframeload.html [ Crash ]
+crbug.com/982194 virtual/stable/http/tests/navigation/no-referrer-reset.html [ Crash ]
+crbug.com/982194 virtual/stable/http/tests/navigation/no-referrer-same-window.html [ Crash ]
+crbug.com/982194 virtual/stable/http/tests/navigation/no-referrer-subframe.html [ Crash ]
+crbug.com/982194 virtual/stable/http/tests/navigation/parsed-iframe-dynamic-form-back-entry-user-gesture.html [ Crash ]
+crbug.com/982194 virtual/stable/http/tests/navigation/ping-cross-origin-from-https.html [ Crash ]
+crbug.com/982194 virtual/stable/http/tests/navigation/post-with-modifier.html [ Crash ]
+crbug.com/982194 virtual/stable/http/tests/navigation/same-document-scroll-position-restore.html [ Crash ]
+crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-cert-not-found.js [ Crash ]
+crbug.com/874695 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-disable-cache.js [ Timeout Crash ]
+crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-navigation-fail.js [ Crash ]
+crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-navigation-redirect.js [ Crash ]
+crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-navigation.js [ Crash ]
+crbug.com/851363 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-prefetch-fail.js [ Pass Failure Crash ]
+crbug.com/982194 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-transfer-size.js [ Crash ]
+crbug.com/982194 virtual/sxg-with-network-service/http/tests/loading/sxg/sxg-subresource-origin-trial.https.html [ Failure ]
+crbug.com/982194 virtual/threaded/animations/inline-transform.html [ Failure ]
+crbug.com/982194 virtual/threaded/animations/rotate-transform-equivalent.html [ Failure ]
+crbug.com/982194 virtual/threaded/external/wpt/css/css-paint-api/style-before-pseudo.https.html [ Failure ]
+crbug.com/982194 virtual/threaded/external/wpt/css/css-paint-api/style-first-letter-pseudo.https.html [ Failure ]
+crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/focus-without-user-activation-tentative.sub.html [ Crash ]
+crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/vertical-scroll-disabled-frame-no-scroll-manual.tentative.html [ Failure ]
+crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/vertical-scroll-touch-action-manual.tentative.html [ Failure ]
+crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/vertical-scroll-touch-block-manual.tentative.html [ Failure ]
+crbug.com/982194 virtual/threaded/external/wpt/feature-policy/experimental-features/vertical-scroll-wheel-block-manual.tentative.html [ Failure ]
+crbug.com/243871 virtual/threaded/fast/scroll-behavior/scroll-over-resizer.html [ Timeout Failure ]
+crbug.com/243871 virtual/threaded/fast/scroll-behavior/smooth-scroll/scroll-during-selection.html [ Timeout Crash ]
+crbug.com/982194 virtual/threaded/fast/scrolling/hashtag-autoscroll.html [ Crash ]
+crbug.com/982194 virtual/threaded/fast/scrolling/scroll-into-view-ignores-invisible-selection.html [ Crash ]
+crbug.com/982194 virtual/threaded/fast/scrolling/scrollable-area-frame-overflow-hidden.html [ Failure ]
+crbug.com/982194 virtual/threaded/fast/scrolling/scrollable-area-frame-overried-inherited-visibility-hidden.html [ Failure ]
+crbug.com/982194 virtual/threaded/fast/scrolling/scrollable-area-frame-scrolling-yes.html [ Failure ]
+crbug.com/982194 virtual/threaded/fast/scrolling/scrollable-area-frame-visibility-hidden-child.html [ Failure ]
+crbug.com/982194 virtual/threaded/fast/scrolling/scrollable-area-frame.html [ Failure ]
+crbug.com/982194 virtual/threaded/fast/scrolling/scrollbar-mousedown-mouseup.html [ Failure ]
+crbug.com/982194 virtual/threaded/fast/scrolling/scrollbar-tickmarks-styled-after-onload.html [ Failure ]
+crbug.com/982194 virtual/threaded/fast/scrolling/scrollbar-tickmarks-styled.html [ Failure ]
+crbug.com/982194 virtual/threaded/fast/scrolling/scrollbars/scrollbar-occluded-by-div.html [ Crash ]
+crbug.com/874695 virtual/threaded/http/tests/devtools/tracing/console-timeline.js [ Timeout Crash ]
+crbug.com/420008 virtual/threaded/http/tests/devtools/tracing/timeline-js/timeline-script-tag-1.js [ Timeout Failure ]
+crbug.com/420008 virtual/threaded/http/tests/devtools/tracing/timeline-misc/timeline-event-dispatch.js [ Timeout Timeout ]
+crbug.com/420008 virtual/threaded/http/tests/devtools/tracing/timeline-time/timeline-timer-fired-from-eval-call-site.js [ Timeout Failure ]
+crbug.com/982194 virtual/threaded/printing/return-from-printing-mode.html [ Failure ]
+crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/focus-without-user-activation-tentative.sub.html [ Crash ]
+crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/vertical-scroll-disabled-frame-no-scroll-manual.tentative.html [ Failure ]
+crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/vertical-scroll-touch-action-manual.tentative.html [ Failure ]
+crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/vertical-scroll-wheel-block-manual.tentative.html [ Failure ]
+crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/camera-report-only.https.html [ Failure ]
+crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/fullscreen-report-only.html [ Failure ]
+crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/microphone-report-only.https.html [ Failure ]
+crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/picture-in-picture-report-only.html [ Failure ]
+crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/picture-in-picture-reporting.html [ Failure ]
+crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/serial-report-only.https.html [ Failure ]
+crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/serial-reporting.https.html [ Failure ]
+crbug.com/982194 virtual/unified-autoplay/external/wpt/feature-policy/reporting/usb-report-only.https.html [ Failure ]
+crbug.com/982194 virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCPeerConnection-generateCertificate.html [ Failure ]
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests
index 7ace5fd7..94fd890 100644
--- a/third_party/blink/web_tests/NeverFixTests
+++ b/third_party/blink/web_tests/NeverFixTests
@@ -2058,6 +2058,8 @@
 crbug.com/870173 external/wpt/fetch/metadata/appcache.tentative.https.sub.html [ WontFix ]
 crbug.com/870173 external/wpt/fetch/metadata/redirect/redirect-http-upgrade.tentative.sub.html [ WontFix ]
 crbug.com/870173 external/wpt/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html [ WontFix ]
+crbug.com/870173 external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-http-upgrade.tentative.sub.html [ WontFix ]
+crbug.com/870173 external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html [ WontFix ]
 crbug.com/870173 external/wpt/resource-timing/cors-preflight.any.html [ WontFix ]
 crbug.com/870173 external/wpt/resource-timing/cors-preflight.any.worker.html [ WontFix ]
 crbug.com/870173 http/tests/devtools/console-xhr-logging.js [ WontFix ]
@@ -2074,6 +2076,8 @@
 crbug.com/870173 mhtml/cid_in_html_resource.html [ WontFix ]
 crbug.com/870173 virtual/omt-worker-fetch/external/wpt/fetch/metadata/redirect/redirect-http-upgrade.tentative.sub.html [ WontFix ]
 crbug.com/870173 virtual/omt-worker-fetch/external/wpt/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html [ WontFix ]
+crbug.com/870173 virtual/omt-worker-fetch/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-http-upgrade.tentative.sub.html [ WontFix ]
+crbug.com/870173 virtual/omt-worker-fetch/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html [ WontFix ]
 crbug.com/870173 virtual/omt-worker-fetch/external/wpt/resource-timing/cors-preflight.any.html [ WontFix ]
 crbug.com/870173 virtual/omt-worker-fetch/external/wpt/resource-timing/cors-preflight.any.worker.html [ WontFix ]
 crbug.com/870173 virtual/omt-worker-fetch/http/tests/workers/worker-redirect.html [ WontFix ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index c331bc5..6b8e1a9 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -257,7 +257,6 @@
 
 # Display locking failures
 crbug.com/955533 wpt_internal/display-lock/sizing/overflow-auto-with-overflow.html [ Failure ]
-crbug.com/1011376 wpt_internal/virtual-scroller/full-scroll-500px.html [ Failure ]
 
 # MSAN failure
 crbug.com/996625 inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js [ Skip ]
@@ -2074,11 +2073,6 @@
 # Run these tests with under virtual/scalefactor... only.
 crbug.com/567837 fast/hidpi/static [ Skip ]
 
-crbug.com/1002780 [ Linux ] external/wpt/websockets/stream-tentative/backpressure-receive.any.html [ Failure Pass ]
-crbug.com/1002780 [ Linux ] external/wpt/websockets/stream-tentative/backpressure-receive.any.serviceworker.html [ Failure Pass ]
-crbug.com/1002780 [ Linux ] external/wpt/websockets/stream-tentative/backpressure-receive.any.sharedworker.html [ Failure Pass ]
-crbug.com/1002780 [ Linux ] external/wpt/websockets/stream-tentative/backpressure-receive.any.worker.html [ Failure Pass ]
-
 # For win10, see crbug.com/955109
 crbug.com/538697 [ Win Win10 ] virtual/threaded/printing/webgl-oversized-printing.html [ Failure Crash ]
 crbug.com/538697 [ Win ] printing/webgl-oversized-printing.html [ Failure Crash ]
@@ -3094,8 +3088,6 @@
 
 # Hit a DCHECK
 crbug.com/918664 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/sizing/block-size-with-min-or-max-content-table-1a.html [ Failure Pass ]
-crbug.com/939181 external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html [ Failure Crash ]
-crbug.com/939181 virtual/not-site-per-process/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html [ Failure Timeout ]
 
 # FontFace object failures detected by WPT test
 crbug.com/965409 external/wpt/css/css-font-loading/fontface-descriptor-updates.html [ Failure ]
@@ -3120,6 +3112,12 @@
 crbug.com/618969 external/wpt/css/css-grid/subgrid/ [ Skip ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 [ Linux ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html [ Failure ]
+crbug.com/626703 [ Mac ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html [ Failure ]
+crbug.com/626703 [ Win ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html [ Failure ]
+crbug.com/626703 [ Linux ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html [ Failure ]
+crbug.com/626703 [ Mac ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html [ Failure ]
+crbug.com/626703 [ Win ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/clear-site-data/storage.https.html [ Timeout ]
 crbug.com/626703 [ Mac ] external/wpt/clear-site-data/storage.https.html [ Timeout ]
 crbug.com/626703 [ Win ] external/wpt/clear-site-data/storage.https.html [ Timeout ]
@@ -6140,7 +6138,7 @@
 crbug.com/1003055 virtual/threaded/external/wpt/css/css-scroll-snap/scroll-target-snap-003.html [ Failure ]
 
 # Sheriff 2019-09-12
-crbug.com/1003268 [ Win10 Win7 ] fast/harness/internals-observe-gc.html [ Failure ]
+crbug.com/1011515 [ Win7 ] fast/harness/internals-observe-gc.html [ Failure ]
 crbug.com/731018 [ Mac ] external/wpt/accelerometer/Accelerometer.https.html [ Pass Failure ]
 crbug.com/731018 [ Mac ] external/wpt/gyroscope/Gyroscope.https.html [ Pass Failure ]
 crbug.com/731018 [ Mac ] external/wpt/orientation-sensor/AbsoluteOrientationSensor.https.html [ Pass Failure ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
index 92cd775..a9bc4c5 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -107253,6 +107253,30 @@
      {}
     ]
    ],
+   "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html": [
+    [
+     "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html",
+     [
+      [
+       "/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html": [
+    [
+     "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html",
+     [
+      [
+       "/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/child-index-no-parent-01.html": [
     [
      "css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/child-index-no-parent-01.html",
@@ -138373,6 +138397,9 @@
    "css/css-grid/parsing/grid-auto-flow-valid-expected.txt": [
     []
    ],
+   "css/css-grid/parsing/grid-shorthand-expected.txt": [
+    []
+   ],
    "css/css-grid/parsing/grid-template-columns-computed-nogrid-expected.txt": [
     []
    ],
@@ -139741,6 +139768,9 @@
    "css/css-multicol/parsing/column-fill-valid-expected.txt": [
     []
    ],
+   "css/css-multicol/parsing/column-rule-shorthand-expected.txt": [
+    []
+   ],
    "css/css-multicol/reference/multicol-basic-005-ref.xht": [
     []
    ],
@@ -148717,6 +148747,9 @@
    "css/motion/parsing/offset-path-parsing-valid-expected.txt": [
     []
    ],
+   "css/motion/parsing/offset-shorthand-expected.txt": [
+    []
+   ],
    "css/reference/META.yml": [
     []
    ],
@@ -150160,6 +150193,9 @@
    "css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/whitespace-present-1-ref.html": [
     []
    ],
+   "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html": [
+    []
+   ],
    "css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/OWNERS": [
     []
    ],
@@ -180537,6 +180573,12 @@
      {}
     ]
    ],
+   "2dcontext/drawing-images-to-the-canvas/drawimage_crossorigin.sub.html": [
+    [
+     "2dcontext/drawing-images-to-the-canvas/drawimage_crossorigin.sub.html",
+     {}
+    ]
+   ],
    "2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html": [
     [
      "2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html",
@@ -208218,6 +208260,12 @@
      {}
     ]
    ],
+   "css/css-grid/parsing/grid-shorthand.html": [
+    [
+     "css/css-grid/parsing/grid-shorthand.html",
+     {}
+    ]
+   ],
    "css/css-grid/parsing/grid-template-areas-computed.html": [
     [
      "css/css-grid/parsing/grid-template-areas-computed.html",
@@ -209460,6 +209508,12 @@
      {}
     ]
    ],
+   "css/css-multicol/parsing/column-rule-shorthand.html": [
+    [
+     "css/css-multicol/parsing/column-rule-shorthand.html",
+     {}
+    ]
+   ],
    "css/css-multicol/parsing/column-rule-style-computed.html": [
     [
      "css/css-multicol/parsing/column-rule-style-computed.html",
@@ -220672,6 +220726,12 @@
      {}
     ]
    ],
+   "css/motion/parsing/offset-shorthand.html": [
+    [
+     "css/motion/parsing/offset-shorthand.html",
+     {}
+    ]
+   ],
    "css/selectors/anplusb-selector-parsing.html": [
     [
      "css/selectors/anplusb-selector-parsing.html",
@@ -329872,6 +329932,10 @@
    "9f297cacdcd81bef7093f79ebed6992110dab4d7",
    "support"
   ],
+  "2dcontext/drawing-images-to-the-canvas/drawimage_crossorigin.sub.html": [
+   "3d57d9f064bec7755a4f735e3fd12850109fcc15",
+   "testharness"
+  ],
   "2dcontext/drawing-images-to-the-canvas/drawimage_html_image.html": [
    "a94cfdcd2d66fb667d458a4dff91532fbf3608de",
    "testharness"
@@ -335277,7 +335341,7 @@
    "support"
   ],
   "README.md": [
-   "8c5b201818e388ea56b582d7f546bb4d67c31dd2",
+   "f728d502e17783c92114c904597eb3cc9b8c473a",
    "support"
   ],
   "WebCryptoAPI/META.yml": [
@@ -381332,6 +381396,14 @@
    "d4dcdb12b177cf97c3aa030cbb19c2ce2ae6d25d",
    "testharness"
   ],
+  "css/css-grid/parsing/grid-shorthand-expected.txt": [
+   "d2c4b0fd368779929161d94812987f4e675f2ea7",
+   "support"
+  ],
+  "css/css-grid/parsing/grid-shorthand.html": [
+   "91995608dd9eda5cd8d99abe3454cd67e52e405b",
+   "testharness"
+  ],
   "css/css-grid/parsing/grid-template-areas-computed.html": [
    "8290a40088311e7775f84ec33e6a46fc94c8dbe7",
    "testharness"
@@ -386456,6 +386528,14 @@
    "e9945ec77404f4d453eda7f7e90c771f993336ca",
    "testharness"
   ],
+  "css/css-multicol/parsing/column-rule-shorthand-expected.txt": [
+   "27cda6e51dd918bb7f6414e172750eb973728a72",
+   "support"
+  ],
+  "css/css-multicol/parsing/column-rule-shorthand.html": [
+   "68e7582fcc17cee92065b64c3ec8ecff2bb2a39b",
+   "testharness"
+  ],
   "css/css-multicol/parsing/column-rule-style-computed.html": [
    "277750ef36334b27f4544ada61c092db77ebd9e2",
    "testharness"
@@ -421704,6 +421784,14 @@
    "048c246f16b6cdcd286c9fa4ac6d1ac8dbdfbcbf",
    "testharness"
   ],
+  "css/motion/parsing/offset-shorthand-expected.txt": [
+   "740a2ecaa5678fc513cb38d4cb4fd85b44d6c089",
+   "support"
+  ],
+  "css/motion/parsing/offset-shorthand.html": [
+   "611a394b8b17f5da5d75128a5be8acfba7e0fcbe",
+   "testharness"
+  ],
   "css/reference/META.yml": [
    "0f0f7aa96a3d8d59be0a26eaf5c706ae82faf4e4",
    "support"
@@ -423853,7 +423941,7 @@
    "support"
   ],
   "css/support/shorthand-testcommon.js": [
-   "3298113513fb1e34311a6e7f34dd2d20cfe0c870",
+   "ab1f3794c8dac2f1e067209fd766ec18858a5f45",
    "support"
   ],
   "css/support/square-purple.png": [
@@ -426952,6 +427040,18 @@
    "70239a8e0853afad656f70cdba460dc3f10995fc",
    "reftest"
   ],
+  "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html": [
+   "0d1b1362873483fa1b900e2da3efe603648f791e",
+   "support"
+  ],
+  "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html": [
+   "f7ed6e3b342d6cd259b3df61a5445f83ab39b0f9",
+   "reftest"
+  ],
+  "css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html": [
+   "f02bf13a73cd0ee025bf3e3d6ae9215feadb12b4",
+   "reftest"
+  ],
   "css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/OWNERS": [
    "5e03d9bce08ec1c2c4d3a23b993e8f428c9e68db",
    "support"
@@ -459845,7 +459945,7 @@
    "testharness"
   ],
   "import-maps/imported/parsing-addresses.tentative-expected.txt": [
-   "3e2db5767c43b8fa7feba87b33f565ca0af05942",
+   "7d869b436fbf4187e87cdfa3d974c2da13cbbe4e",
    "support"
   ],
   "import-maps/imported/parsing-addresses.tentative.html": [
@@ -459869,7 +459969,7 @@
    "testharness"
   ],
   "import-maps/imported/parsing-specifier-keys.tentative-expected.txt": [
-   "c07d36cd946a28473a7ad643cebb36b1386b2d63",
+   "2c08065917f153cdc7f2db72add9b8acb96b4f32",
    "support"
   ],
   "import-maps/imported/parsing-specifier-keys.tentative.html": [
diff --git a/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_crossorigin.sub.html b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_crossorigin.sub.html
new file mode 100644
index 0000000..3d57d9f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_crossorigin.sub.html
@@ -0,0 +1,61 @@
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+  function draw_and_read_image(img, should_throw) {
+      let c = document.createElement('canvas');
+      document.body.appendChild(c);
+      let ctx = c.getContext('2d');
+      ctx.drawImage(img, 0, 0);
+
+      function get_image_data() {
+          ctx.getImageData(0, 0, 4, 4);
+      }
+
+      if (should_throw) {
+          assert_throws_dom('SecurityError', get_image_data);
+      } else {
+          get_image_data();
+      }
+
+      document.body.removeChild(c);
+  }
+
+  async_test(t => {
+      let img = new Image();
+      img.src = "/images/green.png";
+      img.crossOrigin = "anonymous";
+      img.onload = t.step_func_done(() => {
+          draw_and_read_image(img, false);
+      });
+      img.onerror = t.unreached_func();
+  }, "Can get pixels of canvas with same origin image drawn");
+
+  async_test(t => {
+      let img = new Image();
+      img.src = "http://{{hosts[][www]}}:{{ports[http][0]}}/images/green.png?pipe=header(Access-Control-Allow-Origin,*)";
+      img.crossOrigin = "anonymous";
+      img.onload = t.step_func_done(() => {
+          draw_and_read_image(img, false);
+      });
+      img.onerror = t.unreached_func();
+  }, "Can get pixels of canvas with CORS enabled cross origin image drawn");
+
+  async_test(t => {
+      let img = new Image();
+      img.src = "http://{{hosts[][www]}}:{{ports[http][0]}}/images/green.png?pipe=header(Access-Control-Allow-Origin,*)";
+      img.onload = t.step_func_done(() => {
+          draw_and_read_image(img, true);
+      });
+      img.onerror = t.unreached_func();
+  }, "Can't get pixels of canvas with CORS enabled cross origin image drawn from non-CORS element");
+
+  async_test(t => {
+      let img = new Image();
+      img.src = "http://{{hosts[][www]}}:{{ports[http][0]}}/images/green.png";
+
+      img.onload = t.step_func_done(() => {
+          draw_and_read_image(img, true);
+      });
+      img.onerror = t.unreached_func();
+  }, "Can't get pixels of canvas with non-CORS enabled cross origin image drawn");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/README.md b/third_party/blink/web_tests/external/wpt/README.md
index 8c5b201..f728d502e 100644
--- a/third_party/blink/web_tests/external/wpt/README.md
+++ b/third_party/blink/web_tests/external/wpt/README.md
@@ -118,7 +118,7 @@
 http://web-platform.test:8000/tools/runner/index.html <br>
 https://web-platform.test:8443/tools/runner/index.html *
 
-\**See [Trusting Root CA](#trusting-root-ca)*
+\**See [Trusting Root CA](./tools/certs/README.md)*
 
 Running Tests Automatically
 ---------------------------
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html b/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html
new file mode 100644
index 0000000..062edaf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollLeft-of-scroller-with-wider-scrollbar.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<title>The maximum value of scrollLeft shouldn't be affected by scrollbar when it's wider than scroller</title>
+<meta charset="utf-8">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollleft">
+
+<div id="scroller" style="overflow: scroll; width: 5px;height: 300px;">
+    <div style="width:100px; height: 1px"></div>
+</div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+    test(function() {
+        scroller.scrollLeft = 1000;
+        assert_equals(scroller.scrollLeft, 100);
+    }, "Test the maxium value of scrollLeft");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html b/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html
new file mode 100644
index 0000000..0d1b136
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001-ref.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <title>CSS Reference: String value of list-style-type</title>
+  <link rel="author" title="Xidorn Quan" href="mailto:quanxunzhen@gmail.com">
+  <style>
+    ol, ul { list-style: none; }
+    li::before {
+      content: "# ";
+      font-variant-numeric: tabular-nums;
+    }
+  </style>
+</head>
+<body>
+  <ol start="-1">
+    <li>item -1</li>
+    <li>item 0</li>
+    <li>item 1</li>
+    <li>item 2</li>
+  </ol>
+  <ul start="-1">
+    <li>item -1</li>
+    <li>item 0</li>
+    <li>item 1</li>
+    <li>item 2</li>
+  </ul>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html b/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html
new file mode 100644
index 0000000..f7ed6e3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001a.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <title>CSS Test: String value of list-style-type</title>
+  <link rel="author" title="Xidorn Quan" href="mailto:quanxunzhen@gmail.com">
+  <link rel="help" href="https://drafts.csswg.org/css-lists-3/#valdef-list-style-type-string">
+  <link rel="match" href="list-style-type-string-001-ref.html">
+  <style>
+    ol, ul { list-style-type: "# "; list-style-position: inside; }
+  </style>
+</head>
+<body>
+  <ol start="-1">
+    <li>item -1</li>
+    <li>item 0</li>
+    <li>item 1</li>
+    <li>item 2</li>
+  </ol>
+  <ul start="-1">
+    <li>item -1</li>
+    <li>item 0</li>
+    <li>item 1</li>
+    <li>item 2</li>
+  </ul>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html b/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html
new file mode 100644
index 0000000..f02bf13
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/lists-3/list-style-type-string-001b.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <title>CSS Test: String value of list-style</title>
+  <link rel="author" title="Xidorn Quan" href="mailto:quanxunzhen@gmail.com">
+  <link rel="help" href="https://drafts.csswg.org/css-lists-3/#valdef-list-style-type-string">
+  <link rel="match" href="list-style-type-string-001-ref.html">
+  <style>
+    ol, ul { list-style: inside "# "; }
+  </style>
+</head>
+<body>
+  <ol start="-1">
+    <li>item -1</li>
+    <li>item 0</li>
+    <li>item 1</li>
+    <li>item 2</li>
+  </ol>
+  <ul start="-1">
+    <li>item -1</li>
+    <li>item 0</li>
+    <li>item 1</li>
+    <li>item 2</li>
+  </ul>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/appcache.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/appcache.tentative.https.sub.html
index 1b5a576..3aa902c 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/appcache.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/appcache.tentative.https.sub.html
@@ -12,7 +12,6 @@
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=appcache-manifest{{$id}}")
           .then(t.step_func(response => response.text()))
           .then(t.step_func_done(text => assert_header_equals(text, {
-            "dest": "",
             "site": "same-origin",
             "user": "",
             "mode": "no-cors"
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/embed.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/embed.tentative.https.sub.html
index bf895e9..aae61e0f 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/embed.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/embed.tentative.https.sub.html
@@ -16,7 +16,7 @@
       let e = document.createElement('embed');
       e.src = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
       e.onload = e => {
-        let expected = {"dest":"embed", "site":"same-origin", "user":"", "mode":"no-cors"};
+        let expected = {"site":"same-origin", "user":"", "mode":"no-cors"};
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected))
@@ -35,7 +35,7 @@
       let e = document.createElement('embed');
       e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
       e.onload = e => {
-        let expected = {"dest":"embed", "site":"same-site", "user":"", "mode":"no-cors"};
+        let expected = {"site":"same-site", "user":"", "mode":"no-cors"};
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected))
@@ -54,7 +54,7 @@
       let e = document.createElement('embed');
       e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
       e.onload = e => {
-        let expected = {"dest":"embed", "site":"cross-site", "user":"", "mode":"no-cors"};
+        let expected = {"site":"cross-site", "user":"", "mode":"no-cors"};
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected))
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-preflight.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-preflight.tentative.https.sub.html
index 27dafc25d..1ab3de6 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-preflight.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-preflight.tentative.https.sub.html
@@ -13,7 +13,6 @@
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j, {
-            "dest": "empty",
             "site": "same-site",
             "user": "",
             "mode": "cors",
@@ -30,7 +29,6 @@
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j, {
-            "dest": "empty",
             "site": "cross-site",
             "user": "",
             "mode": "cors",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--fallback.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--fallback.tentative.https.sub.html
index 86edfd0..13016fe 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--fallback.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--fallback.tentative.https.sub.html
@@ -44,7 +44,7 @@
         const text = await response.text();
 
         // Verify presence of the expected Sec-Fetch-... request headers.
-        let expected = {"dest":"empty", "site":"same-origin", "user":"", "mode": "no-cors"};
+        let expected = {"site":"same-origin", "user":"", "mode": "no-cors"};
         assert_header_equals(text, expected);
       }, 'Sec-Fetch headers after SW fallback');
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--respondWith.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--respondWith.tentative.https.sub.html
index d59348c2..d437157 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--respondWith.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch-via-serviceworker--respondWith.tentative.https.sub.html
@@ -45,7 +45,7 @@
         const text = await response.text();
 
         // Verify presence of the expected Sec-Fetch-... request headers.
-        let expected = {"dest":"empty", "site":"same-origin", "user":"", "mode": "no-cors"};
+        let expected = {"site":"same-origin", "user":"", "mode": "no-cors"};
         assert_header_equals(text, expected);
       }, 'Sec-Fetch headers after SW fallback');
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.https.sub.html
index 30042f8..72fb52ec 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.https.sub.html
@@ -9,7 +9,6 @@
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j, {
-            "dest": "empty",
             "site": "same-origin",
             "user": "",
             "mode": "cors",
@@ -22,7 +21,6 @@
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j, {
-            "dest": "empty",
             "site": "same-site",
             "user": "",
             "mode": "cors",
@@ -35,7 +33,6 @@
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j, {
-            "dest": "empty",
             "site": "cross-site",
             "user": "",
             "mode": "cors",
@@ -49,7 +46,6 @@
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j, {
-            "dest": "empty",
             "site": "same-origin",
             "user": "",
             "mode": "same-origin",
@@ -62,7 +58,6 @@
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j, {
-            "dest": "empty",
             "site": "same-origin",
             "user": "",
             "mode": "cors",
@@ -75,7 +70,6 @@
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j, {
-            "dest": "empty",
             "site": "same-origin",
             "user": "",
             "mode": "no-cors",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.sub.html
index a2d66d6..a14c2c5 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/fetch.tentative.sub.html
@@ -12,7 +12,6 @@
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j, {
-            "dest": "empty",
             "site": "cross-site",
             "user": "",
             "mode": "cors",
@@ -27,7 +26,6 @@
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j, {
-            "dest": "",
             "site": "",
             "user": "",
             "mode": "",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/font.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/font.tentative.https.sub.html
index 07152e8..9064dd6 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/font.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/font.tentative.https.sub.html
@@ -46,7 +46,7 @@
     promise_test(t => {
       return new Promise((resolve, reject) => {
         let key = "font-same-origin";
-        let expected = {"dest":"font", "site":"same-origin", "user":"", "mode": "cors"};
+        let expected = {"site":"same-origin", "user":"", "mode": "cors"};
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected))
@@ -58,7 +58,7 @@
     promise_test(t => {
       return new Promise((resolve, reject) => {
         let key = "font-same-site";
-        let expected = {"dest":"font", "site":"same-site", "user":"", "mode": "cors"};
+        let expected = {"site":"same-site", "user":"", "mode": "cors"};
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected))
@@ -70,7 +70,7 @@
     promise_test(t => {
       return new Promise((resolve, reject) => {
         let key = "font-cross-site";
-        let expected = {"dest":"font", "site":"cross-site", "user":"", "mode": "cors"};
+        let expected = {"site":"cross-site", "user":"", "mode": "cors"};
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected))
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/history.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/history.tentative.https.sub.html
index ef8e74b..0d78ec06 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/history.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/history.tentative.https.sub.html
@@ -55,8 +55,7 @@
   "back to same-origin-initiated navigation",
   same_origin_host,  // report_host
   cross_site_host,  // go_back_host
-  { "dest": "document",
-    "site": "same-origin",
+  { "site": "same-origin",
     "user": "",
     "mode": "navigate" });
 
@@ -64,8 +63,7 @@
   "back to same-site-initiated navigation",
   same_site_host,  // report_host
   cross_site_host,  // go_back_host
-  { "dest": "document",
-    "site": "same-site",
+  { "site": "same-site",
     "user": "",
     "mode": "navigate" });
 
@@ -73,8 +71,7 @@
   "back to cross-site-initiated navigation",
   cross_site_host,  // report_host
   cross_site_host,  // go_back_host
-  { "dest": "document",
-    "site": "cross-site",
+  { "site": "cross-site",
     "user": "",
     "mode": "navigate" });
 
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.https.sub.html
index 7b89d8dc..b8f11c66 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.https.sub.html
@@ -42,42 +42,36 @@
   }
 
   create_test("{{host}}:{{ports[https][0]}}", FORCED, {
-    "dest": "nested-document",
     "site": "same-origin",
     "user": "",
     "mode": "nested-navigate"
   });
 
   create_test("{{hosts[][www]}}:{{ports[https][0]}}", FORCED, {
-    "dest": "nested-document",
     "site": "same-site",
     "user": "",
     "mode": "nested-navigate"
   });
 
   create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", FORCED, {
-    "dest": "nested-document",
     "site": "cross-site",
     "user": "",
     "mode": "nested-navigate"
   });
 
   create_test("{{host}}:{{ports[https][0]}}", USER, {
-    "dest": "nested-document",
     "site": "same-origin",
     "user": "?1",
     "mode": "nested-navigate"
   });
 
   create_test("{{hosts[][www]}}:{{ports[https][0]}}", USER, {
-    "dest": "nested-document",
     "site": "same-site",
     "user": "?1",
     "mode": "nested-navigate"
   });
 
   create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", USER, {
-    "dest": "nested-document",
     "site": "cross-site",
     "user": "?1",
     "mode": "nested-navigate"
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.sub.html
index 418e2a2d..c5469f4 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/iframe.tentative.sub.html
@@ -12,7 +12,6 @@
         return;
 
       assert_header_equals(e.data, {
-        "dest": "",
         "site": "",
         "user": "",
         "mode": "",
@@ -31,7 +30,6 @@
         return;
 
       assert_header_equals(e.data, {
-        "dest": "",
         "site": "",
         "user": "",
         "mode": "",
@@ -50,7 +48,6 @@
         return;
 
       assert_header_equals(e.data, {
-        "dest": "",
         "site": "",
         "user": "",
         "mode": "",
@@ -69,7 +66,6 @@
         return;
 
       assert_header_equals(e.data, {
-        "dest": "nested-document",
         "site": "cross-site",
         "user": "",
         "mode": "nested-navigate",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/img.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/img.tentative.https.sub.html
index c3248f6..ced6f984 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/img.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/img.tentative.https.sub.html
@@ -13,13 +13,11 @@
     .then(result => {
         headers = result.headers;
         got = {
-          "dest": headers["sec-fetch-dest"],
           "mode": headers["sec-fetch-mode"],
           "site": headers["sec-fetch-site"],
           "user": headers["sec-fetch-user"]
         };
         assert_header_equals(got, {
-          "dest": "image",
           "site": "same-origin",
           // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way
           // that `image.py` encodes data.
@@ -35,13 +33,11 @@
     .then(result => {
         headers = result.headers;
         got = {
-          "dest": headers["sec-fetch-dest"],
           "mode": headers["sec-fetch-mode"],
           "site": headers["sec-fetch-site"],
           "user": headers["sec-fetch-user"]
         };
         assert_header_equals(got, {
-          "dest": "image",
           "site": "same-site",
           // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way
           // that `image.py` encodes data.
@@ -57,13 +53,11 @@
     .then(result => {
         headers = result.headers;
         got = {
-          "dest": headers["sec-fetch-dest"],
           "mode": headers["sec-fetch-mode"],
           "site": headers["sec-fetch-site"],
           "user": headers["sec-fetch-user"]
         };
         assert_header_equals(got, {
-          "dest": "image",
           "site": "cross-site",
           // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way
           // that `image.py` encodes data.
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/navigation.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/navigation.https.sub.html
index 50857ae..1c2ce953 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/navigation.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/navigation.https.sub.html
@@ -6,13 +6,11 @@
 <script>
   test(t => {
     let expected = {
-      "dest": "document",
       "mode": "navigate",
       "site": "none",
     };
 
     let actual = {
-      "dest": "{{headers[sec-fetch-dest]}}",
       "mode": "{{headers[sec-fetch-mode]}}",
       "site": "{{headers[sec-fetch-site]}}",
       // Skipping `Sec-Fetch-User`, as the test harness isn't consistent here.
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/object.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/object.tentative.https.sub.html
index 40ef308..cf1c260 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/object.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/object.tentative.https.sub.html
@@ -16,7 +16,7 @@
       let e = document.createElement('object');
       e.data = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
       e.onload = e => {
-        let expected = {"dest":"object", "site":"same-origin", "user":"", "mode":"no-cors"};
+        let expected = {"site":"same-origin", "user":"", "mode":"no-cors"};
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected))
@@ -35,7 +35,7 @@
       let e = document.createElement('object');
       e.data = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
       e.onload = e => {
-        let expected = {"dest":"object", "site":"same-site", "user":"", "mode":"no-cors"};
+        let expected = {"site":"same-site", "user":"", "mode":"no-cors"};
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected))
@@ -54,7 +54,7 @@
       let e = document.createElement('object');
       e.data = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
       e.onload = e => {
-        let expected = {"dest":"object", "site":"cross-site", "user":"", "mode":"no-cors"};
+        let expected = {"site":"cross-site", "user":"", "mode":"no-cors"};
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected))
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/portal.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/portal.tentative.https.sub.html
index 50f0037..ee24b5ec 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/portal.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/portal.tentative.https.sub.html
@@ -25,22 +25,18 @@
   }
 
   create_test("{{host}}:{{ports[https][0]}}", {
-    // TODO(mkwst): 'document' seems right, I guess? Perhaps a portal-specific destination would be better?
-    "dest": "document",
     "site": "same-origin",
     "user": "",
     "mode": "nested-navigate"
   });
 
   create_test("{{hosts[][www]}}:{{ports[https][0]}}", {
-    "dest": "document",
     "site": "same-site",
     "user": "",
     "mode": "nested-navigate"
   });
 
   create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", {
-    "dest": "document",
     "site": "cross-site",
     "user": "",
     "mode": "nested-navigate"
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/prefetch.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/prefetch.tentative.https.sub.html
index 1902b9b..30966f872 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/prefetch.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/prefetch.tentative.https.sub.html
@@ -30,7 +30,7 @@
     }, `<link rel='prefetch' href='https://${host}/...'>`);
   }
 
-  create_test("{{host}}:{{ports[https][0]}}", {"dest":"empty", "site":"same-origin", "user":"", "mode": "cors"});
-  create_test("{{hosts[][www]}}:{{ports[https][0]}}", {"dest":"empty", "site":"same-site", "user":"", "mode": "cors"});
-  create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", {"dest":"empty", "site":"cross-site", "user":"", "mode": "cors"});
+  create_test("{{host}}:{{ports[https][0]}}", {"site":"same-origin", "user":"", "mode": "cors"});
+  create_test("{{hosts[][www]}}:{{ports[https][0]}}", {"site":"same-site", "user":"", "mode": "cors"});
+  create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", {"site":"cross-site", "user":"", "mode": "cors"});
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/preload.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/preload.tentative.https.sub.html
index 9dbcad32..e8c541e 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/preload.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/preload.tentative.https.sub.html
@@ -44,8 +44,8 @@
   ];
 
   as_tests.forEach(item => {
-    create_test("{{host}}:{{ports[https][0]}}", item[0], {"dest":item[1], "site":"same-origin", "user":"", "mode": "cors"});
-    create_test("{{hosts[][www]}}:{{ports[https][0]}}", item[0], {"dest":item[1], "site":"same-site", "user":"", "mode": "cors"});
-    create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", item[0], {"dest":item[1], "site":"cross-site", "user":"", "mode": "cors"});
+    create_test("{{host}}:{{ports[https][0]}}", item[0], {"site":"same-origin", "user":"", "mode": "cors"});
+    create_test("{{hosts[][www]}}:{{ports[https][0]}}", item[0], {"site":"same-site", "user":"", "mode": "cors"});
+    create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", item[0], {"site":"cross-site", "user":"", "mode": "cors"});
   });
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/cross-site-redirect.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/cross-site-redirect.tentative.https.sub.html
index 4747ebf36..0874273e 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/cross-site-redirect.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/cross-site-redirect.tentative.https.sub.html
@@ -15,7 +15,7 @@
 
       let e = document.createElement('img');
       e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
-      let expected = {"dest":"image", "site":"cross-site", "user":"", "mode": "no-cors"};
+      let expected = {"site":"cross-site", "user":"", "mode": "no-cors"};
       e.onload = e => {
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
@@ -41,7 +41,7 @@
 
       let e = document.createElement('img');
       e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
-      let expected = {"dest":"image", "site":"cross-site", "user":"", "mode": "no-cors"};
+      let expected = {"site":"cross-site", "user":"", "mode": "no-cors"};
       e.onload = e => {
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
@@ -67,7 +67,7 @@
 
       let e = document.createElement('img');
       e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
-      let expected = {"dest":"image", "site":"cross-site", "user":"", "mode": "no-cors"};
+      let expected = {"site":"cross-site", "user":"", "mode": "no-cors"};
       e.onload = e => {
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-cross-site.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-cross-site.tentative.https.sub.html
index 8120e76..efff1cd 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-cross-site.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-cross-site.tentative.https.sub.html
@@ -17,7 +17,7 @@
       e.src = "https://{{host}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// same-origin
       "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// cross-site
       "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;// same-origin
-      let expected = {"dest":"image", "site":"cross-site", "user":"", "mode": "no-cors"};
+      let expected = {"site":"cross-site", "user":"", "mode": "no-cors"};
 
       e.onload = e => {
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html
index a15e681..e7774f6b 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html
@@ -19,7 +19,7 @@
     <div id="fontTest">Downgraded then upgraded font</div>
     <script>
   let nonce = "{{$id}}";
-  let expected = { "dest": "", "site": "cross-site", "user": "", "mode": "cors" };
+  let expected = { "site": "cross-site", "user": "", "mode": "cors" };
 
   // Validate various scenarios handle a request that redirects from https => http
   // correctly and avoids disclosure of any Sec- headers.
@@ -43,7 +43,6 @@
       .then(result => {
          headers = result.headers;
          got = {
-           "dest": headers["sec-fetch-dest"],
            "mode": headers["sec-fetch-mode"],
            "site": headers["sec-fetch-site"],
            "user": headers["sec-fetch-user"]
@@ -51,7 +50,6 @@
          assert_header_equals(got, {
            // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way
            // that `image.py` encodes data.
-           "dest": undefined,
            "site": "cross-site",
            "user": undefined,
            "mode": "cors",
@@ -63,7 +61,7 @@
 <script>
   test(t => {
     t.add_cleanup(_ => { header = null; });
-    assert_header_equals(header, { "dest": "", "site": "cross-site", "user": "", "mode": "no-cors" });
+    assert_header_equals(header, { "site": "cross-site", "user": "", "mode": "no-cors" });
   }, "Https downgrade-upgrade script => No headers");
 </script>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-same-site.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-same-site.tentative.https.sub.html
index 8c65095..b1df738 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-same-site.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/multiple-redirect-same-site.tentative.https.sub.html
@@ -17,7 +17,7 @@
       e.src = "https://{{host}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// same-origin
       "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// same-site
       "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;// same-origin
-      let expected = {"dest":"image", "site":"same-site", "user":"", "mode": "no-cors"};
+      let expected = {"site":"same-site", "user":"", "mode": "no-cors"};
 
       e.onload = e => {
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-http-upgrade.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-http-upgrade.tentative.sub.html
index 6ba5b94..c7e1721 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-http-upgrade.tentative.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-http-upgrade.tentative.sub.html
@@ -19,7 +19,7 @@
     <div id="fontTest">Upgraded font</div>
     <script>
   let nonce = "{{$id}}";
-  let expected = { "dest": "", "site": "cross-site", "user": "", "mode": "cors" };
+  let expected = { "site": "cross-site", "user": "", "mode": "cors" };
 
   // Validate various scenarios handle a request that redirects from http => https correctly and add the proper Sec- headers.
   RunCommonRedirectTests("Http upgrade", upgradeRedirectTo, expected);
@@ -42,7 +42,6 @@
       .then(result => {
          headers = result.headers;
          got = {
-           "dest": headers["sec-fetch-dest"],
            "mode": headers["sec-fetch-mode"],
            "site": headers["sec-fetch-site"],
            "user": headers["sec-fetch-user"]
@@ -50,7 +49,6 @@
          assert_header_equals(got, {
            // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way
            // that `image.py` encodes data.
-           "dest": undefined,
            "site": "cross-site",
            "user": undefined,
            "mode": "cors",
@@ -63,7 +61,7 @@
 <script>
   test(t => {
     t.add_cleanup(_ => { header = null; });
-    assert_header_equals(header, { "dest": "", "site": "cross-site", "user": "", "mode": "no-cors" });
+    assert_header_equals(header, { "site": "cross-site", "user": "", "mode": "no-cors" });
   }, "Http upgrade script => No headers");
 </script>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-https-downgrade.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-https-downgrade.tentative.sub.html
index 54e48e0c..eee21da 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-https-downgrade.tentative.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/redirect-https-downgrade.tentative.sub.html
@@ -19,7 +19,7 @@
   <div id="fontTest">Downgraded font</div>
   <script>
   let nonce = token();
-  let expected = { "dest": "", "site": "", "user": "", "mode": "" };
+  let expected = { "site": "", "user": "", "mode": "" };
 
   // Validate various scenarios handle a request that redirects from https => http correctly and avoids disclosure of any Sec- headers.
   RunCommonRedirectTests("Https downgrade", downgradeRedirectTo, expected);
@@ -42,7 +42,6 @@
       .then(result => {
          headers = result.headers;
          got = {
-           "dest": headers["sec-fetch-dest"],
            "mode": headers["sec-fetch-mode"],
            "site": headers["sec-fetch-site"],
            "user": headers["sec-fetch-user"]
@@ -50,7 +49,6 @@
          assert_header_equals(got, {
            // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way
            // that `image.py` encodes data.
-           "dest": undefined,
            "site": undefined,
            "user": undefined,
            "mode": undefined,
@@ -62,7 +60,7 @@
 <script>
   test(t => {
     t.add_cleanup(_ => { header = null; });
-    assert_header_equals(header, { "dest": "", "site": "cross-site", "user": "", "mode": "no-cors" });
+    assert_header_equals(header, { "site": "cross-site", "user": "", "mode": "no-cors" });
   }, "Https downgrade script => No headers");
 </script>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-origin-redirect.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-origin-redirect.tentative.https.sub.html
index b88429c5..a31d2d39 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-origin-redirect.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-origin-redirect.tentative.https.sub.html
@@ -15,7 +15,7 @@
 
       let e = document.createElement('img');
       e.src = "/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
-      let expected = {"dest":"image", "site":"same-origin", "user":"", "mode": "no-cors"};
+      let expected = {"site":"same-origin", "user":"", "mode": "no-cors"};
 
       e.onload = e => {
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
@@ -42,7 +42,7 @@
 
       let e = document.createElement('img');
       e.src = "/xhr/resources/redirect.py?location=https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
-      let expected = {"dest":"image", "site":"same-site", "user":"", "mode": "no-cors"};
+      let expected = {"site":"same-site", "user":"", "mode": "no-cors"};
 
       e.onload = e => {
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
@@ -69,7 +69,7 @@
 
       let e = document.createElement('img');
       e.src = "/xhr/resources/redirect.py?location=https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
-      let expected = {"dest":"image", "site":"cross-site", "user":"", "mode": "no-cors"};
+      let expected = {"site":"cross-site", "user":"", "mode": "no-cors"};
 
       e.onload = e => {
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-site-redirect.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-site-redirect.tentative.https.sub.html
index 795e418..f342b1c2 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-site-redirect.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/redirect/same-site-redirect.tentative.https.sub.html
@@ -15,7 +15,7 @@
 
       let e = document.createElement('img');
       e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
-      let expected = {"dest":"image", "site":"same-site", "user":"", "mode": "no-cors"};
+      let expected = {"site":"same-site", "user":"", "mode": "no-cors"};
 
       e.onload = e => {
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
@@ -42,7 +42,7 @@
 
       let e = document.createElement('img');
       e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
-      let expected = {"dest":"image", "site":"same-site", "user":"", "mode": "no-cors"};
+      let expected = {"site":"same-site", "user":"", "mode": "no-cors"};
 
       e.onload = e => {
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
@@ -69,7 +69,7 @@
 
       let e = document.createElement('img');
       e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
-      let expected = {"dest":"image", "site":"cross-site", "user":"", "mode": "no-cors"};
+      let expected = {"site":"cross-site", "user":"", "mode": "no-cors"};
 
       e.onload = e => {
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/report.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/report.tentative.https.sub.html
index 8209fd17..821c56f58 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/report.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/report.tentative.https.sub.html
@@ -22,9 +22,9 @@
   document.addEventListener("securitypolicyviolation", (e) => {
     counter++;
     if (counter == 3) {
-      generate_test({"dest":"report", "site":"same-origin", "user":"", "mode": "no-cors"}, "same-origin");
-      generate_test({"dest":"report", "site":"same-site", "user":"", "mode": "no-cors"}, "same-site");
-      generate_test({"dest":"report", "site":"cross-site", "user":"", "mode": "no-cors"}, "cross-site");
+      generate_test({"site":"same-origin", "user":"", "mode": "no-cors"}, "same-origin");
+      generate_test({"site":"same-site", "user":"", "mode": "no-cors"}, "same-site");
+      generate_test({"site":"cross-site", "user":"", "mode": "no-cors"}, "cross-site");
 
       done();
     }
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/helper.js b/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/helper.js
index 9425246..eac176a 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/helper.js
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/helper.js
@@ -2,15 +2,72 @@
   return tag ? `${tag}: ${text}`: text;
 }
 
+/**
+ * @param {object} value
+ * @param {object} expected
+ * @param {string} tag
+ **/
 function assert_header_equals(value, expected, tag) {
   if (typeof(value) === "string"){
     assert_not_equals(value, "No header has been recorded");
     value = JSON.parse(value);
   }
 
-  assert_equals(value.dest, expected.dest, wrap_by_tag(tag, "dest"));
   assert_equals(value.mode, expected.mode, wrap_by_tag(tag, "mode"));
   assert_equals(value.site, expected.site, wrap_by_tag(tag, "site"));
   if (expected.hasOwnProperty("user"))
     assert_equals(value.user, expected.user, wrap_by_tag(tag, "user"));
 }
+
+/**
+ * @param {string} header
+ * @param {object} value
+ * @param {string} expected
+ * @param {string} tag
+ **/
+function assert_header(header, value, expected, tag) {
+  if (typeof(value) === "string"){
+    assert_not_equals(value, "No header has been recorded");
+    value = JSON.parse(value);
+  }
+
+  assert_equals(value[header], expected, wrap_by_tag(tag, header));
+}
+
+/**
+ *
+ * @param {object} value
+ * @param {string} expected
+ * @param {string} tag
+ **/
+function assert_header_dest_equals(value, expected, tag) {
+  assert_header("dest", value, expected, tag);
+}
+
+/**
+ * Test fetch record-header.py
+ * @param {string} key
+ * @param {string} expected
+ * @param {function} assert
+ * @return {Promise<string | never>}
+ */
+function fetch_record_header(key, expected, assert) {
+  return fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
+      .then(response => response.text())
+      .then(text => assert(text, expected))
+}
+
+/**
+ *
+ * @param {string} key
+ * @param {string} expected
+ * @param {function} assert
+ * @param {function} resolve
+ * @param {function} reject
+ * @return {Promise<any>}
+ */
+function fetch_record_header_with_catch(key, expected, assert, resolve, reject) {
+  return fetch_record_header(key, expected, assert, resolve)
+      .then(_ => resolve())
+      .catch(e => reject(e));
+}
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.https.sub.html
index f877b50..d5a1096e 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.https.sub.html
@@ -10,7 +10,6 @@
     t.add_cleanup(_ => { header = null; });
 
     assert_header_equals(header, {
-      "dest": "script",
       "site": "same-origin",
       "user": "",
       "mode": "no-cors",
@@ -25,7 +24,6 @@
     t.add_cleanup(_ => { header = null; });
 
     assert_header_equals(header, {
-      "dest": "script",
       "site": "same-site",
       "user": "",
       "mode": "no-cors",
@@ -40,7 +38,6 @@
     t.add_cleanup(_ => { header = null; });
 
     assert_header_equals(header, {
-      "dest": "script",
       "site": "cross-site",
       "user": "",
       "mode": "no-cors",
@@ -55,7 +52,6 @@
     t.add_cleanup(_ => { header = null; });
 
     assert_header_equals(header, {
-      "dest": "script",
       "site": "same-origin",
       "user": "",
       "mode": "cors",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.sub.html
index 66b82126..b1361516 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/script.tentative.sub.html
@@ -10,7 +10,6 @@
     t.add_cleanup(_ => { header = null; });
 
     assert_header_equals(header, {
-      "dest": "",
       "site": "",
       "user": "",
       "mode": "",
@@ -25,7 +24,6 @@
     t.add_cleanup(_ => { header = null; });
 
     assert_header_equals(header, {
-      "dest": "",
       "site": "",
       "user": "",
       "mode": "",
@@ -40,7 +38,6 @@
     t.add_cleanup(_ => { header = null; });
 
     assert_header_equals(header, {
-      "dest": "",
       "site": "",
       "user": "",
       "mode": "",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/appcache.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/appcache.tentative.https.sub.html
new file mode 100644
index 0000000..469001e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/appcache.tentative.https.sub.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html manifest="/fetch/metadata/resources/record-header.py?file=appcache-manifest{{$id:uuid()}}">
+<meta name="timeout" content="long">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body></body>
+<script>
+  async_test(t => {
+    window.applicationCache.oncached = window.applicationCache.onnoupdate = window.applicationCache.onerror = t.step_func(e => {
+        fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=appcache-manifest{{$id}}")
+          .then(t.step_func(response => response.text()))
+          .then(t.step_func_done(text => assert_header_dest_equals(text, "")))
+          .catch(t.unreached_func("Fetching and verifying the results should succeed."));
+});
+}, "Appcache!");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/embed.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/embed.tentative.https.sub.html
new file mode 100644
index 0000000..d880dee
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/embed.tentative.https.sub.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body>
+<script>
+  let nonce = token();
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "embed-same-origin" + nonce;
+
+      let e = document.createElement('embed');
+      e.src = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "embed", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Origin embed");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "embed-same-site" + nonce;
+
+      let e = document.createElement('embed');
+      e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "embed", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Site embed");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "embed-cross-site" + nonce;
+
+      let e = document.createElement('embed');
+      e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "embed", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Cross-Site embed");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-preflight.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-preflight.tentative.https.sub.html
new file mode 100644
index 0000000..63d53e8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-preflight.tentative.https.sub.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script>
+  // Site
+  promise_test(t => {
+    return fetch("https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py",
+                 {
+                   mode: "cors",
+                   headers: { 'x-test': 'testing' }
+                 })
+        .then(r => r.json())
+        .then(j => assert_header_dest_equals(j, "empty"));
+  }, "Same-site fetch with preflight");
+
+  promise_test(t => {
+    return fetch("https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py",
+                 {
+                   mode: "cors",
+                   headers: { 'x-test': 'testing' }
+                 })
+        .then(r => r.json())
+        .then(j => assert_header_dest_equals(j, "empty"));
+  }, "Cross-site fetch with preflight");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--fallback.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--fallback.tentative.https.sub.html
new file mode 100644
index 0000000..d234157
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--fallback.tentative.https.sub.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<!--
+  This test verifies presence of Sec-Fetch-... request headers on a request
+  handled by a service worker - this test covers the scenario when the service
+  worker doesn't do anything and the request falls back to the network.
+-->
+<meta charset="utf-8"/>
+<link rel="author" href="lukasza@chromium.org" title="Lukasz Anforowicz">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/service-workers/service-worker/resources/test-helpers.sub.js></script>
+<script src=/common/utils.js></script>
+<script>
+    const nonce = token();
+    const key = "fetch-via-serviceworker--fallback--" + nonce;
+
+    promise_test(async function(t) {
+        const SCOPE = '/fetch/metadata/resources/fetch-via-serviceworker--fallback--frame.html';
+        const SCRIPT = '/fetch/metadata/resources/fetch-via-serviceworker--fallback--sw.js';
+        const URL = '/fetch/metadata/resources/record-header.py?file=' + key;
+        const RETRIEVAL_URL = "/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key;
+
+        const reg = await service_worker_unregister_and_register(t, SCRIPT, SCOPE);
+        t.add_cleanup(async () => {
+          if (reg)
+            await reg.unregister();
+        });
+
+        await wait_for_state(t, reg.installing, 'activated');
+
+        const frame = await with_iframe(SCOPE);
+        t.add_cleanup(async () => {
+          if (frame)
+            frame.remove();
+        });
+
+        // Trigger a fetch that 1) will go through the service worker and 2) will
+        // fetch a special URL that records request headers.
+        await frame.contentWindow.fetch(URL, {mode:'no-cors'});
+
+        // Retrieve the request headers that have been recorded in the previous step.
+        const response = await fetch(RETRIEVAL_URL);
+        const text = await response.text();
+
+        // Verify presence of the expected Sec-Fetch-... request headers.
+        assert_header_dest_equals(text, "empty");
+      }, 'Sec-Fetch headers after SW fallback');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--respondWith.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--respondWith.tentative.https.sub.html
new file mode 100644
index 0000000..f70ae8b9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch-via-serviceworker--respondWith.tentative.https.sub.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<!--
+  This test verifies presence of Sec-Fetch-... request headers on a request
+  handled by a service worker - this test covers the scenario when the service
+  worker responds to the `fetch` event with:
+      event.respondWith(fetch(event.request));
+-->
+<meta charset="utf-8"/>
+<link rel="author" href="lukasza@chromium.org" title="Lukasz Anforowicz">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/service-workers/service-worker/resources/test-helpers.sub.js></script>
+<script src=/common/utils.js></script>
+<script>
+    const nonce = token();
+    const key = "fetch-via-serviceworker--respondWith--" + nonce;
+
+    promise_test(async function(t) {
+        const SCOPE = '/fetch/metadata/resources/fetch-via-serviceworker--respondWith--frame.html';
+        const SCRIPT = '/fetch/metadata/resources/fetch-via-serviceworker--respondWith--sw.js';
+        const URL = '/fetch/metadata/resources/record-header.py?file=' + key;
+        const RETRIEVAL_URL = "/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key;
+
+        const reg = await service_worker_unregister_and_register(t, SCRIPT, SCOPE);
+        t.add_cleanup(async () => {
+          if (reg)
+            await reg.unregister();
+        });
+
+        await wait_for_state(t, reg.installing, 'activated');
+
+        const frame = await with_iframe(SCOPE);
+        t.add_cleanup(async () => {
+          if (frame)
+            frame.remove();
+        });
+
+        // Trigger a fetch that 1) will go through the service worker and 2) will
+        // fetch a special URL that records request headers.
+        await frame.contentWindow.fetch(URL, {mode:'no-cors'});
+
+        // Retrieve the request headers that have been recorder in the previous step.
+        const response = await fetch(RETRIEVAL_URL);
+        const text = await response.text();
+
+        // Verify presence of the expected Sec-Fetch-... request headers.
+        assert_header_dest_equals(text, "empty");
+      }, 'Sec-Fetch headers after SW fallback');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch.tentative.https.sub.html
new file mode 100644
index 0000000..99f8191d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch.tentative.https.sub.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script>
+  // Site
+  promise_test(t => {
+    return fetch("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py")
+        .then(r => r.json())
+        .then(j => assert_header_dest_equals(j, "empty"));
+  }, "Same-origin fetch");
+
+  promise_test(t => {
+    return fetch("https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py")
+        .then(r => r.json())
+        .then(j => assert_header_dest_equals(j, "empty"));
+  }, "Same-site fetch");
+
+  promise_test(t => {
+    return fetch("https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py")
+        .then(r => r.json())
+        .then(j => assert_header_dest_equals(j, "empty"));
+  }, "Cross-site fetch");
+
+  // Mode
+  promise_test(t => {
+    return fetch("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py", {mode: "same-origin"})
+        .then(r => r.json())
+        .then(j => assert_header_dest_equals(j, "empty"));
+  }, "Same-origin mode");
+
+  promise_test(t => {
+    return fetch("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py", {mode: "cors"})
+        .then(r => r.json())
+        .then(j => assert_header_dest_equals(j, "empty"));
+  }, "CORS mode");
+
+  promise_test(t => {
+    return fetch("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py", {mode: "no-cors"})
+        .then(r => r.json())
+        .then(j => assert_header_dest_equals(j, "empty"));
+  }, "no-CORS mode");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch.tentative.sub.html
new file mode 100644
index 0000000..cf6c797
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/fetch.tentative.sub.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script>
+  // http -> https should see `Sec-Fetch-Site: cross-site`.
+  // This is a regression test for
+  // https://github.com/w3c/webappsec-fetch-metadata/issues/34
+  promise_test(t => {
+    assert_equals(location.protocol, "http:");
+    return fetch("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py")
+        .then(r => r.json())
+        .then(j => assert_header_dest_equals(j, "empty"));
+  }, "http->https fetch (cross-scheme => cross-site)");
+
+  // http -> http should see no `Sec-Fetch-Site`.
+  promise_test(t => {
+    assert_equals(location.protocol, "http:");
+    return fetch("/fetch/metadata/resources/echo-as-json.py")
+        .then(r => r.json())
+        .then(j => assert_header_dest_equals(j, ""));
+  }, "http->http fetch (non-trustworthy destination => no metadata)");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/font.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/font.tentative.https.sub.html
new file mode 100644
index 0000000..bc892db
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/font.tentative.https.sub.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html>
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<body>
+  <div id="test1">1</div>
+  <div id="test2">2</div>
+  <div id="test3">3</div>
+  <!-- Same-Origin request -->
+  <style>
+    @font-face {
+      font-family: myFirstFont;
+      src: url(https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=font-same-origin);
+    }
+    #test1 {
+      font-family: myFirstFont;
+    }
+  </style>
+
+  <!-- Same-Site request -->
+  <style>
+    @font-face {
+      font-family: mySecondFont;
+      src: url(https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=font-same-site);
+    }
+    #test2 {
+      font-family: mySecondFont;
+    }
+  </style>
+
+  <!-- Cross-Site request -->
+  <style>
+    @font-face {
+      font-family: myThirdFont;
+      src: url(https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=font-cross-site);
+    }
+    #test3 {
+      font-family: myThirdFont;
+    }
+  </style>
+</body>
+<script>
+  document.fonts.ready.then(function () {
+    promise_test(t => {
+      return new Promise((resolve, reject) => {
+        let key = "font-same-origin";
+        fetch_record_header_with_catch(key, "font", assert_header_dest_equals, resolve, reject);
+        });
+    }, "Same-Origin font");
+
+    promise_test(t => {
+      return new Promise((resolve, reject) => {
+        let key = "font-same-site";
+        fetch_record_header_with_catch(key, "font", assert_header_dest_equals, resolve, reject);
+        });
+    }, "Same-Site font");
+
+    promise_test(t => {
+      return new Promise((resolve, reject) => {
+        let key = "font-cross-site";
+        fetch_record_header_with_catch(key, "font", assert_header_dest_equals, resolve, reject);
+        });
+    }, "Cross-Site font");
+
+  });
+</script>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/history.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/history.tentative.https.sub.html
new file mode 100644
index 0000000..55e03a2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/history.tentative.https.sub.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script>
+
+// Test that correct `Sec-Fetch-Site` (and other `Sec-Fetch-...` request
+/// headers) are used in navigations triggered by |history.back()|.
+function add_test(description, report_host, go_back_host, expectation) {
+  async_test(t => {
+    // STEP1: Navigate a new window to report_host/post-to-owner.py
+    const url_suffix = '/fetch/metadata/resources/post-to-owner.py'
+    const url = `https://${report_host}${url_suffix}`;
+    const w = window.open(url, '_blank');
+
+    var msg_counter = 0;
+    window.addEventListener('message', t.step_func(e => {
+      if (e.source != w)
+        return;
+      msg_counter = msg_counter + 1;
+      if (msg_counter == 1) {
+        // STEP2: Verify the headers (this is a sanity check that the same
+        // headers are used here and in STEP5).
+        assert_header_dest_equals(e.data, expectation);
+
+        // STEP3: Go to go_back_host/go-back.html (postponing this via
+        // step_timeout ensures that go-back.html will get a separate
+        // history entry - otherwise it might be treated as a client-side
+        // redirect and we might end up with nowhere to go back to).
+        t.step_timeout(() => {
+          const url_suffix = '/fetch/metadata/resources/go-back.html'
+          const url = `https://${go_back_host}${url_suffix}`;
+          w.location = url;
+        });
+
+        // STEP4 (elsewhere - inside go-back.html): Call history.back().
+      } else if (msg_counter == 2) {
+        // STEP5: Verify the headers (this is the main verification and focus
+        // of the test).
+        assert_header_dest_equals(e.data, expectation);
+
+        // STEP6: Finish the test.
+        t.done();
+      }
+    }));
+  }, description);
+}
+
+const same_origin_host = "{{host}}:{{ports[https][0]}}";
+const same_site_host = "{{hosts[][www]}}:{{ports[https][0]}}";
+const cross_site_host = "{{hosts[alt][www]}}:{{ports[https][0]}}";
+
+add_test(
+  "back to same-origin-initiated navigation",
+  same_origin_host,  // report_host
+  cross_site_host,  // go_back_host
+  "document");
+
+add_test(
+  "back to same-site-initiated navigation",
+  same_site_host,  // report_host
+  cross_site_host,  // go_back_host
+  "document");
+
+add_test(
+  "back to cross-site-initiated navigation",
+  cross_site_host,  // report_host
+  cross_site_host,  // go_back_host
+  "document");
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/iframe.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/iframe.tentative.https.sub.html
new file mode 100644
index 0000000..ed9cfa0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/iframe.tentative.https.sub.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/resources/testdriver.js></script>
+<script src=/resources/testdriver-vendor.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body>
+<script>
+  const USER = true;
+  const FORCED = false;
+
+  function create_test(host, user_activated, expectations) {
+    async_test(t => {
+      let i = document.createElement('iframe');
+      window.addEventListener('message', t.step_func(e => {
+        if (e.source != i.contentWindow)
+          return;
+
+        assert_header_dest_equals(e.data, expectations);
+        t.done();
+      }));
+
+      let url = `https://${host}/fetch/metadata/resources/post-to-owner.py`;
+      if (user_activated == FORCED) {
+        i.src = url;
+        document.body.appendChild(i);
+      } else if (user_activated == USER) {
+        let uuid = token();
+        i.name = uuid;
+        let a = document.createElement('a');
+        a.href = url;
+        a.target = uuid;
+        a.text = "This is a link!";
+
+        document.body.appendChild(i);
+        document.body.appendChild(a);
+
+        test_driver.click(a);
+      }
+    }, `{{host}} -> ${host} iframe: ${user_activated ? "user-activated" : "forced"}`);
+  }
+
+  create_test("{{host}}:{{ports[https][0]}}", FORCED, "nested-document");
+
+  create_test("{{hosts[][www]}}:{{ports[https][0]}}", FORCED, "nested-document");
+
+  create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", FORCED, "nested-document");
+
+  create_test("{{host}}:{{ports[https][0]}}", USER, "nested-document");
+
+  create_test("{{hosts[][www]}}:{{ports[https][0]}}", USER, "nested-document");
+
+  create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", USER, "nested-document");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/iframe.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/iframe.tentative.sub.html
new file mode 100644
index 0000000..d90a414
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/iframe.tentative.sub.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<body>
+<script>
+  async_test(t => {
+    let i = document.createElement('iframe');
+    i.src = "http://{{host}}:{{ports[http][0]}}/fetch/metadata/resources/post-to-owner.py";
+    window.addEventListener('message', t.step_func(e => {
+      if (e.source != i.contentWindow)
+        return;
+
+      assert_header_dest_equals(e.data, "");
+      t.done();
+    }));
+
+    document.body.appendChild(i);
+  }, "Non-secure same-origin iframe => No headers");
+
+  async_test(t => {
+    let i = document.createElement('iframe');
+    i.src = "http://{{hosts[][www]}}:{{ports[http][0]}}/fetch/metadata/resources/post-to-owner.py";
+    window.addEventListener('message', t.step_func(e => {
+      if (e.source != i.contentWindow)
+        return;
+
+      assert_header_dest_equals(e.data, "");
+      t.done();
+    }));
+
+    document.body.appendChild(i);
+  }, "Non-secure same-site iframe => No headers");
+
+  async_test(t => {
+    let i = document.createElement('iframe');
+    i.src = "http://{{hosts[alt][www]}}:{{ports[http][0]}}/fetch/metadata/resources/post-to-owner.py";
+    window.addEventListener('message', t.step_func(e => {
+      if (e.source != i.contentWindow)
+        return;
+
+      assert_header_dest_equals(e.data, "");
+      t.done();
+    }));
+
+    document.body.appendChild(i);
+  }, "Non-secure cross-site iframe => No headers.");
+
+  async_test(t => {
+    let i = document.createElement('iframe');
+    i.src = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py";
+    window.addEventListener('message', t.step_func(e => {
+      if (e.source != i.contentWindow)
+        return;
+
+      assert_header_dest_equals(e.data, "nested-document");
+      t.done();
+    }));
+
+    document.body.appendChild(i);
+  }, "Secure, cross-site (cross-scheme, same-host) iframe");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/img.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/img.tentative.https.sub.html
new file mode 100644
index 0000000..f6b84b1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/img.tentative.https.sub.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/common/security-features/resources/common.sub.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<body>
+<script>
+  // These tests reuse the `referrer-policy` infrastructure to load images that
+  // encode their request headers in their pixels. Fun stuff!
+  promise_test(() =>
+    requestViaImage(
+      "https://{{host}}:{{ports[https][0]}}/common/security-features/subresource/image.py")
+    .then(result => {
+        headers = result.headers;
+        got = {
+          "dest": headers["sec-fetch-dest"]
+        };
+        assert_header_dest_equals(got, "image");
+      }),
+    "Same-origin image");
+
+  promise_test(() =>
+    requestViaImage(
+      "https://{{hosts[][www]}}:{{ports[https][0]}}/common/security-features/subresource/image.py")
+    .then(result => {
+        headers = result.headers;
+        got = {
+          "dest": headers["sec-fetch-dest"]
+        };
+        assert_header_dest_equals(got, "image");
+      }),
+    "Same-site image");
+
+  promise_test(() =>
+    requestViaImage(
+      "https://{{hosts[alt][www]}}:{{ports[https][0]}}/common/security-features/subresource/image.py")
+    .then(result => {
+        headers = result.headers;
+        got = {
+          "dest": headers["sec-fetch-dest"]
+        };
+        assert_header_dest_equals(got, "image");
+      }),
+    "Cross-site image");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/navigation.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/navigation.https.sub.html
new file mode 100644
index 0000000..3ab843d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/navigation.https.sub.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script>
+  test(t => {
+    let actual = {
+      "dest": "{{headers[sec-fetch-dest]}}"
+    };
+
+    assert_header_dest_equals(actual, "document");
+  }, "This page's top-level navigation.");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/object.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/object.tentative.https.sub.html
new file mode 100644
index 0000000..29db5111
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/object.tentative.https.sub.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body>
+<script>
+  let nonce = token();
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "object-same-origin" + nonce;
+
+      let e = document.createElement('object');
+      e.data = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "object", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Origin object");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "object-same-site" + nonce;
+
+      let e = document.createElement('object');
+      e.data = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "object", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Site object");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "object-cross-site" + nonce;
+
+      let e = document.createElement('object');
+      e.data = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "object", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Cross-Site object");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/portal.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/portal.tentative.https.sub.html
new file mode 100644
index 0000000..ad9e8fd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/portal.tentative.https.sub.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/resources/testdriver.js></script>
+<script src=/resources/testdriver-vendor.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body>
+<script>
+  const USER = true;
+  const FORCED = false;
+
+  function create_test(host, expectation) {
+    async_test(t => {
+      let p = document.createElement('portal');
+      p.addEventListener('message', t.step_func(e => {
+        assert_header_dest_equals(e.data, expectation);
+        t.done();
+      }));
+
+      let url = `https://${host}/fetch/metadata/resources/post-to-owner.py`;
+      p.src = url;
+      document.body.appendChild(p);
+    }, `{{host}} -> ${host} portal`);
+  }
+
+  // TODO(mkwst): 'document' seems right, I guess? Perhaps a portal-specific destination would be better?
+  create_test("{{host}}:{{ports[https][0]}}", "document");
+
+  create_test("{{hosts[][www]}}:{{ports[https][0]}}", "document");
+
+  create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", "document");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/prefetch.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/prefetch.tentative.https.sub.html
new file mode 100644
index 0000000..be495ba
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/prefetch.tentative.https.sub.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body></body>
+<script>
+  test(t => {
+    assert_true(document.createElement('link').relList.supports('prefetch'));
+  }, "Browser supports prefetch.");
+
+  function create_test(host, expected) {
+    async_test(t => {
+      let nonce = token();
+      let key = "prefetch" + nonce;
+
+      let e = document.createElement('link');
+      e.rel = "prefetch";
+      e.href = `https://${host}/fetch/metadata/resources/record-header.py?file=${key}`;
+      e.setAttribute("crossorigin", "crossorigin");
+      e.onload = t.step_func(e => {
+        fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
+          .then(t.step_func(response => response.text()))
+          .then(t.step_func_done(text => assert_header_dest_equals(text, expected)))
+          .catch(t.unreached_func("Fetching and verifying the results should succeed."));
+      });
+      e.onerror = t.unreached_func();
+
+      document.head.appendChild(e);
+    }, `<link rel='prefetch' href='https://${host}/...'>`);
+  }
+
+  create_test("{{host}}:{{ports[https][0]}}", "empty");
+  create_test("{{hosts[][www]}}:{{ports[https][0]}}", "empty");
+  create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", "empty");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/preload.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/preload.tentative.https.sub.html
new file mode 100644
index 0000000..2c82abb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/preload.tentative.https.sub.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<meta name="timeout" content="long">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body></body>
+<script>
+  test(t => {
+    assert_true(document.createElement('link').relList.supports('preload'));
+  }, "Browser supports preload.");
+
+  function create_test(host, as, expected) {
+    async_test(t => {
+      let nonce = "{{uuid()}}";
+      let key = as + nonce;
+
+      let e = document.createElement('link');
+      e.rel = "preload";
+      e.href = `https://${host}/fetch/metadata/resources/record-header.py?file=${key}`;
+      e.setAttribute("crossorigin", "crossorigin");
+      if (as !== undefined) {
+        e.setAttribute("as", as);
+      }
+      e.onload = e.onerror = t.step_func_done(e => {
+        fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
+          .then(t.step_func(response => response.text()))
+          .then(t.step_func(text => assert_header_dest_equals(text, expected)))
+          .then(t.step_func_done(_ => resolve()))
+          .catch(t.unreached_func());
+      });
+
+      document.head.appendChild(e);
+    }, `<link rel='preload' as='${as}' href='https://${host}/...'>`);
+  }
+
+  let as_tests = [
+    [ "fetch", "empty" ],
+    [ "font", "font" ],
+    [ "image", "image" ],
+    [ "script", "script" ],
+    [ "style", "style" ],
+    [ "track", "track" ],
+  ];
+
+  as_tests.forEach(item => {
+    create_test("{{host}}:{{ports[https][0]}}", item[0], item[1]);
+    create_test("{{hosts[][www]}}:{{ports[https][0]}}", item[0], item[1]);
+    create_test("{{hosts[alt][www]}}:{{ports[https][0]}}", item[0], item[1]);
+  });
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/cross-site-redirect.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/cross-site-redirect.tentative.https.sub.html
new file mode 100644
index 0000000..ea13cc8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/cross-site-redirect.tentative.https.sub.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body></body>
+<script>
+  let nonce = token();
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "redirect-cross-site-same-origin" + nonce;
+
+      let e = document.createElement('img');
+      e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+      e.onerror = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Cross-Site -> Same-Origin redirect");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "redirect-cross-site-same-site" + nonce;
+
+      let e = document.createElement('img');
+      e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+      e.onerror = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Cross-Site -> Same-Site redirect");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "redirect-cross-site-cross-site" + nonce;
+
+      let e = document.createElement('img');
+      e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+      e.onerror = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Cross-Site -> Cross-Site redirect");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-cross-site.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-cross-site.tentative.https.sub.html
new file mode 100644
index 0000000..e74ce0c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-cross-site.tentative.https.sub.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body></body>
+<script>
+  let nonce = token();
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "redirect-multiple-cross-site" + nonce;
+
+      let e = document.createElement('img');
+      e.src = "https://{{host}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// same-origin
+      "https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// cross-site
+      "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;// same-origin
+
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+      e.onerror = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Origin -> Cross-Site -> Same-Origin redirect");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html
new file mode 100644
index 0000000..78ee10d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-https-downgrade-upgrade.tentative.sub.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/fetch/metadata/resources/redirectTestHelper.sub.js></script>
+<script src=/common/security-features/resources/common.sub.js></script>
+<script src=/common/utils.js></script>
+<style>
+  @font-face {
+    font-family: myDowngradeUpgradeFont;
+    src: url(https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fapi%2Fresources%2Fredirect.py%3Flocation%3Dhttps%253A%252F%252F{{host}}%253A{{ports[https][0]}}%252Ffetch%252Fmetadata%252Fresources%252Frecord-header.py%253Ffile%253Dfont-https-downgrade-upgrade{{$id:uuid()}});
+  }
+  #fontTest {
+    font-family: myDowngradeUpgradeFont;
+  }
+</style>
+<body>
+    <div id="fontTest">Downgraded then upgraded font</div>
+    <script>
+  let nonce = "{{$id}}";
+
+  // Validate various scenarios handle a request that redirects from https => http
+  // correctly and avoids disclosure of any Sec- headers.
+  RunCommonRedirectTests("Https downgrade-upgrade", MultipleRedirectTo, expected);
+
+  document.fonts.ready.then(function () {
+    promise_test(t => {
+      return new Promise((resolve, reject) => {
+        let key = "font-https-downgrade-upgrade{{$id}}";
+        return fetch_record_header_with_catch(key, "", assert_header_dest_equals, resolve, reject);
+      });
+    }, "Https downgrade-upgrade font => No headers");
+  });
+
+  promise_test(() => {
+    return requestViaImage(secureRedirectURL + encodeURIComponent(insecureRedirectURL + encodeURIComponent("https://{{host}}:{{ports[https][0]}}/common/security-features/subresource/image.py")))
+      .then(result => {
+         headers = result.headers;
+         got = {
+           "dest": headers["sec-fetch-dest"]
+         };
+         // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way
+         // that `image.py` encodes data.
+         assert_header_dest_equals(got, undefined);
+      });
+  }, "Https downgrade-upgrade image => No headers");
+</script>
+<script src="https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fapi%2Fresources%2Fredirect.py%3Flocation%3Dhttps%253A%252F%252F{{host}}%253A{{ports[https][0]}}%252Ffetch%252Fmetadata%252Fresources%252Fecho-as-script.py"></script>
+<script>
+  test(t => {
+    t.add_cleanup(_ => { header = null; });
+    assert_header_dest_equals(header, "");
+  }, "Https downgrade-upgrade script => No headers");
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-same-site.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-same-site.tentative.https.sub.html
new file mode 100644
index 0000000..90a476684
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/multiple-redirect-same-site.tentative.https.sub.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body></body>
+<script>
+  let nonce = token();
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "redirect-multiple-same-site" + nonce;
+
+      let e = document.createElement('img');
+      e.src = "https://{{host}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// same-origin
+      "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=" +// same-site
+      "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;// same-origin
+
+      e.onload = e => {
+        return fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+      e.onerror = e => {
+        return fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Origin -> Same-Site -> Same-Origin redirect");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-http-upgrade.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-http-upgrade.tentative.sub.html
new file mode 100644
index 0000000..a31efcb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-http-upgrade.tentative.sub.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/fetch/metadata/resources/redirectTestHelper.sub.js></script>
+<script src=/common/security-features/resources/common.sub.js></script>
+<script src=/common/utils.js></script>
+<style>
+  @font-face {
+    font-family: myUpgradedFont;
+    src: url(http://{{host}}:{{ports[http][0]}}/fetch/api/resources/redirect.py?location=https%3A%2F%2F{{host}}%3A{{ports[https][0]}}%2Ffetch%2Fmetadata%2Fresources%2Frecord-header.py%3Ffile%3Dfont-https-upgrade{{$id:uuid()}});
+  }
+  #fontTest {
+    font-family: myUpgradedFont;
+  }
+</style>
+<body>
+    <div id="fontTest">Upgraded font</div>
+    <script>
+  let nonce = "{{$id}}";
+
+  // Validate various scenarios handle a request that redirects from http => https correctly and add the proper Sec- headers.
+  RunCommonRedirectTests("Http upgrade", upgradeRedirectTo, expected);
+
+  document.fonts.ready.then(function () {
+    promise_test(t => {
+      return new Promise((resolve, reject) => {
+        let key = "font-https-upgrade{{$id}}";
+        fetch_record_header_with_catch(key, "", assert_header_dest_equals, resolve, reject);
+      });
+    }, "Http upgrade font => No headers");
+  });
+
+  promise_test(() => {
+    return requestViaImage(insecureRedirectURL + encodeURIComponent("https://{{host}}:{{ports[https][0]}}/common/security-features/subresource/image.py"))
+      .then(result => {
+         headers = result.headers;
+         got = {
+           "dest": headers["sec-fetch-dest"]
+         };
+         // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way
+         // that `image.py` encodes data.
+         assert_header_dest_equals(got, undefined);
+      });
+  }, "Http upgrade image => No headers");
+</script>
+
+<script src="http://{{host}}:{{ports[http][0]}}/fetch/api/resources/redirect.py?location=https%3A%2F%2F{{host}}%3A{{ports[https][0]}}%2Ffetch%2Fmetadata%2Fresources%2Fecho-as-script.py"></script>
+<script>
+  test(t => {
+    t.add_cleanup(_ => { header = null; });
+    assert_header_dest_equals(header, "");
+  }, "Http upgrade script => No headers");
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-https-downgrade.tentative.sub-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-https-downgrade.tentative.sub-expected.txt
new file mode 100644
index 0000000..f6bcb6a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-https-downgrade.tentative.sub-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL redirect-https-downgrade Uncaught SyntaxError: Unexpected token 'return'
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-https-downgrade.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-https-downgrade.tentative.sub.html
new file mode 100644
index 0000000..425753cb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/redirect-https-downgrade.tentative.sub.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/fetch/metadata/resources/redirectTestHelper.sub.js></script>
+<script src=/common/security-features/resources/common.sub.js></script>
+<script src=/common/utils.js></script>
+<style>
+  @font-face {
+    font-family: myDowngradedFont;
+    src: url(https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fmetadata%2Fresources%2Frecord-header.py%3Ffile%3Dfont-https-downgrade);
+  }
+  #fontTest {
+    font-family: myDowngradedFont;
+  }
+</style>
+<body>
+  <div id="fontTest">Downgraded font</div>
+  <script>
+  let nonce = token();
+
+  // Validate various scenarios handle a request that redirects from https => http correctly and avoids disclosure of any Sec- headers.
+  RunCommonRedirectTests("Https downgrade", downgradeRedirectTo, expected);
+
+  document.fonts.ready.then(function () {
+    promise_test(t => {
+      return new Promise((resolve, reject) => {
+        let key = "font-https-downgrade";
+        fetch_record_header_with_catch(key, "", assert_header_dest_equals, resolve, reject);
+      });
+    }, "Https downgrade font => No headers");
+  });
+
+  promise_test(() =>
+    return requestViaImage(secureRedirectURL + encodeURIComponent("http://{{host}}:{{ports[http][0]}}/common/security-features/subresource/image.py"))
+      .then(result => {
+         headers = result.headers;
+         got = {
+           "dest": headers["sec-fetch-dest"]
+         };
+         // Note that we're using `undefined` here, as opposed to "" elsewhere because of the way
+         // that `image.py` encodes data.
+         assert_header_dest_equals(got, undefined);
+  }), "Https downgrade image => No headers");
+</script>
+
+<script src="https://{{host}}:{{ports[https][0]}}/fetch/api/resources/redirect.py?location=http%3A%2F%2F{{host}}%3A{{ports[http][0]}}%2Ffetch%2Fmetadata%2Fresources%2Fecho-as-script.py"></script>
+<script>
+  test(t => {
+    t.add_cleanup(_ => { header = null; });
+    assert_header_dest_equals(header, "");
+  }, "Https downgrade script => No headers");
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/same-origin-redirect.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/same-origin-redirect.tentative.https.sub.html
new file mode 100644
index 0000000..9b8b44b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/same-origin-redirect.tentative.https.sub.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body></body>
+<script>
+  let nonce = token();
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "redirect-same-origin-same-origin" + nonce;
+
+      let e = document.createElement('img');
+      e.src = "/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+      e.onerror = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Origin -> Same-Origin redirect");
+
+promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "redirect-same-origin-same-site" + nonce;
+
+      let e = document.createElement('img');
+      e.src = "/xhr/resources/redirect.py?location=https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+      e.onerror = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Origin -> Same-Site redirect");
+
+promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "redirect-same-origin-cross-site" + nonce;
+
+      let e = document.createElement('img');
+      e.src = "/xhr/resources/redirect.py?location=https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+      e.onerror = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Origin -> Cross-Site redirect");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/same-site-redirect.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/same-site-redirect.tentative.https.sub.html
new file mode 100644
index 0000000..2f12fe0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/redirect/same-site-redirect.tentative.https.sub.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body></body>
+<script>
+  let nonce = token();
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "redirect-same-site-same-origin" + nonce;
+
+      let e = document.createElement('img');
+      e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+      e.onerror = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Site -> Same-Origin redirect");
+
+promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "redirect-same-site-same-site" + nonce;
+
+      let e = document.createElement('img');
+      e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+      e.onerror = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Site -> Same-Site redirect");
+
+promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "redirect-same-site-cross-site" + nonce;
+
+      let e = document.createElement('img');
+      e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+      e.onerror = e => {
+        fetch_record_header_with_catch(key, "image", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Site -> Cross-Site redirect");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html
new file mode 100644
index 0000000..d3cb7e1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<link id="style" href="https://foo.bar" rel="stylesheet">
+<body></body>
+<script>
+  setup({ explicit_done: true });
+  function generate_test(expected, name) {
+    async_test(t => {
+      t.step_timeout(_ => {
+        return fetch_record_header("report-" + name, expected, assert_header_dest_equals)
+            .then(_ => t.done());
+      }, 1000);
+    }, name + " report");
+  }
+
+  let counter = 0;
+  document.addEventListener("securitypolicyviolation", (e) => {
+    counter++;
+    if (counter == 3) {
+      generate_test("report", "same-origin");
+      generate_test("report", "same-site");
+      generate_test("report", "cross-site");
+
+      done();
+    }
+  });
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html.sub.headers
new file mode 100644
index 0000000..1ec5df7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/report.tentative.https.sub.html.sub.headers
@@ -0,0 +1,3 @@
+Content-Security-Policy: style-src 'self' 'unsafe-inline'; report-uri /fetch/metadata/resources/record-header.py?file=report-same-origin
+Content-Security-Policy: style-src 'self' 'unsafe-inline'; report-uri https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=report-same-site
+Content-Security-Policy: style-src 'self' 'unsafe-inline'; report-uri https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=report-cross-site
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/script.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/script.tentative.https.sub.html
new file mode 100644
index 0000000..18e8be78
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/script.tentative.https.sub.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+
+<!-- Same-origin script -->
+<script src="https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-script.py"></script>
+<script>
+  test(t => {
+    t.add_cleanup(_ => { header = null; });
+
+    assert_header_dest_equals(header, "script");
+  }, "Same-origin script");
+</script>
+
+<!-- Same-site script -->
+<script src="https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-script.py"></script>
+<script>
+  test(t => {
+    t.add_cleanup(_ => { header = null; });
+
+    assert_header_dest_equals(header, "script");
+  }, "Same-site script");
+</script>
+
+<!-- Cross-site script -->
+<script src="https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-script.py"></script>
+<script>
+  test(t => {
+    t.add_cleanup(_ => { header = null; });
+
+    assert_header_dest_equals(header, "script");
+  }, "Cross-site script");
+</script>
+
+<!-- Same-origin script, CORS mode -->
+<script src="https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/echo-as-script.py" crossorigin="anonymous"></script>
+<script>
+  test(t => {
+    t.add_cleanup(_ => { header = null; });
+
+    assert_header_dest_equals(header, "script");
+  }, "Same-origin CORS script");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/script.tentative.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/script.tentative.sub.html
new file mode 100644
index 0000000..0512dc6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/script.tentative.sub.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+
+<!-- Same-origin script -->
+<script src="http://{{host}}:{{ports[http][0]}}/fetch/metadata/resources/echo-as-script.py"></script>
+<script>
+  test(t => {
+    t.add_cleanup(_ => { header = null; });
+
+    assert_header_dest_equals(header, "");
+  }, "Non-secure same-origin script => No headers");
+</script>
+
+<!-- Same-site script -->
+<script src="http://{{hosts[][www]}}:{{ports[http][0]}}/fetch/metadata/resources/echo-as-script.py"></script>
+<script>
+  test(t => {
+    t.add_cleanup(_ => { header = null; });
+
+    assert_header_dest_equals(header, "");
+  }, "Non-secure same-site script => No headers");
+</script>
+
+<!-- Cross-site script -->
+<script src="http://{{hosts[alt][www]}}:{{ports[http][0]}}/fetch/metadata/resources/echo-as-script.py"></script>
+<script>
+  test(t => {
+    t.add_cleanup(_ => { header = null; });
+
+    assert_header_dest_equals(header, "");
+  }, "Non-secure cross-site script => No headers");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/serviceworker.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/serviceworker.tentative.https.sub.html
new file mode 100644
index 0000000..1faee65
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/serviceworker.tentative.https.sub.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!--
+  This test verifies presence of Sec-Fetch-... request headers on a request
+  that fetches the service worker script itself (i.e. the script at the URL
+  passed as an argument to navigator.serviceWorker.register).
+-->
+<meta charset="utf-8"/>
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body>
+  <script>
+    promise_test(async t => {
+      const nonce = token();
+      const key = "serviceworker-same-origin" + nonce;
+
+      // Register a service worker and check the request header.
+      const registration = await navigator.serviceWorker.register('https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=' + key);
+      t.add_cleanup(() => registration.unregister());
+      await retrieve_and_assert_headers(key, 'Register service worker');
+
+      // Trigger an update check and check the request header again.
+      await registration.update();
+      await retrieve_and_assert_headers(key, 'Update service worker');
+    }, 'metadata for service worker scripts');
+
+    async function retrieve_and_assert_headers(key, tag) {
+      const response = await fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
+      const text = await response.text();
+      assert_header_dest_equals(text, "serviceworker", tag);
+    }
+  </script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/sharedworker.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/sharedworker.tentative.https.sub.html
new file mode 100644
index 0000000..882572c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/sharedworker.tentative.https.sub.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<script>
+  let nonce = token();
+  let key = "sharedworker-same-origin" + nonce;
+
+  // TESTS //
+  if (window.Worker) {
+
+      //  Same-Origin test
+      var sharedWorker = new SharedWorker('/fetch/metadata/resources/record-header.py?file=' + key);
+      sharedWorker.port.start();
+
+      sharedWorker.onerror = function(){
+        test_same_origin();
+      }
+      sharedWorker.port.onmessage = function(e) {
+        test_same_origin();
+      }
+      sharedWorker.port.postMessage("Ready");
+    }
+
+  function test_same_origin(){
+    promise_test(t => {
+      return new Promise((resolve, reject) => {
+        fetch_record_header_with_catch(key, "sharedworker", assert_header_dest_equals, resolve, reject);
+      })
+    }, "Same-Origin sharedworker")
+  }
+</script>
+<body></body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/style.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/style.tentative.https.sub.html
new file mode 100644
index 0000000..ed30c81c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/style.tentative.https.sub.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body></body>
+<script>
+  let nonce = token();
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "style-same-origin" + nonce;
+
+      let e = document.createElement('link');
+      e.rel = "stylesheet";
+      e.href = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "style", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Origin style");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "style-same-site" + nonce;
+
+      let e = document.createElement('link');
+      e.rel = "stylesheet";
+      e.href = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "style", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Site style");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "style-cross-site" + nonce;
+
+      let e = document.createElement('link');
+      e.rel = "stylesheet";
+      e.href = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "style", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Cross-Site style");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "style-same-origin-cors" + nonce;
+
+      let e = document.createElement('link');
+      e.rel = "stylesheet";
+      e.href = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      e.crossOrigin = "anonymous";
+      e.onload = e => {
+        fetch_record_header_with_catch(key, "style", assert_header_dest_equals, resolve, reject);
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Origin, cors style");
+</script>
+</html>
+
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/track.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/track.tentative.https.sub.html
new file mode 100644
index 0000000..09e927f1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/track.tentative.https.sub.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body>
+</body>
+<script>
+  let nonce = token();
+
+  function createVideoElement() {
+    let el = document.createElement('video');
+    el.src = "/media/movie_5.mp4";
+    el.setAttribute("controls", "");
+    el.setAttribute("crossorigin", "");
+    return el;
+  }
+
+  function createTrack() {
+    let el = document.createElement("track");
+    el.setAttribute("default", "");
+    el.setAttribute("kind", "captions");
+    el.setAttribute("srclang", "en");
+    return el;
+  }
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "track-same-origin" + nonce;
+      let video = createVideoElement();
+      let el = createTrack();
+      el.src = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      el.onload = t.step_func(_ => {
+        fetch_record_header_with_catch(key, "track", assert_header_dest_equals, resolve, reject);
+      });
+      video.appendChild(el);
+      document.body.appendChild(video);
+    });
+  }, "Same-Origin track");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "track-same-site" + nonce;
+      let video = createVideoElement();
+      let el = createTrack();
+      el.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      el.onload = t.step_func(_ => {
+        fetch_record_header_with_catch(key, "track", assert_header_dest_equals, resolve, reject);
+      });
+      video.appendChild(el);
+      document.body.appendChild(video);
+    });
+  }, "Same-Site track");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "track-cross-site" + nonce;
+      let video = createVideoElement();
+      let el = createTrack();
+      el.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      el.onload = t.step_func(_ => {
+        fetch_record_header_with_catch(key, "track", assert_header_dest_equals, resolve, reject);
+      });
+      video.appendChild(el);
+      document.body.appendChild(video);
+    });
+  }, "Cross-Site track");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "track-same-origin-cors" + nonce;
+      let video = createVideoElement();
+
+      // Unset `crossorigin` to change the CORS mode:
+      video.crossOrigin = undefined;
+
+      let el = createTrack();
+      el.src = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
+      el.onload = t.step_func(_ => {
+        fetch_record_header_with_catch(key, "track", assert_header_dest_equals, resolve, reject);
+      });
+      video.appendChild(el);
+      document.body.appendChild(video);
+    });
+  }, "Same-Origin, CORS track");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/trailing-dot.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/trailing-dot.tentative.https.sub.html
new file mode 100644
index 0000000..283b928
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/trailing-dot.tentative.https.sub.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script>
+  // Site
+  promise_test(t => {
+    return fetch("https://{{host}}.:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py")
+        .then(r => r.json())
+        .then(j => {
+          assert_header_dest_equals(j, "empty");
+        });
+  }, "Fetching a resource from the same origin, but spelled with a trailing dot.");
+
+  promise_test(t => {
+    return fetch("https://{{hosts[][www]}}.:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py")
+        .then(r => r.json())
+        .then(j => {
+          assert_header_dest_equals(j, "empty");
+        });
+  }, "Fetching a resource from the same site, but spelled with a trailing dot.");
+
+  promise_test(t => {
+    return fetch("https://{{hosts[alt][www]}}.:{{ports[https][0]}}/fetch/metadata/resources/echo-as-json.py")
+        .then(r => r.json())
+        .then(j => {
+          assert_header_dest_equals(j, "empty");
+        });
+  }, "Fetching a resource from a cross-site host, spelled with a trailing dot.");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/unload.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/unload.tentative.https.sub.html
new file mode 100644
index 0000000..a702fb83
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/unload.tentative.https.sub.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/resources/testdriver.js></script>
+<script src=/resources/testdriver-vendor.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<body>
+<script>
+  // The test
+  // 1. Creates a same-origin iframe
+  // 2. Adds to the iframe an unload handler that will
+  //    trigger a request to <unload_request_url>/.../record-header.py...
+  // 3. Navigate the iframe to a cross-origin url (to data: url)
+  // 4. Waits until the request goes through
+  // 5. Verifies Sec-Fetch-Site request header of the request.
+  //
+  // This is a regression test for https://crbug.com/986577.
+  function create_test(unload_request_origin, expectation) {
+    async_test(t => {
+      // STEP 1: Create an iframe.
+      let nonce = token();
+      let key = "unload-test-" + nonce;
+      let url = unload_request_origin +
+          "/fetch/metadata/resources/record-header.py?file=" + key;
+      let i = document.createElement('iframe');
+      i.src = '/fetch/metadata/resources/unload-with-beacon.html';
+      i.onload = () => {
+          // STEP 2: Ask the iframe to add an unload handler.
+          i.contentWindow.postMessage(url, '*');
+      };
+      window.addEventListener('message', e => {
+          // STEP 3: Navigate the iframe away
+          i.contentWindow.location = 'data:text/html,DONE';
+      });
+      document.body.appendChild(i);
+
+      // STEPS 4 and 5: Wait for the beacon to go through and verify
+      // the request headers.
+      function wait_and_verify() {
+          t.step_timeout(() => {
+              let callback_method = text => t.step(() => {
+                if (text == "No header has been recorded") {
+                  wait_and_verify();
+                  return;
+                }
+                assert_header_dest_equals(text, expectation);
+                t.done();
+              });
+              fetch_record_header(key, expectation, callback_method);
+          }, 200);
+      }
+      wait_and_verify();
+    }, "Fetch from an unload handler");
+  }
+
+  create_test("https://{{host}}:{{ports[https][0]}}", "empty");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/window-open.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/window-open.tentative.https.sub.html
new file mode 100644
index 0000000..650ba6a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/window-open.tentative.https.sub.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/resources/testdriver.js></script>
+<script src=/resources/testdriver-vendor.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<body>
+<script>
+  // Forced navigations:
+  async_test(t => {
+    let w = window.open("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py");
+    t.add_cleanup(_ => w.close());
+    window.addEventListener('message', t.step_func(e => {
+      if (e.source != w)
+        return;
+
+      assert_header_dest_equals(e.data, "document");
+      t.done();
+    }));
+  }, "Same-origin window, forced");
+
+  async_test(t => {
+    let w = window.open("https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py");
+    t.add_cleanup(_ => w.close());
+    window.addEventListener('message', t.step_func(e => {
+      if (e.source != w)
+        return;
+
+      assert_header_dest_equals(e.data, "document");
+      t.done();
+    }));
+  }, "Same-site window, forced");
+
+  async_test(t => {
+    let w = window.open("https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py");
+    t.add_cleanup(_ => w.close());
+    window.addEventListener('message', t.step_func(e => {
+      if (e.source != w)
+        return;
+
+      assert_header_dest_equals(e.data, "document");
+      t.done();
+    }));
+  }, "Cross-site window, forced");
+
+  async_test(t => {
+    let w = window.open("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py");
+    t.add_cleanup(_ => w.close());
+    let messages = 0;
+    window.addEventListener('message', t.step_func(e => {
+      messages++;
+      if (e.source != w)
+        return;
+
+      assert_header_dest_equals(e.data, "document");
+
+      if (messages == 1) {
+        w.location.reload();
+      } else {
+        t.done();
+      }
+    }));
+  }, "Same-origin window, forced, reloaded");
+
+  async_test(t => {
+    let w = window.open("https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py");
+    t.add_cleanup(_ => w.close());
+    let messages = 0;
+    window.addEventListener('message', t.step_func(e => {
+      messages++;
+      if (e.source != w)
+        return;
+
+      assert_header_dest_equals(e.data, "document");
+
+      if (messages == 1) {
+        w.location.reload();
+      } else {
+        t.done();
+      }
+    }));
+  }, "Same-site window, forced, reloaded");
+
+  async_test(t => {
+    let w = window.open("https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py");
+    t.add_cleanup(_ => w.close());
+    let messages = 0;
+    window.addEventListener('message', t.step_func(e => {
+      messages++;
+      if (e.source != w)
+        return;
+
+      assert_header_dest_equals(e.data, "document");
+
+      if (messages == 1) {
+        w.location.reload();
+      } else {
+        t.done();
+      }
+    }));
+  }, "Cross-site window, forced, reloaded");
+
+  // User-activated navigations:
+  async_test(t => {
+    let b = document.createElement('button');
+    b.onclick = t.step_func(_ => {
+      let w = window.open("https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py");
+      t.add_cleanup(_ => w.close());
+      window.addEventListener('message', t.step_func(e => {
+        if (e.source != w)
+          return;
+
+        assert_header_dest_equals(e.data, "document");
+        t.done();
+      }));
+    });
+    document.body.appendChild(b);
+    test_driver.click(b);
+  }, "Same-origin window, user-activated");
+
+  async_test(t => {
+    let b = document.createElement('button');
+    b.onclick = t.step_func(_ => {
+      let w = window.open("https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py");
+      t.add_cleanup(_ => w.close());
+      window.addEventListener('message', t.step_func(e => {
+        if (e.source != w)
+          return;
+
+        assert_header_dest_equals(e.data, "document");
+        t.done();
+      }));
+    });
+    document.body.appendChild(b);
+    test_driver.click(b);
+  }, "Same-site window, user-activated");
+
+  async_test(t => {
+    let b = document.createElement('button');
+    b.onclick = t.step_func(_ => {
+      let w = window.open("https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/post-to-owner.py");
+      t.add_cleanup(_ => w.close());
+      window.addEventListener('message', t.step_func(e => {
+        if (e.source != w)
+          return;
+
+        assert_header_dest_equals(e.data, "document");
+        t.done();
+      }));
+    });
+    document.body.appendChild(b);
+    test_driver.click(b);
+  }, "Cross-site window, user-activated");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/worker.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/worker.tentative.https.sub.html
new file mode 100644
index 0000000..8e40fb6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/worker.tentative.https.sub.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<script>
+  let nonce = token();
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "worker-same-origin" + nonce;
+      let w = new Worker("/fetch/metadata/resources/record-header.py?file=" + key);
+      w.onmessage = e => {
+        fetch_record_header_with_catch(key, "worker", assert_header_dest_equals, resolve, reject);
+      };
+    });
+  }, "Same-Origin worker");
+</script>
+<body></body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/xslt.tentative.https.sub-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/xslt.tentative.https.sub-expected.txt
new file mode 100644
index 0000000..be26fdf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/xslt.tentative.https.sub-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+PASS Same-Origin xslt
+FAIL Same-site xslt assert_not_equals: got disallowed value "No header has been recorded"
+FAIL Cross-site xslt assert_not_equals: got disallowed value "No header has been recorded"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/xslt.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/xslt.tentative.https.sub.html
new file mode 100644
index 0000000..df44514f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sec-fetch-dest/xslt.tentative.https.sub.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/metadata/resources/helper.js></script>
+<script src=/common/utils.js></script>
+<script>
+  // Open a window with XML document which loads resources via <?xml-stylesheet/> tag
+  let nonce = token();
+  let w = window.open("/fetch/metadata/resources/xslt-test.sub.xml?token=" + nonce);
+  window.addEventListener('message', function(e) {
+    if (e.source != w)
+      return;
+
+    promise_test(t => {
+      return fetch_record_header("xslt-same-origin" + nonce, "xslt", assert_header_dest_equals);
+    }, "Same-Origin xslt");
+
+    promise_test(t => {
+      return fetch_record_header("xslt-same-site" + nonce, "xslt", assert_header_dest_equals);
+    }, "Same-site xslt");
+
+    promise_test(t => {
+      return fetch_record_header("xslt-cross-site" + nonce, "xslt", assert_header_dest_equals);
+    }, "Cross-site xslt");
+
+    w.close();
+  });
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/serviceworker.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/serviceworker.tentative.https.sub.html
index 6fdb37a7f..1fbdee4 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/serviceworker.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/serviceworker.tentative.https.sub.html
@@ -27,8 +27,8 @@
     }, 'metadata for service worker scripts');
 
     async function retrieve_and_assert_headers(key, tag) {
-      let expected = { "dest": "serviceworker", "site": "same-origin", "user": "", "mode": "same-origin" };
-      const response = await fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
+      let expected = { "site": "same-origin", "user": "", "mode": "same-origin" };
+      const response = await fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key);
       const text = await response.text();
       assert_header_equals(text, expected, tag);
     }
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/sharedworker.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/sharedworker.tentative.https.sub.html
index 9014415..0408c442 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/sharedworker.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/sharedworker.tentative.https.sub.html
@@ -28,7 +28,7 @@
   function test_same_origin(){
     promise_test(t => {
       return new Promise((resolve, reject) => {
-        let expected = {"dest":"sharedworker", "site":"same-origin", "user":"", "mode": "same-origin"};
+        let expected = {"site":"same-origin", "user":"", "mode": "same-origin"};
 
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/style.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/style.tentative.https.sub.html
index 1f875e8c..08ac184 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/style.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/style.tentative.https.sub.html
@@ -17,7 +17,7 @@
       e.rel = "stylesheet";
       e.href = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
       e.onload = e => {
-        let expected = {"dest":"style", "site":"same-origin", "user":"", "mode": "no-cors"};
+        let expected = {"site":"same-origin", "user":"", "mode": "no-cors"};
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected))
@@ -37,7 +37,7 @@
       e.rel = "stylesheet";
       e.href = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
       e.onload = e => {
-        let expected = {"dest":"style", "site":"same-site", "user":"", "mode": "no-cors"};
+        let expected = {"site":"same-site", "user":"", "mode": "no-cors"};
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected))
@@ -57,7 +57,7 @@
       e.rel = "stylesheet";
       e.href = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
       e.onload = e => {
-        let expected = {"dest":"style", "site":"cross-site", "user":"", "mode": "no-cors"};
+        let expected = {"site":"cross-site", "user":"", "mode": "no-cors"};
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected))
@@ -78,7 +78,7 @@
       e.href = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
       e.crossOrigin = "anonymous";
       e.onload = e => {
-        let expected = {"dest":"style", "site":"same-origin", "user":"", "mode": "cors"};
+        let expected = {"site":"same-origin", "user":"", "mode": "cors"};
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected))
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/track.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/track.tentative.https.sub.html
index 63d7637..11e45e2 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/track.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/track.tentative.https.sub.html
@@ -34,7 +34,6 @@
       el.src = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
       el.onload = t.step_func(_ => {
         expected = {
-          "dest": "track",
           "site": "same-origin",
           "user": "",
           "mode": "cors" // Because the `video` element has `crossorigin`
@@ -57,7 +56,6 @@
       el.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
       el.onload = t.step_func(_ => {
         expected = {
-          "dest": "track",
           "site": "same-site",
           "user": "",
           "mode": "cors" // Because the `video` element has `crossorigin`
@@ -82,7 +80,6 @@
       el.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
       el.onload = t.step_func(_ => {
         expected = {
-          "dest": "track",
           "site": "cross-site",
           "user": "",
           "mode": "cors" // Because the `video` element has `crossorigin`
@@ -110,7 +107,6 @@
       el.src = "https://{{host}}:{{ports[https][0]}}/fetch/metadata/resources/record-header.py?file=" + key;
       el.onload = t.step_func(_ => {
         expected = {
-          "dest":"track",
           "site":"same-origin",
           "user":"",
           "mode": "same-origin"
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/trailing-dot.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/trailing-dot.tentative.https.sub.html
index f1a0ad1..f7069e72 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/trailing-dot.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/trailing-dot.tentative.https.sub.html
@@ -9,7 +9,6 @@
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j, {
-            "dest": "empty",
             "site": "cross-site",
             "user": "",
             "mode": "cors",
@@ -22,7 +21,6 @@
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j, {
-            "dest": "empty",
             "site": "cross-site",
             "user": "",
             "mode": "cors",
@@ -35,7 +33,6 @@
         .then(r => r.json())
         .then(j => {
           assert_header_equals(j, {
-            "dest": "empty",
             "site": "cross-site",
             "user": "",
             "mode": "cors",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/unload.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/unload.tentative.https.sub.html
index c93ecab3..8917c53a 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/unload.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/unload.tentative.https.sub.html
@@ -56,7 +56,6 @@
   }
 
   create_test("https://{{host}}:{{ports[https][0]}}", {
-    "dest": "empty",
     "site": "same-origin",
     "user": "",
     "mode": "no-cors"
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/window-open.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/window-open.tentative.https.sub.html
index 79f1eec8..29c325f 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/window-open.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/window-open.tentative.https.sub.html
@@ -15,7 +15,6 @@
         return;
 
       assert_header_equals(e.data, {
-        "dest": "document",
         "site": "same-origin",
         "user": "",
         "mode": "navigate",
@@ -32,7 +31,6 @@
         return;
 
       assert_header_equals(e.data, {
-        "dest": "document",
         "site": "same-site",
         "user": "",
         "mode": "navigate",
@@ -49,7 +47,6 @@
         return;
 
       assert_header_equals(e.data, {
-        "dest": "document",
         "site": "cross-site",
         "user": "",
         "mode": "navigate",
@@ -68,7 +65,6 @@
         return;
 
       assert_header_equals(e.data, {
-        "dest": "document",
         "site": "same-origin",
         "user": "",
         "mode": "navigate",
@@ -92,7 +88,6 @@
         return;
 
       assert_header_equals(e.data, {
-        "dest": "document",
         "site": "same-site",
         "user": "",
         "mode": "navigate",
@@ -116,7 +111,6 @@
         return;
 
       assert_header_equals(e.data, {
-        "dest": "document",
         "site": "cross-site",
         "user": "",
         "mode": "navigate",
@@ -141,7 +135,6 @@
           return;
 
         assert_header_equals(e.data, {
-          "dest": "document",
           "site": "same-origin",
           "user": "?1",
           "mode": "navigate",
@@ -163,7 +156,6 @@
           return;
 
         assert_header_equals(e.data, {
-          "dest": "document",
           "site": "same-site",
           "user": "?1",
           "mode": "navigate",
@@ -185,7 +177,6 @@
           return;
 
         assert_header_equals(e.data, {
-          "dest": "document",
           "site": "cross-site",
           "user": "?1",
           "mode": "navigate",
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/worker.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/worker.tentative.https.sub.html
index df1abc4b..d2162d5 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/worker.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/worker.tentative.https.sub.html
@@ -13,7 +13,7 @@
       let key = "worker-same-origin" + nonce;
       let w = new Worker("/fetch/metadata/resources/record-header.py?file=" + key);
       w.onmessage = e => {
-        let expected = {"dest":"worker", "site":"same-origin", "user":"", "mode": "same-origin"};
+        let expected = {"site":"same-origin", "user":"", "mode": "same-origin"};
         fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=" + key)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected))
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/xslt.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/fetch/metadata/xslt.tentative.https.sub.html
index 6e4f186d..5fc647b 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/xslt.tentative.https.sub.html
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/xslt.tentative.https.sub.html
@@ -14,21 +14,21 @@
       return;
 
     promise_test(t => {
-      let expected = {"dest":"xslt", "site":"same-origin", "user":"", "mode": "same-origin"};
+      let expected = {"site":"same-origin", "user":"", "mode": "same-origin"};
       return fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=xslt-same-origin" + nonce)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected));
     }, "Same-Origin xslt");
 
     promise_test(t => {
-      let expected = {"dest":"xslt", "site":"same-site", "user":"", "mode": "no-cors"};
+      let expected = {"site":"same-site", "user":"", "mode": "no-cors"};
       return fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=xslt-same-site" + nonce)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected));
     }, "Same-site xslt");
 
     promise_test(t => {
-      let expected = {"dest":"xslt", "site":"cross-site", "user":"", "mode": "no-cors"};
+      let expected = {"site":"cross-site", "user":"", "mode": "no-cors"};
       return fetch("/fetch/metadata/resources/record-header.py?retrieve=true&file=xslt-cross-site" + nonce)
           .then(response => response.text())
           .then(text => assert_header_equals(text, expected));
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects-expected.txt b/third_party/blink/web_tests/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects-expected.txt
new file mode 100644
index 0000000..7aceba49
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects-expected.txt
@@ -0,0 +1,94 @@
+This is a testharness.js-based test.
+Found 90 tests; 42 PASS, 48 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Basic sanity-checking (cross-origin)
+PASS Basic sanity-checking (same-origin + document.domain)
+PASS Basic sanity-checking (cross-site)
+FAIL Only whitelisted properties are accessible cross-origin (cross-origin) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame.
+FAIL Only whitelisted properties are accessible cross-origin (same-origin + document.domain) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame.
+FAIL Only whitelisted properties are accessible cross-origin (cross-site) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame.
+FAIL Only whitelisted properties are usable as cross-origin this objects (cross-origin) promise_test: Unhandled rejection with value: object "SecurityError: Failed to execute 'replace' on 'Location': The current window does not have permission to navigate the target frame to 'javascript:undefined'."
+FAIL Only whitelisted properties are usable as cross-origin this objects (same-origin + document.domain) promise_test: Unhandled rejection with value: object "SecurityError: Failed to execute 'replace' on 'Location': The current window does not have permission to navigate the target frame to 'javascript:undefined'."
+FAIL Only whitelisted properties are usable as cross-origin this objects (cross-site) promise_test: Unhandled rejection with value: object "SecurityError: Failed to execute 'replace' on 'Location': The current window does not have permission to navigate the target frame to 'javascript:undefined'."
+PASS [[GetPrototypeOf]] should return null (cross-origin)
+PASS [[GetPrototypeOf]] should return null (same-origin + document.domain)
+PASS [[GetPrototypeOf]] should return null (cross-site)
+FAIL [[SetPrototypeOf]] should return false (cross-origin) assert_throws: proto setter |call| on cross-origin Window function "function() { protoSetter.call(win, new Object()); }" threw object "SecurityError: Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame." ("SecurityError") expected object "TypeError" ("TypeError")
+FAIL [[SetPrototypeOf]] should return false (same-origin + document.domain) assert_throws: proto setter |call| on cross-origin Window function "function() { protoSetter.call(win, new Object()); }" threw object "SecurityError: Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame." ("SecurityError") expected object "TypeError" ("TypeError")
+FAIL [[SetPrototypeOf]] should return false (cross-site) assert_throws: proto setter |call| on cross-origin Window function "function() { protoSetter.call(win, new Object()); }" threw object "SecurityError: Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame." ("SecurityError") expected object "TypeError" ("TypeError")
+PASS [[IsExtensible]] should return true for cross-origin objects (cross-origin)
+PASS [[IsExtensible]] should return true for cross-origin objects (same-origin + document.domain)
+PASS [[IsExtensible]] should return true for cross-origin objects (cross-site)
+FAIL [[PreventExtensions]] should throw for cross-origin objects (cross-origin) assert_throws: preventExtensions on cross-origin Window should throw function "function() { Object.preventExtensions(win) }" threw object "SecurityError: Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame." ("SecurityError") expected object "TypeError" ("TypeError")
+FAIL [[PreventExtensions]] should throw for cross-origin objects (same-origin + document.domain) assert_throws: preventExtensions on cross-origin Window should throw function "function() { Object.preventExtensions(win) }" threw object "SecurityError: Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame." ("SecurityError") expected object "TypeError" ("TypeError")
+FAIL [[PreventExtensions]] should throw for cross-origin objects (cross-site) assert_throws: preventExtensions on cross-origin Window should throw function "function() { Object.preventExtensions(win) }" threw object "SecurityError: Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame." ("SecurityError") expected object "TypeError" ("TypeError")
+FAIL [[GetOwnProperty]] - Properties on cross-origin objects should be reported |own| (cross-origin) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame.
+FAIL [[GetOwnProperty]] - Properties on cross-origin objects should be reported |own| (same-origin + document.domain) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame.
+FAIL [[GetOwnProperty]] - Properties on cross-origin objects should be reported |own| (cross-site) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame.
+FAIL [[GetOwnProperty]] - Property descriptors for cross-origin properties should be set up correctly (cross-origin) assert_equals: property descriptor for 0 should be enumerable expected true but got false
+FAIL [[GetOwnProperty]] - Property descriptors for cross-origin properties should be set up correctly (same-origin + document.domain) assert_equals: property descriptor for 0 should be enumerable expected true but got false
+FAIL [[GetOwnProperty]] - Property descriptors for cross-origin properties should be set up correctly (cross-site) assert_equals: property descriptor for 0 should be enumerable expected true but got false
+PASS [[GetOwnProperty]] - Subframe named 'then' should shadow the default 'then' value (cross-origin)
+PASS [[GetOwnProperty]] - Subframe named 'then' should shadow the default 'then' value (same-origin + document.domain)
+PASS [[GetOwnProperty]] - Subframe named 'then' should shadow the default 'then' value (cross-site)
+PASS [[GetOwnProperty]] - Subframes should be visible cross-origin only if their names don't match the names of cross-origin-exposed IDL properties (cross-origin)
+PASS [[GetOwnProperty]] - Subframes should be visible cross-origin only if their names don't match the names of cross-origin-exposed IDL properties (same-origin + document.domain)
+PASS [[GetOwnProperty]] - Subframes should be visible cross-origin only if their names don't match the names of cross-origin-exposed IDL properties (cross-site)
+PASS [[GetOwnProperty]] - Should be able to get a property descriptor for an indexed property only if it corresponds to a child window. (cross-origin)
+PASS [[GetOwnProperty]] - Should be able to get a property descriptor for an indexed property only if it corresponds to a child window. (same-origin + document.domain)
+PASS [[GetOwnProperty]] - Should be able to get a property descriptor for an indexed property only if it corresponds to a child window. (cross-site)
+PASS [[Delete]] Should throw on cross-origin objects (cross-origin)
+PASS [[Delete]] Should throw on cross-origin objects (same-origin + document.domain)
+PASS [[Delete]] Should throw on cross-origin objects (cross-site)
+PASS [[DefineOwnProperty]] Should throw for cross-origin objects (cross-origin)
+PASS [[DefineOwnProperty]] Should throw for cross-origin objects (same-origin + document.domain)
+PASS [[DefineOwnProperty]] Should throw for cross-origin objects (cross-site)
+FAIL Can only enumerate safelisted enumerable properties (cross-origin) assert_equals: Enumerate all enumerable safelisted cross-origin Window properties expected 2 but got 0
+FAIL Can only enumerate safelisted enumerable properties (same-origin + document.domain) assert_equals: Enumerate all enumerable safelisted cross-origin Window properties expected 2 but got 0
+FAIL Can only enumerate safelisted enumerable properties (cross-site) assert_equals: Enumerate all enumerable safelisted cross-origin Window properties expected 2 but got 0
+FAIL [[OwnPropertyKeys]] should return all properties from cross-origin objects (cross-origin) assert_array_equals: Object.getOwnPropertyNames() gives the right answer for cross-origin Window lengths differ, expected 16 got 13
+FAIL [[OwnPropertyKeys]] should return all properties from cross-origin objects (same-origin + document.domain) assert_array_equals: Object.getOwnPropertyNames() gives the right answer for cross-origin Window lengths differ, expected 16 got 13
+FAIL [[OwnPropertyKeys]] should return all properties from cross-origin objects (cross-site) assert_array_equals: Object.getOwnPropertyNames() gives the right answer for cross-origin Window lengths differ, expected 16 got 13
+FAIL [[OwnPropertyKeys]] should return the right symbol-named properties for cross-origin objects (cross-origin) assert_array_equals: Object.getOwnPropertySymbols() should return the three symbol-named properties that are exposed on a cross-origin Window lengths differ, expected 3 got 0
+FAIL [[OwnPropertyKeys]] should return the right symbol-named properties for cross-origin objects (same-origin + document.domain) assert_array_equals: Object.getOwnPropertySymbols() should return the three symbol-named properties that are exposed on a cross-origin Window lengths differ, expected 3 got 0
+FAIL [[OwnPropertyKeys]] should return the right symbol-named properties for cross-origin objects (cross-site) assert_array_equals: Object.getOwnPropertySymbols() should return the three symbol-named properties that are exposed on a cross-origin Window lengths differ, expected 3 got 0
+FAIL [[OwnPropertyKeys]] should place the symbols after the property names after the subframe indices (cross-origin) assert_equals: 'then' property should be added to the end of the string list if not there expected "then" but got "close"
+FAIL [[OwnPropertyKeys]] should place the symbols after the property names after the subframe indices (same-origin + document.domain) assert_equals: 'then' property should be added to the end of the string list if not there expected "then" but got "close"
+FAIL [[OwnPropertyKeys]] should place the symbols after the property names after the subframe indices (cross-site) assert_equals: 'then' property should be added to the end of the string list if not there expected "then" but got "close"
+FAIL [[OwnPropertyKeys]] should not reorder where 'then' appears if it's a named subframe, nor add another copy of 'then' (cross-origin) assert_equals: expected "then" but got "postMessage"
+FAIL [[OwnPropertyKeys]] should not reorder where 'then' appears if it's a named subframe, nor add another copy of 'then' (same-origin + document.domain) assert_equals: expected "then" but got "postMessage"
+FAIL [[OwnPropertyKeys]] should not reorder where 'then' appears if it's a named subframe, nor add another copy of 'then' (cross-site) assert_equals: expected "then" but got "postMessage"
+PASS A and B jointly observe the same identity for cross-origin Window and Location (cross-origin)
+PASS A and B jointly observe the same identity for cross-origin Window and Location (same-origin + document.domain)
+PASS A and B jointly observe the same identity for cross-origin Window and Location (cross-site)
+PASS Cross-origin functions get local Function.prototype (cross-origin)
+PASS Cross-origin functions get local Function.prototype (same-origin + document.domain)
+PASS Cross-origin functions get local Function.prototype (cross-site)
+FAIL Cross-origin Window accessors get local Function.prototype (cross-origin) Cannot read property 'name' of undefined
+FAIL Cross-origin Window accessors get local Function.prototype (same-origin + document.domain) Cannot read property 'name' of undefined
+FAIL Cross-origin Window accessors get local Function.prototype (cross-site) Cannot read property 'name' of undefined
+FAIL Same-origin observers get different functions for cross-origin objects (cross-origin) assert_not_equals: cross-origin Window functions get their own object got disallowed value function "function () { [native code] }"
+FAIL Same-origin observers get different functions for cross-origin objects (same-origin + document.domain) assert_not_equals: cross-origin Window functions get their own object got disallowed value function "function () { [native code] }"
+FAIL Same-origin observers get different functions for cross-origin objects (cross-site) assert_not_equals: cross-origin Window functions get their own object got disallowed value function "function () { [native code] }"
+FAIL Same-origin observers get different accessors for cross-origin Window (cross-origin) assert_not_equals: different Window accessors per-incumbent script settings object got disallowed value undefined
+FAIL Same-origin observers get different accessors for cross-origin Window (same-origin + document.domain) assert_not_equals: different Window accessors per-incumbent script settings object got disallowed value undefined
+FAIL Same-origin observers get different accessors for cross-origin Window (cross-site) assert_not_equals: different Window accessors per-incumbent script settings object got disallowed value undefined
+FAIL Same-origin observers get different accessors for cross-origin Location (cross-origin) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame.
+FAIL Same-origin observers get different accessors for cross-origin Location (same-origin + document.domain) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame.
+FAIL Same-origin observers get different accessors for cross-origin Location (cross-site) Blocked a frame with origin "http://web-platform.test:8001" from accessing a cross-origin frame.
+FAIL {}.toString.call() does the right thing on cross-origin objects (cross-origin) assert_equals: expected "[object Object]" but got "[object Location]"
+FAIL {}.toString.call() does the right thing on cross-origin objects (same-origin + document.domain) assert_equals: expected "[object Object]" but got "[object Location]"
+FAIL {}.toString.call() does the right thing on cross-origin objects (cross-site) assert_equals: expected "[object Object]" but got "[object Location]"
+PASS Resolving a promise with a cross-origin window without a 'then' subframe should work (cross-origin)
+PASS Resolving a promise with a cross-origin window without a 'then' subframe should work (same-origin + document.domain)
+PASS Resolving a promise with a cross-origin window without a 'then' subframe should work (cross-site)
+PASS Resolving a promise with a cross-origin window with a 'then' subframe should work (cross-origin)
+PASS Resolving a promise with a cross-origin window with a 'then' subframe should work (same-origin + document.domain)
+PASS Resolving a promise with a cross-origin window with a 'then' subframe should work (cross-site)
+PASS Resolving a promise with a cross-origin location should work (cross-origin)
+PASS Resolving a promise with a cross-origin location should work (same-origin + document.domain)
+PASS Resolving a promise with a cross-origin location should work (cross-site)
+PASS LenientThis behavior (cross-origin)
+PASS LenientThis behavior (same-origin + document.domain)
+PASS LenientThis behavior (cross-site)
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-child-test.js b/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-child-test.js
index add04fa5..ee790bb6 100644
--- a/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-child-test.js
+++ b/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-child-test.js
@@ -14,7 +14,7 @@
         if (messageEvent.data.type === 'Attach') {
           messageEvent.data.interfaces.forEach(interfaceName => {
             let interfaceInterceptor =
-                new MojoInterfaceInterceptor(interfaceName);
+                new MojoInterfaceInterceptor(interfaceName, "context", true);
             interfaceInterceptor.oninterfacerequest =
               e => messageChannel.port1.postMessage({
                 type: interfaceName,
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-test.js b/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-test.js
index 8bccfd1f..83b881f 100644
--- a/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-test.js
+++ b/third_party/blink/web_tests/external/wpt/resources/chromium/webusb-test.js
@@ -476,7 +476,7 @@
 
     internal.webUsbService = new FakeWebUsbService();
     internal.webUsbServiceInterceptor =
-        new MojoInterfaceInterceptor(blink.mojom.WebUsbService.name);
+        new MojoInterfaceInterceptor(blink.mojom.WebUsbService.name, "context", true);
     internal.webUsbServiceInterceptor.oninterfacerequest =
         e => internal.webUsbService.addBinding(e.handle);
     internal.webUsbServiceInterceptor.start();
diff --git a/third_party/blink/web_tests/external/wpt/websockets/handlers/send-backpressure_wsh.py b/third_party/blink/web_tests/external/wpt/websockets/handlers/send-backpressure_wsh.py
index fe69b8f..c57b997 100755
--- a/third_party/blink/web_tests/external/wpt/websockets/handlers/send-backpressure_wsh.py
+++ b/third_party/blink/web_tests/external/wpt/websockets/handlers/send-backpressure_wsh.py
@@ -2,13 +2,18 @@
 
 import time
 
-# The amount of buffering a WebSocket connection has is not standardised, but
-# it's reasonable to expect that it will not be as large as 8MB.
-MESSAGE_SIZE = 8 * 1024 * 1024
+# The amount of internal buffering a WebSocket connection has is not
+# standardised, and varies depending upon the OS. Setting this number too small
+# will result in false negatives, as the entire message gets buffered. Setting
+# this number too large will result in false positives, when it takes more than
+# 2 seconds to transmit the message anyway. This number was arrived at by
+# trial-and-error.
+MESSAGE_SIZE = 16 * 1024 * 1024
 
 
 def web_socket_do_extra_handshake(request):
-    # Turn off permessage-deflate, otherwise it shrinks our 8MB buffer to 8KB.
+    # Turn off permessage-deflate, otherwise it shrinks our big message to a
+    # tiny message.
     request.ws_extension_processors = []
 
 
diff --git a/third_party/blink/web_tests/external/wpt/websockets/stream-tentative/backpressure-receive.any.js b/third_party/blink/web_tests/external/wpt/websockets/stream-tentative/backpressure-receive.any.js
index 11f4bd9..b4b0909 100644
--- a/third_party/blink/web_tests/external/wpt/websockets/stream-tentative/backpressure-receive.any.js
+++ b/third_party/blink/web_tests/external/wpt/websockets/stream-tentative/backpressure-receive.any.js
@@ -3,11 +3,14 @@
 // META: global=window,worker
 // META: timeout=long
 
-// This test works by using a server WebSocket handler which sends an 8MB
+// Allow for this much timer jitter.
+const JITTER_ALLOWANCE_MS = 200;
+
+// This test works by using a server WebSocket handler which sends a large
 // message, and then sends a second message with the time it measured the first
 // message taking. On the browser side, we wait 2 seconds before reading from
 // the socket. This should ensure it takes at least 2 seconds to finish sending
-// the 8MB message.
+// the large message.
 promise_test(async t => {
   const wss = new WebSocketStream(`${BASEURL}/send-backpressure`);
   const { readable } = await wss.connection;
@@ -16,7 +19,7 @@
   // Create backpressure for 2 seconds.
   await new Promise(resolve => t.step_timeout(resolve, 2000));
 
-  // Skip the 8MB message.
+  // Skip the large message.
   await reader.read();
 
   // Read the time it took.
@@ -24,6 +27,6 @@
 
   // A browser can pass this test simply by being slow. This may be a source of
   // flakiness for browsers that do not implement backpressure properly.
-  assert_greater_than_equal(Number(value), 2,
+  assert_greater_than_equal(Number(value), 2 - JITTER_ALLOWANCE_MS / 1000,
                             'data send should have taken at least 2 seconds');
 }, 'backpressure should be applied to received messages');
diff --git a/third_party/blink/web_tests/external/wpt/worklets/resources/import-tests.js b/third_party/blink/web_tests/external/wpt/worklets/resources/import-tests.js
index f504588..de4ca72 100644
--- a/third_party/blink/web_tests/external/wpt/worklets/resources/import-tests.js
+++ b/third_party/blink/web_tests/external/wpt/worklets/resources/import-tests.js
@@ -139,14 +139,14 @@
 
     promise_test(t => {
         const kScriptURL = 'resources/syntax-error-worklet-script.js';
-        return promise_rejects(t, new DOMException('', 'AbortError'),
+        return promise_rejects(t, new DOMException('', 'SyntaxError'),
                                worklet.addModule(kScriptURL));
     }, 'Importing a script that has a syntax error should reject the given ' +
        'promise.');
 
     promise_test(t => {
         const kScriptURL = 'resources/import-syntax-error-worklet-script.js';
-        return promise_rejects(t, new DOMException('', 'AbortError'),
+        return promise_rejects(t, new DOMException('', 'SyntaxError'),
                                worklet.addModule(kScriptURL));
     }, 'Importing a nested script that has a syntax error should reject the ' +
        'given promise.');
@@ -155,7 +155,7 @@
         const kBlob = new Blob(["import 'invalid-specifier.js';"],
                                {type: 'text/javascript'});
         const kBlobURL = URL.createObjectURL(kBlob);
-        return promise_rejects(t, new DOMException('', 'AbortError'),
+        return promise_rejects(t, new DOMException('', 'TypeError'),
                                worklet.addModule(kBlobURL));
     }, 'Importing a script that imports an invalid identifier should reject ' +
        'the given promise.');
diff --git a/third_party/blink/web_tests/http/tests/workers/resources/worker-static-import-nonexistent-script.js b/third_party/blink/web_tests/http/tests/workers/resources/worker-static-import-nonexistent-script.js
new file mode 100644
index 0000000..9b61b18
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/workers/resources/worker-static-import-nonexistent-script.js
@@ -0,0 +1 @@
+import './nonexistent-script.js';
diff --git a/third_party/blink/web_tests/http/tests/workers/worker-termination-on-script-fetch-failure.html b/third_party/blink/web_tests/http/tests/workers/worker-termination-on-script-fetch-failure.html
new file mode 100644
index 0000000..76c2942
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/workers/worker-termination-on-script-fetch-failure.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test worker termination on script fetch failure</title>
+<body></body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+
+// This test should not be upstreamed to WPT because of using Internals API.
+
+function run_test(worker_url, worker_options, fetch_type) {
+  promise_test(async t => {
+    assert_equals(window.internals.workerThreadCount, 0);
+    const worker = new Worker(worker_url, worker_options);
+
+    // A failure of worker script fetch should be reported to the onerror
+    // handler.
+    await new Promise(resolve => worker.onerror = resolve);
+
+    // Also, it should terminate the worker thread.
+    await new Promise(resolve => {
+      const timer = setInterval(() => {
+        if (window.internals.workerThreadCount === 0) {
+          clearInterval(timer);
+          resolve();
+        }
+      }, 10);
+    });
+  }, `A failure on ${fetch_type} fetch should terminate the worker`);
+}
+
+// Loading non-existent top-level classic worker script should terminate the
+// worker.
+run_test('resources/non-existent-script.js',
+         { type: 'classic' },
+         'top-level classic worker script');
+
+// Loading non-existent top-level module worker script should terminate the
+// worker.
+run_test('resources/non-existent-script.js',
+         { type: 'module' },
+         'top-level module worker script');
+
+// Static import to non-existent module worker script should terminate the
+// worker.
+run_test('resources/worker-static-import-nonexistent-script.js',
+         { type: 'module' },
+         'static import');
+
+</script>
diff --git a/third_party/blink/web_tests/inspector-protocol/dom-snapshot/captureSnapshot-origin-url-async-expected.txt b/third_party/blink/web_tests/inspector-protocol/dom-snapshot/captureSnapshot-origin-url-async-expected.txt
new file mode 100644
index 0000000..7f2b42c
--- /dev/null
+++ b/third_party/blink/web_tests/inspector-protocol/dom-snapshot/captureSnapshot-origin-url-async-expected.txt
@@ -0,0 +1,3 @@
+Tests that DOMSnapshot.captureSnapshot records origin url of dom nodes generated by script.
+DIV: http://a.test/script.js
+
diff --git a/third_party/blink/web_tests/inspector-protocol/dom-snapshot/captureSnapshot-origin-url-async.js b/third_party/blink/web_tests/inspector-protocol/dom-snapshot/captureSnapshot-origin-url-async.js
new file mode 100644
index 0000000..eeab78e5
--- /dev/null
+++ b/third_party/blink/web_tests/inspector-protocol/dom-snapshot/captureSnapshot-origin-url-async.js
@@ -0,0 +1,28 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startBlank('Tests that DOMSnapshot.captureSnapshot records origin url of dom nodes generated by script.');
+  await dp.DOMSnapshot.enable();
+  await dp.Runtime.enable();
+  const res = await dp.Runtime.setAsyncCallStackDepth({maxDepth: 10});
+
+  await session.evaluateAsync(`
+      setTimeout("document.body.appendChild(document.createElement('div'))", 0);
+      new Promise(fulfill => setTimeout(fulfill), 0);
+      \n//# sourceURL=http://a.test/script.js`);
+
+  const {result} = await dp.DOMSnapshot.captureSnapshot({'computedStyles': []});
+  function lookupRareString(table, index) {
+    const entryIndex = table.index.indexOf(index);
+    return entryIndex >= 0 ? result.strings[table.value[entryIndex]] : "";
+  }
+  const nodes = result.documents[0].nodes;
+  let nodeIndex = 0;
+  for (const nameIndex of nodes.nodeName) {
+    const name = result.strings[nameIndex];
+    if (name === 'DIV') {
+      const originURL = lookupRareString(nodes.originURL, nodeIndex);
+      testRunner.log(`${name}: ${originURL}`);
+    }
+    ++nodeIndex;
+  }
+  testRunner.completeTest();
+})
\ No newline at end of file
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
index 82456601..e4b8540 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
index e47b35f..de6ea589 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
index dd97c182..2a9071c7 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
index f9d3d5c..75ab4a72 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
index 38f17e7..a467e8a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
index d6c463d4d..fa776ba 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
index 38f17e7..a467e8a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
index d6c463d4d..fa776ba 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
index 5f4ce38e..db833b07 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
index 7f57a9e..5e8fe0d 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
index 5f4ce38e..db833b07 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
index 7f57a9e..5e8fe0d 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
index 35adb291..85305ca 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
index 7be2227..bd985e94 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
index 75f079c..04b89bd 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
index 06c2b8e0..7ca4360 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/wpt_internal/virtual-scroller/resources/ref-tests.mjs b/third_party/blink/web_tests/wpt_internal/virtual-scroller/resources/ref-tests.mjs
index bb3fe73..7c65f33 100644
--- a/third_party/blink/web_tests/wpt_internal/virtual-scroller/resources/ref-tests.mjs
+++ b/third_party/blink/web_tests/wpt_internal/virtual-scroller/resources/ref-tests.mjs
@@ -20,7 +20,8 @@
 
 export function testFullScroll500px(target) {
   helpers.appendDivs(target, MORE_THAN_SCREENFUL, '10px');
-  helpers.nextFrame(() => {
+  // Scroller needs some time to settle.
+  helpers.inNFrames(10, () => {
     window.scrollBy(0, 500);  // eslint-disable-line no-magic-numbers
     helpers.stopWaiting();
   });
diff --git a/tools/ipc_fuzzer/message_tools/message_list.cc b/tools/ipc_fuzzer/message_tools/message_list.cc
index f94bd9bc..81d43bba 100644
--- a/tools/ipc_fuzzer/message_tools/message_list.cc
+++ b/tools/ipc_fuzzer/message_tools/message_list.cc
@@ -49,14 +49,9 @@
   exemptions.push_back(TestMsgStart);
   exemptions.push_back(BlinkTestMsgStart);
   exemptions.push_back(WebTestMsgStart);
-  exemptions.push_back(CastCryptoMsgStart);   // Reserved for chromecast.
-  exemptions.push_back(CastChannelMsgStart);  // Reserved for chromecast.
-  exemptions.push_back(CastMediaMsgStart);    // Reserved for chromecast.
   exemptions.push_back(IPCTestMsgStart);
   exemptions.push_back(WorkerMsgStart);    // Now only used by tests.
-  exemptions.push_back(ResourceMsgStart);  // Cleanup underway.
   exemptions.push_back(ChromeUtilityPrintingMsgStart);  // BUILDFLAGS, sigh.
-  exemptions.push_back(WebRtcLoggingMsgStart);
 
 #if !BUILDFLAG(ENABLE_NACL)
   exemptions.push_back(NaClMsgStart);
@@ -64,11 +59,9 @@
 
 
 #if !defined(OS_ANDROID)
-  exemptions.push_back(MediaPlayerMsgStart);
   exemptions.push_back(EncryptedMediaMsgStart);
   exemptions.push_back(GinJavaBridgeMsgStart);
   exemptions.push_back(AndroidWebViewMsgStart);
-  exemptions.push_back(SyncCompositorMsgStart);
   exemptions.push_back(ExtensionWorkerMsgStart);
   exemptions.push_back(SurfaceViewManagerMsgStart);
 #endif  // !defined(OS_ANDROID)
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 5775554..4ab8cc8 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -14240,6 +14240,59 @@
   <description>Recorded when a persistent notification gets shown.</description>
 </action>
 
+<action name="Notifications.Quiet.AnimatedIconClicked">
+  <owner>andypaicu@chromium.org</owner>
+  <owner>engedy@chromium.org</owner>
+  <owner>hkamila@chromium.org</owner>
+  <description>
+    Logs when the user clicks on the notification permission request animated
+    icon on the omnibox, that upon being clicked, opens the permission request
+    bubble .
+  </description>
+</action>
+
+<action name="Notifications.Quiet.ManageClicked">
+  <owner>andypaicu@chromium.org</owner>
+  <owner>engedy@chromium.org</owner>
+  <owner>hkamila@chromium.org</owner>
+  <description>
+    Logs when the user clicks &quot;Manage&quot;, which is a button, that upon
+    being clicked, navigates the user to the notifications category settings
+    page.
+  </description>
+</action>
+
+<action name="Notifications.Quiet.PermissionRequestShown">
+  <owner>andypaicu@chromium.org</owner>
+  <owner>engedy@chromium.org</owner>
+  <owner>hkamila@chromium.org</owner>
+  <description>
+    The notification permission request was shown quietly as an icon in the
+    omnibox.
+  </description>
+</action>
+
+<action name="Notifications.Quiet.ShowForSiteClicked">
+  <owner>andypaicu@chromium.org</owner>
+  <owner>engedy@chromium.org</owner>
+  <owner>hkamila@chromium.org</owner>
+  <description>
+    Logs when the user clicks &quot;Show for site&quot;, which is a button, that
+    upon being clicked, allows the site to send notifications.
+  </description>
+</action>
+
+<action name="Notifications.Quiet.StaticIconClicked">
+  <owner>andypaicu@chromium.org</owner>
+  <owner>engedy@chromium.org</owner>
+  <owner>hkamila@chromium.org</owner>
+  <description>
+    Logs when the user clicks on the notification permission request static icon
+    on the omnibox, that upon being clicked, opens the permission request bubble
+    .
+  </description>
+</action>
+
 <action name="Notifications.ShowMessageCenter">
   <owner>dewittj@chromium.org</owner>
   <description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index c9d36c98..9ae22a84 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -4691,6 +4691,13 @@
   <int value="5" label="Overlay Insecure Non-player-element Fullscreen"/>
 </enum>
 
+<enum name="BackForwardCacheDisabledForRenderFrameHostReason">
+  <int value="-1449100855" label="safe_browsing::ThreatDetails"/>
+  <int value="-1314032804" label="MediaSessionImpl::OnServiceCreated"/>
+  <int value="-866479064" label="content::protocol::SecurityHandler"/>
+  <int value="671363579" label="banners::AppBannerManager"/>
+</enum>
+
 <enum name="BackForwardCacheHistoryNavigationOutcome">
   <int value="0" label="Restored"/>
   <int value="1" label="Not cached"/>
@@ -45752,6 +45759,9 @@
     The model for the optimization target was evaluated and the page load was
     predicted to match the optimization target.
   </int>
+  <int value="3" label="Model for target not available on client">
+    The model for the optimization target not available on the client.
+  </int>
 </enum>
 
 <enum name="OptimizationGuideOptimizationTypeDecision">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index d7dd034..0db195e 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -13084,6 +13084,28 @@
   </summary>
 </histogram>
 
+<histogram
+    name="BackForwardCache.HistoryNavigationOutcome.DisabledForRenderFrameHostReason"
+    enum="BackForwardCacheDisabledForRenderFrameHostReason"
+    expires_after="2020-10-01">
+  <owner>bfcache-dev@chromium.org</owner>
+  <owner>carlscab@chromium.org</owner>
+  <owner>hajimehoshi@chromium.org</owner>
+  <summary>
+    For history navigations, records the reasons passed to
+    BackForwardCache::DisableForRenderFrameHost calls. These reasons are
+    specified as strings, so this histograms contains their hashes computed as
+    base::HashMetricName.
+
+    The metric is recorded when a history navigation commits and emits a sample
+    for each reason. Compare this with
+    BackForwardCache.HistoryNavigationOutcome, which contains the total number
+    of navigations which where not cached
+
+    Recording starts as of M79.
+  </summary>
+</histogram>
+
 <histogram base="true" name="BackgroundFetch.EventDispatchFailure.Dispatch"
     enum="ServiceWorkerStatusCode">
 <!-- Name completed by histogram_suffixes name="BackgroundFetchEvents" -->
@@ -45091,7 +45113,7 @@
 </histogram>
 
 <histogram name="Extensions.MimeHandlerViewEvents" enum="MimeHandlerViewEvents"
-    expires_after="M79">
+    expires_after="M81">
   <owner>ekaramad@chromium.org</owner>
   <owner>wjmaclean@chromium.org</owner>
   <summary>
@@ -78010,7 +78032,7 @@
 </histogram>
 
 <histogram name="Net.KeepaliveStatisticsRecorder.PeakInflightRequests2"
-    units="requests" expires_after="M77">
+    units="requests" expires_after="2020-06-30">
   <owner>yhirano@chromium.org</owner>
   <summary>
     The peak number of concurrent outstanding requests with keepalive specified.
@@ -78022,7 +78044,7 @@
 
 <histogram
     name="Net.KeepaliveStatisticsRecorder.PeakInflightRequestsPerProcess"
-    units="requests" expires_after="M78">
+    units="requests" expires_after="2020-06-30">
   <owner>yhirano@chromium.org</owner>
   <summary>
     The peak number of concurrent outstanding requests with keepalive specified
@@ -78032,7 +78054,7 @@
 
 <histogram
     name="Net.KeepaliveStatisticsRecorder.PeakInflightRequestsPerProcess2"
-    units="requests" expires_after="M78">
+    units="requests" expires_after="2020-06-30">
   <owner>yhirano@chromium.org</owner>
   <summary>
     The peak number of concurrent outstanding requests with keepalive specified
@@ -95470,6 +95492,17 @@
 </histogram>
 
 <histogram
+    name="OptimizationGuide.PredictionManager.HasHostModelFeaturesForHost"
+    enum="Boolean" expires_after="M85">
+  <owner>mcrouse@chromium.org</owner>
+  <owner>sophiechang@chromium.org</owner>
+  <summary>
+    Whether the PredictionManager had HostModelFeatures for the host of the
+    navigation. Recorded when ShouldTargetNavigation is called.
+  </summary>
+</histogram>
+
+<histogram
     name="OptimizationGuide.PredictionModelFetcher.GetModelsRequest.HostCount"
     units="total host count" expires_after="M85">
   <owner>mcrouse@chromium.org</owner>
@@ -119546,7 +119579,7 @@
 </histogram>
 
 <histogram name="ResourceReporter.BrowserProcess.MemoryUsage"
-    enum="ResourceReporterMemoryUsage" expires_after="M79">
+    enum="ResourceReporterMemoryUsage" expires_after="M85">
   <owner>afakhry@chromium.org</owner>
   <summary>
     The system memory usage range reported for the browser process when the
@@ -119568,7 +119601,7 @@
 </histogram>
 
 <histogram name="ResourceReporter.GpuProcess.MemoryUsage"
-    enum="ResourceReporterMemoryUsage" expires_after="M79">
+    enum="ResourceReporterMemoryUsage" expires_after="M85">
   <owner>afakhry@chromium.org</owner>
   <summary>
     The system's RAM memory usage range reported for the GPU process when the
@@ -152339,6 +152372,20 @@
   </summary>
 </histogram>
 
+<histogram name="V8.CollectSourcePositions" units="microseconds"
+    expires_after="M85">
+  <owner>delphick@chromium.org</owner>
+  <summary>
+    Time spent collecting source positions to generate stack traces.
+
+    Warning: This metric may include reports from clients with low-resolution
+    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
+    will cause this metric to have an abnormal distribution. When considering
+    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
+    solution.
+  </summary>
+</histogram>
+
 <histogram name="V8.Compile" units="ms" expires_after="2015-01-27">
   <obsolete>
     This histogram has been replaced by V8.CompileMicroSeconds.
@@ -164083,6 +164130,7 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="ArcThrottleObservers" separator=".">
+  <suffix name="ArcAppLaunchRequested" label="ARC++ app launch in progress."/>
   <suffix name="ArcIsBooting" label="ARC++ is booting or restarting."/>
   <suffix name="ArcWindowIsActiveWindow" label="An ARC++ window is active."/>
   <affected-histogram name="Arc.CpuRestrictionDisabled"/>
@@ -169496,7 +169544,11 @@
       label="Database for storing budget information for origins."/>
   <suffix name="CachedImageFetcherDatabase"
       label="Database for CachedImageFetcher metadata."/>
-  <suffix name="DomDistillerStore" label="Databases for DomDistillerStore"/>
+  <suffix name="DomDistillerStore" label="Databases for DomDistillerStore">
+    <obsolete>
+      Deprecated since 2019-10.
+    </obsolete>
+  </suffix>
   <suffix name="DownloadDB" label="Databases for in-progress download."/>
   <suffix name="FeatureEngagementTrackerAvailabilityStore"
       label="Database for FeatureEngagementTracker feature availability."/>
diff --git a/ui/aura/window_tree_host_platform.cc b/ui/aura/window_tree_host_platform.cc
index 4d04060..40c6bc90 100644
--- a/ui/aura/window_tree_host_platform.cc
+++ b/ui/aura/window_tree_host_platform.cc
@@ -24,6 +24,7 @@
 #include "ui/events/keyboard_hook.h"
 #include "ui/events/keycodes/dom/dom_code.h"
 #include "ui/events/keycodes/dom/dom_keyboard_layout_map.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_init_properties.h"
 
 #if defined(USE_OZONE)
@@ -85,7 +86,7 @@
 }
 
 void WindowTreeHostPlatform::SetPlatformWindow(
-    std::unique_ptr<ui::PlatformWindow> window) {
+    std::unique_ptr<ui::PlatformWindowBase> window) {
   platform_window_ = std::move(window);
 }
 
diff --git a/ui/aura/window_tree_host_platform.h b/ui/aura/window_tree_host_platform.h
index a2af44f..2fc6d49 100644
--- a/ui/aura/window_tree_host_platform.h
+++ b/ui/aura/window_tree_host_platform.h
@@ -14,11 +14,11 @@
 #include "ui/aura/window.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/gfx/native_widget_types.h"
-#include "ui/platform_window/platform_window.h"
 #include "ui/platform_window/platform_window_delegate.h"
 
 namespace ui {
 enum class DomCode;
+class PlatformWindowBase;
 class KeyboardHook;
 struct PlatformWindowInitProperties;
 }  // namespace ui
@@ -62,9 +62,9 @@
   // installs it at as the PlatformWindow for this WindowTreeHostPlatform.
   void CreateAndSetPlatformWindow(ui::PlatformWindowInitProperties properties);
 
-  void SetPlatformWindow(std::unique_ptr<ui::PlatformWindow> window);
-  ui::PlatformWindow* platform_window() { return platform_window_.get(); }
-  const ui::PlatformWindow* platform_window() const {
+  void SetPlatformWindow(std::unique_ptr<ui::PlatformWindowBase> window);
+  ui::PlatformWindowBase* platform_window() { return platform_window_.get(); }
+  const ui::PlatformWindowBase* platform_window() const {
     return platform_window_.get();
   }
 
@@ -93,7 +93,7 @@
 
  private:
   gfx::AcceleratedWidget widget_;
-  std::unique_ptr<ui::PlatformWindow> platform_window_;
+  std::unique_ptr<ui::PlatformWindowBase> platform_window_;
   gfx::NativeCursor current_cursor_;
   gfx::Rect bounds_in_pixels_;
 
diff --git a/ui/aura/window_tree_host_platform_unittest.cc b/ui/aura/window_tree_host_platform_unittest.cc
index eda14e2..677e569 100644
--- a/ui/aura/window_tree_host_platform_unittest.cc
+++ b/ui/aura/window_tree_host_platform_unittest.cc
@@ -22,7 +22,7 @@
     CreateCompositor();
   }
 
-  ui::PlatformWindow* platform_window() {
+  ui::PlatformWindowBase* platform_window() {
     return WindowTreeHostPlatform::platform_window();
   }
 
@@ -37,7 +37,7 @@
 class TestWindowTreeHostObserver : public aura::WindowTreeHostObserver {
  public:
   TestWindowTreeHostObserver(WindowTreeHostPlatform* host,
-                             ui::PlatformWindow* platform_window)
+                             ui::PlatformWindowBase* platform_window)
       : host_(host), platform_window_(platform_window) {
     host_->AddObserver(this);
   }
@@ -70,7 +70,7 @@
 
  private:
   WindowTreeHostPlatform* host_;
-  ui::PlatformWindow* platform_window_;
+  ui::PlatformWindowBase* platform_window_;
   bool should_change_bounds_in_on_resized_ = true;
   int on_host_will_process_bounds_change_count_ = 0;
   int on_host_did_process_bounds_change_count_ = 0;
diff --git a/ui/compositor/test/test_compositor_host_ozone.cc b/ui/compositor/test/test_compositor_host_ozone.cc
index 7dbbe5c..66f8b74 100644
--- a/ui/compositor/test/test_compositor_host_ozone.cc
+++ b/ui/compositor/test/test_compositor_host_ozone.cc
@@ -18,7 +18,7 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/native_widget_types.h"
 #include "ui/ozone/public/ozone_platform.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_delegate.h"
 #include "ui/platform_window/platform_window_init_properties.h"
 
@@ -72,7 +72,7 @@
 
   gfx::Rect bounds_;
   ui::Compositor compositor_;
-  std::unique_ptr<PlatformWindow> window_;
+  std::unique_ptr<PlatformWindowBase> window_;
   StubPlatformWindowDelegate window_delegate_;
   viz::ParentLocalSurfaceIdAllocator allocator_;
 
diff --git a/ui/file_manager/file_manager/common/js/util.js b/ui/file_manager/file_manager/common/js/util.js
index d57f0c38..5e7619c 100644
--- a/ui/file_manager/file_manager/common/js/util.js
+++ b/ui/file_manager/file_manager/common/js/util.js
@@ -219,9 +219,10 @@
  * number separators.
  *
  * @param {number} bytes The number of bytes.
+ * @param {number=} addedPrecision The number of precision digits to add.
  * @return {string} Localized string.
  */
-util.bytesToString = bytes => {
+util.bytesToString = (bytes, addedPrecision = 0) => {
   // Translation identifiers for size units.
   const UNITS = [
     'SIZE_BYTES',
@@ -242,12 +243,18 @@
     Math.pow(2, 50),
   ];
 
+  // Rounding with precision.
+  const round = (value, decimals) => {
+    const scale = Math.pow(10, decimals);
+    return Math.round(value * scale) / scale;
+  };
+
   const str = (n, u) => {
     return strf(u, n.toLocaleString());
   };
 
   const fmt = (s, u) => {
-    const rounded = Math.round(bytes / s * 10) / 10;
+    const rounded = round(bytes / s, 1 + addedPrecision);
     return str(rounded, u);
   };
 
@@ -256,9 +263,11 @@
     return str(bytes, UNITS[0]);
   }
 
-  // Up to 1MB is displayed as rounded up number of KBs.
+  // Up to 1MB is displayed as rounded up number of KBs, or with the desired
+  // number of precision digits.
   if (bytes < STEPS[2]) {
-    const rounded = Math.ceil(bytes / STEPS[1]);
+    const rounded = addedPrecision ? round(bytes / STEPS[1], addedPrecision) :
+                                     Math.ceil(bytes / STEPS[1]);
     return str(rounded, UNITS[1]);
   }
 
diff --git a/ui/file_manager/file_manager/common/js/util_unittest.js b/ui/file_manager/file_manager/common/js/util_unittest.js
index 565c7a8f..48418da6 100644
--- a/ui/file_manager/file_manager/common/js/util_unittest.js
+++ b/ui/file_manager/file_manager/common/js/util_unittest.js
@@ -193,7 +193,7 @@
 }
 
 /**
- * Tests the formatting of util.bytesToString
+ * Tests the formatting of util.bytesToString.
  */
 function testBytesToString() {
   const KB = 2 ** 10;
@@ -208,7 +208,7 @@
   assertEquals(util.bytesToString(KB - 1), '1,023 bytes');
   assertEquals(util.bytesToString(KB), '1 KB');
 
-  // Up to 1MB is displayed as a number of KBs.
+  // Up to 1MB is displayed as a number of KBs with no precision digit.
   assertEquals(util.bytesToString(2 * KB), '2 KB');
   assertEquals(util.bytesToString(2 * KB + 1), '3 KB');
   assertEquals(util.bytesToString(MB - KB), '1,023 KB');
@@ -216,7 +216,7 @@
   assertEquals(util.bytesToString(MB - 1), '1,024 KB');
   assertEquals(util.bytesToString(MB), '1 MB');
 
-  // Up to 1GB is displayed as a number of MBs.
+  // Up to 1GB is displayed as a number of MBs with <= 1 precision digit.
   assertEquals(util.bytesToString(2.55 * MB - 1), '2.5 MB');
   assertEquals(util.bytesToString(2.55 * MB), '2.6 MB');
   assertEquals(util.bytesToString(GB - 0.05 * MB - 1), '1,023.9 MB');
@@ -224,7 +224,7 @@
   assertEquals(util.bytesToString(GB - 1), '1,024 MB');
   assertEquals(util.bytesToString(GB), '1 GB');
 
-  // Up to 1TB is displayed as a number of GBs.
+  // Up to 1TB is displayed as a number of GBs with <= 1 precision digit.
   assertEquals(util.bytesToString(2.55 * GB - 1), '2.5 GB');
   assertEquals(util.bytesToString(2.55 * GB), '2.6 GB');
   assertEquals(util.bytesToString(TB - 0.05 * GB - 1), '1,023.9 GB');
@@ -232,11 +232,84 @@
   assertEquals(util.bytesToString(TB - 1), '1,024 GB');
   assertEquals(util.bytesToString(TB), '1 TB');
 
-  // Up to 1PB is displayed as a number of GBs.
+  // Up to 1PB is displayed as a number of TBs with <= 1 precision digit.
   assertEquals(util.bytesToString(2.55 * TB - 1), '2.5 TB');
   assertEquals(util.bytesToString(2.55 * TB), '2.6 TB');
   assertEquals(util.bytesToString(PB - 0.05 * TB - 1), '1,023.9 TB');
   assertEquals(util.bytesToString(PB - 0.05 * TB), '1,024 TB');
   assertEquals(util.bytesToString(PB - 1), '1,024 TB');
   assertEquals(util.bytesToString(PB), '1 PB');
+
+  // Above 1PB is displayed as a number of PBs with <= 1 precision digit.
+  assertEquals(util.bytesToString(2.55 * PB - 1), '2.5 PB');
+  assertEquals(util.bytesToString(2.55 * PB), '2.6 PB');
+}
+
+/**
+ * Tests the formatting of util.bytesToString with added precision digits.
+ *
+ * Useful information regarding the below assertions:
+ * 647 bytes = 0.6318359375 KB.
+ * bytesToString() internally uses Number.toLocaleString() which outputs at most
+ * 3 precision digits in en-US.
+ */
+function testBytesToStringWithAddedPrecision() {
+  const KB = 2 ** 10;
+  const MB = 2 ** 20;
+  const GB = 2 ** 30;
+  const TB = 2 ** 40;
+  const PB = 2 ** 50;
+
+  // Up to 1KB formatting unchanged.
+  assertEquals(util.bytesToString(0, 1), '0 bytes');
+  assertEquals(util.bytesToString(10, 2), '10 bytes');
+  assertEquals(util.bytesToString(KB - 1, 3), '1,023 bytes');
+
+  // Exact values, no trailing 0s regardless of precision.
+  assertEquals(util.bytesToString(2 * KB, 1), '2 KB');
+  assertEquals(util.bytesToString(2 * MB, 2), '2 MB');
+  assertEquals(util.bytesToString(2 * GB, 3), '2 GB');
+  assertEquals(util.bytesToString(2 * TB, 4), '2 TB');
+  assertEquals(util.bytesToString(2 * PB, 5), '2 PB');
+
+  // up to MB, initially no precision digits.
+  assertEquals(util.bytesToString(2 * KB + 647), '3 KB');
+  assertEquals(util.bytesToString(2 * KB + 647, 0), '3 KB');
+  assertEquals(util.bytesToString(2 * KB + 647, 1), '2.6 KB');
+  assertEquals(util.bytesToString(2 * KB + 647, 2), '2.63 KB');
+  assertEquals(util.bytesToString(2 * KB + 647, 3), '2.632 KB');
+  assertEquals(util.bytesToString(2 * KB + 647, 4), '2.632 KB');
+  assertEquals(util.bytesToString(200 * KB + 647, 1), '200.6 KB');
+
+  // From 1MB, up to 1 precision digit + added precision.
+  assertEquals(util.bytesToString(2 * MB + 647 * KB), '2.6 MB');
+  assertEquals(util.bytesToString(2 * MB + 647 * KB, 0), '2.6 MB');
+  assertEquals(util.bytesToString(2 * MB + 647 * KB, 1), '2.63 MB');
+  assertEquals(util.bytesToString(2 * MB + 647 * KB, 2), '2.632 MB');
+  assertEquals(util.bytesToString(2 * MB + 647 * KB, 3), '2.632 MB');
+  assertEquals(util.bytesToString(200 * MB + 647 * KB, 1), '200.63 MB');
+
+  // Up to 1TB.
+  assertEquals(util.bytesToString(2 * GB + 647 * MB), '2.6 GB');
+  assertEquals(util.bytesToString(2 * GB + 647 * MB, 0), '2.6 GB');
+  assertEquals(util.bytesToString(2 * GB + 647 * MB, 1), '2.63 GB');
+  assertEquals(util.bytesToString(2 * GB + 647 * MB, 2), '2.632 GB');
+  assertEquals(util.bytesToString(2 * GB + 647 * MB, 3), '2.632 GB');
+  assertEquals(util.bytesToString(200 * GB + 647 * MB, 1), '200.63 GB');
+
+  // Up to 1PB.
+  assertEquals(util.bytesToString(2 * TB + 647 * GB), '2.6 TB');
+  assertEquals(util.bytesToString(2 * TB + 647 * GB, 0), '2.6 TB');
+  assertEquals(util.bytesToString(2 * TB + 647 * GB, 1), '2.63 TB');
+  assertEquals(util.bytesToString(2 * TB + 647 * GB, 2), '2.632 TB');
+  assertEquals(util.bytesToString(2 * TB + 647 * GB, 3), '2.632 TB');
+  assertEquals(util.bytesToString(200 * TB + 647 * GB, 1), '200.63 TB');
+
+  // Above 1PB.
+  assertEquals(util.bytesToString(2 * PB + 647 * TB), '2.6 PB');
+  assertEquals(util.bytesToString(2 * PB + 647 * TB, 0), '2.6 PB');
+  assertEquals(util.bytesToString(2 * PB + 647 * TB, 1), '2.63 PB');
+  assertEquals(util.bytesToString(2 * PB + 647 * TB, 2), '2.632 PB');
+  assertEquals(util.bytesToString(2 * PB + 647 * TB, 3), '2.632 PB');
+  assertEquals(util.bytesToString(200 * PB + 647 * TB, 1), '200.63 PB');
 }
diff --git a/ui/file_manager/file_manager/foreground/js/metadata_box_controller.js b/ui/file_manager/file_manager/foreground/js/metadata_box_controller.js
index 66ea97a..ad8b2d3 100644
--- a/ui/file_manager/file_manager/foreground/js/metadata_box_controller.js
+++ b/ui/file_manager/file_manager/foreground/js/metadata_box_controller.js
@@ -141,7 +141,7 @@
       this.setDirectorySize_(directory, isSameEntry);
     } else if (item.size) {
       this.metadataBox_.size =
-          this.fileMetadataFormatter_.formatSize(item.size, item.hosted);
+          this.fileMetadataFormatter_.formatSize(item.size, item.hosted, true);
       this.metadataBox_.metadataRendered('size');
     }
 
@@ -274,7 +274,7 @@
       }
 
       this.metadataBox_.size =
-          this.fileMetadataFormatter_.formatSize(size, true);
+          this.fileMetadataFormatter_.formatSize(size, true, true);
       this.metadataBox_.isSizeLoading = false;
       this.metadataBox_.metadataRendered('size');
     });
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_metadata_formatter.js b/ui/file_manager/file_manager/foreground/js/ui/file_metadata_formatter.js
index 3483b7b..db726b2 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_metadata_formatter.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_metadata_formatter.js
@@ -73,9 +73,11 @@
    * Generates a formatted filesize text.
    * @param {number=} size
    * @param {boolean=} hosted
+   * @param {boolean=} addPrecision addPrecision used to optionally add more
+   *     precision digits to the formatted filesize text.
    * @return {string} A string that represents a file size.
    */
-  formatSize(size, hosted) {
+  formatSize(size, hosted, addPrecision = false) {
     if (size === null || size === undefined) {
       return '...';
     } else if (size === -1) {
@@ -83,7 +85,7 @@
     } else if (size === 0 && hosted) {
       return '--';
     } else {
-      return util.bytesToString(size);
+      return util.bytesToString(size, addPrecision ? 1 : 0);
     }
   }
 }
diff --git a/ui/gfx/geometry/mojom/geometry_mojom_traits_unittest.cc b/ui/gfx/geometry/mojom/geometry_mojom_traits_unittest.cc
index 60f9a57..f7cb245 100644
--- a/ui/gfx/geometry/mojom/geometry_mojom_traits_unittest.cc
+++ b/ui/gfx/geometry/mojom/geometry_mojom_traits_unittest.cc
@@ -5,7 +5,8 @@
 #include <utility>
 
 #include "base/test/task_environment.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/geometry/mojom/geometry_traits_test_service.mojom.h"
 #include "ui/gfx/geometry/point.h"
@@ -21,9 +22,9 @@
   GeometryStructTraitsTest() {}
 
  protected:
-  mojom::GeometryTraitsTestServicePtr GetTraitsTestProxy() {
-    mojom::GeometryTraitsTestServicePtr proxy;
-    traits_test_bindings_.AddBinding(this, mojo::MakeRequest(&proxy));
+  mojo::Remote<mojom::GeometryTraitsTestService> GetTraitsTestProxy() {
+    mojo::Remote<mojom::GeometryTraitsTestService> proxy;
+    traits_test_receivers_.Add(this, proxy.BindNewPipeAndPassReceiver());
     return proxy;
   }
 
@@ -85,7 +86,7 @@
   }
 
   base::test::TaskEnvironment task_environment_;
-  mojo::BindingSet<GeometryTraitsTestService> traits_test_bindings_;
+  mojo::ReceiverSet<GeometryTraitsTestService> traits_test_receivers_;
 
   DISALLOW_COPY_AND_ASSIGN(GeometryStructTraitsTest);
 };
@@ -96,7 +97,7 @@
   const int32_t x = 1234;
   const int32_t y = -5678;
   gfx::Point input(x, y);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy();
   gfx::Point output;
   proxy->EchoPoint(input, &output);
   EXPECT_EQ(x, output.x());
@@ -107,7 +108,7 @@
   const float x = 1234.5f;
   const float y = 6789.6f;
   gfx::PointF input(x, y);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy();
   gfx::PointF output;
   proxy->EchoPointF(input, &output);
   EXPECT_EQ(x, output.x());
@@ -119,7 +120,7 @@
   const float y = 6789.6f;
   const float z = 5432.1f;
   gfx::Point3F input(x, y, z);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy();
   gfx::Point3F output;
   proxy->EchoPoint3F(input, &output);
   EXPECT_EQ(x, output.x());
@@ -131,7 +132,7 @@
   const int32_t width = 1234;
   const int32_t height = 5678;
   gfx::Size input(width, height);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy();
   gfx::Size output;
   proxy->EchoSize(input, &output);
   EXPECT_EQ(width, output.width());
@@ -142,7 +143,7 @@
   const float width = 1234.5f;
   const float height = 6789.6f;
   gfx::SizeF input(width, height);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy();
   gfx::SizeF output;
   proxy->EchoSizeF(input, &output);
   EXPECT_EQ(width, output.width());
@@ -155,7 +156,7 @@
   const int32_t width = 4321;
   const int32_t height = 8765;
   gfx::Rect input(x, y, width, height);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy();
   gfx::Rect output;
   proxy->EchoRect(input, &output);
   EXPECT_EQ(x, output.x());
@@ -170,7 +171,7 @@
   const float width = 4321.3f;
   const float height = 8765.4f;
   gfx::RectF input(x, y, width, height);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy();
   gfx::RectF output;
   proxy->EchoRectF(input, &output);
   EXPECT_EQ(x, output.x());
@@ -185,7 +186,7 @@
   const int32_t bottom = 4321;
   const int32_t right = 8765;
   gfx::Insets input(top, left, bottom, right);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy();
   gfx::Insets output;
   proxy->EchoInsets(input, &output);
   EXPECT_EQ(top, output.top());
@@ -200,7 +201,7 @@
   const float bottom = 4321.3f;
   const float right = 8765.4f;
   gfx::InsetsF input(top, left, bottom, right);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy();
   gfx::InsetsF output;
   proxy->EchoInsetsF(input, &output);
   EXPECT_EQ(top, output.top());
@@ -213,7 +214,7 @@
   const int32_t x = 1234;
   const int32_t y = -5678;
   gfx::Vector2d input(x, y);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy();
   gfx::Vector2d output;
   proxy->EchoVector2d(input, &output);
   EXPECT_EQ(x, output.x());
@@ -224,7 +225,7 @@
   const float x = 1234.5f;
   const float y = 6789.6f;
   gfx::Vector2dF input(x, y);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy();
   gfx::Vector2dF output;
   proxy->EchoVector2dF(input, &output);
   EXPECT_EQ(x, output.x());
@@ -236,7 +237,7 @@
   const float y = 6789.6f;
   const float z = 5432.1f;
   gfx::Vector3dF input(x, y, z);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy();
   gfx::Vector3dF output;
   proxy->EchoVector3dF(input, &output);
   EXPECT_EQ(x, output.x());
@@ -250,7 +251,7 @@
   const double z = 31415.9;
   const double w = 27182.8;
   gfx::Quaternion input(x, y, z, w);
-  mojom::GeometryTraitsTestServicePtr proxy = GetTraitsTestProxy();
+  mojo::Remote<mojom::GeometryTraitsTestService> proxy = GetTraitsTestProxy();
   gfx::Quaternion output;
   proxy->EchoQuaternion(input, &output);
   EXPECT_EQ(x, output.x());
diff --git a/ui/gl/direct_composition_surface_win_unittest.cc b/ui/gl/direct_composition_surface_win_unittest.cc
index 36f10c9..873cabd 100644
--- a/ui/gl/direct_composition_surface_win_unittest.cc
+++ b/ui/gl/direct_composition_surface_win_unittest.cc
@@ -589,7 +589,7 @@
 
  protected:
   void SetUp() override {
-    static_cast<ui::PlatformWindow*>(&window_)->Show();
+    static_cast<ui::PlatformWindowBase*>(&window_)->Show();
     DirectCompositionSurfaceTest::SetUp();
   }
 
diff --git a/ui/ozone/common/linux/drm_util_linux.cc b/ui/ozone/common/linux/drm_util_linux.cc
index c85f0dc..7cb7b4e 100644
--- a/ui/ozone/common/linux/drm_util_linux.cc
+++ b/ui/ozone/common/linux/drm_util_linux.cc
@@ -98,7 +98,6 @@
     case DRM_FORMAT_XRGB2101010:
     case DRM_FORMAT_XBGR2101010:
     case DRM_FORMAT_RGB565:
-    case DRM_FORMAT_UYVY:
     case DRM_FORMAT_NV12:
     case DRM_FORMAT_YVU420:
     case DRM_FORMAT_P010:
diff --git a/ui/ozone/demo/demo_window.cc b/ui/ozone/demo/demo_window.cc
index caf78c25..f85f908 100644
--- a/ui/ozone/demo/demo_window.cc
+++ b/ui/ozone/demo/demo_window.cc
@@ -13,7 +13,7 @@
 #include "ui/ozone/demo/renderer_factory.h"
 #include "ui/ozone/demo/window_manager.h"
 #include "ui/ozone/public/ozone_platform.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_init_properties.h"
 
 #if defined(OS_FUCHSIA)
diff --git a/ui/ozone/demo/demo_window.h b/ui/ozone/demo/demo_window.h
index e0e7871..e502ff26 100644
--- a/ui/ozone/demo/demo_window.h
+++ b/ui/ozone/demo/demo_window.h
@@ -10,7 +10,7 @@
 #include "base/memory/weak_ptr.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_delegate.h"
 
 namespace ui {
@@ -58,7 +58,7 @@
   std::unique_ptr<Renderer> renderer_;
 
   // Window-related state.
-  std::unique_ptr<PlatformWindow> platform_window_;
+  std::unique_ptr<PlatformWindowBase> platform_window_;
   gfx::AcceleratedWidget widget_ = gfx::kNullAcceleratedWidget;
 
   base::WeakPtrFactory<DemoWindow> weak_ptr_factory_{this};
diff --git a/ui/ozone/platform/cast/ozone_platform_cast.cc b/ui/ozone/platform/cast/ozone_platform_cast.cc
index 8bf10ff..c8212e81 100644
--- a/ui/ozone/platform/cast/ozone_platform_cast.cc
+++ b/ui/ozone/platform/cast/ozone_platform_cast.cc
@@ -93,7 +93,7 @@
   std::unique_ptr<SystemInputInjector> CreateSystemInputInjector() override {
     return event_factory_ozone_->CreateSystemInputInjector();
   }
-  std::unique_ptr<PlatformWindow> CreatePlatformWindow(
+  std::unique_ptr<PlatformWindowBase> CreatePlatformWindow(
       PlatformWindowDelegate* delegate,
       PlatformWindowInitProperties properties) override {
     return std::make_unique<PlatformWindowCast>(delegate, properties.bounds);
diff --git a/ui/ozone/platform/drm/host/drm_window_host.h b/ui/ozone/platform/drm/host/drm_window_host.h
index c86f0d6..bda6a97 100644
--- a/ui/ozone/platform/drm/host/drm_window_host.h
+++ b/ui/ozone/platform/drm/host/drm_window_host.h
@@ -15,7 +15,7 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/native_widget_types.h"
 #include "ui/ozone/platform/drm/host/gpu_thread_observer.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_delegate.h"
 
 namespace ui {
@@ -37,7 +37,7 @@
 // State propagation needs to happen before the state change is acknowledged to
 // |delegate_| as |delegate_| is responsible for initializing the surface
 // associated with the window (the surface is created on the GPU process).
-class DrmWindowHost : public PlatformWindow,
+class DrmWindowHost : public PlatformWindowBase,
                       public PlatformEventDispatcher,
                       public GpuThreadObserver {
  public:
diff --git a/ui/ozone/platform/drm/ozone_platform_gbm.cc b/ui/ozone/platform/drm/ozone_platform_gbm.cc
index 2e9bc19..aa9c7e4 100644
--- a/ui/ozone/platform/drm/ozone_platform_gbm.cc
+++ b/ui/ozone/platform/drm/ozone_platform_gbm.cc
@@ -140,7 +140,7 @@
     drm_thread_started_ = true;
   }
 
-  std::unique_ptr<PlatformWindow> CreatePlatformWindow(
+  std::unique_ptr<PlatformWindowBase> CreatePlatformWindow(
       PlatformWindowDelegate* delegate,
       PlatformWindowInitProperties properties) override {
     GpuThreadAdapter* adapter = gpu_platform_support_host_.get();
diff --git a/ui/ozone/platform/headless/ozone_platform_headless.cc b/ui/ozone/platform/headless/ozone_platform_headless.cc
index 85bfcb43..2cff46c6 100644
--- a/ui/ozone/platform/headless/ozone_platform_headless.cc
+++ b/ui/ozone/platform/headless/ozone_platform_headless.cc
@@ -75,7 +75,7 @@
   std::unique_ptr<SystemInputInjector> CreateSystemInputInjector() override {
     return nullptr;  // no input injection support.
   }
-  std::unique_ptr<PlatformWindow> CreatePlatformWindow(
+  std::unique_ptr<PlatformWindowBase> CreatePlatformWindow(
       PlatformWindowDelegate* delegate,
       PlatformWindowInitProperties properties) override {
     return std::make_unique<HeadlessWindow>(delegate, window_manager_.get(),
diff --git a/ui/ozone/platform/scenic/ozone_platform_scenic.cc b/ui/ozone/platform/scenic/ozone_platform_scenic.cc
index d47b7887..6240b25 100644
--- a/ui/ozone/platform/scenic/ozone_platform_scenic.cc
+++ b/ui/ozone/platform/scenic/ozone_platform_scenic.cc
@@ -90,7 +90,7 @@
     return nullptr;
   }
 
-  std::unique_ptr<PlatformWindow> CreatePlatformWindow(
+  std::unique_ptr<PlatformWindowBase> CreatePlatformWindow(
       PlatformWindowDelegate* delegate,
       PlatformWindowInitProperties properties) override {
     if (!properties.view_token.value) {
diff --git a/ui/ozone/platform/scenic/scenic_window.h b/ui/ozone/platform/scenic/scenic_window.h
index 5207777..ee8b1ac5 100644
--- a/ui/ozone/platform/scenic/scenic_window.h
+++ b/ui/ozone/platform/scenic/scenic_window.h
@@ -21,7 +21,7 @@
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/geometry/size_f.h"
 #include "ui/gfx/native_widget_types.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_delegate.h"
 
 namespace ui {
@@ -29,7 +29,7 @@
 class ScenicWindowManager;
 
 class COMPONENT_EXPORT(OZONE) ScenicWindow
-    : public PlatformWindow,
+    : public PlatformWindowBase,
       public InputEventDispatcherDelegate {
  public:
   // Both |window_manager| and |delegate| must outlive the ScenicWindow.
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc b/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc
index b14fca58..8bc4711 100644
--- a/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc
+++ b/ui/ozone/platform/wayland/host/wayland_buffer_manager_host.cc
@@ -515,7 +515,8 @@
 
 void WaylandBufferManagerHost::OnWindowRemoved(WaylandWindow* window) {
   DCHECK(window);
-  DCHECK(surfaces_.erase(window->GetWidget()));
+  auto ret = surfaces_.erase(window->GetWidget());
+  DCHECK(ret);
 }
 
 void WaylandBufferManagerHost::SetTerminateGpuCallback(
diff --git a/ui/ozone/platform/wayland/host/wayland_window.h b/ui/ozone/platform/wayland/host/wayland_window.h
index 903476d..ba1be4c 100644
--- a/ui/ozone/platform/wayland/host/wayland_window.h
+++ b/ui/ozone/platform/wayland/host/wayland_window.h
@@ -17,11 +17,11 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/native_widget_types.h"
 #include "ui/ozone/platform/wayland/common/wayland_object.h"
-#include "ui/platform_window/platform_window.h"
 #include "ui/platform_window/platform_window_delegate.h"
 #include "ui/platform_window/platform_window_handler/wm_drag_handler.h"
 #include "ui/platform_window/platform_window_handler/wm_move_resize_handler.h"
 #include "ui/platform_window/platform_window_init_properties.h"
+#include "ui/platform_window/platform_window_linux.h"
 
 namespace gfx {
 class PointF;
@@ -39,7 +39,7 @@
 class XDGShellObjectFactory;
 }  // namespace
 
-class WaylandWindow : public PlatformWindow,
+class WaylandWindow : public PlatformWindowLinux,
                       public PlatformEventDispatcher,
                       public WmMoveResizeHandler,
                       public WmDragHandler {
diff --git a/ui/ozone/platform/wayland/ozone_platform_wayland.cc b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
index 0906ee2..5aa6327 100644
--- a/ui/ozone/platform/wayland/ozone_platform_wayland.cc
+++ b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
@@ -103,7 +103,7 @@
     return nullptr;
   }
 
-  std::unique_ptr<PlatformWindow> CreatePlatformWindow(
+  std::unique_ptr<PlatformWindowBase> CreatePlatformWindow(
       PlatformWindowDelegate* delegate,
       PlatformWindowInitProperties properties) override {
     auto window = std::make_unique<WaylandWindow>(delegate, connection_.get());
diff --git a/ui/ozone/platform/windows/ozone_platform_windows.cc b/ui/ozone/platform/windows/ozone_platform_windows.cc
index 702dcb9..912645f6 100644
--- a/ui/ozone/platform/windows/ozone_platform_windows.cc
+++ b/ui/ozone/platform/windows/ozone_platform_windows.cc
@@ -67,7 +67,7 @@
   std::unique_ptr<SystemInputInjector> CreateSystemInputInjector() override {
     return nullptr;  // no input injection support.
   }
-  std::unique_ptr<PlatformWindow> CreatePlatformWindow(
+  std::unique_ptr<PlatformWindowBase> CreatePlatformWindow(
       PlatformWindowDelegate* delegate,
       PlatformWindowInitProperties properties) override {
     return std::make_unique<WindowsWindow>(delegate, properties.bounds);
diff --git a/ui/ozone/platform/x11/ozone_platform_x11.cc b/ui/ozone/platform/x11/ozone_platform_x11.cc
index 109583a..f99f0ee 100644
--- a/ui/ozone/platform/x11/ozone_platform_x11.cc
+++ b/ui/ozone/platform/x11/ozone_platform_x11.cc
@@ -24,7 +24,7 @@
 #include "ui/ozone/public/input_controller.h"
 #include "ui/ozone/public/ozone_platform.h"
 #include "ui/ozone/public/system_input_injector.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_init_properties.h"
 
 #if defined(OS_CHROMEOS)
@@ -79,7 +79,7 @@
     return gpu_platform_support_host_.get();
   }
 
-  std::unique_ptr<PlatformWindow> CreatePlatformWindow(
+  std::unique_ptr<PlatformWindowBase> CreatePlatformWindow(
       PlatformWindowDelegate* delegate,
       PlatformWindowInitProperties properties) override {
     std::unique_ptr<X11WindowOzone> window =
diff --git a/ui/ozone/platform/x11/x11_window_ozone_unittest.cc b/ui/ozone/platform/x11/x11_window_ozone_unittest.cc
index 71e05ec..119e6a8 100644
--- a/ui/ozone/platform/x11/x11_window_ozone_unittest.cc
+++ b/ui/ozone/platform/x11/x11_window_ozone_unittest.cc
@@ -100,7 +100,7 @@
   }
 
  protected:
-  std::unique_ptr<PlatformWindow> CreatePlatformWindow(
+  std::unique_ptr<PlatformWindowBase> CreatePlatformWindow(
       MockPlatformWindowDelegate* delegate,
       const gfx::Rect& bounds,
       gfx::AcceleratedWidget* widget) {
diff --git a/ui/ozone/public/ozone_platform.h b/ui/ozone/public/ozone_platform.h
index 7085e04..d57e8287 100644
--- a/ui/ozone/public/ozone_platform.h
+++ b/ui/ozone/public/ozone_platform.h
@@ -14,7 +14,7 @@
 #include "base/message_loop/message_pump_type.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "ui/gfx/buffer_types.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_delegate.h"
 
 namespace display {
@@ -156,7 +156,7 @@
   virtual IPC::MessageFilter* GetGpuMessageFilter();
   virtual ui::GpuPlatformSupportHost* GetGpuPlatformSupportHost() = 0;
   virtual std::unique_ptr<SystemInputInjector> CreateSystemInputInjector() = 0;
-  virtual std::unique_ptr<PlatformWindow> CreatePlatformWindow(
+  virtual std::unique_ptr<PlatformWindowBase> CreatePlatformWindow(
       PlatformWindowDelegate* delegate,
       PlatformWindowInitProperties properties) = 0;
   virtual std::unique_ptr<display::NativeDisplayDelegate>
diff --git a/ui/platform_window/BUILD.gn b/ui/platform_window/BUILD.gn
index d826a8a..1aea55a 100644
--- a/ui/platform_window/BUILD.gn
+++ b/ui/platform_window/BUILD.gn
@@ -6,7 +6,6 @@
 
 source_set("platform_window") {
   sources = [
-    "platform_window.h",
     "platform_window_base.cc",
     "platform_window_base.h",
     "platform_window_delegate.h",
@@ -44,6 +43,10 @@
       "platform_window_linux.h",
     ]
   }
+
+  if (is_win) {
+    sources += [ "platform_window_win.h" ]
+  }
 }
 
 group("platform_impls") {
diff --git a/ui/platform_window/platform_window.h b/ui/platform_window/platform_window.h
deleted file mode 100644
index aa0b4df..0000000
--- a/ui/platform_window/platform_window.h
+++ /dev/null
@@ -1,28 +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 UI_PLATFORM_WINDOW_PLATFORM_WINDOW_H_
-#define UI_PLATFORM_WINDOW_PLATFORM_WINDOW_H_
-
-#include "build/build_config.h"
-
-// By default, PlatformWindowBase is used. However, different platforms
-// should specify what window they would like to use if needed.
-#if defined(OS_LINUX)
-#include "ui/platform_window/platform_window_linux.h"
-#else
-#include "ui/platform_window/platform_window_base.h"
-#endif
-
-namespace ui {
-
-#if defined(OS_LINUX)
-using PlatformWindow = PlatformWindowLinux;
-#else
-using PlatformWindow = PlatformWindowBase;
-#endif
-
-}  // namespace ui
-
-#endif  // UI_PLATFORM_WINDOW_PLATFORM_WINDOW_H_
diff --git a/ui/platform_window/platform_window_handler/DEPS b/ui/platform_window/platform_window_handler/DEPS
index 381a2e478..d55936f36 100644
--- a/ui/platform_window/platform_window_handler/DEPS
+++ b/ui/platform_window/platform_window_handler/DEPS
@@ -1,4 +1,4 @@
 include_rules = [
   "+ui/base/class_property.h",
-  "+ui/platform_window/platform_window.h",
+  "+ui/platform_window/platform_window_base.h",
 ]
diff --git a/ui/platform_window/platform_window_handler/wm_drag_handler.cc b/ui/platform_window/platform_window_handler/wm_drag_handler.cc
index f559d42..27e05a5 100644
--- a/ui/platform_window/platform_window_handler/wm_drag_handler.cc
+++ b/ui/platform_window/platform_window_handler/wm_drag_handler.cc
@@ -5,7 +5,7 @@
 #include "ui/platform_window/platform_window_handler/wm_drag_handler.h"
 
 #include "ui/base/class_property.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 
 DEFINE_UI_CLASS_PROPERTY_TYPE(ui::WmDragHandler*)
 
@@ -13,12 +13,12 @@
 
 DEFINE_UI_CLASS_PROPERTY_KEY(WmDragHandler*, kWmDragHandlerKey, nullptr)
 
-void SetWmDragHandler(PlatformWindow* platform_window,
+void SetWmDragHandler(PlatformWindowBase* platform_window,
                       WmDragHandler* drag_handler) {
   platform_window->SetProperty(kWmDragHandlerKey, drag_handler);
 }
 
-WmDragHandler* GetWmDragHandler(const PlatformWindow& platform_window) {
+WmDragHandler* GetWmDragHandler(const PlatformWindowBase& platform_window) {
   return platform_window.GetProperty(kWmDragHandlerKey);
 }
 
diff --git a/ui/platform_window/platform_window_handler/wm_drag_handler.h b/ui/platform_window/platform_window_handler/wm_drag_handler.h
index 2789c3e..87604ca4 100644
--- a/ui/platform_window/platform_window_handler/wm_drag_handler.h
+++ b/ui/platform_window/platform_window_handler/wm_drag_handler.h
@@ -7,10 +7,10 @@
 
 #include "base/bind.h"
 #include "ui/gfx/native_widget_types.h"
-#include "ui/platform_window/platform_window.h"
 #include "ui/platform_window/platform_window_handler/wm_platform_export.h"
 
 namespace ui {
+class PlatformWindowBase;
 class OSExchangeData;
 
 class WM_PLATFORM_EXPORT WmDragHandler {
@@ -29,10 +29,10 @@
   virtual ~WmDragHandler() {}
 };
 
-WM_PLATFORM_EXPORT void SetWmDragHandler(PlatformWindow* platform_window,
+WM_PLATFORM_EXPORT void SetWmDragHandler(PlatformWindowBase* platform_window,
                                          WmDragHandler* drag_handler);
 WM_PLATFORM_EXPORT WmDragHandler* GetWmDragHandler(
-    const PlatformWindow& platform_window);
+    const PlatformWindowBase& platform_window);
 
 }  // namespace ui
 
diff --git a/ui/platform_window/platform_window_handler/wm_drop_handler.cc b/ui/platform_window/platform_window_handler/wm_drop_handler.cc
index 64ff6bd..11f23479 100644
--- a/ui/platform_window/platform_window_handler/wm_drop_handler.cc
+++ b/ui/platform_window/platform_window_handler/wm_drop_handler.cc
@@ -5,7 +5,7 @@
 #include "ui/platform_window/platform_window_handler/wm_drop_handler.h"
 
 #include "ui/base/class_property.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 
 DEFINE_UI_CLASS_PROPERTY_TYPE(ui::WmDropHandler*)
 
@@ -13,12 +13,12 @@
 
 DEFINE_UI_CLASS_PROPERTY_KEY(WmDropHandler*, kWmDropHandlerKey, nullptr)
 
-void SetWmDropHandler(PlatformWindow* platform_window,
+void SetWmDropHandler(PlatformWindowBase* platform_window,
                       WmDropHandler* drop_handler) {
   platform_window->SetProperty(kWmDropHandlerKey, drop_handler);
 }
 
-WmDropHandler* GetWmDropHandler(const PlatformWindow& platform_window) {
+WmDropHandler* GetWmDropHandler(const PlatformWindowBase& platform_window) {
   return platform_window.GetProperty(kWmDropHandlerKey);
 }
 
diff --git a/ui/platform_window/platform_window_handler/wm_drop_handler.h b/ui/platform_window/platform_window_handler/wm_drop_handler.h
index fc7a81f..e4844c0 100644
--- a/ui/platform_window/platform_window_handler/wm_drop_handler.h
+++ b/ui/platform_window/platform_window_handler/wm_drop_handler.h
@@ -8,7 +8,6 @@
 #include <memory>
 
 #include "ui/gfx/native_widget_types.h"
-#include "ui/platform_window/platform_window.h"
 #include "ui/platform_window/platform_window_handler/wm_platform_export.h"
 
 namespace gfx {
@@ -16,6 +15,7 @@
 }
 
 namespace ui {
+class PlatformWindowBase;
 class OSExchangeData;
 
 class WM_PLATFORM_EXPORT WmDropHandler {
@@ -45,10 +45,10 @@
   virtual ~WmDropHandler() {}
 };
 
-WM_PLATFORM_EXPORT void SetWmDropHandler(PlatformWindow* platform_window,
+WM_PLATFORM_EXPORT void SetWmDropHandler(PlatformWindowBase* platform_window,
                                          WmDropHandler* drop_handler);
 WM_PLATFORM_EXPORT WmDropHandler* GetWmDropHandler(
-    const PlatformWindow& platform_window);
+    const PlatformWindowBase& platform_window);
 
 }  // namespace ui
 
diff --git a/ui/platform_window/platform_window_handler/wm_move_resize_handler.cc b/ui/platform_window/platform_window_handler/wm_move_resize_handler.cc
index a79ad70a..d9303cc 100644
--- a/ui/platform_window/platform_window_handler/wm_move_resize_handler.cc
+++ b/ui/platform_window/platform_window_handler/wm_move_resize_handler.cc
@@ -5,7 +5,7 @@
 #include "ui/platform_window/platform_window_handler/wm_move_resize_handler.h"
 
 #include "ui/base/class_property.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 
 DEFINE_UI_CLASS_PROPERTY_TYPE(WmMoveResizeHandler*)
 
@@ -15,13 +15,13 @@
                              kWmMoveResizeHandlerKey,
                              nullptr)
 
-void SetWmMoveResizeHandler(PlatformWindow* platform_window,
+void SetWmMoveResizeHandler(PlatformWindowBase* platform_window,
                             WmMoveResizeHandler* move_resize_handler) {
   platform_window->SetProperty(kWmMoveResizeHandlerKey, move_resize_handler);
 }
 
 WmMoveResizeHandler* GetWmMoveResizeHandler(
-    const PlatformWindow& platform_window) {
+    const PlatformWindowBase& platform_window) {
   return platform_window.GetProperty(kWmMoveResizeHandlerKey);
 }
 
diff --git a/ui/platform_window/platform_window_handler/wm_move_resize_handler.h b/ui/platform_window/platform_window_handler/wm_move_resize_handler.h
index 3da718c..57e5a622 100644
--- a/ui/platform_window/platform_window_handler/wm_move_resize_handler.h
+++ b/ui/platform_window/platform_window_handler/wm_move_resize_handler.h
@@ -5,7 +5,6 @@
 #ifndef UI_PLATFORM_WINDOW_PLATFORM_WINDOW_HANDLER_WM_MOVE_RESIZE_HANDLER_H_
 #define UI_PLATFORM_WINDOW_PLATFORM_WINDOW_HANDLER_WM_MOVE_RESIZE_HANDLER_H_
 
-#include "ui/platform_window/platform_window.h"
 #include "ui/platform_window/platform_window_handler/wm_platform_export.h"
 
 namespace gfx {
@@ -14,6 +13,8 @@
 
 namespace ui {
 
+class PlatformWindowBase;
+
 class WmMoveResizeHandler {
  public:
   // A system window manager starts interactive drag or resize of a window based
@@ -52,10 +53,10 @@
 };
 
 WM_PLATFORM_EXPORT void SetWmMoveResizeHandler(
-    PlatformWindow* platform_window,
+    PlatformWindowBase* platform_window,
     WmMoveResizeHandler* move_resize_handler);
 WM_PLATFORM_EXPORT WmMoveResizeHandler* GetWmMoveResizeHandler(
-    const PlatformWindow& platform_window);
+    const PlatformWindowBase& platform_window);
 
 }  // namespace ui
 
diff --git a/ui/platform_window/platform_window_win.h b/ui/platform_window/platform_window_win.h
new file mode 100644
index 0000000..a3802d6
--- /dev/null
+++ b/ui/platform_window/platform_window_win.h
@@ -0,0 +1,25 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_PLATFORM_WINDOW_PLATFORM_WINDOW_WIN_H_
+#define UI_PLATFORM_WINDOW_PLATFORM_WINDOW_WIN_H_
+
+#include "ui/platform_window/platform_window_base.h"
+
+namespace ui {
+
+// Windows extensions to the PlatformWindowBase.
+class PlatformWindowWin : public PlatformWindowBase {
+ public:
+  PlatformWindowWin() = default;
+  ~PlatformWindowWin() override = default;
+
+  // Enables or disables platform provided animations of the PlatformWindow.
+  // If |enabled| is set to false, animations must be disabled.
+  virtual void SetVisibilityChangedAnimationsEnabled(bool enabled) = 0;
+};
+
+}  // namespace ui
+
+#endif  // UI_PLATFORM_WINDOW_PLATFORM_WINDOW_WIN_H_
diff --git a/ui/platform_window/stub/stub_window.h b/ui/platform_window/stub/stub_window.h
index 13f92ee..3752dc7 100644
--- a/ui/platform_window/stub/stub_window.h
+++ b/ui/platform_window/stub/stub_window.h
@@ -8,7 +8,7 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "ui/gfx/geometry/rect.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_delegate.h"
 #include "ui/platform_window/stub/stub_window_export.h"
 
@@ -16,7 +16,7 @@
 
 // StubWindow is useful for tests, as well as implementations that only care
 // about bounds.
-class STUB_WINDOW_EXPORT StubWindow : public PlatformWindow {
+class STUB_WINDOW_EXPORT StubWindow : public PlatformWindowBase {
  public:
   explicit StubWindow(PlatformWindowDelegate* delegate,
                       bool use_default_accelerated_widget = true,
diff --git a/ui/platform_window/win/win_window.cc b/ui/platform_window/win/win_window.cc
index 0cca7be..3b4ef347 100644
--- a/ui/platform_window/win/win_window.cc
+++ b/ui/platform_window/win/win_window.cc
@@ -191,6 +191,10 @@
   NOTIMPLEMENTED_LOG_ONCE();
 }
 
+void WinWindow::SetVisibilityChangedAnimationsEnabled(bool enabled) {
+  NOTIMPLEMENTED_LOG_ONCE();
+}
+
 bool WinWindow::IsFullscreen() const {
   return GetPlatformWindowState() == PlatformWindowState::kFullScreen;
 }
diff --git a/ui/platform_window/win/win_window.h b/ui/platform_window/win/win_window.h
index c2c04d8..992be002 100644
--- a/ui/platform_window/win/win_window.h
+++ b/ui/platform_window/win/win_window.h
@@ -9,15 +9,15 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "ui/gfx/win/window_impl.h"
-#include "ui/platform_window/platform_window.h"
 #include "ui/platform_window/platform_window_delegate.h"
+#include "ui/platform_window/platform_window_win.h"
 #include "ui/platform_window/win/win_window_export.h"
 
 #include <windows.h>
 
 namespace ui {
 
-class WIN_WINDOW_EXPORT WinWindow : public PlatformWindow,
+class WIN_WINDOW_EXPORT WinWindow : public PlatformWindowWin,
                                     public gfx::WindowImpl {
  public:
   WinWindow(PlatformWindowDelegate* delegate, const gfx::Rect& bounds);
@@ -58,6 +58,7 @@
   void StackAbove(gfx::AcceleratedWidget widget) override;
   void StackAtTop() override;
   void FlashFrame(bool flash_frame) override;
+  void SetVisibilityChangedAnimationsEnabled(bool enabled) override;
 
   bool IsFullscreen() const;
 
diff --git a/ui/platform_window/x11/x11_window.h b/ui/platform_window/x11/x11_window.h
index b25ae7e..d5e5cfe 100644
--- a/ui/platform_window/x11/x11_window.h
+++ b/ui/platform_window/x11/x11_window.h
@@ -8,9 +8,9 @@
 #include "base/macros.h"
 #include "ui/base/x/x11_window.h"
 #include "ui/events/platform/platform_event_dispatcher.h"
-#include "ui/platform_window/platform_window.h"
 #include "ui/platform_window/platform_window_handler/wm_move_resize_handler.h"
 #include "ui/platform_window/platform_window_init_properties.h"
+#include "ui/platform_window/platform_window_linux.h"
 #include "ui/platform_window/x11/x11_window_export.h"
 
 namespace ui {
@@ -35,7 +35,7 @@
 };
 
 // PlatformWindow implementation for X11. PlatformEvents are XEvents.
-class X11_WINDOW_EXPORT X11Window : public PlatformWindow,
+class X11_WINDOW_EXPORT X11Window : public PlatformWindowLinux,
                                     public WmMoveResizeHandler,
                                     public XWindow,
                                     public PlatformEventDispatcher {
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index 5df7333..1ade466 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -1231,6 +1231,7 @@
       if (use_ozone) {
         sources +=
             [ "widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc" ]
+        deps += [ "//ui/platform_window" ]
       }
     }
   }
diff --git a/ui/views/controls/button/button.cc b/ui/views/controls/button/button.cc
index 28283fe7..eac3f34 100644
--- a/ui/views/controls/button/button.cc
+++ b/ui/views/controls/button/button.cc
@@ -280,8 +280,8 @@
     return PlatformStyle::kKeyClickActionOnSpace;
   if (event.key_code() == ui::VKEY_RETURN &&
       PlatformStyle::kReturnClicksFocusedControl)
-    return CLICK_ON_KEY_PRESS;
-  return CLICK_NONE;
+    return KeyClickAction::kOnKeyPress;
+  return KeyClickAction::kNone;
 }
 
 void Button::SetButtonController(
@@ -370,7 +370,7 @@
   // If this button is focused and the user presses space or enter, don't let
   // that be treated as an accelerator if there is a key click action
   // corresponding to it.
-  return GetKeyClickActionForEvent(event) != KeyClickAction::CLICK_NONE;
+  return GetKeyClickActionForEvent(event) != KeyClickAction::kNone;
 }
 
 base::string16 Button::GetTooltipText(const gfx::Point& p) const {
diff --git a/ui/views/controls/button/button.h b/ui/views/controls/button/button.h
index 0ee5ac9..7d5f4c29 100644
--- a/ui/views/controls/button/button.h
+++ b/ui/views/controls/button/button.h
@@ -62,10 +62,10 @@
 
   // An enum describing the events on which a button should be clicked for a
   // given key event.
-  enum KeyClickAction {
-    CLICK_ON_KEY_PRESS,
-    CLICK_ON_KEY_RELEASE,
-    CLICK_NONE,
+  enum class KeyClickAction {
+    kOnKeyPress,
+    kOnKeyRelease,
+    kNone,
   };
 
   // TODO(cyan): Consider having Button implement ButtonControllerDelegate.
diff --git a/ui/views/controls/button/button_controller.cc b/ui/views/controls/button/button_controller.cc
index 4fd8b56..328e7a2c 100644
--- a/ui/views/controls/button/button_controller.cc
+++ b/ui/views/controls/button/button_controller.cc
@@ -80,7 +80,7 @@
     return false;
 
   switch (button_->GetKeyClickActionForEvent(event)) {
-    case Button::KeyClickAction::CLICK_ON_KEY_RELEASE:
+    case Button::KeyClickAction::kOnKeyRelease:
       button_->SetState(Button::STATE_PRESSED);
       if (button_controller_delegate_->GetInkDrop()->GetTargetInkDropState() !=
           InkDropState::ACTION_PENDING) {
@@ -88,11 +88,11 @@
                                 nullptr /* event */);
       }
       return true;
-    case Button::KeyClickAction::CLICK_ON_KEY_PRESS:
+    case Button::KeyClickAction::kOnKeyPress:
       button_->SetState(Button::STATE_NORMAL);
       button_controller_delegate_->NotifyClick(event);
       return true;
-    case Button::KeyClickAction::CLICK_NONE:
+    case Button::KeyClickAction::kNone:
       return false;
   }
 
@@ -103,7 +103,7 @@
 bool ButtonController::OnKeyReleased(const ui::KeyEvent& event) {
   const bool click_button = button_->state() == Button::STATE_PRESSED &&
                             button_->GetKeyClickActionForEvent(event) ==
-                                Button::KeyClickAction::CLICK_ON_KEY_RELEASE;
+                                Button::KeyClickAction::kOnKeyRelease;
   if (!click_button)
     return false;
 
diff --git a/ui/views/controls/button/button_unittest.cc b/ui/views/controls/button/button_unittest.cc
index a3f38c2..fa0a6fde 100644
--- a/ui/views/controls/button/button_unittest.cc
+++ b/ui/views/controls/button/button_unittest.cc
@@ -72,7 +72,7 @@
   ~TestButton() override = default;
 
   KeyClickAction GetKeyClickActionForEvent(const ui::KeyEvent& event) override {
-    if (custom_key_click_action_ == KeyClickAction::CLICK_NONE)
+    if (custom_key_click_action_ == KeyClickAction::kNone)
       return Button::GetKeyClickActionForEvent(event);
     return custom_key_click_action_;
   }
@@ -117,7 +117,7 @@
   int ink_drop_layer_add_count_ = 0;
   int ink_drop_layer_remove_count_ = 0;
 
-  KeyClickAction custom_key_click_action_ = KeyClickAction::CLICK_NONE;
+  KeyClickAction custom_key_click_action_ = KeyClickAction::kNone;
 
   DISALLOW_COPY_AND_ASSIGN(TestButton);
 };
@@ -831,9 +831,8 @@
   button()->RequestFocus();
   EXPECT_TRUE(button()->HasFocus());
 
-  // Set the button to handle any key pressed event as |CLICK_ON_KEY_PRESS|.
-  button()->set_custom_key_click_action(
-      Button::KeyClickAction::CLICK_ON_KEY_PRESS);
+  // Set the button to handle any key pressed event as kOnKeyPress.
+  button()->set_custom_key_click_action(Button::KeyClickAction::kOnKeyPress);
 
   ui::KeyEvent control_press(ui::ET_KEY_PRESSED, ui::VKEY_CONTROL, ui::EF_NONE);
   EXPECT_TRUE(button()->OnKeyPressed(control_press));
diff --git a/ui/views/controls/webview/web_dialog_view.cc b/ui/views/controls/webview/web_dialog_view.cc
index 2952e8d..2e2baf0 100644
--- a/ui/views/controls/webview/web_dialog_view.cc
+++ b/ui/views/controls/webview/web_dialog_view.cc
@@ -391,22 +391,15 @@
   *proceed_to_fire_unload = proceed;
 }
 
-bool WebDialogView::ShouldCreateWebContents(
-    content::WebContents* web_contents,
-    content::RenderFrameHost* opener,
+bool WebDialogView::IsWebContentsCreationOverridden(
     content::SiteInstance* source_site_instance,
-    int32_t route_id,
-    int32_t main_frame_route_id,
-    int32_t main_frame_widget_route_id,
     content::mojom::WindowContainerType window_container_type,
     const GURL& opener_url,
     const std::string& frame_name,
-    const GURL& target_url,
-    const std::string& partition_id,
-    content::SessionStorageNamespace* session_storage_namespace) {
+    const GURL& target_url) {
   if (delegate_)
-    return delegate_->HandleShouldCreateWebContents();
-  return true;
+    return delegate_->HandleShouldOverrideWebContentsCreation();
+  return false;
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/ui/views/controls/webview/web_dialog_view.h b/ui/views/controls/webview/web_dialog_view.h
index 7e6755c7..8c7f6521 100644
--- a/ui/views/controls/webview/web_dialog_view.h
+++ b/ui/views/controls/webview/web_dialog_view.h
@@ -145,19 +145,12 @@
   void BeforeUnloadFired(content::WebContents* tab,
                          bool proceed,
                          bool* proceed_to_fire_unload) override;
-  bool ShouldCreateWebContents(
-      content::WebContents* web_contents,
-      content::RenderFrameHost* opener,
+  bool IsWebContentsCreationOverridden(
       content::SiteInstance* source_site_instance,
-      int32_t route_id,
-      int32_t main_frame_route_id,
-      int32_t main_frame_widget_route_id,
       content::mojom::WindowContainerType window_container_type,
       const GURL& opener_url,
       const std::string& frame_name,
-      const GURL& target_url,
-      const std::string& partition_id,
-      content::SessionStorageNamespace* session_storage_namespace) override;
+      const GURL& target_url) override;
 
  private:
   FRIEND_TEST_ALL_PREFIXES(WebDialogBrowserTest, WebContentRendered);
diff --git a/ui/views/style/platform_style.cc b/ui/views/style/platform_style.cc
index 0b118993..ec2a05cf 100644
--- a/ui/views/style/platform_style.cc
+++ b/ui/views/style/platform_style.cc
@@ -42,7 +42,7 @@
 const bool PlatformStyle::kSelectWordOnRightClick = false;
 const bool PlatformStyle::kSelectAllOnRightClickWhenUnfocused = false;
 const Button::KeyClickAction PlatformStyle::kKeyClickActionOnSpace =
-    Button::CLICK_ON_KEY_RELEASE;
+    Button::KeyClickAction::kOnKeyRelease;
 const bool PlatformStyle::kReturnClicksFocusedControl = true;
 const bool PlatformStyle::kTableViewSupportsKeyboardNavigationByCell = true;
 const bool PlatformStyle::kTreeViewSelectionPaintsEntireRow = false;
diff --git a/ui/views/style/platform_style_mac.mm b/ui/views/style/platform_style_mac.mm
index c5685d18..739f8e6f 100644
--- a/ui/views/style/platform_style_mac.mm
+++ b/ui/views/style/platform_style_mac.mm
@@ -46,7 +46,7 @@
 const bool PlatformStyle::kInactiveWidgetControlsAppearDisabled = true;
 
 const Button::KeyClickAction PlatformStyle::kKeyClickActionOnSpace =
-    Button::CLICK_ON_KEY_PRESS;
+    Button::KeyClickAction::kOnKeyPress;
 
 // On Mac, the Return key is used to perform the default action even when a
 // control is focused.
diff --git a/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc b/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc
index 5a1220ae..fdea67f 100644
--- a/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc
+++ b/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone_unittest.cc
@@ -13,6 +13,7 @@
 #include "ui/aura/window.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/dragdrop/os_exchange_data.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_handler/wm_drag_handler.h"
 #include "ui/platform_window/platform_window_handler/wm_drop_handler.h"
 #include "ui/views/test/views_test_base.h"
@@ -24,7 +25,8 @@
 namespace views {
 
 namespace {
-class FakePlatformWindow : public ui::PlatformWindow, public ui::WmDragHandler {
+class FakePlatformWindow : public ui::PlatformWindowBase,
+                           public ui::WmDragHandler {
  public:
   FakePlatformWindow() { SetWmDragHandler(this, this); }
   ~FakePlatformWindow() override = default;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
index aec51d54..e892b00 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.cc
@@ -11,6 +11,7 @@
 #include "ui/events/event.h"
 #include "ui/platform_window/platform_window_handler/wm_move_resize_handler.h"
 #include "ui/platform_window/platform_window_init_properties.h"
+#include "ui/platform_window/platform_window_linux.h"
 #include "ui/views/linux_ui/linux_ui.h"
 #include "ui/views/views_delegate.h"
 #include "ui/views/widget/desktop_aura/window_event_filter_linux.h"
@@ -69,7 +70,7 @@
 void DesktopWindowTreeHostLinux::Init(const Widget::InitParams& params) {
   DesktopWindowTreeHostPlatform::Init(params);
 
-  if (platform_window()->IsSyncExtensionAvailable()) {
+  if (GetPlatformWindowLinux()->IsSyncExtensionAvailable()) {
     compositor_observer_ = std::make_unique<SwapWithNewSizeObserverHelper>(
         compositor(),
         base::BindRepeating(
@@ -85,17 +86,17 @@
 }
 
 std::string DesktopWindowTreeHostLinux::GetWorkspace() const {
-  base::Optional<int> workspace = platform_window()->GetWorkspace();
+  base::Optional<int> workspace = GetPlatformWindowLinux()->GetWorkspace();
   return workspace ? base::NumberToString(workspace.value()) : std::string();
 }
 
 void DesktopWindowTreeHostLinux::SetVisibleOnAllWorkspaces(
     bool always_visible) {
-  platform_window()->SetVisibleOnAllWorkspaces(always_visible);
+  GetPlatformWindowLinux()->SetVisibleOnAllWorkspaces(always_visible);
 }
 
 bool DesktopWindowTreeHostLinux::IsVisibleOnAllWorkspaces() const {
-  return platform_window()->IsVisibleOnAllWorkspaces();
+  return GetPlatformWindowLinux()->IsVisibleOnAllWorkspaces();
 }
 
 void DesktopWindowTreeHostLinux::OnDisplayMetricsChanged(
@@ -220,13 +221,13 @@
 
 void DesktopWindowTreeHostLinux::OnCompleteSwapWithNewSize(
     const gfx::Size& size) {
-  platform_window()->OnCompleteSwapAfterResize();
+  GetPlatformWindowLinux()->OnCompleteSwapAfterResize();
 }
 
 void DesktopWindowTreeHostLinux::CreateNonClientEventFilter() {
   DCHECK(!non_client_window_event_filter_);
   non_client_window_event_filter_ = std::make_unique<WindowEventFilterLinux>(
-      this, GetWmMoveResizeHandler(*platform_window()));
+      this, GetWmMoveResizeHandler(*GetPlatformWindowLinux()));
 }
 
 void DesktopWindowTreeHostLinux::DestroyNonClientEventFilter() {
@@ -248,6 +249,15 @@
   }
 }
 
+const ui::PlatformWindowLinux*
+DesktopWindowTreeHostLinux::GetPlatformWindowLinux() const {
+  return static_cast<const ui::PlatformWindowLinux*>(platform_window());
+}
+
+ui::PlatformWindowLinux* DesktopWindowTreeHostLinux::GetPlatformWindowLinux() {
+  return static_cast<ui::PlatformWindowLinux*>(platform_window());
+}
+
 // As DWTHX11 subclasses DWTHPlatform through DWTHLinux now (during transition
 // period. see https://crbug.com/990756), we need to guard this factory method.
 // TODO(msisov): remove this guard once DWTHX11 is finally merged into
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
index e86535a..534faf4 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux.h
@@ -11,6 +11,10 @@
 
 class SkPath;
 
+namespace ui {
+class PlatformWindowLinux;
+}  // namespace ui
+
 namespace views {
 
 class WindowEventFilterLinux;
@@ -62,6 +66,9 @@
   void OnWorkspaceChanged() override;
   void GetWindowMask(const gfx::Size& size, SkPath* window_mask) override;
 
+  const ui::PlatformWindowLinux* GetPlatformWindowLinux() const;
+  ui::PlatformWindowLinux* GetPlatformWindowLinux();
+
   // A handler for events intended for non client area.
   // A posthandler for events intended for non client area. Handles events if no
   // other consumer handled them.
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc
index ad80e3d..ae0e0f2 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_linux_interactive_uitest.cc
@@ -7,7 +7,7 @@
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window_tree_host_platform.h"
 #include "ui/base/hit_test.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_handler/wm_move_resize_handler.h"
 #include "ui/views/test/views_interactive_ui_test_base.h"
 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
@@ -41,7 +41,7 @@
 class FakeWmMoveResizeHandler : public ui::WmMoveResizeHandler {
  public:
   using SetBoundsCallback = base::RepeatingCallback<void(gfx::Rect)>;
-  explicit FakeWmMoveResizeHandler(ui::PlatformWindow* window)
+  explicit FakeWmMoveResizeHandler(ui::PlatformWindowBase* window)
       : platform_window_(window), hittest_(-1) {}
   ~FakeWmMoveResizeHandler() override = default;
 
@@ -66,7 +66,7 @@
   }
 
  private:
-  ui::PlatformWindow* platform_window_;
+  ui::PlatformWindowBase* platform_window_;
   gfx::Rect bounds_;
 
   int hittest_ = -1;
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
index bd59f48..e697cf0 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
@@ -15,7 +15,7 @@
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 #include "ui/gfx/geometry/dip_util.h"
-#include "ui/platform_window/platform_window.h"
+#include "ui/platform_window/platform_window_base.h"
 #include "ui/platform_window/platform_window_init_properties.h"
 #include "ui/views/corewm/tooltip_aura.h"
 #include "ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.h"
@@ -502,8 +502,9 @@
 
 void DesktopWindowTreeHostPlatform::SetVisibilityChangedAnimationsEnabled(
     bool value) {
-  // TODO: needs PlatformWindow support.
-  NOTIMPLEMENTED_LOG_ONCE();
+#if defined(OS_WIN)
+  platform_window()->SetVisibilityChangedAnimationsEnabled(value);
+#endif
 }
 
 NonClientFrameView* DesktopWindowTreeHostPlatform::CreateNonClientFrameView() {
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
index b5041a5..1860bd6 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
@@ -9,6 +9,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/win/win_util.h"
+#include "base/win/windows_version.h"
 #include "third_party/skia/include/core/SkPath.h"
 #include "third_party/skia/include/core/SkRegion.h"
 #include "ui/aura/client/aura_constants.h"
@@ -166,7 +167,10 @@
 void DesktopWindowTreeHostWin::OnWidgetInitDone() {}
 
 std::unique_ptr<corewm::Tooltip> DesktopWindowTreeHostWin::CreateTooltip() {
-  if (base::FeatureList::IsEnabled(features::kEnableAuraTooltipsOnWindows))
+  bool force_legacy_tooltips =
+      (base::win::GetVersion() < base::win::Version::WIN8);
+  if (base::FeatureList::IsEnabled(features::kEnableAuraTooltipsOnWindows) &&
+      !force_legacy_tooltips)
     return std::make_unique<corewm::TooltipAura>();
 
   DCHECK(!tooltip_);
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
index ea06b2a..8bcf317 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
@@ -249,11 +249,6 @@
   x11_window_move_client_->EndMoveLoop();
 }
 
-void DesktopWindowTreeHostX11::SetVisibilityChangedAnimationsEnabled(
-    bool value) {
-  // Much like the previous NativeWidgetGtk, we don't have anything to do here.
-}
-
 void DesktopWindowTreeHostX11::SetOpacity(float opacity) {
   GetXWindow()->SetOpacity(opacity);
 }
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
index 80ae10e71..e8b15e42 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h
@@ -97,7 +97,6 @@
       Widget::MoveLoopSource source,
       Widget::MoveLoopEscapeBehavior escape_behavior) override;
   void EndMoveLoop() override;
-  void SetVisibilityChangedAnimationsEnabled(bool value) override;
   void SetOpacity(float opacity) override;
   void SetAspectRatio(const gfx::SizeF& aspect_ratio) override;
   void SetWindowIcons(const gfx::ImageSkia& window_icon,
diff --git a/ui/web_dialogs/web_dialog_delegate.cc b/ui/web_dialogs/web_dialog_delegate.cc
index 60add58..0d0e20d60 100644
--- a/ui/web_dialogs/web_dialog_delegate.cc
+++ b/ui/web_dialogs/web_dialog_delegate.cc
@@ -54,8 +54,8 @@
   return false;
 }
 
-bool WebDialogDelegate::HandleShouldCreateWebContents() {
-  return true;
+bool WebDialogDelegate::HandleShouldOverrideWebContentsCreation() {
+  return false;
 }
 
 std::vector<Accelerator> WebDialogDelegate::GetAccelerators() {
diff --git a/ui/web_dialogs/web_dialog_delegate.h b/ui/web_dialogs/web_dialog_delegate.h
index 7e2587e..ba3e5d5 100644
--- a/ui/web_dialogs/web_dialog_delegate.h
+++ b/ui/web_dialogs/web_dialog_delegate.h
@@ -142,8 +142,8 @@
                                     content::WebContents** out_new_contents);
 
   // A callback to control whether a WebContents will be created. Returns
-  // false to disallow the creation. Return true to use the default handler.
-  virtual bool HandleShouldCreateWebContents();
+  // true to disallow the creation. Return false to use the default handler.
+  virtual bool HandleShouldOverrideWebContentsCreation();
 
   // Stores the dialog bounds.
   virtual void StoreDialogSize(const gfx::Size& dialog_size) {}