diff --git a/DEPS b/DEPS
index 592dce2..de2cec8c 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': '81e8d3b296629532589e58625eec2a59378edf35',
+  'skia_revision': 'e25df6cf7879d3059bf7a61eabb35bfbf878506e',
   # 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': 'dd844944780f054ecc85f92f028c0901b75c4638',
+  'v8_revision': '0b40cfb3db44d470a0f8c4ed80bb48cea0b4e64e',
   # 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': '5335faaece2ad62af2176df1efb92884f5750c15',
+  'angle_revision': '66aae7e647fdcdd1a8e7b1ab0e4977fa5e071b56',
   # 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': '03882834cb5581b9e36e1190d65187f0138a73f0',
+  'catapult_revision': 'bfdfc7ac4118354794ef65bd45bf686949830ec2',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -242,7 +242,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '032591d6921120a1744e893e8712ee4bb84b8d62',
+  'devtools_frontend_revision': 'c39b45a50522ede5dd7b6df0cdeab4566561c3e7',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -290,7 +290,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'spv_tools_revision': 'e8c3f9b0b463c24eab839c82332344ccaddfa19d',
+  'spv_tools_revision': '615918c91d1d6ae1620f3ab3c03de1acba3cce0e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -866,7 +866,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '0ce6d876771dfa1aa92664a0bdc9fe03b46e8774',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '62b5cdc733cc9c28dd2ace034d7cc6d5e5189ff5',
       'condition': 'checkout_linux',
   },
 
@@ -963,7 +963,7 @@
   },
 
   'src/third_party/glslang/src':
-    Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + '834ee546f93d33a80fb2dea6fdef6764f8730b75',
+    Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + '5e634c8999e631aacb7deacd968b40ff25fc15de',
 
   'src/third_party/google_toolbox_for_mac/src': {
       'url': Var('chromium_git') + '/external/github.com/google/google-toolbox-for-mac.git' + '@' + Var('google_toolbox_for_mac_revision'),
@@ -1182,7 +1182,7 @@
     Var('chromium_git') + '/webm/libwebm.git' + '@' + '51ca718c3adf0ddedacd7df25fe45f67dc5a9ce1',
 
   'src/third_party/libyuv':
-    Var('chromium_git') + '/libyuv/libyuv.git' + '@' + 'f9aacffa029ff3a32f0408f78e2588663271f1b1',  # from r1714
+    Var('chromium_git') + '/libyuv/libyuv.git' + '@' + '53b529e362cc09560c89840fd02ddb68ae3b11aa',  # from r1714
 
   'src/third_party/lighttpd': {
       'url': Var('chromium_git') + '/chromium/deps/lighttpd.git' + '@' + Var('lighttpd_revision'),
@@ -1287,7 +1287,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '88adfb7aa2e688f3083bbf041dc510e9d409f957',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '1872e136d13b7738e16cedff27357dbf5f513631',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1477,7 +1477,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '2701c130839edbeb226735b0775966b6423d9e83',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'ead0ec9a2017602cd5ea25d3e686ebe80fda7cf4',
+    Var('webrtc_git') + '/src.git' + '@' + 'd15a0283d1d8a02a1deff0674a231106113eac67',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1539,7 +1539,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@8f5594ef1fc7b86950ffba59efc2a3c3ae264b6e',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@4ec0e215bc4adabb588c5f23af7e0476a560bfbe',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 51b30c2..9bbb4f6b 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -409,7 +409,6 @@
   '^device/bluetooth/',
   '^device/fido/',
   '^device/gamepad/',
-  '^device/udev_linux/',
   '^device/vr/',
   '^extensions/',
   '^gin/',
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index da788f7..c14a246 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -403,9 +403,6 @@
       renaming_sources = [ "$_secondary_abi_out_dir/v8_context_snapshot.bin" ]
       renaming_destinations = [ "v8_context_snapshot_$arch_suffix.bin" ]
     } else {
-      sources = [
-        "$root_out_dir/natives_blob.bin",
-      ]
       renaming_sources = [ "$_secondary_abi_out_dir/snapshot_blob.bin" ]
       renaming_destinations = [ "snapshot_blob_$arch_suffix.bin" ]
     }
diff --git a/android_webview/browser/gfx/BUILD.gn b/android_webview/browser/gfx/BUILD.gn
index 5050f54..227523b 100644
--- a/android_webview/browser/gfx/BUILD.gn
+++ b/android_webview/browser/gfx/BUILD.gn
@@ -34,8 +34,12 @@
     "hardware_renderer.h",
     "hardware_renderer_single_thread.cc",
     "hardware_renderer_single_thread.h",
+    "hardware_renderer_viz.cc",
+    "hardware_renderer_viz.h",
     "java_browser_view_renderer_helper.cc",
     "java_browser_view_renderer_helper.h",
+    "output_surface_provider_webview.cc",
+    "output_surface_provider_webview.h",
     "parent_compositor_draw_constraints.cc",
     "parent_compositor_draw_constraints.h",
     "parent_output_surface.cc",
diff --git a/android_webview/browser/gfx/browser_view_renderer.cc b/android_webview/browser/gfx/browser_view_renderer.cc
index bf9db05a..9291afc 100644
--- a/android_webview/browser/gfx/browser_view_renderer.cc
+++ b/android_webview/browser/gfx/browser_view_renderer.cc
@@ -137,7 +137,11 @@
   }
   current_compositor_frame_consumer_ = compositor_frame_consumer;
   if (current_compositor_frame_consumer_) {
-    current_compositor_frame_consumer_->SetCompositorFrameProducer(this);
+    RootFrameSinkGetter root_sink_getter;
+    if (root_frame_sink_proxy_)
+      root_sink_getter = root_frame_sink_proxy_->GetRootFrameSinkCallback();
+    current_compositor_frame_consumer_->SetCompositorFrameProducer(
+        this, std::move(root_sink_getter));
     OnParentDrawDataUpdated(current_compositor_frame_consumer_);
   }
 }
@@ -302,7 +306,7 @@
   }
   std::unique_ptr<ChildFrame> child_frame = std::make_unique<ChildFrame>(
       std::move(future), frame_sink_id_, viewport_size_for_tile_priority,
-      external_draw_constraints_.transform, offscreen_pre_raster_,
+      external_draw_constraints_.transform, offscreen_pre_raster_, dip_scale_,
       std::move(requests));
 
   ReturnUnusedResource(
diff --git a/android_webview/browser/gfx/child_frame.cc b/android_webview/browser/gfx/child_frame.cc
index 7976013..cbd5be2 100644
--- a/android_webview/browser/gfx/child_frame.cc
+++ b/android_webview/browser/gfx/child_frame.cc
@@ -18,12 +18,14 @@
     const gfx::Size& viewport_size_for_tile_priority,
     const gfx::Transform& transform_for_tile_priority,
     bool offscreen_pre_raster,
+    float device_scale_factor,
     CopyOutputRequestQueue copy_requests)
     : frame_future(std::move(frame_future)),
       frame_sink_id(frame_sink_id),
       viewport_size_for_tile_priority(viewport_size_for_tile_priority),
       transform_for_tile_priority(transform_for_tile_priority),
       offscreen_pre_raster(offscreen_pre_raster),
+      device_scale_factor(device_scale_factor),
       copy_requests(std::move(copy_requests)) {}
 
 ChildFrame::~ChildFrame() {
@@ -39,8 +41,14 @@
   if (frame_ptr) {
     layer_tree_frame_sink_id = frame_ptr->layer_tree_frame_sink_id;
     frame = std::move(frame_ptr->frame);
+    local_surface_id = frame_future->local_surface_id();
   }
   frame_future = nullptr;
 }
 
+viz::SurfaceId ChildFrame::GetSurfaceId() const {
+  DCHECK(!frame_future);
+  return viz::SurfaceId(frame_sink_id, local_surface_id);
+}
+
 }  // namespace android_webview
diff --git a/android_webview/browser/gfx/child_frame.h b/android_webview/browser/gfx/child_frame.h
index c65955f..e41c86e5c 100644
--- a/android_webview/browser/gfx/child_frame.h
+++ b/android_webview/browser/gfx/child_frame.h
@@ -11,6 +11,7 @@
 #include "base/containers/circular_deque.h"
 #include "base/macros.h"
 #include "components/viz/common/surfaces/frame_sink_id.h"
+#include "components/viz/common/surfaces/surface_id.h"
 #include "content/public/browser/android/synchronous_compositor.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/transform.h"
@@ -33,11 +34,13 @@
       const gfx::Size& viewport_size_for_tile_priority,
       const gfx::Transform& transform_for_tile_priority,
       bool offscreen_pre_raster,
+      float device_scale_factor,
       CopyOutputRequestQueue copy_requests);
   ~ChildFrame();
 
   // Helper to move frame from |frame_future| to |frame|.
   void WaitOnFutureIfNeeded();
+  viz::SurfaceId GetSurfaceId() const;
 
   // The frame is either in |frame_future| or |frame|. It's illegal if both
   // are non-null.
@@ -46,9 +49,12 @@
   std::unique_ptr<viz::CompositorFrame> frame;
   // The id of the compositor this |frame| comes from.
   const viz::FrameSinkId frame_sink_id;
+  // local surface id of the frame, used with viz for webview
+  viz::LocalSurfaceId local_surface_id;
   const gfx::Size viewport_size_for_tile_priority;
   const gfx::Transform transform_for_tile_priority;
   const bool offscreen_pre_raster;
+  const float device_scale_factor;
   CopyOutputRequestQueue copy_requests;
 
  private:
diff --git a/android_webview/browser/gfx/compositor_frame_consumer.h b/android_webview/browser/gfx/compositor_frame_consumer.h
index ca29179..87806f3 100644
--- a/android_webview/browser/gfx/compositor_frame_consumer.h
+++ b/android_webview/browser/gfx/compositor_frame_consumer.h
@@ -7,6 +7,7 @@
 
 #include "android_webview/browser/gfx/child_frame.h"
 #include "android_webview/browser/gfx/parent_compositor_draw_constraints.h"
+#include "android_webview/browser/gfx/root_frame_sink.h"
 #include "components/viz/common/frame_timing_details_map.h"
 #include "ui/gfx/geometry/vector2d.h"
 
@@ -29,7 +30,8 @@
   // In order to register a consumer with a new producer, the current producer
   // must unregister the consumer, and call SetCompositorProducer(nullptr).
   virtual void SetCompositorFrameProducer(
-      CompositorFrameProducer* compositor_frame_producer) = 0;
+      CompositorFrameProducer* compositor_frame_producer,
+      RootFrameSinkGetter root_frame_sink_getter) = 0;
   virtual void SetScrollOffsetOnUI(gfx::Vector2d scroll_offset) = 0;
   // Returns uncommitted frame to be returned, if any.
   virtual std::unique_ptr<ChildFrame> SetFrameOnUI(
diff --git a/android_webview/browser/gfx/hardware_renderer.h b/android_webview/browser/gfx/hardware_renderer.h
index 0fcd117..dd2fd5a 100644
--- a/android_webview/browser/gfx/hardware_renderer.h
+++ b/android_webview/browser/gfx/hardware_renderer.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "android_webview/browser/gfx/child_frame.h"
+#include "android_webview/browser/gfx/output_surface_provider_webview.h"
 #include "base/macros.h"
 #include "ui/gfx/color_space.h"
 
diff --git a/android_webview/browser/gfx/hardware_renderer_viz.cc b/android_webview/browser/gfx/hardware_renderer_viz.cc
new file mode 100644
index 0000000..e5336ca
--- /dev/null
+++ b/android_webview/browser/gfx/hardware_renderer_viz.cc
@@ -0,0 +1,347 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "android_webview/browser/gfx/hardware_renderer_viz.h"
+
+#include <algorithm>
+#include <iterator>
+#include <memory>
+#include <utility>
+
+#include "android_webview/browser/gfx/aw_gl_surface.h"
+#include "android_webview/browser/gfx/aw_render_thread_context_provider.h"
+#include "android_webview/browser/gfx/gpu_service_web_view.h"
+#include "android_webview/browser/gfx/parent_compositor_draw_constraints.h"
+#include "android_webview/browser/gfx/render_thread_manager.h"
+#include "android_webview/browser/gfx/root_frame_sink.h"
+#include "android_webview/browser/gfx/skia_output_surface_dependency_webview.h"
+#include "android_webview/browser/gfx/surfaces_instance.h"
+#include "android_webview/browser/gfx/task_queue_web_view.h"
+#include "android_webview/browser/gfx/viz_compositor_thread_runner_webview.h"
+#include "android_webview/common/aw_switches.h"
+#include "base/command_line.h"
+#include "base/logging.h"
+#include "base/macros.h"
+#include "base/no_destructor.h"
+#include "base/stl_util.h"
+#include "base/trace_event/trace_event.h"
+#include "components/viz/common/display/renderer_settings.h"
+#include "components/viz/common/features.h"
+#include "components/viz/common/frame_sinks/begin_frame_source.h"
+#include "components/viz/common/frame_timing_details_map.h"
+#include "components/viz/common/quads/compositor_frame.h"
+#include "components/viz/common/quads/solid_color_draw_quad.h"
+#include "components/viz/common/quads/surface_draw_quad.h"
+#include "components/viz/common/surfaces/local_surface_id_allocation.h"
+#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
+#include "components/viz/service/display/display.h"
+#include "components/viz/service/display/display_client.h"
+#include "components/viz/service/display/display_scheduler.h"
+#include "components/viz/service/display_embedder/skia_output_surface_dependency.h"
+#include "components/viz/service/display_embedder/skia_output_surface_impl.h"
+#include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
+#include "components/viz/service/frame_sinks/frame_sink_manager_impl.h"
+#include "ui/gfx/transform.h"
+#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_share_group.h"
+#include "ui/gl/init/gl_factory.h"
+
+namespace android_webview {
+
+class HardwareRendererViz::OnViz : public viz::DisplayClient {
+ public:
+  OnViz(OutputSurfaceProviderWebview* output_surface_provider,
+        const scoped_refptr<RootFrameSink>& root_frame_sink);
+  ~OnViz() override;
+
+  void DrawAndSwapOnViz(const gfx::Size& viewport,
+                        const gfx::Rect& clip,
+                        const gfx::Transform& transform,
+                        const gfx::Size& frame_size,
+                        const viz::SurfaceId& child_id,
+                        float device_scale_factor,
+                        const gfx::ColorSpace& color_space);
+  void PostDrawOnViz(viz::FrameTimingDetailsMap* timing_details);
+
+  // viz::DisplayClient overrides.
+  void DisplayOutputSurfaceLost() override;
+  void DisplayWillDrawAndSwap(bool will_draw_and_swap,
+                              viz::RenderPassList* render_passes) override;
+  void DisplayDidDrawAndSwap() override {}
+  void DisplayDidReceiveCALayerParams(
+      const gfx::CALayerParams& ca_layer_params) override {}
+  void DisplayDidCompleteSwapWithSize(const gfx::Size& pixel_size) override {}
+  void SetPreferredFrameInterval(base::TimeDelta interval) override {}
+  base::TimeDelta GetPreferredFrameIntervalForFrameSinkId(
+      const viz::FrameSinkId& id) override;
+
+ private:
+  viz::FrameSinkManagerImpl* GetFrameSinkManager();
+
+  scoped_refptr<RootFrameSink> without_gpu_;
+
+  const viz::FrameSinkId frame_sink_id_;
+  viz::LocalSurfaceIdAllocation root_id_allocation_;
+  viz::ParentLocalSurfaceIdAllocator parent_local_surface_id_allocator_;
+  std::unique_ptr<viz::BeginFrameSource> stub_begin_frame_source_;
+  std::unique_ptr<viz::Display> display_;
+
+  std::unique_ptr<viz::HitTestAggregator> hit_test_aggregator_;
+  viz::SurfaceId child_surface_id_;
+  viz::FrameTokenGenerator next_frame_token_;
+  gfx::Size surface_size_;
+
+  THREAD_CHECKER(viz_thread_checker_);
+
+  DISALLOW_COPY_AND_ASSIGN(OnViz);
+};
+
+HardwareRendererViz::OnViz::OnViz(
+    OutputSurfaceProviderWebview* output_surface_provider,
+    const scoped_refptr<RootFrameSink>& root_frame_sink)
+    : without_gpu_(root_frame_sink),
+      frame_sink_id_(without_gpu_->root_frame_sink_id()) {
+  DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
+
+  std::unique_ptr<viz::OutputSurface> output_surface =
+      output_surface_provider->CreateOutputSurface();
+
+  stub_begin_frame_source_ = std::make_unique<viz::StubBeginFrameSource>();
+  auto scheduler = std::make_unique<viz::DisplayScheduler>(
+      stub_begin_frame_source_.get(), nullptr,
+      output_surface->capabilities().max_frames_pending);
+  display_ = std::make_unique<viz::Display>(
+      nullptr /* shared_bitmap_manager */,
+      output_surface_provider->renderer_settings(), frame_sink_id_,
+      std::move(output_surface), std::move(scheduler),
+      nullptr /* current_task_runner */);
+  display_->Initialize(this, GetFrameSinkManager()->surface_manager(),
+                       output_surface_provider->enable_shared_image());
+
+  display_->SetVisible(true);
+}
+
+HardwareRendererViz::OnViz::~OnViz() {
+  DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
+  GetFrameSinkManager()->surface_manager()->GarbageCollectSurfaces();
+}
+
+void HardwareRendererViz::OnViz::DrawAndSwapOnViz(
+    const gfx::Size& viewport,
+    const gfx::Rect& clip,
+    const gfx::Transform& transform,
+    const gfx::Size& frame_size,
+    const viz::SurfaceId& child_id,
+    float device_scale_factor,
+    const gfx::ColorSpace& color_space) {
+  TRACE_EVENT1("android_webview", "HardwareRendererViz::DrawAndSwap",
+               "child_id", child_id.ToString());
+  DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
+  DCHECK(child_id.is_valid());
+
+  gfx::ColorSpace display_color_space =
+      color_space.IsValid() ? color_space : gfx::ColorSpace::CreateSRGB();
+  display_->SetColorSpace(display_color_space);
+
+  // Create a frame with a single SurfaceDrawQuad referencing the child
+  // Surface and transformed using the given transform.
+  std::unique_ptr<viz::RenderPass> render_pass = viz::RenderPass::Create();
+  render_pass->SetNew(1, gfx::Rect(viewport), clip, gfx::Transform());
+  render_pass->has_transparent_background = false;
+
+  viz::SharedQuadState* quad_state =
+      render_pass->CreateAndAppendSharedQuadState();
+  quad_state->quad_to_target_transform = transform;
+  quad_state->quad_layer_rect = gfx::Rect(frame_size);
+  quad_state->visible_quad_layer_rect = gfx::Rect(frame_size);
+  quad_state->clip_rect = clip;
+  quad_state->is_clipped = true;
+  quad_state->opacity = 1.f;
+
+  viz::SurfaceDrawQuad* surface_quad =
+      render_pass->CreateAndAppendDrawQuad<viz::SurfaceDrawQuad>();
+  surface_quad->SetNew(quad_state, gfx::Rect(quad_state->quad_layer_rect),
+                       gfx::Rect(quad_state->quad_layer_rect),
+                       viz::SurfaceRange(base::nullopt, child_id),
+                       SK_ColorWHITE, /*stretch_content_to_fill_bounds=*/false,
+                       /*ignores_input_event=*/false);
+
+  viz::CompositorFrame frame;
+  // We draw synchronously, so acknowledge a manual BeginFrame.
+  frame.metadata.begin_frame_ack =
+      viz::BeginFrameAck::CreateManualAckWithDamage();
+  frame.render_pass_list.push_back(std::move(render_pass));
+  frame.metadata.device_scale_factor = device_scale_factor;
+  frame.metadata.frame_token = ++next_frame_token_;
+
+  if (!root_id_allocation_.IsValid() || viewport != surface_size_ ||
+      child_surface_id_ != child_id) {
+    parent_local_surface_id_allocator_.GenerateId();
+    root_id_allocation_ =
+        parent_local_surface_id_allocator_.GetCurrentLocalSurfaceIdAllocation();
+    surface_size_ = viewport;
+    display_->SetLocalSurfaceId(root_id_allocation_.local_surface_id(),
+                                device_scale_factor);
+
+    if (child_surface_id_ != child_id) {
+      if (child_surface_id_.frame_sink_id() != child_id.frame_sink_id()) {
+        hit_test_aggregator_ = std::make_unique<viz::HitTestAggregator>(
+            GetFrameSinkManager()->hit_test_manager(), GetFrameSinkManager(),
+            display_.get(), child_id.frame_sink_id());
+      }
+      child_surface_id_ = child_id;
+      GetFrameSinkManager()->surface_manager()->GarbageCollectSurfaces();
+    }
+  }
+
+  {
+    std::vector<viz::SurfaceRange> child_ranges;
+    child_ranges.emplace_back(child_surface_id_);
+    frame.metadata.referenced_surfaces = std::move(child_ranges);
+  }
+
+  without_gpu_->support()->SubmitCompositorFrame(
+      root_id_allocation_.local_surface_id(), std::move(frame));
+  display_->Resize(viewport);
+  display_->DrawAndSwap();
+}
+
+void HardwareRendererViz::OnViz::PostDrawOnViz(
+    viz::FrameTimingDetailsMap* timing_details) {
+  *timing_details = without_gpu_->support()->TakeFrameTimingDetailsMap();
+}
+
+viz::FrameSinkManagerImpl* HardwareRendererViz::OnViz::GetFrameSinkManager() {
+  DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
+  return VizCompositorThreadRunnerWebView::GetInstance()->GetFrameSinkManager();
+}
+
+void HardwareRendererViz::OnViz::DisplayOutputSurfaceLost() {
+  DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
+  // Android WebView does not handle context loss.
+  LOG(FATAL) << "Render thread context loss";
+}
+
+void HardwareRendererViz::OnViz::DisplayWillDrawAndSwap(
+    bool will_draw_and_swap,
+    viz::RenderPassList* render_passes) {
+  DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
+  hit_test_aggregator_->Aggregate(child_surface_id_, render_passes);
+}
+
+base::TimeDelta
+HardwareRendererViz::OnViz::GetPreferredFrameIntervalForFrameSinkId(
+    const viz::FrameSinkId& id) {
+  DCHECK_CALLED_ON_VALID_THREAD(viz_thread_checker_);
+  return GetFrameSinkManager()->GetPreferredFrameIntervalForFrameSinkId(id);
+}
+
+HardwareRendererViz::HardwareRendererViz(
+    RenderThreadManager* state,
+    RootFrameSinkGetter root_frame_sink_getter)
+    : HardwareRenderer(state) {
+  DCHECK_CALLED_ON_VALID_THREAD(render_thread_checker_);
+  DCHECK(output_surface_provider_.renderer_settings().use_skia_renderer);
+
+  VizCompositorThreadRunnerWebView::GetInstance()->ScheduleOnVizAndBlock(
+      base::BindOnce(&HardwareRendererViz::InitializeOnViz,
+                     base::Unretained(this),
+                     std::move(root_frame_sink_getter)));
+}
+
+void HardwareRendererViz::InitializeOnViz(
+    RootFrameSinkGetter root_frame_sink_getter) {
+  scoped_refptr<RootFrameSink> root_frame_sink =
+      std::move(root_frame_sink_getter).Run();
+  if (root_frame_sink) {
+    on_viz_ = std::make_unique<OnViz>(&output_surface_provider_,
+                                      std::move(root_frame_sink));
+  }
+}
+
+HardwareRendererViz::~HardwareRendererViz() {
+  DCHECK_CALLED_ON_VALID_THREAD(render_thread_checker_);
+
+  VizCompositorThreadRunnerWebView::GetInstance()->ScheduleOnVizAndBlock(
+      base::BindOnce(&HardwareRendererViz::DestroyOnViz,
+                     base::Unretained(this)));
+}
+
+void HardwareRendererViz::DestroyOnViz() {
+  on_viz_ = nullptr;
+}
+
+bool HardwareRendererViz::IsUsingVulkan() const {
+  DCHECK_CALLED_ON_VALID_THREAD(render_thread_checker_);
+  DCHECK(output_surface_provider_.shared_context_state());
+  return output_surface_provider_.shared_context_state()->GrContextIsVulkan();
+}
+
+void HardwareRendererViz::DrawAndSwap(HardwareRendererDrawParams* params) {
+  TRACE_EVENT1("android_webview", "HardwareRendererViz::Draw", "vulkan",
+               IsUsingVulkan());
+  DCHECK_CALLED_ON_VALID_THREAD(render_thread_checker_);
+
+  viz::FrameTimingDetailsMap timing_details;
+
+  gfx::Transform transform(gfx::Transform::kSkipInitialization);
+  transform.matrix().setColMajorf(params->transform);
+  transform.Translate(scroll_offset_.x(), scroll_offset_.y());
+
+  gfx::Size viewport(params->width, params->height);
+  // Need to post the new transform matrix back to child compositor
+  // because there is no onDraw during a Render Thread animation, and child
+  // compositor might not have the tiles rasterized as the animation goes on.
+  ParentCompositorDrawConstraints draw_constraints =
+      ParentCompositorDrawConstraints(viewport, transform);
+  bool need_to_update_draw_constraints =
+      !child_frame_.get() || draw_constraints.NeedUpdate(*child_frame_);
+
+  if (!child_frame_)
+    return;
+
+  viz::SurfaceId child_surface_id = child_frame_->GetSurfaceId();
+  if (child_surface_id.is_valid() && child_surface_id != surface_id_) {
+    surface_id_ = child_surface_id;
+    device_scale_factor_ = child_frame_->device_scale_factor;
+  }
+
+  if (!surface_id_.is_valid())
+    return;
+
+  gfx::Rect clip(params->clip_left, params->clip_top,
+                 params->clip_right - params->clip_left,
+                 params->clip_bottom - params->clip_top);
+
+  DCHECK(output_surface_provider_.shared_context_state());
+  output_surface_provider_.shared_context_state()
+      ->PessimisticallyResetGrContext();
+
+  VizCompositorThreadRunnerWebView::GetInstance()->ScheduleOnVizAndBlock(
+      base::BindOnce(&HardwareRendererViz::OnViz::DrawAndSwapOnViz,
+                     base::Unretained(on_viz_.get()), viewport, clip, transform,
+                     viewport, surface_id_, device_scale_factor_,
+                     params->color_space));
+
+  output_surface_provider_.gl_surface()->MaybeDidPresent(
+      gfx::PresentationFeedback(base::TimeTicks::Now(), base::TimeDelta(),
+                                0 /* flags */));
+
+  // Implement proper damage tracking, then deliver FrameTimingDetails
+  // through the common begin frame path.
+  VizCompositorThreadRunnerWebView::GetInstance()->ScheduleOnVizAndBlock(
+      base::BindOnce(&HardwareRendererViz::OnViz::PostDrawOnViz,
+                     base::Unretained(on_viz_.get()), &timing_details));
+
+  if (need_to_update_draw_constraints || !timing_details.empty()) {
+    // We don't have client surface |frame_token| here, so we pass 0 for it and
+    // empty FrameSinkId. |frame_token| will be reported through the
+    // FrameSinkManager and the other use of FrameSinkId is on old BeginFrame
+    // path that will be different for viz.
+    render_thread_manager_->PostParentDrawDataToChildCompositorOnRT(
+        draw_constraints, viz::FrameSinkId(), std::move(timing_details), 0);
+  }
+}
+
+}  // namespace android_webview
diff --git a/android_webview/browser/gfx/hardware_renderer_viz.h b/android_webview/browser/gfx/hardware_renderer_viz.h
new file mode 100644
index 0000000..56de42d
--- /dev/null
+++ b/android_webview/browser/gfx/hardware_renderer_viz.h
@@ -0,0 +1,54 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ANDROID_WEBVIEW_BROWSER_GFX_HARDWARE_RENDERER_VIZ_H_
+#define ANDROID_WEBVIEW_BROWSER_GFX_HARDWARE_RENDERER_VIZ_H_
+
+#include <memory>
+
+#include "android_webview/browser/gfx/hardware_renderer.h"
+#include "android_webview/browser/gfx/output_surface_provider_webview.h"
+#include "android_webview/browser/gfx/root_frame_sink.h"
+#include "base/macros.h"
+#include "base/threading/thread_checker.h"
+#include "components/viz/common/surfaces/frame_sink_id.h"
+
+namespace android_webview {
+
+class HardwareRendererViz : public HardwareRenderer {
+ public:
+  HardwareRendererViz(RenderThreadManager* state,
+                      RootFrameSinkGetter root_frame_sink_getter);
+  ~HardwareRendererViz() override;
+
+  // HardwareRenderer overrides.
+  void DrawAndSwap(HardwareRendererDrawParams* params) override;
+
+ private:
+  class OnViz;
+
+  void InitializeOnViz(RootFrameSinkGetter root_frame_sink_getter);
+  void DestroyOnViz();
+  bool IsUsingVulkan() const;
+
+  // Information about last delegated frame.
+  gfx::Size surface_size_;
+  float device_scale_factor_ = 0;
+
+  viz::SurfaceId surface_id_;
+
+  // Used to create viz::OutputSurface and gl::GLSurface
+  OutputSurfaceProviderWebview output_surface_provider_;
+
+  // These are accessed on the viz thread.
+  std::unique_ptr<OnViz> on_viz_;
+
+  THREAD_CHECKER(render_thread_checker_);
+
+  DISALLOW_COPY_AND_ASSIGN(HardwareRendererViz);
+};
+
+}  // namespace android_webview
+
+#endif  // ANDROID_WEBVIEW_BROWSER_GFX_HARDWARE_RENDERER_VIZ_H_
diff --git a/android_webview/browser/gfx/output_surface_provider_webview.cc b/android_webview/browser/gfx/output_surface_provider_webview.cc
new file mode 100644
index 0000000..b4f3392
--- /dev/null
+++ b/android_webview/browser/gfx/output_surface_provider_webview.cc
@@ -0,0 +1,112 @@
+// 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 "android_webview/browser/gfx/output_surface_provider_webview.h"
+
+#include "android_webview/browser/gfx/aw_render_thread_context_provider.h"
+#include "android_webview/browser/gfx/aw_vulkan_context_provider.h"
+#include "android_webview/browser/gfx/deferred_gpu_command_service.h"
+#include "android_webview/browser/gfx/gpu_service_web_view.h"
+#include "android_webview/browser/gfx/parent_output_surface.h"
+#include "android_webview/browser/gfx/skia_output_surface_dependency_webview.h"
+#include "android_webview/browser/gfx/task_queue_web_view.h"
+#include "android_webview/common/aw_switches.h"
+#include "base/callback_helpers.h"
+#include "base/command_line.h"
+#include "components/viz/common/features.h"
+#include "components/viz/service/display_embedder/skia_output_surface_impl.h"
+#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_share_group.h"
+#include "ui/gl/init/gl_factory.h"
+
+namespace android_webview {
+
+namespace {
+
+void OnContextLost() {
+  NOTREACHED() << "Non owned context lost!";
+}
+
+}  // namespace
+
+OutputSurfaceProviderWebview::OutputSurfaceProviderWebview() {
+  // Should be kept in sync with compositor_impl_android.cc.
+  renderer_settings_.allow_antialiasing = false;
+  renderer_settings_.highp_threshold_min = 2048;
+
+  // Webview does not own the surface so should not clear it.
+  renderer_settings_.should_clear_root_render_pass = false;
+
+  renderer_settings_.use_skia_renderer = features::IsUsingSkiaRenderer();
+
+  auto* command_line = base::CommandLine::ForCurrentProcess();
+  enable_vulkan_ = command_line->HasSwitch(switches::kWebViewEnableVulkan);
+  enable_shared_image_ =
+      command_line->HasSwitch(switches::kWebViewEnableSharedImage);
+  LOG_IF(FATAL, enable_vulkan_ && !enable_shared_image_)
+      << "--webview-enable-vulkan only works with shared image "
+         "(--webview-enable-shared-image).";
+  LOG_IF(FATAL, enable_vulkan_ && !renderer_settings_.use_skia_renderer)
+      << "--webview-enable-vulkan only works with skia renderer "
+         "(--enable-features=UseSkiaRenderer).";
+
+  InitializeContext();
+}
+OutputSurfaceProviderWebview::~OutputSurfaceProviderWebview() = default;
+
+void OutputSurfaceProviderWebview::InitializeContext() {
+  DCHECK(!gl_surface_) << "InitializeContext() called twice";
+  gl_surface_ = base::MakeRefCounted<AwGLSurface>();
+
+  if (renderer_settings_.use_skia_renderer) {
+    auto share_group = base::MakeRefCounted<gl::GLShareGroup>();
+    gpu::GpuDriverBugWorkarounds workarounds(
+        GpuServiceWebView::GetInstance()
+            ->gpu_feature_info()
+            .enabled_gpu_driver_bug_workarounds);
+    auto gl_context = gl::init::CreateGLContext(
+        share_group.get(), gl_surface_.get(), gl::GLContextAttribs());
+    gl_context->MakeCurrent(gl_surface_.get());
+
+    auto vulkan_context_provider =
+        enable_vulkan_ ? AwVulkanContextProvider::GetOrCreateInstance()
+                       : nullptr;
+
+    shared_context_state_ = base::MakeRefCounted<gpu::SharedContextState>(
+        share_group, gl_surface_, std::move(gl_context),
+        false /* use_virtualized_gl_contexts */, base::BindOnce(&OnContextLost),
+        GpuServiceWebView::GetInstance()->gpu_preferences().gr_context_type,
+        vulkan_context_provider.get());
+    if (!enable_vulkan_) {
+      auto feature_info = base::MakeRefCounted<gpu::gles2::FeatureInfo>(
+          workarounds, GpuServiceWebView::GetInstance()->gpu_feature_info());
+      shared_context_state_->InitializeGL(
+          GpuServiceWebView::GetInstance()->gpu_preferences(),
+          std::move(feature_info));
+    }
+    shared_context_state_->InitializeGrContext(workarounds,
+                                               nullptr /* gr_shader_cache */);
+  }
+}
+
+std::unique_ptr<viz::OutputSurface>
+OutputSurfaceProviderWebview::CreateOutputSurface() {
+  DCHECK(gl_surface_)
+      << "InitializeContext() must be called before CreateOutputSurface()";
+
+  if (renderer_settings_.use_skia_renderer) {
+    auto skia_dependency = std::make_unique<SkiaOutputSurfaceDependencyWebView>(
+        TaskQueueWebView::GetInstance(), GpuServiceWebView::GetInstance(),
+        shared_context_state_.get(), gl_surface_.get());
+    return viz::SkiaOutputSurfaceImpl::Create(std::move(skia_dependency),
+                                              renderer_settings_);
+  } else {
+    auto context_provider = AwRenderThreadContextProvider::Create(
+        gl_surface_, DeferredGpuCommandService::GetInstance());
+    return std::make_unique<ParentOutputSurface>(gl_surface_,
+                                                 std::move(context_provider));
+  }
+}
+
+}  // namespace android_webview
diff --git a/android_webview/browser/gfx/output_surface_provider_webview.h b/android_webview/browser/gfx/output_surface_provider_webview.h
new file mode 100644
index 0000000..41870ed
--- /dev/null
+++ b/android_webview/browser/gfx/output_surface_provider_webview.h
@@ -0,0 +1,55 @@
+// 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 ANDROID_WEBVIEW_BROWSER_GFX_OUTPUT_SURFACE_PROVIDER_WEBVIEW_H_
+#define ANDROID_WEBVIEW_BROWSER_GFX_OUTPUT_SURFACE_PROVIDER_WEBVIEW_H_
+
+#include <memory>
+
+#include "android_webview/browser/gfx/aw_gl_surface.h"
+#include "base/memory/ref_counted.h"
+#include "components/viz/common/display/renderer_settings.h"
+#include "gpu/command_buffer/service/shared_context_state.h"
+
+namespace gpu {
+class SharedContextState;
+}
+
+namespace viz {
+class OutputSurface;
+}
+
+namespace android_webview {
+
+class OutputSurfaceProviderWebview {
+ public:
+  OutputSurfaceProviderWebview();
+  ~OutputSurfaceProviderWebview();
+
+  std::unique_ptr<viz::OutputSurface> CreateOutputSurface();
+
+  const viz::RendererSettings& renderer_settings() const {
+    return renderer_settings_;
+  }
+  scoped_refptr<AwGLSurface> gl_surface() const { return gl_surface_; }
+  scoped_refptr<gpu::SharedContextState> shared_context_state() const {
+    return shared_context_state_;
+  }
+  bool enable_shared_image() const { return enable_shared_image_; }
+
+ private:
+  void InitializeContext();
+
+  // The member variables are effectively const after constructor, so it's safe
+  // to call accessors on different threads
+  viz::RendererSettings renderer_settings_;
+  scoped_refptr<AwGLSurface> gl_surface_;
+  scoped_refptr<gpu::SharedContextState> shared_context_state_;
+  bool enable_shared_image_;
+  bool enable_vulkan_;
+};
+
+}  // namespace android_webview
+
+#endif  // ANDROID_WEBVIEW_BROWSER_GFX_OUTPUT_SURFACE_PROVIDER_WEBVIEW_H_
diff --git a/android_webview/browser/gfx/render_thread_manager.cc b/android_webview/browser/gfx/render_thread_manager.cc
index 6ee49f6..ebd8f4e 100644
--- a/android_webview/browser/gfx/render_thread_manager.cc
+++ b/android_webview/browser/gfx/render_thread_manager.cc
@@ -8,8 +8,11 @@
 
 #include "android_webview/browser/gfx/compositor_frame_producer.h"
 #include "android_webview/browser/gfx/gpu_service_web_view.h"
+#include "android_webview/browser/gfx/hardware_renderer_single_thread.h"
+#include "android_webview/browser/gfx/hardware_renderer_viz.h"
 #include "android_webview/browser/gfx/scoped_app_gl_state_restore.h"
 #include "android_webview/browser/gfx/task_queue_web_view.h"
+#include "android_webview/common/aw_features.h"
 #include "android_webview/public/browser/draw_gl.h"
 #include "base/bind.h"
 #include "base/lazy_instance.h"
@@ -189,7 +192,18 @@
   ScopedAllowGL allow_gl;
   if (!hardware_renderer_ && !IsInsideHardwareRelease() &&
       HasFrameForHardwareRendererOnRT()) {
-    hardware_renderer_.reset(new HardwareRendererSingleThread(this));
+    if (base::FeatureList::IsEnabled(features::kVizForWebView)) {
+      RootFrameSinkGetter getter;
+      {
+        base::AutoLock lock(lock_);
+        getter = root_frame_sink_getter_;
+      }
+      DCHECK(getter);
+      hardware_renderer_.reset(
+          new HardwareRendererViz(this, std::move(getter)));
+    } else {
+      hardware_renderer_.reset(new HardwareRendererSingleThread(this));
+    }
     hardware_renderer_->CommitFrame();
   }
 
@@ -217,10 +231,14 @@
 }
 
 void RenderThreadManager::SetCompositorFrameProducer(
-    CompositorFrameProducer* compositor_frame_producer) {
+    CompositorFrameProducer* compositor_frame_producer,
+    RootFrameSinkGetter root_frame_sink_getter) {
   DCHECK(ui_loop_->BelongsToCurrentThread());
   CheckUiCallsAllowed();
   producer_weak_ptr_ = compositor_frame_producer->GetWeakPtr();
+
+  base::AutoLock lock(lock_);
+  root_frame_sink_getter_ = std::move(root_frame_sink_getter);
 }
 
 bool RenderThreadManager::HasFrameForHardwareRendererOnRT() const {
diff --git a/android_webview/browser/gfx/render_thread_manager.h b/android_webview/browser/gfx/render_thread_manager.h
index c9b1a0d..cb35bdb 100644
--- a/android_webview/browser/gfx/render_thread_manager.h
+++ b/android_webview/browser/gfx/render_thread_manager.h
@@ -8,8 +8,9 @@
 #include <map>
 
 #include "android_webview/browser/gfx/compositor_frame_consumer.h"
-#include "android_webview/browser/gfx/hardware_renderer_single_thread.h"
+#include "android_webview/browser/gfx/hardware_renderer.h"
 #include "android_webview/browser/gfx/parent_compositor_draw_constraints.h"
+#include "android_webview/browser/gfx/root_frame_sink.h"
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
@@ -22,7 +23,6 @@
 
 class ChildFrame;
 class CompositorFrameProducer;
-class HardwareRenderer;
 
 // This class is used to pass data between UI thread and RenderThread.
 class RenderThreadManager : public CompositorFrameConsumer {
@@ -33,7 +33,8 @@
 
   // CompositorFrameConsumer methods.
   void SetCompositorFrameProducer(
-      CompositorFrameProducer* compositor_frame_producer) override;
+      CompositorFrameProducer* compositor_frame_producer,
+      RootFrameSinkGetter root_frame_sink_getter) override;
   void SetScrollOffsetOnUI(gfx::Vector2d scroll_offset) override;
   std::unique_ptr<ChildFrame> SetFrameOnUI(
       std::unique_ptr<ChildFrame> frame) override;
@@ -110,6 +111,7 @@
 
   // Accessed by both UI and RT thread.
   mutable base::Lock lock_;
+  RootFrameSinkGetter root_frame_sink_getter_;
   gfx::Vector2d scroll_offset_;
   ChildFrameQueue child_frames_;
   bool mark_hardware_release_;
diff --git a/android_webview/browser/gfx/root_frame_sink.h b/android_webview/browser/gfx/root_frame_sink.h
index d08af70..ab5a6261 100644
--- a/android_webview/browser/gfx/root_frame_sink.h
+++ b/android_webview/browser/gfx/root_frame_sink.h
@@ -70,7 +70,8 @@
   DISALLOW_COPY_AND_ASSIGN(RootFrameSink);
 };
 
-using RootFrameSinkGetter = base::OnceCallback<scoped_refptr<RootFrameSink>()>;
+using RootFrameSinkGetter =
+    base::RepeatingCallback<scoped_refptr<RootFrameSink>()>;
 
 }  // namespace android_webview
 
diff --git a/android_webview/browser/gfx/root_frame_sink_proxy.cc b/android_webview/browser/gfx/root_frame_sink_proxy.cc
index 2d416b4..832483b3 100644
--- a/android_webview/browser/gfx/root_frame_sink_proxy.cc
+++ b/android_webview/browser/gfx/root_frame_sink_proxy.cc
@@ -116,8 +116,8 @@
 }
 
 RootFrameSinkGetter RootFrameSinkProxy::GetRootFrameSinkCallback() {
-  return base::BindOnce(&RootFrameSinkProxy::GetRootFrameSinkHelper,
-                        weak_ptr_factory_on_viz_.GetWeakPtr());
+  return base::BindRepeating(&RootFrameSinkProxy::GetRootFrameSinkHelper,
+                             weak_ptr_factory_on_viz_.GetWeakPtr());
 }
 
 }  // namespace android_webview
diff --git a/android_webview/browser/gfx/surfaces_instance.cc b/android_webview/browser/gfx/surfaces_instance.cc
index 1841ddc..a0ba82a 100644
--- a/android_webview/browser/gfx/surfaces_instance.cc
+++ b/android_webview/browser/gfx/surfaces_instance.cc
@@ -12,6 +12,7 @@
 #include "android_webview/browser/gfx/aw_vulkan_context_provider.h"
 #include "android_webview/browser/gfx/deferred_gpu_command_service.h"
 #include "android_webview/browser/gfx/gpu_service_web_view.h"
+#include "android_webview/browser/gfx/output_surface_provider_webview.h"
 #include "android_webview/browser/gfx/parent_output_surface.h"
 #include "android_webview/browser/gfx/skia_output_surface_dependency_webview.h"
 #include "android_webview/browser/gfx/task_queue_web_view.h"
@@ -48,10 +49,6 @@
 constexpr uint32_t kDefaultClientId = 0u;
 SurfacesInstance* g_surfaces_instance = nullptr;
 
-void OnContextLost() {
-  NOTREACHED() << "Non owned context lost!";
-}
-
 }  // namespace
 
 // static
@@ -64,17 +61,6 @@
 SurfacesInstance::SurfacesInstance()
     : frame_sink_id_allocator_(kDefaultClientId),
       frame_sink_id_(AllocateFrameSinkId()) {
-  viz::RendererSettings settings;
-
-  // Should be kept in sync with compositor_impl_android.cc.
-  settings.allow_antialiasing = false;
-  settings.highp_threshold_min = 2048;
-
-  // Webview does not own the surface so should not clear it.
-  settings.should_clear_root_render_pass = false;
-
-  settings.use_skia_renderer = features::IsUsingSkiaRenderer();
-
   // The SharedBitmapManager is null as we do not support or use software
   // compositing on Android.
   frame_sink_manager_ = std::make_unique<viz::FrameSinkManagerImpl>(
@@ -88,77 +74,20 @@
       this, frame_sink_manager_.get(), frame_sink_id_, is_root,
       needs_sync_points);
 
-  auto* command_line = base::CommandLine::ForCurrentProcess();
-  const bool enable_vulkan =
-      command_line->HasSwitch(switches::kWebViewEnableVulkan);
-  const bool enable_shared_image =
-      command_line->HasSwitch(switches::kWebViewEnableSharedImage);
-  LOG_IF(FATAL, enable_vulkan && !enable_shared_image)
-      << "--webview-enable-vulkan only works with shared image "
-         "(--webview-enable-shared-image).";
-  LOG_IF(FATAL, enable_vulkan && !settings.use_skia_renderer)
-      << "--webview-enable-vulkan only works with skia renderer "
-         "(--enable-features=UseSkiaRenderer).";
-
-  auto vulkan_context_provider =
-      enable_vulkan ? AwVulkanContextProvider::GetOrCreateInstance() : nullptr;
-  std::unique_ptr<viz::OutputSurface> output_surface;
-  gl_surface_ = base::MakeRefCounted<AwGLSurface>();
-  if (settings.use_skia_renderer) {
-    // TODO(weiliangc): If we could share only one SkiaOutputSurfaceDependency
-    // like CommandBufferTaskExecutor, we could move the |shared_context_state|
-    // creation to its constructor.
-    if (!shared_context_state_) {
-      if (!share_group_) {
-        // First create a share group.
-        share_group_ = base::MakeRefCounted<gl::GLShareGroup>();
-      }
-      gpu::GpuDriverBugWorkarounds workarounds(
-          GpuServiceWebView::GetInstance()
-              ->gpu_feature_info()
-              .enabled_gpu_driver_bug_workarounds);
-      auto gl_context = gl::init::CreateGLContext(
-          share_group_.get(), gl_surface_.get(), gl::GLContextAttribs());
-      gl_context->MakeCurrent(gl_surface_.get());
-      shared_context_state_ = base::MakeRefCounted<gpu::SharedContextState>(
-          share_group_, gl_surface_, std::move(gl_context),
-          false /* use_virtualized_gl_contexts */,
-          base::BindOnce(&OnContextLost),
-          GpuServiceWebView::GetInstance()->gpu_preferences().gr_context_type,
-          vulkan_context_provider.get());
-      if (!enable_vulkan) {
-        auto feature_info = base::MakeRefCounted<gpu::gles2::FeatureInfo>(
-            workarounds, GpuServiceWebView::GetInstance()->gpu_feature_info());
-        shared_context_state_->InitializeGL(
-            GpuServiceWebView::GetInstance()->gpu_preferences(),
-            std::move(feature_info));
-      }
-      shared_context_state_->InitializeGrContext(workarounds,
-                                                 nullptr /* gr_shader_cache */);
-    }
-    auto skia_dependency = std::make_unique<SkiaOutputSurfaceDependencyWebView>(
-        TaskQueueWebView::GetInstance(), GpuServiceWebView::GetInstance(),
-        shared_context_state_.get(), gl_surface_.get());
-    output_surface = viz::SkiaOutputSurfaceImpl::Create(
-        std::move(skia_dependency), settings);
-    DCHECK(output_surface);
-  } else {
-    auto context_provider = AwRenderThreadContextProvider::Create(
-        gl_surface_, DeferredGpuCommandService::GetInstance());
-    output_surface = std::make_unique<ParentOutputSurface>(
-        gl_surface_, std::move(context_provider));
-  }
+  std::unique_ptr<viz::OutputSurface> output_surface =
+      output_surface_provider_.CreateOutputSurface();
 
   begin_frame_source_ = std::make_unique<viz::StubBeginFrameSource>();
   auto scheduler = std::make_unique<viz::DisplayScheduler>(
       begin_frame_source_.get(), nullptr /* current_task_runner */,
       output_surface->capabilities().max_frames_pending);
   display_ = std::make_unique<viz::Display>(
-      nullptr /* shared_bitmap_manager */, settings, frame_sink_id_,
+      nullptr /* shared_bitmap_manager */,
+      output_surface_provider_.renderer_settings(), frame_sink_id_,
       std::move(output_surface), std::move(scheduler),
       nullptr /* current_task_runner */);
   display_->Initialize(this, frame_sink_manager_->surface_manager(),
-                       enable_shared_image);
+                       output_surface_provider_.enable_shared_image());
   frame_sink_manager_->RegisterBeginFrameSource(begin_frame_source_.get(),
                                                 frame_sink_id_);
 
@@ -173,7 +102,8 @@
   frame_sink_manager_->UnregisterBeginFrameSource(begin_frame_source_.get());
   g_surfaces_instance = nullptr;
   display_ = nullptr;
-  DCHECK(!shared_context_state_ || shared_context_state_->HasOneRef());
+  DCHECK(!output_surface_provider_.shared_context_state() ||
+         output_surface_provider_.shared_context_state()->HasOneRef());
   DCHECK(child_ids_.empty());
 }
 
@@ -249,11 +179,12 @@
   support_->SubmitCompositorFrame(root_id_allocation_.local_surface_id(),
                                   std::move(frame));
 
-  if (shared_context_state_) {
+  if (output_surface_provider_.shared_context_state()) {
     // GL state could be changed across frames, so we need reset GrContext.
-    shared_context_state_->PessimisticallyResetGrContext();
+    output_surface_provider_.shared_context_state()
+        ->PessimisticallyResetGrContext();
   }
-  gl_surface_->SetSize(viewport);
+  output_surface_provider_.gl_surface()->SetSize(viewport);
   display_->Resize(viewport);
   display_->DrawAndSwap();
   // SkiaRenderer generates DidReceiveSwapBuffersAck calls.
@@ -264,8 +195,9 @@
     base::TimeTicks now = base::TimeTicks::Now();
     display_->DidReceiveSwapBuffersAck({now, now});
   }
-  gl_surface_->MaybeDidPresent(gfx::PresentationFeedback(
-      base::TimeTicks::Now(), base::TimeDelta(), 0 /* flags */));
+  output_surface_provider_.gl_surface()->MaybeDidPresent(
+      gfx::PresentationFeedback(base::TimeTicks::Now(), base::TimeDelta(),
+                                0 /* flags */));
 }
 
 void SurfacesInstance::AddChildId(const viz::SurfaceId& child_id) {
diff --git a/android_webview/browser/gfx/surfaces_instance.h b/android_webview/browser/gfx/surfaces_instance.h
index 27af5bae..7dc58f4 100644
--- a/android_webview/browser/gfx/surfaces_instance.h
+++ b/android_webview/browser/gfx/surfaces_instance.h
@@ -8,7 +8,7 @@
 #include <memory>
 #include <vector>
 
-#include "android_webview/browser/gfx/aw_gl_surface.h"
+#include "android_webview/browser/gfx/output_surface_provider_webview.h"
 #include "base/memory/ref_counted.h"
 #include "components/viz/common/frame_timing_details_map.h"
 #include "components/viz/common/surfaces/frame_sink_id.h"
@@ -26,10 +26,6 @@
 class Transform;
 }
 
-namespace gl {
-class GLShareGroup;
-}
-
 namespace viz {
 class BeginFrameSource;
 class CompositorFrameSinkSupport;
@@ -59,7 +55,8 @@
   void AddChildId(const viz::SurfaceId& child_id);
   void RemoveChildId(const viz::SurfaceId& child_id);
   bool is_using_vulkan() const {
-    return shared_context_state_ && shared_context_state_->GrContextIsVulkan();
+    return output_surface_provider_.shared_context_state() &&
+           output_surface_provider_.shared_context_state()->GrContextIsVulkan();
   }
 
  private:
@@ -99,10 +96,8 @@
 
   viz::FrameSinkId frame_sink_id_;
 
-  // These need to outlive viz objects such as |display_| below.
-  scoped_refptr<AwGLSurface> gl_surface_;
-  scoped_refptr<gl::GLShareGroup> share_group_;
-  scoped_refptr<gpu::SharedContextState> shared_context_state_;
+  // Used to create viz::OutputSurface and gl::GLSurface
+  OutputSurfaceProviderWebview output_surface_provider_;
 
   std::unique_ptr<viz::FrameSinkManagerImpl> frame_sink_manager_;
   std::unique_ptr<viz::BeginFrameSource> begin_frame_source_;
diff --git a/android_webview/lib/aw_main_delegate.cc b/android_webview/lib/aw_main_delegate.cc
index 78593321..3b7512b 100644
--- a/android_webview/lib/aw_main_delegate.cc
+++ b/android_webview/lib/aw_main_delegate.cc
@@ -141,9 +141,6 @@
     ui::GestureConfiguration::GetInstance()
         ->set_fling_touchscreen_tap_suppression_enabled(false);
 
-    base::android::RegisterApkAssetWithFileDescriptorStore(
-        content::kV8NativesDataDescriptor,
-        gin::V8Initializer::GetNativesFilePath());
 #if defined(USE_V8_CONTEXT_SNAPSHOT)
     gin::V8Initializer::V8SnapshotFileType file_type =
         gin::V8Initializer::V8SnapshotFileType::kWithAdditionalContext;
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 29b04eb..b877416 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -31,14 +31,8 @@
     "accessibility/accessibility_controller_impl.h",
     "accessibility/accessibility_delegate.h",
     "accessibility/focus_ring_controller.h",
-    "app_list/app_list_controller_impl.h",
-    "detachable_base/detachable_base_handler.h",
-    "detachable_base/detachable_base_observer.h",
-    "display/display_prefs.h",
     "display/output_protection_delegate.h",
     "display/screen_orientation_controller.h",
-    "events/event_rewriter_controller_impl.h",
-    "focus_cycler.h",
     "frame/header_view.h",
     "frame/non_client_frame_view_ash.h",
     "frame/wide_frame_view.h",
@@ -75,12 +69,9 @@
     "shell_observer.h",
     "sticky_keys/sticky_keys_controller.h",
     "system/status_area_widget.h",
-    "system/status_area_widget_delegate.h",
     "system/tray/system_tray_notifier.h",
     "system/unified/unified_system_tray.h",
     "touch/touch_hud_debug.h",
-    "touch/touch_observer_hud.h",
-    "wm/client_controlled_state.h",
     "wm/desks/desks_util.h",
     "wm/drag_window_resizer.h",
     "wm/mru_window_tracker.h",
@@ -180,6 +171,7 @@
     "ambient/util/ambient_util.h",
     "animation/animation_change_type.h",
     "app_list/app_list_controller_impl.cc",
+    "app_list/app_list_controller_impl.h",
     "app_list/app_list_presenter_delegate_impl.cc",
     "app_list/app_list_presenter_delegate_impl.h",
     "ash_export.h",
@@ -239,8 +231,10 @@
     "debug.cc",
     "debug.h",
     "detachable_base/detachable_base_handler.cc",
+    "detachable_base/detachable_base_handler.h",
     "detachable_base/detachable_base_notification_controller.cc",
     "detachable_base/detachable_base_notification_controller.h",
+    "detachable_base/detachable_base_observer.h",
     "detachable_base/detachable_base_pairing_status.h",
     "disconnected_app_handler.cc",
     "disconnected_app_handler.h",
@@ -261,6 +255,7 @@
     "display/display_move_window_util.cc",
     "display/display_move_window_util.h",
     "display/display_prefs.cc",
+    "display/display_prefs.h",
     "display/display_shutdown_observer.cc",
     "display/display_shutdown_observer.h",
     "display/display_util.cc",
@@ -277,7 +272,6 @@
     "display/null_mouse_warp_controller.cc",
     "display/null_mouse_warp_controller.h",
     "display/output_protection_delegate.cc",
-    "display/output_protection_delegate.h",
     "display/overscan_calibrator.cc",
     "display/overscan_calibrator.h",
     "display/persistent_window_controller.cc",
@@ -293,6 +287,7 @@
     "display/screen_ash.cc",
     "display/screen_ash.h",
     "display/screen_orientation_controller.cc",
+    "display/screen_orientation_controller.h",
     "display/screen_position_controller.cc",
     "display/screen_position_controller.h",
     "display/shared_display_edge_indicator.cc",
@@ -312,6 +307,7 @@
     "drag_drop/drag_image_view.cc",
     "drag_drop/drag_image_view.h",
     "events/event_rewriter_controller_impl.cc",
+    "events/event_rewriter_controller_impl.h",
     "events/keyboard_driven_event_rewriter.cc",
     "events/keyboard_driven_event_rewriter.h",
     "events/select_to_speak_event_handler.cc",
@@ -325,6 +321,7 @@
     "first_run/first_run_helper_impl.cc",
     "first_run/first_run_helper_impl.h",
     "focus_cycler.cc",
+    "focus_cycler.h",
     "frame/header_view.cc",
     "frame/non_client_frame_view_ash.cc",
     "frame/snap_controller_impl.cc",
@@ -475,6 +472,7 @@
     "magnifier/docked_magnifier_controller_impl.cc",
     "magnifier/docked_magnifier_controller_impl.h",
     "magnifier/magnification_controller.cc",
+    "magnifier/magnification_controller.h",
     "magnifier/magnifier_utils.cc",
     "magnifier/magnifier_utils.h",
     "magnifier/partial_magnification_controller.cc",
@@ -549,6 +547,7 @@
     "scoped_root_window_for_new_windows.h",
     "screen_util.cc",
     "screen_util.h",
+    "screenshot_delegate.h",
     "session/multiprofiles_intro_dialog.cc",
     "session/multiprofiles_intro_dialog.h",
     "session/session_aborted_dialog.cc",
@@ -556,6 +555,7 @@
     "session/session_activation_observer_holder.cc",
     "session/session_activation_observer_holder.h",
     "session/session_controller_impl.cc",
+    "session/session_controller_impl.h",
     "session/session_observer.cc",
     "session/session_observer.h",
     "session/teleport_warning_dialog.cc",
@@ -923,6 +923,7 @@
     "system/status_area_layout_manager.h",
     "system/status_area_widget.cc",
     "system/status_area_widget_delegate.cc",
+    "system/status_area_widget_delegate.h",
     "system/supervised/supervised_icon_string.cc",
     "system/supervised/supervised_icon_string.h",
     "system/supervised/supervised_notification_controller.cc",
@@ -1061,6 +1062,7 @@
     "touch/touch_hud_renderer.cc",
     "touch/touch_hud_renderer.h",
     "touch/touch_observer_hud.cc",
+    "touch/touch_observer_hud.h",
     "tray_action/tray_action.cc",
     "tray_action/tray_action.h",
     "tray_action/tray_action_observer.h",
@@ -1100,6 +1102,7 @@
     "wm/base_state.cc",
     "wm/base_state.h",
     "wm/client_controlled_state.cc",
+    "wm/client_controlled_state.h",
     "wm/collision_detection/collision_detection_utils.cc",
     "wm/collision_detection/collision_detection_utils.h",
     "wm/container_finder.cc",
@@ -1178,6 +1181,7 @@
     "wm/overview/overview_animation_type.h",
     "wm/overview/overview_constants.h",
     "wm/overview/overview_controller.cc",
+    "wm/overview/overview_controller.h",
     "wm/overview/overview_delegate.h",
     "wm/overview/overview_grid.cc",
     "wm/overview/overview_grid.h",
@@ -1227,6 +1231,7 @@
     "wm/session_state_animator_impl.h",
     "wm/splitview/split_view_constants.h",
     "wm/splitview/split_view_controller.cc",
+    "wm/splitview/split_view_controller.h",
     "wm/splitview/split_view_divider.cc",
     "wm/splitview/split_view_divider.h",
     "wm/splitview/split_view_divider_handler_view.cc",
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc
index 55a3eb9..0f8a559 100644
--- a/ash/shelf/shelf_layout_manager.cc
+++ b/ash/shelf/shelf_layout_manager.cc
@@ -850,6 +850,7 @@
     return;
   }
 
+  home_launcher_animation_state_ = new_animation_state;
   UpdateVisibilityState();
   MaybeUpdateShelfBackground(AnimationChangeType::IMMEDIATE);
 }
diff --git a/ash/shell/content/test/ash_content_perf_test_launcher.cc b/ash/shell/content/test/ash_content_perf_test_launcher.cc
index 947b77ff..fb68206 100644
--- a/ash/shell/content/test/ash_content_perf_test_launcher.cc
+++ b/ash/shell/content/test/ash_content_perf_test_launcher.cc
@@ -34,9 +34,10 @@
  protected:
   // content::ContentTestSuiteBase:
   void Initialize() override {
-    // Browser tests are expected not to tear-down various globals. (Must run
-    // before the base class is initialized.)
+    // Browser tests are expected not to tear-down various globals and may
+    // complete with the thread priority being above NORMAL.
     base::TestSuite::DisableCheckForLeakedGlobals();
+    base::TestSuite::DisableCheckForThreadPriorityAtTestEnd();
     ContentTestSuiteBase::Initialize();
     ui_controls::InstallUIControlsAura(ash::test::CreateAshUIControls());
   }
diff --git a/base/test/test_suite.cc b/base/test/test_suite.cc
index 3b1de80..50820a9 100644
--- a/base/test/test_suite.cc
+++ b/base/test/test_suite.cc
@@ -37,6 +37,7 @@
 #include "base/test/multiprocess_test.h"
 #include "base/test/test_switches.h"
 #include "base/test/test_timeouts.h"
+#include "base/threading/platform_thread.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -188,6 +189,31 @@
 };
 #endif  // !defined(OS_IOS)
 
+class CheckThreadPriority : public testing::EmptyTestEventListener {
+ public:
+  CheckThreadPriority(bool check_thread_priority_at_test_end)
+      : check_thread_priority_at_test_end_(check_thread_priority_at_test_end) {
+    CHECK_EQ(base::PlatformThread::GetCurrentThreadPriority(),
+             base::ThreadPriority::NORMAL);
+  }
+
+  void OnTestStart(const testing::TestInfo& test) override {
+    EXPECT_EQ(base::PlatformThread::GetCurrentThreadPriority(),
+              base::ThreadPriority::NORMAL);
+  }
+  void OnTestEnd(const testing::TestInfo& test) override {
+    if (check_thread_priority_at_test_end_) {
+      EXPECT_EQ(base::PlatformThread::GetCurrentThreadPriority(),
+                base::ThreadPriority::NORMAL);
+    }
+  }
+
+ private:
+  const bool check_thread_priority_at_test_end_;
+
+  DISALLOW_COPY_AND_ASSIGN(CheckThreadPriority);
+};
+
 const std::string& GetProfileName() {
   static const NoDestructor<std::string> profile_name([]() {
     const CommandLine& command_line = *CommandLine::ForCurrentProcess();
@@ -376,9 +402,14 @@
   check_for_leaked_globals_ = false;
 }
 
-void TestSuite::DisableCheckForProcessPriority() {
+void TestSuite::DisableCheckForThreadAndProcessPriority() {
   DCHECK(!is_initialized_);
-  check_for_process_priority_ = false;
+  check_for_thread_and_process_priority_ = false;
+}
+
+void TestSuite::DisableCheckForThreadPriorityAtTestEnd() {
+  DCHECK(!is_initialized_);
+  check_for_thread_priority_at_test_end_ = false;
 }
 
 void TestSuite::UnitTestAssertHandler(const char* file,
@@ -567,10 +598,13 @@
   listeners.Append(new ResetCommandLineBetweenTests);
   if (check_for_leaked_globals_)
     listeners.Append(new CheckForLeakedGlobals);
+  if (check_for_thread_and_process_priority_) {
+    listeners.Append(
+        new CheckThreadPriority(check_for_thread_priority_at_test_end_));
 #if !defined(OS_IOS)
-  if (check_for_process_priority_)
     listeners.Append(new CheckProcessPriority);
 #endif
+  }
 
   AddTestLauncherResultPrinter();
 
diff --git a/base/test/test_suite.h b/base/test/test_suite.h
index 6e1e750..4d4d638 100644
--- a/base/test/test_suite.h
+++ b/base/test/test_suite.h
@@ -43,8 +43,15 @@
 
   int Run();
 
-  // Disables checks for process priority. Most tests should not use this.
-  void DisableCheckForProcessPriority();
+  // Disables checks for thread and process priority at the beginning and end of
+  // each test. Most tests should not use this.
+  void DisableCheckForThreadAndProcessPriority();
+
+  // Disables checks for thread priority at the end of each test (still checks
+  // at the beginning of each test). This should be used for tests that run in
+  // their own process and should start with normal priorities but are allowed
+  // to end with different priorities.
+  void DisableCheckForThreadPriorityAtTestEnd();
 
   // Disables checks for certain global objects being leaked across tests.
   void DisableCheckForLeakedGlobals();
@@ -93,7 +100,8 @@
   std::unique_ptr<logging::ScopedLogAssertHandler> assert_handler_;
 
   bool check_for_leaked_globals_ = true;
-  bool check_for_process_priority_ = true;
+  bool check_for_thread_and_process_priority_ = true;
+  bool check_for_thread_priority_at_test_end_ = true;
 
   bool is_initialized_ = false;
 
diff --git a/build/android/pylib/utils/device_dependencies.py b/build/android/pylib/utils/device_dependencies.py
index 26cddb4..99555dc 100644
--- a/build/android/pylib/utils/device_dependencies.py
+++ b/build/android/pylib/utils/device_dependencies.py
@@ -27,7 +27,6 @@
     re.compile(r'.*jni_generator_tests'),
 
     # v8's blobs and icu data get packaged into APKs.
-    re.compile(r'.*natives_blob.*\.bin'),
     re.compile(r'.*snapshot_blob.*\.bin'),
     re.compile(r'.*icudtl.bin'),
 
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 08e98f3..1822d83 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -680,7 +680,7 @@
   }
 
   if (compiler_timing) {
-    if (is_clang) {
+    if (is_clang && !is_nacl) {
       if (is_win) {
         cflags += [ "/clang:-ftime-trace" ]
       } else {
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 7d817de..0dc86b2 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8898967358757463760
\ No newline at end of file
+8898945379932813792
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index edee9fe..60a701f 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-8898970893399579248
\ No newline at end of file
+8898943320662064048
\ No newline at end of file
diff --git a/build/vs_toolchain.py b/build/vs_toolchain.py
index c3503cc4..8e34d9b6 100755
--- a/build/vs_toolchain.py
+++ b/build/vs_toolchain.py
@@ -430,6 +430,8 @@
   # VS 2019 Update 9 (16.3.29324.140) with 10.0.18362 SDK, 10.0.17763 version of
   # Debuggers, and 10.0.17134 version of d3dcompiler_47.dll, with ARM64
   # libraries.
+  # See go/chromium-msvc-toolchain for instructions about how to update the
+  # toolchain.
   toolchain_hash = '8f58c55897a3282ed617055775a77ec3db771b88'
   # Third parties that do not have access to the canonical toolchain can map
   # canonical toolchain version to their own toolchain versions.
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index 16653e1..5ea10f73 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -894,7 +894,6 @@
     }
 
     if (v8_use_external_startup_data) {
-      sources += [ "$root_out_dir/natives_blob.bin" ]
       public_deps += [ "//v8" ]
       if (use_v8_context_snapshot) {
         sources += [ "$root_out_dir/v8_context_snapshot.bin" ]
diff --git a/chrome/VERSION b/chrome/VERSION
index 4949a5d7..0befdc80 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=80
 MINOR=0
-BUILD=3947
+BUILD=3948
 PATCH=0
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 82dd038..32dbf1e 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -166,6 +166,7 @@
   "java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/TwaFinishHandler.java",
   "java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/TwaIntentHandlingStrategy.java",
   "java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/ClientAppDataRecorder.java",
+  "java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TrustedWebActivityBrowserControlsVisibilityManager.java",
   "java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TrustedWebActivityDisclosureController.java",
   "java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TrustedWebActivityOpenTimeRecorder.java",
   "java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TrustedWebActivityVerifier.java",
@@ -1564,6 +1565,7 @@
   "java/src/org/chromium/chrome/browser/tab/TabContextMenuPopulator.java",
   "java/src/org/chromium/chrome/browser/tab/TabDelegateFactory.java",
   "java/src/org/chromium/chrome/browser/tab/TabFavicon.java",
+  "java/src/org/chromium/chrome/browser/tab/TabFeatureUtilities.java",
   "java/src/org/chromium/chrome/browser/tab/TabIdManager.java",
   "java/src/org/chromium/chrome/browser/tab/TabImportanceManager.java",
   "java/src/org/chromium/chrome/browser/tab/TabHelpers.java",
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandlerImpl.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandlerImpl.java
index 3e3ca10..fc140df 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandlerImpl.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandlerImpl.java
@@ -23,6 +23,8 @@
  * A handler that provides Autofill Assistant actions for a specific activity.
  */
 class AutofillAssistantActionHandlerImpl implements AutofillAssistantActionHandler {
+    private static final String[] EMPTY_ARRAY = new String[0];
+
     private final Context mContext;
     private final BottomSheetController mBottomSheetController;
     private final ScrimView mScrimView;
@@ -53,6 +55,15 @@
     }
 
     @Override
+    public String[] getActions() {
+        AutofillAssistantClient client = getOrCreateClient();
+        if (client == null) {
+            return EMPTY_ARRAY;
+        }
+        return client.getDirectActions();
+    }
+
+    @Override
     public void performOnboarding(String experimentIds, Callback<Boolean> callback) {
         AssistantOnboardingCoordinator coordinator = new AssistantOnboardingCoordinator(
                 experimentIds, mContext, mBottomSheetController, mGetCurrentTab.get());
@@ -73,11 +84,6 @@
 
         Callback<AssistantOnboardingCoordinator> afterOnboarding = (onboardingCoordinator) -> {
             Map<String, String> argumentMap = toArgumentMap(arguments);
-            if (name.isEmpty()) {
-                callback.onResult(client.start(/* initialUrl= */ "", argumentMap, experimentIds,
-                        Bundle.EMPTY, onboardingCoordinator));
-                return;
-            }
             callback.onResult(client.performDirectAction(
                     name, experimentIds, argumentMap, onboardingCoordinator));
         };
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantClient.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantClient.java
index 71b7d8dd..040461b 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantClient.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantClient.java
@@ -159,6 +159,15 @@
                 arguments.values().toArray(new String[arguments.size()]), callback);
     }
 
+    /** Lists available direct actions. */
+    public String[] getDirectActions() {
+        if (mNativeClientAndroid == 0) {
+            return null;
+        }
+        return AutofillAssistantClientJni.get().getDirectActions(
+                mNativeClientAndroid, AutofillAssistantClient.this);
+    }
+
     /**
      * Performs a direct action.
      *
@@ -357,6 +366,8 @@
         void listDirectActions(long nativeClientAndroid, AutofillAssistantClient caller,
                 String experimentIds, String[] argumentNames, String[] argumentValues,
                 Object callback);
+        String[] getDirectActions(long nativeClientAndroid, AutofillAssistantClient caller);
+
         boolean performDirectAction(long nativeClientAndroid, AutofillAssistantClient caller,
                 String actionId, String experimentId, String[] argumentNames,
                 String[] argumentValues,
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandlerTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandlerTest.java
index e9fa249..c41fe08a 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandlerTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandlerTest.java
@@ -84,7 +84,93 @@
 
     @Test
     @MediumTest
-    public void testReportAvailableDirectActions() {
+    public void testReportOnboardingOnlyIfNotAccepted() throws Exception {
+        mModuleEntryProvider.setInstalled();
+        assertThat(listActions(), contains("onboarding"));
+
+        FakeDirectActionReporter reporter = new FakeDirectActionReporter();
+        mHandler.reportAvailableDirectActions(reporter);
+
+        assertEquals(1, reporter.mActions.size());
+
+        FakeDirectActionDefinition onboarding = reporter.mActions.get(0);
+        assertEquals("onboarding", onboarding.mId);
+        assertEquals(2, onboarding.mParameters.size());
+        assertEquals("name", onboarding.mParameters.get(0).mName);
+        assertEquals(Type.STRING, onboarding.mParameters.get(0).mType);
+        assertEquals("experiment_ids", onboarding.mParameters.get(1).mName);
+        assertEquals(Type.STRING, onboarding.mParameters.get(1).mType);
+        assertEquals(1, onboarding.mResults.size());
+        assertEquals("success", onboarding.mResults.get(0).mName);
+        assertEquals(Type.BOOLEAN, onboarding.mResults.get(0).mType);
+    }
+
+    @Test
+    @MediumTest
+    public void testReportAvailableDirectActions() throws Exception {
+        mModuleEntryProvider.setInstalled();
+        assertThat(listActions(), contains("onboarding"));
+        AutofillAssistantPreferencesUtil.setInitialPreferences(true);
+        // Ask again for a new list of actions.
+        listActions();
+
+        FakeDirectActionReporter reporter = new FakeDirectActionReporter();
+        mHandler.reportAvailableDirectActions(reporter);
+
+        assertEquals(4, reporter.mActions.size());
+
+        FakeDirectActionDefinition list = reporter.mActions.get(0);
+        assertEquals("list_assistant_actions", list.mId);
+        assertEquals(2, list.mParameters.size());
+        assertEquals("user_name", list.mParameters.get(0).mName);
+        assertEquals(Type.STRING, list.mParameters.get(0).mType);
+        assertEquals(false, list.mParameters.get(0).mRequired);
+        assertEquals("experiment_ids", list.mParameters.get(1).mName);
+        assertEquals(Type.STRING, list.mParameters.get(1).mType);
+        assertEquals(false, list.mParameters.get(1).mRequired);
+
+        assertEquals(1, list.mResults.size());
+        assertEquals("names", list.mResults.get(0).mName);
+        assertEquals(Type.STRING, list.mResults.get(0).mType);
+
+        FakeDirectActionDefinition perform = reporter.mActions.get(1);
+        assertEquals("perform_assistant_action", perform.mId);
+        assertEquals(2, perform.mParameters.size());
+        assertEquals("name", perform.mParameters.get(0).mName);
+        assertEquals(Type.STRING, perform.mParameters.get(0).mType);
+        assertEquals("experiment_ids", perform.mParameters.get(1).mName);
+        assertEquals(Type.STRING, perform.mParameters.get(1).mType);
+        assertEquals(1, perform.mResults.size());
+        assertEquals("success", perform.mResults.get(0).mName);
+        assertEquals(Type.BOOLEAN, perform.mResults.get(0).mType);
+
+        // Now we expect 2 dyamic actions "search" and "action2".
+        FakeDirectActionDefinition search = reporter.mActions.get(2);
+        assertEquals("search", search.mId);
+        assertEquals(1, search.mParameters.size());
+        assertEquals("experiment_ids", search.mParameters.get(0).mName);
+        assertEquals(Type.STRING, search.mParameters.get(0).mType);
+        assertEquals(1, search.mResults.size());
+        assertEquals("success", search.mResults.get(0).mName);
+        assertEquals(Type.BOOLEAN, search.mResults.get(0).mType);
+
+        FakeDirectActionDefinition action2 = reporter.mActions.get(3);
+        assertEquals("action2", action2.mId);
+        assertEquals(1, action2.mParameters.size());
+        assertEquals("experiment_ids", action2.mParameters.get(0).mName);
+        assertEquals(Type.STRING, action2.mParameters.get(0).mType);
+        assertEquals(1, action2.mResults.size());
+        assertEquals("success", action2.mResults.get(0).mName);
+        assertEquals(Type.BOOLEAN, action2.mResults.get(0).mType);
+    }
+
+    @Test
+    @MediumTest
+    public void testReportAvailableAutofillAssistantActions() throws Exception {
+        mModuleEntryProvider.setInstalled();
+        assertThat(listActions(), contains("onboarding"));
+        AutofillAssistantPreferencesUtil.setInitialPreferences(true);
+
         FakeDirectActionReporter reporter = new FakeDirectActionReporter();
         mHandler.reportAvailableDirectActions(reporter);
 
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/TestingAutofillAssistantModuleEntryProvider.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/TestingAutofillAssistantModuleEntryProvider.java
index 213b59bf..5b2a1d2 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/TestingAutofillAssistantModuleEntryProvider.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/TestingAutofillAssistantModuleEntryProvider.java
@@ -4,8 +4,18 @@
 
 package org.chromium.chrome.browser.autofill_assistant;
 
+import android.content.Context;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+
 import org.chromium.base.Callback;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.widget.ScrimView;
+import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
+import org.chromium.content_public.browser.WebContents;
+
+import java.util.Map;
 
 /**
  * Implementation of {@link AutofillAssistantModuleEntryProvider} that can be manipulated to
@@ -15,6 +25,41 @@
     private boolean mNotInstalled;
     private boolean mCannotInstall;
 
+    /*
+     * Mock action handler. We only override returning dynamic actions.
+     *
+     * TODO(crbug/806868): Inject a service also for the DirectAction path and get rid of this
+     * mock.
+     */
+    static class MockAutofillAssistantActionHandler extends AutofillAssistantActionHandlerImpl {
+        public MockAutofillAssistantActionHandler(Context context,
+                BottomSheetController bottomSheetController, ScrimView scrimView,
+                GetCurrentTab getCurrentTab) {
+            super(context, bottomSheetController, scrimView, getCurrentTab);
+        }
+
+        @Override
+        public String[] getActions() {
+            return new String[] {"search", "action2"};
+        }
+    }
+
+    /** Mock module entry. */
+    static class MockAutofillAssistantModuleEntry implements AutofillAssistantModuleEntry {
+        @Override
+        public void start(@NonNull Tab tab, @NonNull WebContents webContents,
+                boolean skipOnboarding, String initialUrl, Map<String, String> parameters,
+                String experimentIds, Bundle intentExtras) {}
+
+        @Override
+        public AutofillAssistantActionHandler createActionHandler(Context context,
+                BottomSheetController bottomSheetController, ScrimView scrimView,
+                GetCurrentTab getCurrentTab) {
+            return new MockAutofillAssistantActionHandler(
+                    context, bottomSheetController, scrimView, getCurrentTab);
+        }
+    }
+
     /** The module is already installed. This is the default state. */
     public void setInstalled() {
         mNotInstalled = false;
@@ -36,7 +81,7 @@
     @Override
     public AutofillAssistantModuleEntry getModuleEntryIfInstalled() {
         if (mNotInstalled) return null;
-        return super.getModuleEntryIfInstalled();
+        return new MockAutofillAssistantModuleEntry();
     }
 
     @Override
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandler.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandler.java
index b3c25bd..c65b55b 100644
--- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandler.java
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantActionHandler.java
@@ -28,6 +28,17 @@
     void listActions(String userName, String experimentIds, Bundle arguments,
             Callback<Set<String>> callback);
 
+    /**
+     * Returns the available AA actions to be reported to the direct actions framework.
+     *
+     * <p>This method simply returns the list of actions known to AA. An empty string array means
+     * either that the controller has not yet been started or there are no actions available for the
+     * current website.
+     *
+     * @return Array of strings with the names of known actions.
+     */
+    String[] getActions();
+
     /** Performs onboarding and returns the result to the callback. */
     void performOnboarding(String experimentIds, Callback<Boolean> callback);
 
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandler.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandler.java
index ecabb74..6f5eba3e 100644
--- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandler.java
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandler.java
@@ -18,6 +18,7 @@
 import org.chromium.chrome.browser.widget.ScrimView;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Set;
 
@@ -26,10 +27,13 @@
  * through direct actions. The actual implementation is in the module.
  */
 public class AutofillAssistantDirectActionHandler implements DirectActionHandler {
+    // TODO(b/138833619): Rename this action into something that shows that it is starting the
+    // controller / dynamic actions stack.
     private static final String LIST_AA_ACTIONS = "list_assistant_actions";
     private static final String LIST_AA_ACTIONS_RESULT = "names";
+    // TODO(b/138833619): Remove this action entirely.
     private static final String PERFORM_AA_ACTION = "perform_assistant_action";
-    private static final String PERFORM_AA_ACTION_RESULT = "success";
+    private static final String AA_ACTION_RESULT = "success";
     private static final String ACTION_NAME = "name";
     private static final String EXPERIMENT_IDS = "experiment_ids";
     private static final String ONBOARDING_ACTION = "onboarding";
@@ -62,7 +66,17 @@
 
     @Override
     public void reportAvailableDirectActions(DirectActionReporter reporter) {
-        if (!AutofillAssistantPreferencesUtil.isAutofillAssistantSwitchOn()) return;
+        if (!AutofillAssistantPreferencesUtil.isAutofillAssistantSwitchOn()) {
+            return;
+        }
+
+        if (!AutofillAssistantPreferencesUtil.isAutofillOnboardingAccepted()) {
+            reporter.addDirectAction(ONBOARDING_ACTION)
+                    .withParameter(ACTION_NAME, Type.STRING, /* required= */ false)
+                    .withParameter(EXPERIMENT_IDS, Type.STRING, /* required= */ false)
+                    .withResult(AA_ACTION_RESULT, Type.BOOLEAN);
+            return;
+        }
 
         reporter.addDirectAction(LIST_AA_ACTIONS)
                 .withParameter(USER_NAME, Type.STRING, /* required= */ false)
@@ -72,7 +86,16 @@
         reporter.addDirectAction(PERFORM_AA_ACTION)
                 .withParameter(ACTION_NAME, Type.STRING, /* required= */ false)
                 .withParameter(EXPERIMENT_IDS, Type.STRING, /* required= */ false)
-                .withResult(PERFORM_AA_ACTION_RESULT, Type.BOOLEAN);
+                .withResult(AA_ACTION_RESULT, Type.BOOLEAN);
+
+        // Additionally report if there are dynamic actions.
+        if (mDelegate != null) {
+            for (String action : mDelegate.getActions()) {
+                reporter.addDirectAction(action)
+                        .withParameter(EXPERIMENT_IDS, Type.STRING, /* required= */ false)
+                        .withResult(AA_ACTION_RESULT, Type.BOOLEAN);
+            }
+        }
     }
 
     @Override
@@ -86,9 +109,20 @@
             performAction(arguments, callback);
             return true;
         }
+        // Only handle and perform the action if it is known to the controller.
+        if (isActionAvailable(actionId)) {
+            arguments.putString("name", actionId);
+            performAction(arguments, callback);
+            return true;
+        }
         return false;
     }
 
+    private boolean isActionAvailable(String actionId) {
+        if (mDelegate == null) return false;
+        return Arrays.asList(mDelegate.getActions()).contains(actionId);
+    }
+
     private void listActions(Bundle arguments, Callback<Bundle> bundleCallback) {
         Callback<Set<String>> namesCallback = (names) -> {
             Bundle bundle = new Bundle();
@@ -124,7 +158,7 @@
     private void performAction(Bundle arguments, Callback<Bundle> bundleCallback) {
         Callback<Boolean> booleanCallback = (result) -> {
             Bundle bundle = new Bundle();
-            bundle.putBoolean(PERFORM_AA_ACTION_RESULT, result);
+            bundle.putBoolean(AA_ACTION_RESULT, result);
             bundleCallback.onResult(bundle);
         };
 
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
index 18535d2d..99760e8b 100644
--- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
+++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
@@ -139,20 +139,31 @@
     }
 
     private @SurfaceMode int computeSurfaceMode() {
+        // Check the cached flag before getting the parameter to be consistent with the other
+        // places. Note that the cached flag may have been set before native initialization.
+        if (!FeatureUtilities.isStartSurfaceEnabled()) {
+            return SurfaceMode.NO_START_SURFACE;
+        }
+
         String feature = ChromeFeatureList.getFieldTrialParamByFeature(
                 ChromeFeatureList.START_SURFACE_ANDROID, "start_surface_variation");
 
-        // Do not enable two panes when the bottom bar is enabled since it will
-        // overlap the two panes' bottom bar.
-        if (feature.equals("twopanes") && !FeatureUtilities.isBottomToolbarEnabled()) {
-            return SurfaceMode.TWO_PANES;
+        if (feature.equals("twopanes")) {
+            // Do not enable two panes when the bottom bar is enabled since it will
+            // overlap the two panes' bottom bar.
+            return FeatureUtilities.isBottomToolbarEnabled() ? SurfaceMode.SINGLE_PANE
+                                                             : SurfaceMode.TWO_PANES;
         }
 
         if (feature.equals("single")) return SurfaceMode.SINGLE_PANE;
 
         if (feature.equals("tasksonly")) return SurfaceMode.TASKS_ONLY;
 
-        return SurfaceMode.NO_START_SURFACE;
+        // Default to SurfaceMode.TASKS_ONLY. This could happen when the start surface has been
+        // changed from enabled to disabled in native side, but the cached flag has not been updated
+        // yet, so FeatureUtilities.isStartSurfaceEnabled() above returns true.
+        // TODO(crbug.com/1016548): Remember the last surface mode so as to default to it.
+        return SurfaceMode.TASKS_ONLY;
     }
 
     private void createAndSetStartSurface() {
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java
index d3593df..1fbfa74 100644
--- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java
+++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java
@@ -34,10 +34,10 @@
 import org.chromium.chrome.browser.compositor.scene_layer.TabListSceneLayer;
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tab.TabFeatureUtilities;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher;
 import org.chromium.chrome.browser.ui.widget.animation.Interpolators;
-import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.ui.resources.ResourceManager;
 
 import java.util.ArrayList;
@@ -109,7 +109,7 @@
         // The Tab-to-GTS animation is done, and it's time to renew the thumbnail without causing
         // janky frames.
         // When animation is off, the thumbnail is already updated when showing the GTS.
-        if (FeatureUtilities.isTabToGtsAnimationEnabled()) {
+        if (TabFeatureUtilities.isTabToGtsAnimationEnabled()) {
             // Delay thumbnail taking a bit more to make it less likely to happen before the
             // thumbnail taking triggered by ThumbnailFetcher. See crbug.com/996385 for details.
             new Handler().postDelayed(() -> {
@@ -127,7 +127,7 @@
         // The Android View version of GTS overview is hidden.
         // If not doing GTS-to-Tab transition animation, we show the fade-out instead, which was
         // already done.
-        if (!FeatureUtilities.isTabToGtsAnimationEnabled()) {
+        if (!TabFeatureUtilities.isTabToGtsAnimationEnabled()) {
             postHiding();
             return;
         }
@@ -159,7 +159,8 @@
     public void show(long time, boolean animate) {
         super.show(time, animate);
 
-        boolean showShrinkingAnimation = animate && FeatureUtilities.isTabToGtsAnimationEnabled();
+        boolean showShrinkingAnimation =
+                animate && TabFeatureUtilities.isTabToGtsAnimationEnabled();
         boolean quick = mTabListDelegate.prepareOverview();
         Log.d(TAG, "SkipSlowZooming = " + getSkipSlowZooming());
         if (getSkipSlowZooming()) {
@@ -219,7 +220,7 @@
         updateCacheVisibleIds(new LinkedList<>(Arrays.asList(sourceTabId)));
 
         mIsAnimating = true;
-        mController.hideOverview(!FeatureUtilities.isTabToGtsAnimationEnabled());
+        mController.hideOverview(!TabFeatureUtilities.isTabToGtsAnimationEnabled());
     }
 
     @Override
@@ -442,8 +443,8 @@
         // The content viewport is intentionally sent as both params below.
         mSceneLayer.pushLayers(getContext(), contentViewport, contentViewport, this,
                 layerTitleCache, tabContentManager, resourceManager, fullscreenManager,
-                FeatureUtilities.isTabToGtsAnimationEnabled() ? mTabListDelegate.getResourceId()
-                                                              : 0,
+                TabFeatureUtilities.isTabToGtsAnimationEnabled() ? mTabListDelegate.getResourceId()
+                                                                 : 0,
                 mBackgroundAlpha);
         mFrameCount++;
         if (mLastFrameTime != 0) {
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java
index 78276605..c9b159a 100644
--- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java
+++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java
@@ -36,6 +36,7 @@
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tab.TabFeatureUtilities;
 import org.chromium.chrome.browser.tabmodel.TabSelectionType;
 import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.chrome.tab_ui.R;
@@ -105,7 +106,7 @@
             mWaitingTime = 1000;
             mTabNumCap = 0;
         }
-        assertTrue(FeatureUtilities.isTabToGtsAnimationEnabled());
+        assertTrue(TabFeatureUtilities.isTabToGtsAnimationEnabled());
 
         CriteriaHelper.pollUiThread(Criteria.equals(true,
                 mActivityTestRule.getActivity()
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
index bc72b99..9be00df 100644
--- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
+++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
@@ -52,6 +52,7 @@
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tab.TabFeatureUtilities;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabSelectionType;
 import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher;
@@ -153,7 +154,7 @@
     @DisabledTest(message = "crbug.com/991852 This test is flaky")
     public void testTabToGridFromLiveTabAnimation() throws InterruptedException {
         // clang-format on
-        assertTrue(FeatureUtilities.isTabToGtsAnimationEnabled());
+        assertTrue(TabFeatureUtilities.isTabToGtsAnimationEnabled());
 
         prepareTabs(2, 0, NTP_URL);
         testTabToGrid(mUrl);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
index e176c58..09aec22d 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -32,6 +32,7 @@
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tab.TabFeatureUtilities;
 import org.chromium.chrome.browser.tab.TabObserver;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelFilter;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
@@ -776,7 +777,7 @@
      * The selected border should re-appear in the final fading-in stage.
      */
     void prepareOverview() {
-        if (!FeatureUtilities.isTabToGtsAnimationEnabled()
+        if (!TabFeatureUtilities.isTabToGtsAnimationEnabled()
                 || !mTabModelSelector.getTabModelFilterProvider()
                             .getCurrentTabModelFilter()
                             .isTabModelRestored()) {
@@ -900,7 +901,7 @@
                 && (mModel.get(index).model.get(TabProperties.THUMBNAIL_FETCHER) == null
                         || forceUpdate || isUpdatingId)) {
             ThumbnailFetcher callback = new ThumbnailFetcher(mThumbnailProvider, tab, forceUpdate,
-                    forceUpdate && !FeatureUtilities.isTabToGtsAnimationEnabled());
+                    forceUpdate && !TabFeatureUtilities.isTabToGtsAnimationEnabled());
             mModel.get(index).model.set(TabProperties.THUMBNAIL_FETCHER, callback);
         }
     }
@@ -1071,7 +1072,7 @@
 
         if (mThumbnailProvider != null && mVisible) {
             ThumbnailFetcher callback = new ThumbnailFetcher(mThumbnailProvider, tab, isSelected,
-                    isSelected && !FeatureUtilities.isTabToGtsAnimationEnabled());
+                    isSelected && !TabFeatureUtilities.isTabToGtsAnimationEnabled());
             tabInfo.set(TabProperties.THUMBNAIL_FETCHER, callback);
         }
         tab.addObserver(mTabObserver);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java
index 0b49351..b12c062 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListRecyclerView.java
@@ -32,8 +32,8 @@
 
 import org.chromium.base.Log;
 import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.tab.TabFeatureUtilities;
 import org.chromium.chrome.browser.tabmodel.TabModel;
-import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.ui.interpolators.BakedBezierInterpolator;
 import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter;
@@ -153,8 +153,9 @@
         assert mFadeOutAnimator == null;
         mListener.startedShowing(animate);
 
-        long duration = FeatureUtilities.isTabToGtsAnimationEnabled() ? FINAL_FADE_IN_DURATION_MS
-                                                                      : BASE_ANIMATION_DURATION_MS;
+        long duration = TabFeatureUtilities.isTabToGtsAnimationEnabled()
+                ? FINAL_FADE_IN_DURATION_MS
+                : BASE_ANIMATION_DURATION_MS;
 
         setAlpha(0);
         setVisibility(View.VISIBLE);
@@ -178,7 +179,7 @@
                     mRecyclerViewFooter.setVisibility(VISIBLE);
                 }
                 // TODO(crbug.com/972157): remove this band-aid after we know why GTS is invisible.
-                if (FeatureUtilities.isTabToGtsAnimationEnabled()) {
+                if (TabFeatureUtilities.isTabToGtsAnimationEnabled()) {
                     requestLayout();
                 }
             }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java
index 7baad6e..8fe07d6 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java
@@ -30,6 +30,7 @@
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
 import org.chromium.chrome.browser.fullscreen.FullscreenManager;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tab.TabFeatureUtilities;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
 import org.chromium.chrome.browser.tabmodel.TabLaunchType;
@@ -421,7 +422,7 @@
         mHandler.removeCallbacks(mSoftClearTabListRunnable);
         mHandler.removeCallbacks(mClearTabListRunnable);
         boolean quick = false;
-        if (FeatureUtilities.isTabToGtsAnimationEnabled()
+        if (TabFeatureUtilities.isTabToGtsAnimationEnabled()
                 && mTabModelSelector.getTabModelFilterProvider()
                            .getCurrentTabModelFilter()
                            .isTabModelRestored()) {
@@ -447,7 +448,7 @@
                         .isTabModelRestored()) {
             mResetHandler.resetWithTabList(
                     mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter(),
-                    FeatureUtilities.isTabToGtsAnimationEnabled(), mShowTabsInMruOrder);
+                    TabFeatureUtilities.isTabToGtsAnimationEnabled(), mShowTabsInMruOrder);
         }
         if (!animate) mContainerViewModel.set(ANIMATE_VISIBILITY_CHANGES, false);
         setVisibility(true);
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParentTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParentTest.java
index a5d90c4..131cbc7 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParentTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParentTest.java
@@ -24,7 +24,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.ContextUtils;
-import org.chromium.chrome.browser.util.FeatureUtilities;
+import org.chromium.chrome.browser.tab.TabFeatureUtilities;
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ui.DummyUiActivityTestCase;
@@ -52,7 +52,7 @@
     @Override
     public void setUpTest() throws Exception {
         super.setUpTest();
-        FeatureUtilities.setIsTabToGtsAnimationEnabledForTesting(true);
+        TabFeatureUtilities.setIsTabToGtsAnimationEnabledForTesting(true);
 
         mDummyParent = new FrameLayout(getActivity());
         mTabGridDialogParent = new TabGridDialogParent(getActivity(), mDummyParent);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/TrustedWebActivityCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/TrustedWebActivityCoordinator.java
index 7387fc6c..1191a9f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/TrustedWebActivityCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/TrustedWebActivityCoordinator.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.browserservices.trustedwebactivityui;
 
 import org.chromium.chrome.browser.browserservices.TrustedWebActivityUmaRecorder;
+import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.TrustedWebActivityBrowserControlsVisibilityManager;
 import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.TrustedWebActivityDisclosureController;
 import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.TrustedWebActivityOpenTimeRecorder;
 import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.TrustedWebActivityVerifier;
@@ -15,7 +16,6 @@
 import org.chromium.chrome.browser.customtabs.CustomTabStatusBarColorProvider;
 import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController;
 import org.chromium.chrome.browser.customtabs.features.ImmersiveModeController;
-import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarCoordinator;
 import org.chromium.chrome.browser.dependency_injection.ActivityScope;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.InflationObserver;
@@ -32,7 +32,7 @@
 public class TrustedWebActivityCoordinator implements InflationObserver {
 
     private final TrustedWebActivityVerifier mVerifier;
-    private final CustomTabToolbarCoordinator mToolbarCoordinator;
+    private TrustedWebActivityBrowserControlsVisibilityManager mBrowserControlsVisibilityManager;
     private final CustomTabStatusBarColorProvider mStatusBarColorProvider;
     private final Lazy<ImmersiveModeController> mImmersiveModeController;
 
@@ -50,12 +50,12 @@
             TrustedWebActivityUmaRecorder umaRecorder,
             CustomTabStatusBarColorProvider statusBarColorProvider,
             ActivityLifecycleDispatcher lifecycleDispatcher,
-            CustomTabToolbarCoordinator toolbarCoordinator,
+            TrustedWebActivityBrowserControlsVisibilityManager browserControlsVisibilityManager,
             Lazy<ImmersiveModeController> immersiveModeController) {
         // We don't need to do anything with most of the classes above, we just need to resolve them
         // so they start working.
         mVerifier = verifier;
-        mToolbarCoordinator = toolbarCoordinator;
+        mBrowserControlsVisibilityManager = browserControlsVisibilityManager;
         mStatusBarColorProvider = statusBarColorProvider;
         mImmersiveModeController = immersiveModeController;
 
@@ -105,13 +105,8 @@
 
     private void updateUi(boolean inTwaMode) {
         updateImmersiveMode(inTwaMode);
-        mToolbarCoordinator.setToolbarHidden(inTwaMode);
         mStatusBarColorProvider.setUseTabThemeColor(inTwaMode);
-
-        if (!inTwaMode) {
-            // Force showing the controls for a bit when leaving Trusted Web Activity mode.
-            mToolbarCoordinator.showToolbarTemporarily();
-        }
+        mBrowserControlsVisibilityManager.updateIsInTwaMode(inTwaMode);
     }
 
     private void updateImmersiveMode(boolean inTwaMode) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TrustedWebActivityBrowserControlsVisibilityManager.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TrustedWebActivityBrowserControlsVisibilityManager.java
new file mode 100644
index 0000000..1e4c3e46
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TrustedWebActivityBrowserControlsVisibilityManager.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.browserservices.trustedwebactivityui.controller;
+
+import androidx.annotation.NonNull;
+
+import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabProvider;
+import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarCoordinator;
+import org.chromium.chrome.browser.tab.EmptyTabObserver;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tab.TabObserver;
+import org.chromium.chrome.browser.tab.TabObserverRegistrar;
+import org.chromium.components.security_state.ConnectionSecurityLevel;
+import org.chromium.content_public.common.BrowserControlsState;
+
+import javax.inject.Inject;
+
+/**
+ * Updates the browser controls state based on whether the browser is in TWA mode and the page's
+ * security level.
+ */
+public class TrustedWebActivityBrowserControlsVisibilityManager {
+    private final TabObserverRegistrar mTabObserverRegistrar;
+    private final CustomTabActivityTabProvider mTabProvider;
+    private final CustomTabToolbarCoordinator mToolbarCoordinator;
+
+    private boolean mInTwaMode;
+    private @BrowserControlsState int mBrowserControlsState = BrowserControlsState.BOTH;
+
+    private final TabObserver mTabObserver = new EmptyTabObserver() {
+        @Override
+        public void onSSLStateUpdated(Tab tab) {
+            updateBrowserControlsState(tab);
+        }
+    };
+
+    private final CustomTabActivityTabProvider.Observer mActivityTabObserver =
+            new CustomTabActivityTabProvider.Observer() {
+                @Override
+                public void onTabSwapped(@NonNull Tab tab) {
+                    updateBrowserControlsState(tab);
+                }
+            };
+
+    @Inject
+    public TrustedWebActivityBrowserControlsVisibilityManager(
+            TabObserverRegistrar tabObserverRegistrar, CustomTabActivityTabProvider tabProvider,
+            CustomTabToolbarCoordinator toolbarCoordinator) {
+        mTabObserverRegistrar = tabObserverRegistrar;
+        mTabProvider = tabProvider;
+        mToolbarCoordinator = toolbarCoordinator;
+    }
+
+    /**
+     * Should be called when the browser enters and exits TWA mode.
+     */
+    public void updateIsInTwaMode(boolean inTwaMode) {
+        if (mInTwaMode == inTwaMode) return;
+
+        mInTwaMode = inTwaMode;
+        updateBrowserControlsState(mTabProvider.getTab());
+
+        if (mInTwaMode) {
+            mTabObserverRegistrar.registerTabObserver(mTabObserver);
+            mTabProvider.addObserver(mActivityTabObserver);
+        } else {
+            mTabObserverRegistrar.unregisterTabObserver(mTabObserver);
+            mTabProvider.removeObserver(mActivityTabObserver);
+        }
+    }
+
+    private void updateBrowserControlsState(Tab tab) {
+        @BrowserControlsState
+        int newBrowserControlsState = computeBrowserControlsState(tab);
+        if (mBrowserControlsState == newBrowserControlsState) return;
+
+        mBrowserControlsState = newBrowserControlsState;
+        mToolbarCoordinator.setBrowserControlsState(mBrowserControlsState);
+
+        if (mBrowserControlsState == BrowserControlsState.BOTH) {
+            // Force showing the controls for a bit when leaving Trusted Web Activity
+            // mode.
+            mToolbarCoordinator.showToolbarTemporarily();
+        }
+    }
+
+    private @BrowserControlsState int computeBrowserControlsState(Tab tab) {
+        // TODO(pkotwicz): Add check for PWA minimal UI display mode.
+        if (tab != null && tab.getSecurityLevel() == ConnectionSecurityLevel.DANGEROUS) {
+            return BrowserControlsState.SHOWN;
+        }
+
+        return mInTwaMode ? BrowserControlsState.HIDDEN : BrowserControlsState.BOTH;
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dynamicmodule/DynamicModuleToolbarController.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dynamicmodule/DynamicModuleToolbarController.java
index 1cbb853..1223f9b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dynamicmodule/DynamicModuleToolbarController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dynamicmodule/DynamicModuleToolbarController.java
@@ -12,6 +12,7 @@
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.InflationObserver;
 import org.chromium.chrome.browser.lifecycle.NativeInitObserver;
+import org.chromium.content_public.common.BrowserControlsState;
 import org.chromium.ui.util.TokenHolder;
 
 import javax.inject.Inject;
@@ -47,7 +48,7 @@
 
     @Override
     public void onPostInflationStartup() {
-        mToolbarCoordinator.setToolbarHidden(true);
+        mToolbarCoordinator.setBrowserControlsState(BrowserControlsState.HIDDEN);
         mControlsHidingToken =
                 mFullscreenManager.get().hideAndroidControlsAndClearOldToken(mControlsHidingToken);
         mHasReleasedToken = false;
@@ -61,7 +62,7 @@
     }
 
     /* package */ void releaseAndroidControlsHidingToken() {
-        mToolbarCoordinator.setToolbarHidden(false);
+        mToolbarCoordinator.setBrowserControlsState(BrowserControlsState.BOTH);
         mFullscreenManager.get().releaseAndroidControlsHidingToken(mControlsHidingToken);
         mHasReleasedToken = true;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabBrowserControlsVisibilityDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabBrowserControlsVisibilityDelegate.java
index 084f4d08..77039621 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabBrowserControlsVisibilityDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabBrowserControlsVisibilityDelegate.java
@@ -10,6 +10,7 @@
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
 import org.chromium.chrome.browser.tab.BrowserControlsVisibilityDelegate;
 import org.chromium.chrome.browser.tab.TabBrowserControlsState;
+import org.chromium.content_public.common.BrowserControlsState;
 
 import javax.inject.Inject;
 
@@ -23,7 +24,7 @@
         implements BrowserControlsVisibilityDelegate {
     private final Lazy<ChromeFullscreenManager> mFullscreenManagerDelegate;
     private final ActivityTabProvider mTabProvider;
-    private boolean mHidden;
+    private @BrowserControlsState int mBrowserControlsState = BrowserControlsState.BOTH;
 
     @Inject
     public CustomTabBrowserControlsVisibilityDelegate(
@@ -33,23 +34,25 @@
     }
 
     /**
-     * Sets browser controls hidden. Note: this is not enough to completely hide the toolbar, use
-     * {@link CustomTabToolbarCoordinator#setToolbarHidden} for that.
+     * Sets the browser controls state. Note: this is not enough to completely hide the toolbar, use
+     * {@link CustomTabToolbarCoordinator#setBrowserControlsState()} for that.
      */
-    public void setControlsHidden(boolean hidden) {
-        if (hidden == mHidden) return;
-        mHidden = hidden;
+    public void setControlsState(@BrowserControlsState int browserControlsState) {
+        if (browserControlsState == mBrowserControlsState) return;
+        mBrowserControlsState = browserControlsState;
         updateActiveTabFullscreenEnabledState();
     }
 
     @Override
     public boolean canShowBrowserControls() {
-        return !mHidden && getDefaultVisibilityDelegate().canShowBrowserControls();
+        return mBrowserControlsState != BrowserControlsState.HIDDEN
+                && getDefaultVisibilityDelegate().canShowBrowserControls();
     }
 
     @Override
     public boolean canAutoHideBrowserControls() {
-        return getDefaultVisibilityDelegate().canAutoHideBrowserControls();
+        return mBrowserControlsState != BrowserControlsState.SHOWN
+                && getDefaultVisibilityDelegate().canAutoHideBrowserControls();
     }
 
     private BrowserStateBrowserControlsVisibilityDelegate getDefaultVisibilityDelegate() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarCoordinator.java
index f45936f..ac177296 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarCoordinator.java
@@ -34,6 +34,7 @@
 import org.chromium.chrome.browser.tab.TabObserverRegistrar;
 import org.chromium.chrome.browser.toolbar.ToolbarManager;
 import org.chromium.chrome.browser.util.ColorUtils;
+import org.chromium.content_public.common.BrowserControlsState;
 import org.chromium.ui.util.TokenHolder;
 
 import javax.inject.Inject;
@@ -223,13 +224,9 @@
         mNavigationController.navigateOnClose();
     }
 
-    /**
-     * Sets the hidden state. If set to true, toolbar stays hidden. If set to false, toolbar
-     * behaves normally: appears and disappears while scrolling, etc.
-     */
-    public void setToolbarHidden(boolean hidden) {
-        mVisibilityDelegate.setControlsHidden(hidden);
-        if (hidden) {
+    public void setBrowserControlsState(@BrowserControlsState int controlsState) {
+        mVisibilityDelegate.setControlsState(controlsState);
+        if (controlsState == BrowserControlsState.HIDDEN) {
             mControlsHidingToken = mFullscreenManager.get()
                     .hideAndroidControlsAndClearOldToken(mControlsHidingToken);
         } else {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabFeatureUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabFeatureUtilities.java
new file mode 100644
index 0000000..41f86ee2
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabFeatureUtilities.java
@@ -0,0 +1,78 @@
+// 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.tab;
+
+import android.os.Build;
+
+import androidx.annotation.Nullable;
+
+import org.chromium.base.Log;
+import org.chromium.base.SysUtils;
+import org.chromium.base.VisibleForTesting;
+import org.chromium.chrome.browser.ChromeFeatureList;
+
+/**
+ * Contains logic that decides whether to enable features related to tabs.
+ */
+public class TabFeatureUtilities {
+    private static final String TAG = "TabFeatureUtilities";
+
+    private static Boolean sIsTabToGtsAnimationEnabled;
+
+    /**
+     * Toggles whether the Tab-to-GTS animation is enabled for testing. Should be reset back to
+     * null after the test has finished.
+     */
+    @VisibleForTesting
+    public static void setIsTabToGtsAnimationEnabledForTesting(@Nullable Boolean enabled) {
+        sIsTabToGtsAnimationEnabled = enabled;
+    }
+
+    /**
+     * @return Whether the Tab-to-Grid (and Grid-to-Tab) transition animation is enabled.
+     */
+    public static boolean isTabToGtsAnimationEnabled() {
+        if (sIsTabToGtsAnimationEnabled != null) {
+            Log.d(TAG, "IsTabToGtsAnimationEnabled forced to " + sIsTabToGtsAnimationEnabled);
+            return sIsTabToGtsAnimationEnabled;
+        }
+        Log.d(TAG, "GTS.MinSdkVersion = " + GridTabSwitcherUtil.getMinSdkVersion());
+        Log.d(TAG, "GTS.MinMemoryMB = " + GridTabSwitcherUtil.getMinMemoryMB());
+        return ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_TO_GTS_ANIMATION)
+                && Build.VERSION.SDK_INT >= GridTabSwitcherUtil.getMinSdkVersion()
+                && SysUtils.amountOfPhysicalMemoryKB() / 1024
+                >= GridTabSwitcherUtil.getMinMemoryMB();
+    }
+
+    private static class GridTabSwitcherUtil {
+        // Field trial parameter for the minimum Android SDK version to enable zooming animation.
+        private static final String MIN_SDK_PARAM = "zooming-min-sdk-version";
+        private static final int DEFAULT_MIN_SDK = Build.VERSION_CODES.O;
+
+        // Field trial parameter for the minimum physical memory size to enable zooming animation.
+        private static final String MIN_MEMORY_MB_PARAM = "zooming-min-memory-mb";
+        private static final int DEFAULT_MIN_MEMORY_MB = 2048;
+
+        private static int getMinSdkVersion() {
+            String sdkVersion = ChromeFeatureList.getFieldTrialParamByFeature(
+                    ChromeFeatureList.TAB_TO_GTS_ANIMATION, MIN_SDK_PARAM);
+            try {
+                return Integer.valueOf(sdkVersion);
+            } catch (NumberFormatException e) {
+                return DEFAULT_MIN_SDK;
+            }
+        }
+
+        private static int getMinMemoryMB() {
+            String sdkVersion = ChromeFeatureList.getFieldTrialParamByFeature(
+                    ChromeFeatureList.TAB_TO_GTS_ANIMATION, MIN_MEMORY_MB_PARAM);
+            try {
+                return Integer.valueOf(sdkVersion);
+            } catch (NumberFormatException e) {
+                return DEFAULT_MIN_MEMORY_MB;
+            }
+        }
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTTPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTTPhone.java
index 43704333..8cb26ef 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTTPhone.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherModeTTPhone.java
@@ -22,6 +22,7 @@
 import org.chromium.chrome.browser.appmenu.AppMenuButtonHelper;
 import org.chromium.chrome.browser.device.DeviceClassManager;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
+import org.chromium.chrome.browser.tab.TabFeatureUtilities;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.toolbar.IncognitoStateProvider;
@@ -157,7 +158,7 @@
         setAlpha(inTabSwitcherMode ? 0.0f : 1.0f);
 
         boolean showZoomingAnimation = FeatureUtilities.isGridTabSwitcherEnabled()
-                && FeatureUtilities.isTabToGtsAnimationEnabled();
+                && TabFeatureUtilities.isTabToGtsAnimationEnabled();
         long duration = showZoomingAnimation
                 ? TopToolbarCoordinator.TAB_SWITCHER_MODE_GTS_ANIMATION_DURATION_MS
                 : TopToolbarCoordinator.TAB_SWITCHER_MODE_NORMAL_ANIMATION_DURATION_MS;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
index 7669494..ddfbbbf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java
@@ -15,7 +15,6 @@
 import org.chromium.base.CommandLine;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.FieldTrialList;
-import org.chromium.base.Log;
 import org.chromium.base.PackageManagerUtils;
 import org.chromium.base.SysUtils;
 import org.chromium.base.ThreadUtils;
@@ -63,8 +62,6 @@
  * value in shared preferences.
  */
 public class FeatureUtilities {
-    private static final String TAG = "FeatureUtilities";
-
     /**
      * Key for whether DownloadResumptionBackgroundTask should load native in service manager only
      * mode.
@@ -186,7 +183,6 @@
 
     private static Map<String, Boolean> sFlags = new HashMap<>();
     private static Boolean sHasRecognitionIntentHandler;
-    private static Boolean sIsTabToGtsAnimationEnabled;
     private static String sReachedCodeProfilerTrialGroup;
 
     /**
@@ -584,31 +580,6 @@
         sFlags.put(START_SURFACE_ENABLED_KEY, isEnabled);
     }
 
-    /**
-     * Toggles whether the Tab-to-GTS animation is enabled for testing. Should be reset back to
-     * null after the test has finished.
-     */
-    @VisibleForTesting
-    public static void setIsTabToGtsAnimationEnabledForTesting(@Nullable Boolean enabled) {
-        sIsTabToGtsAnimationEnabled = enabled;
-    }
-
-    /**
-     * @return Whether the Tab-to-Grid (and Grid-to-Tab) transition animation is enabled.
-     */
-    public static boolean isTabToGtsAnimationEnabled() {
-        if (sIsTabToGtsAnimationEnabled != null) {
-            Log.d(TAG, "IsTabToGtsAnimationEnabled forced to " + sIsTabToGtsAnimationEnabled);
-            return sIsTabToGtsAnimationEnabled;
-        }
-        Log.d(TAG, "GTS.MinSdkVersion = " + GridTabSwitcherUtil.getMinSdkVersion());
-        Log.d(TAG, "GTS.MinMemoryMB = " + GridTabSwitcherUtil.getMinMemoryMB());
-        return ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_TO_GTS_ANIMATION)
-                && Build.VERSION.SDK_INT >= GridTabSwitcherUtil.getMinSdkVersion()
-                && SysUtils.amountOfPhysicalMemoryKB() / 1024
-                >= GridTabSwitcherUtil.getMinMemoryMB();
-    }
-
     private static boolean isHighEndPhone() {
         return !SysUtils.isLowEndDevice()
                 && !DeviceFormFactor.isNonMultiDisplayContextOnTablet(
@@ -743,36 +714,6 @@
         return sReachedCodeProfilerTrialGroup;
     }
 
-    private static class GridTabSwitcherUtil {
-        // Field trial parameter for the minimum Android SDK version to enable zooming animation.
-        private static final String MIN_SDK_PARAM = "zooming-min-sdk-version";
-        private static final int DEFAULT_MIN_SDK = Build.VERSION_CODES.O;
-
-        // Field trial parameter for the minimum physical memory size to enable zooming animation.
-        private static final String MIN_MEMORY_MB_PARAM = "zooming-min-memory-mb";
-        private static final int DEFAULT_MIN_MEMORY_MB = 2048;
-
-        private static int getMinSdkVersion() {
-            String sdkVersion = ChromeFeatureList.getFieldTrialParamByFeature(
-                    ChromeFeatureList.TAB_TO_GTS_ANIMATION, MIN_SDK_PARAM);
-            try {
-                return Integer.valueOf(sdkVersion);
-            } catch (NumberFormatException e) {
-                return DEFAULT_MIN_SDK;
-            }
-        }
-
-        private static int getMinMemoryMB() {
-            String sdkVersion = ChromeFeatureList.getFieldTrialParamByFeature(
-                    ChromeFeatureList.TAB_TO_GTS_ANIMATION, MIN_MEMORY_MB_PARAM);
-            try {
-                return Integer.valueOf(sdkVersion);
-            } catch (NumberFormatException e) {
-                return DEFAULT_MIN_MEMORY_MB;
-            }
-        }
-    }
-
     private static void cacheFlag(String preferenceName, String featureName) {
         ChromePreferenceManager.getInstance().writeBoolean(
                 preferenceName, ChromeFeatureList.isEnabled(featureName));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
index c90b807..d6912e8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
@@ -972,7 +972,15 @@
         }
 
         // Do open/close computation based on the minimum allowed state by the sheet's content.
-        float minScrollableHeight = getSheetHeightForState(getMinSwipableSheetState());
+        // Note that when transitioning from hidden to peek, even dismissable sheets may want
+        // to have a peek state.
+        @SheetState
+        int minSwipableState = getMinSwipableSheetState();
+        if (isPeekStateEnabled() && !isSheetOpen() && mCurrentState != mTargetState) {
+            minSwipableState = SheetState.PEEK;
+        }
+
+        float minScrollableHeight = getSheetHeightForState(minSwipableState);
         boolean isAtMinHeight = MathUtils.areFloatsEqual(getCurrentOffsetPx(), minScrollableHeight);
         boolean heightLessThanPeek = getCurrentOffsetPx() < minScrollableHeight;
         // Trigger the onSheetClosed event when the sheet is moving toward the hidden state if peek
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java
index aded98f..5c4c5e62 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java
@@ -39,12 +39,15 @@
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tab.TabBrowserControlsState;
 import org.chromium.chrome.browser.tab.TabThemeColorHelper;
 import org.chromium.chrome.browser.test.MockCertVerifierRuleAndroid;
 import org.chromium.chrome.browser.util.ColorUtils;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.ChromeTabUtils;
 import org.chromium.content_public.browser.test.NativeLibraryTestRule;
+import org.chromium.content_public.browser.test.util.Criteria;
+import org.chromium.content_public.browser.test.util.CriteriaHelper;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.net.NetError;
 import org.chromium.net.test.EmbeddedTestServerRule;
@@ -247,4 +250,37 @@
         }
         assertEquals(expectedColor, activity.getWindow().getStatusBarColor());
     }
+
+    /**
+     * Test that trusted web activities show the toolbar when the page has a certificate error
+     * (and origin verification succeeds).
+     */
+    @Test
+    @MediumTest
+    public void testToolbarVisibleCertificateError() throws ExecutionException, TimeoutException {
+        final String pageWithoutCertError =
+                mEmbeddedTestServerRule.getServer().getURL("/chrome/test/data/android/about.html");
+        final String pageWithCertError = mEmbeddedTestServerRule.getServer().getURL(
+                "/chrome/test/data/android/theme_color_test.html");
+
+        // Initially don't set certificate error so that we can later wait for the toolbar to hide.
+        launchCustomTabActivity(createTrustedWebActivityIntent(pageWithoutCertError));
+        Tab tab = mCustomTabActivityTestRule.getActivity().getActivityTab();
+        assertFalse(getCanShowToolbarState(tab));
+
+        mCertVerifierRule.setResult(NetError.ERR_CERT_INVALID);
+        ChromeTabUtils.loadUrlOnUiThread(tab, pageWithCertError);
+
+        CriteriaHelper.pollUiThread(new Criteria() {
+            @Override
+            public boolean isSatisfied() {
+                return getCanShowToolbarState(tab);
+            }
+        }, 10000, CriteriaHelper.DEFAULT_POLLING_INTERVAL);
+    }
+
+    public boolean getCanShowToolbarState(Tab tab) {
+        return TestThreadUtils.runOnUiThreadBlockingNoException(
+                () -> TabBrowserControlsState.get(tab).canShow());
+    }
 }
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index c005907..958afc6f 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -2563,9 +2563,6 @@
       <message name="IDS_COOKIE_CONTROLS_NOT_WORKING_TITLE" desc="Label shown on a dialog that allows users to turn off third-party cookie blocking for a specific site.">
         Site not working?
       </message>
-      <message name="IDS_COOKIE_CONTROLS_TURNED_ON_TITLE" desc="Label shown to a user after cookie blocking has been turned on for a specific site.">
-        Third-party cookie blocking is on
-      </message>
      <message name="IDS_COOKIE_CONTROLS_NOT_WORKING_DESCRIPTION" desc="Label shown on a dialog that allows users to turn off third-party cookie blocking for a specific site.">
         Some sites use third-party cookies to load their pages. If a site isn't working, you can try turning off cookie blocking.
       </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index c029e0d..6e799437 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -5518,6 +5518,8 @@
     "signin/scoped_account_consistency.h",
     "ssl/ssl_client_auth_requestor_mock.cc",
     "ssl/ssl_client_auth_requestor_mock.h",
+    "ssl/tls_deprecation_test_utils.cc",
+    "ssl/tls_deprecation_test_utils.h",
     "translate/translate_test_utils.cc",
     "translate/translate_test_utils.h",
   ]
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 47b5820..263afab 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -104,7 +104,7 @@
 #include "components/security_state/core/security_state.h"
 #include "components/send_tab_to_self/features.h"
 #include "components/services/heap_profiling/public/cpp/switches.h"
-#include "components/signin/core/browser/account_reconcilor.h"
+#include "components/signin/core/browser/dice_account_reconcilor_delegate.h"
 #include "components/signin/public/base/signin_buildflags.h"
 #include "components/signin/public/base/signin_switches.h"
 #include "components/spellcheck/common/spellcheck_features.h"
@@ -2486,6 +2486,9 @@
      flag_descriptions::kImeInputLogicFstName,
      flag_descriptions::kImeInputLogicFstDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::features::kImeInputLogicFst)},
+    {"enable-cros-ime-native-decoder", flag_descriptions::kImeNativeDecoderName,
+     flag_descriptions::kImeNativeDecoderDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(chromeos::features::kImeDecoderWithSandbox)},
     {"enable-experimental-accessibility-switch-access",
      flag_descriptions::kExperimentalAccessibilitySwitchAccessName,
      flag_descriptions::kExperimentalAccessibilitySwitchAccessDescription,
@@ -3256,11 +3259,6 @@
 #endif  // BUILDFLAG(ENABLE_PDF)
 
 #if BUILDFLAG(ENABLE_PRINTING)
-    {"use-pdf-compositor-service-for-print",
-     flag_descriptions::kUsePdfCompositorServiceName,
-     flag_descriptions::kUsePdfCompositorServiceDescription, kOsAll,
-     FEATURE_VALUE_TYPE(printing::features::kUsePdfCompositorServiceForPrint)},
-
     {"harfbuzz-pdf-subsetter", flag_descriptions::kHarfBuzzPDFSubsetterName,
      flag_descriptions::kHarfBuzzPDFSubsetterDescription, kOsAll,
      FEATURE_VALUE_TYPE(printing::features::kHarfBuzzPDFSubsetter)},
@@ -3657,9 +3655,11 @@
      FEATURE_VALUE_TYPE(
          blink::features::kServiceWorkerImportedScriptUpdateCheck)},
 
+#if BUILDFLAG(ENABLE_DICE_SUPPORT)
     {"use-multilogin-endpoint", flag_descriptions::kUseMultiloginEndpointName,
-     flag_descriptions::kUseMultiloginEndpointDescription, kOsAll,
-     FEATURE_VALUE_TYPE(kUseMultiloginEndpoint)},
+     flag_descriptions::kUseMultiloginEndpointDescription,
+     kOsMac | kOsWin | kOsLinux, FEATURE_VALUE_TYPE(kUseMultiloginEndpoint)},
+#endif
 
 #if defined(OS_CHROMEOS)
     {"enable-usbguard", flag_descriptions::kUsbguardName,
@@ -4674,6 +4674,10 @@
     {"enable-desktop-minimal-ui", flag_descriptions::kDesktopMinimalUIName,
      flag_descriptions::kDesktopMinimalUIDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(features::kDesktopMinimalUI)},
+    {"enable-media-internals-devtools",
+     flag_descriptions::kMediaInspectorLoggingName,
+     flag_descriptions::kMediaInspectorLoggingDescription, kOsAll,
+     FEATURE_VALUE_TYPE(media::kMediaInspectorLogging)},
 
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
diff --git a/chrome/browser/android/autofill_assistant/client_android.cc b/chrome/browser/android/autofill_assistant/client_android.cc
index dfb1878..233f92f 100644
--- a/chrome/browser/android/autofill_assistant/client_android.cc
+++ b/chrome/browser/android/autofill_assistant/client_android.cc
@@ -229,10 +229,16 @@
                      weak_ptr_factory_.GetWeakPtr(), scoped_jcallback));
 }
 
-void ClientAndroid::OnListDirectActions(
-    const base::android::JavaRef<jobject>& jcallback) {
+base::android::ScopedJavaLocalRef<jobjectArray>
+ClientAndroid::GetDirectActionsAsJavaArrayOfStrings(JNIEnv* env) const {
   // Using a set here helps remove duplicates.
   std::set<std::string> names;
+
+  if (!controller_) {
+    return base::android::ToJavaArrayOfStrings(
+        env, std::vector<std::string>(names.begin(), names.end()));
+  }
+
   for (const UserAction& user_action : controller_->GetUserActions()) {
     if (!user_action.enabled())
       continue;
@@ -246,11 +252,21 @@
   if (ui_controller_android_)
     names.insert(kCancelActionName);
 
+  return base::android::ToJavaArrayOfStrings(
+      env, std::vector<std::string>(names.begin(), names.end()));
+}
+
+base::android::ScopedJavaLocalRef<jobjectArray> ClientAndroid::GetDirectActions(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jcaller) {
+  return GetDirectActionsAsJavaArrayOfStrings(env);
+}
+
+void ClientAndroid::OnListDirectActions(
+    const base::android::JavaRef<jobject>& jcallback) {
   JNIEnv* env = AttachCurrentThread();
   Java_AutofillAssistantClient_sendDirectActionList(
-      env, java_object_, jcallback,
-      base::android::ToJavaArrayOfStrings(
-          env, std::vector<std::string>(names.begin(), names.end())));
+      env, java_object_, jcallback, GetDirectActionsAsJavaArrayOfStrings(env));
 }
 
 bool ClientAndroid::PerformDirectAction(
diff --git a/chrome/browser/android/autofill_assistant/client_android.h b/chrome/browser/android/autofill_assistant/client_android.h
index 28f46e7..fbff1c6 100644
--- a/chrome/browser/android/autofill_assistant/client_android.h
+++ b/chrome/browser/android/autofill_assistant/client_android.h
@@ -72,6 +72,10 @@
       const base::android::JavaParamRef<jobjectArray>& jargument_values,
       const base::android::JavaParamRef<jobject>& jcallback);
 
+  base::android::ScopedJavaLocalRef<jobjectArray> GetDirectActions(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& jcaller);
+
   bool PerformDirectAction(
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& jcaller,
@@ -110,6 +114,9 @@
   bool NeedsUI();
   void OnListDirectActions(const base::android::JavaRef<jobject>& jcallback);
 
+  base::android::ScopedJavaLocalRef<jobjectArray>
+  GetDirectActionsAsJavaArrayOfStrings(JNIEnv* env) const;
+
   // Returns the index of a direct action with that name, to pass to
   // UiDelegate::PerformUserAction() or -1 if not found.
   int FindDirectAction(const std::string& action_name);
diff --git a/chrome/browser/apps/app_service/extension_apps.cc b/chrome/browser/apps/app_service/extension_apps.cc
index a6ce080..65a88be 100644
--- a/chrome/browser/apps/app_service/extension_apps.cc
+++ b/chrome/browser/apps/app_service/extension_apps.cc
@@ -12,6 +12,7 @@
 #include "ash/public/cpp/shelf_types.h"
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/optional.h"
 #include "base/strings/string16.h"
 #include "chrome/browser/apps/app_service/app_icon_factory.h"
@@ -171,6 +172,28 @@
   DISALLOW_COPY_AND_ASSIGN(ExtensionAppsEnableFlow);
 };
 
+void ExtensionApps::RecordUninstallCanceledAction(Profile* profile,
+                                                  const std::string& app_id) {
+  const extensions::Extension* extension =
+      extensions::ExtensionRegistry::Get(profile)->GetInstalledExtension(
+          app_id);
+  if (!extension) {
+    return;
+  }
+
+  if (extension->from_bookmark()) {
+    UMA_HISTOGRAM_ENUMERATION(
+        "Webapp.UninstallDialogAction",
+        extensions::ExtensionUninstallDialog::CLOSE_ACTION_CANCELED,
+        extensions::ExtensionUninstallDialog::CLOSE_ACTION_LAST);
+  } else {
+    UMA_HISTOGRAM_ENUMERATION(
+        "Extensions.UninstallDialogAction",
+        extensions::ExtensionUninstallDialog::CLOSE_ACTION_CANCELED,
+        extensions::ExtensionUninstallDialog::CLOSE_ACTION_LAST);
+  }
+}
+
 ExtensionApps::ExtensionApps(
     const mojo::Remote<apps::mojom::AppService>& app_service,
     Profile* profile,
@@ -436,15 +459,24 @@
   base::string16 error;
   extensions::ExtensionSystem::Get(profile_)
       ->extension_service()
-      ->UninstallExtension(
-          app_id, extensions::UninstallReason::UNINSTALL_REASON_USER_INITIATED,
-          &error);
-
-  if (!clear_site_data) {
-    return;
-  }
+      ->UninstallExtension(app_id, extensions::UNINSTALL_REASON_USER_INITIATED,
+                           &error);
 
   if (extension->from_bookmark()) {
+    if (!clear_site_data) {
+      UMA_HISTOGRAM_ENUMERATION(
+          "Webapp.UninstallDialogAction",
+          extensions::ExtensionUninstallDialog::CLOSE_ACTION_UNINSTALL,
+          extensions::ExtensionUninstallDialog::CLOSE_ACTION_LAST);
+      return;
+    }
+
+    UMA_HISTOGRAM_ENUMERATION(
+        "Webapp.UninstallDialogAction",
+        extensions::ExtensionUninstallDialog::
+            CLOSE_ACTION_UNINSTALL_AND_CHECKBOX_CHECKED,
+        extensions::ExtensionUninstallDialog::CLOSE_ACTION_LAST);
+
     constexpr bool kClearCookies = true;
     constexpr bool kClearStorage = true;
     constexpr bool kClearCache = true;
@@ -460,6 +492,20 @@
         kClearCookies, kClearStorage, kClearCache, kAvoidClosingConnections,
         base::DoNothing());
   } else {
+    if (!report_abuse) {
+      UMA_HISTOGRAM_ENUMERATION(
+          "Extensions.UninstallDialogAction",
+          extensions::ExtensionUninstallDialog::CLOSE_ACTION_UNINSTALL,
+          extensions::ExtensionUninstallDialog::CLOSE_ACTION_LAST);
+      return;
+    }
+
+    UMA_HISTOGRAM_ENUMERATION(
+        "Extensions.UninstallDialogAction",
+        extensions::ExtensionUninstallDialog::
+            CLOSE_ACTION_UNINSTALL_AND_CHECKBOX_CHECKED,
+        extensions::ExtensionUninstallDialog::CLOSE_ACTION_LAST);
+
     // If the extension specifies a custom uninstall page via
     // chrome.runtime.setUninstallURL, then at uninstallation its uninstall
     // page opens. To ensure that the CWS Report Abuse page is the active
diff --git a/chrome/browser/apps/app_service/extension_apps.h b/chrome/browser/apps/app_service/extension_apps.h
index 74f6717..27b767c 100644
--- a/chrome/browser/apps/app_service/extension_apps.h
+++ b/chrome/browser/apps/app_service/extension_apps.h
@@ -47,6 +47,10 @@
                       public content_settings::Observer,
                       public ArcAppListPrefs::Observer {
  public:
+  // Record uninstall dialog action for Web apps and Chrome apps.
+  static void RecordUninstallCanceledAction(Profile* profile,
+                                            const std::string& app_id);
+
   ExtensionApps(const mojo::Remote<apps::mojom::AppService>& app_service,
                 Profile* profile,
                 apps::mojom::AppType app_type);
diff --git a/chrome/browser/apps/app_service/uninstall_dialog.cc b/chrome/browser/apps/app_service/uninstall_dialog.cc
index 301c364..1314f0b 100644
--- a/chrome/browser/apps/app_service/uninstall_dialog.cc
+++ b/chrome/browser/apps/app_service/uninstall_dialog.cc
@@ -4,8 +4,14 @@
 
 #include "chrome/browser/apps/app_service/uninstall_dialog.h"
 
+#include "base/metrics/histogram_macros.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/services/app_service/public/cpp/icon_loader.h"
+#include "extensions/browser/uninstall_reason.h"
+
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/apps/app_service/extension_apps.h"
+#endif  // OS_CHROMEOS
 
 namespace {
 
@@ -43,6 +49,9 @@
       break;
     case apps::mojom::AppType::kExtension:
     case apps::mojom::AppType::kWeb:
+      UMA_HISTOGRAM_ENUMERATION("Extensions.UninstallSource",
+                                extensions::UNINSTALL_SOURCE_APP_LIST,
+                                extensions::NUM_UNINSTALL_SOURCES);
       size_hint_in_dip = kUninstallIconSize;
       break;
     default:
@@ -63,6 +72,13 @@
 void UninstallDialog::OnDialogClosed(bool uninstall,
                                      bool clear_site_data,
                                      bool report_abuse) {
+#if defined(OS_CHROMEOS)
+  if (!uninstall && (app_type_ == apps::mojom::AppType::kExtension ||
+                     app_type_ == apps::mojom::AppType::kWeb)) {
+    ExtensionApps::RecordUninstallCanceledAction(profile_, app_id_);
+  }
+#endif  // OS_CHROMEOS
+
   std::move(uninstall_callback_)
       .Run(uninstall, clear_site_data, report_abuse, this);
 }
diff --git a/chrome/browser/apps/app_service/uninstall_dialog.h b/chrome/browser/apps/app_service/uninstall_dialog.h
index 90f0a0d..a383e2d 100644
--- a/chrome/browser/apps/app_service/uninstall_dialog.h
+++ b/chrome/browser/apps/app_service/uninstall_dialog.h
@@ -35,10 +35,6 @@
 // TODO(crbug.com/1009248):
 // 1. Add an interface to the uninstall, like what is done by
 // extension_uninstall_dialog_->ConfirmUninstallByExtension
-// 2. Add RecordDialogCreation to the appropriate place as what is done by
-// extension_uninstall_dialog.
-// 3. Add UMA to the appropriate place as what is done by
-// extension_uninstall_dialog.
 class UninstallDialog {
  public:
   // The UiBase is the parent virtual class for the AppUninstallDialogView,
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index b535f33..c0aacb46 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -622,18 +622,6 @@
   }
 };
 
-// Check if the policy to allow WebDriver to override Site Isolation is set and
-// if the user actually wants to use WebDriver which will cause us to skip
-// even checking if Site Isolation should be turned on by policy.
-bool IsWebDriverOverridingPolicy(PrefService* local_state) {
-  auto* command_line = base::CommandLine::ForCurrentProcess();
-  return (!command_line->HasSwitch(switches::kEnableAutomation) ||
-          !(local_state->IsManagedPreference(
-                prefs::kWebDriverOverridesIncompatiblePolicies) &&
-            local_state->GetBoolean(
-                prefs::kWebDriverOverridesIncompatiblePolicies)));
-}
-
 }  // namespace
 
 // BrowserMainParts ------------------------------------------------------------
@@ -1125,17 +1113,15 @@
 #endif
   metrics::RendererUptimeTracker::Initialize();
 
-  if (IsWebDriverOverridingPolicy(local_state)) {
-    auto* command_line = base::CommandLine::ForCurrentProcess();
-    // Add Site Isolation switches as dictated by policy.
-    if (local_state->GetBoolean(prefs::kSitePerProcess) &&
-        SiteIsolationPolicy::IsEnterprisePolicyApplicable() &&
-        !command_line->HasSwitch(switches::kSitePerProcess)) {
-      command_line->AppendSwitch(switches::kSitePerProcess);
-    }
-    // IsolateOrigins policy is taken care of through SiteIsolationPrefsObserver
-    // (constructed and owned by BrowserProcessImpl).
+  // Add Site Isolation switches as dictated by policy.
+  auto* command_line = base::CommandLine::ForCurrentProcess();
+  if (local_state->GetBoolean(prefs::kSitePerProcess) &&
+      SiteIsolationPolicy::IsEnterprisePolicyApplicable() &&
+      !command_line->HasSwitch(switches::kSitePerProcess)) {
+    command_line->AppendSwitch(switches::kSitePerProcess);
   }
+  // IsolateOrigins policy is taken care of through SiteIsolationPrefsObserver
+  // (constructed and owned by BrowserProcessImpl).
 
 #if defined(OS_ANDROID)
   // The admin should also be able to use these policies to force Site Isolation
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index d776811..5ee71fb 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -1119,8 +1119,6 @@
   registry->RegisterStringPref(prefs::kIsolateOrigins, std::string());
   registry->RegisterBooleanPref(prefs::kSitePerProcess, false);
   registry->RegisterBooleanPref(prefs::kTabFreezingEnabled, true);
-  registry->RegisterBooleanPref(prefs::kWebDriverOverridesIncompatiblePolicies,
-                                false);
 }
 
 // static
diff --git a/chrome/browser/chromeos/arc/intent_helper/arc_external_protocol_dialog_unittest.cc b/chrome/browser/chromeos/arc/intent_helper/arc_external_protocol_dialog_unittest.cc
index b0800c8..91774c91 100644
--- a/chrome/browser/chromeos/arc/intent_helper/arc_external_protocol_dialog_unittest.cc
+++ b/chrome/browser/chromeos/arc/intent_helper/arc_external_protocol_dialog_unittest.cc
@@ -7,13 +7,8 @@
 #include "base/macros.h"
 #include "base/time/time.h"
 #include "chrome/browser/chromeos/arc/arc_web_contents_data.h"
-#include "chrome/browser/sharing/sharing_device_registration.h"
-#include "chrome/browser/sharing/sharing_fcm_handler.h"
-#include "chrome/browser/sharing/sharing_fcm_sender.h"
-#include "chrome/browser/sharing/sharing_service.h"
+#include "chrome/browser/sharing/mock_sharing_service.h"
 #include "chrome/browser/sharing/sharing_service_factory.h"
-#include "chrome/browser/sharing/sharing_sync_preference.h"
-#include "chrome/browser/sharing/vapid_key_manager.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "components/arc/intent_helper/arc_intent_helper_bridge.h"
 #include "content/public/browser/render_process_host.h"
@@ -81,34 +76,6 @@
   return ptr;
 }
 
-// TODO(crbug.com/1011364): Extract this into a common mock file.
-class MockSharingService : public SharingService {
- public:
-  MockSharingService()
-      : SharingService(
-            nullptr,
-            nullptr,
-            std::make_unique<SharingDeviceRegistration>(nullptr,
-                                                        nullptr,
-                                                        nullptr,
-                                                        nullptr),
-            nullptr,
-            std::make_unique<SharingFCMHandler>(nullptr, nullptr, nullptr),
-            nullptr,
-            nullptr,
-            nullptr,
-            nullptr,
-            nullptr) {}
-
-  ~MockSharingService() override = default;
-
-  MOCK_METHOD4(SendMessageToDevice,
-               void(const std::string&,
-                    base::TimeDelta,
-                    chrome_browser_sharing::SharingMessage,
-                    SendMessageCallback));
-};
-
 }  // namespace
 
 // Tests that when no apps are returned from ARC, GetAction returns
diff --git a/chrome/browser/chromeos/display/DEPS b/chrome/browser/chromeos/display/DEPS
index eb5c0ad..2d275a7 100644
--- a/chrome/browser/chromeos/display/DEPS
+++ b/chrome/browser/chromeos/display/DEPS
@@ -1,7 +1,6 @@
 specific_include_rules = {
   # Allow ash deps for browser test.
   "display_prefs_browsertest.cc": [
-    "+ash/display/display_prefs.h",
     "+ash/shell.h",
   ],
 }
diff --git a/chrome/browser/chromeos/file_manager/file_manager_jstest.cc b/chrome/browser/chromeos/file_manager/file_manager_jstest.cc
index fc9edbc61..3aa33bc 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_jstest.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_jstest.cc
@@ -195,6 +195,9 @@
   RunTestURL("foreground/js/ui/file_manager_dialog_base_unittest_gen.html");
 }
 
+IN_PROC_BROWSER_TEST_F(FileManagerJsTest, InstallLinuxPackageDialogTest) {
+  RunTestURL("foreground/js/ui/install_linux_package_dialog_unittest_gen.html");
+}
 IN_PROC_BROWSER_TEST_F(FileManagerJsTest, MultiMenu) {
   RunTestURL("foreground/js/ui/multi_menu_unittest_gen.html");
 }
diff --git a/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.cc b/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.cc
index a03c0d8..88ab0c0 100644
--- a/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.cc
+++ b/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.cc
@@ -468,10 +468,15 @@
     else if (GetActivePrincipalName() == updated_principal)
       GetKerberosFiles();
 
-    // Bring the merry news to the observers, but only if there is no
-    // outstanding query, so we don't spam observers.
-    if (add_account_runners_.empty())
-      NotifyAccountsChanged();
+    // Observers should be notified if at least one of the additions succeed.
+    should_notify_accounts_changes_ = true;
+  }
+
+  // Bring the merry news to the observers, but only if there is no outstanding
+  // query, so we don't spam observers.
+  if (add_account_runners_.empty() && should_notify_accounts_changes_) {
+    should_notify_accounts_changes_ = false;
+    NotifyAccountsChanged();
   }
 
   std::move(callback).Run(error);
diff --git a/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h b/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h
index 2869727..af62876 100644
--- a/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h
+++ b/chrome/browser/chromeos/kerberos/kerberos_credentials_manager.h
@@ -257,6 +257,9 @@
   // Keeps track of accounts currently being added.
   std::vector<std::unique_ptr<KerberosAddAccountRunner>> add_account_runners_;
 
+  // Will be true if one of the current account additions succeed.
+  bool should_notify_accounts_changes_ = false;
+
   // Variable expander for the principal name (replaces ${LOGIN_ID} etc.).
   std::unique_ptr<VariableExpander> principal_expander_;
 
diff --git a/chrome/browser/chromeos/login/screens/fingerprint_setup_browsertest.cc b/chrome/browser/chromeos/login/screens/fingerprint_setup_browsertest.cc
index 641a1be..334eeb40 100644
--- a/chrome/browser/chromeos/login/screens/fingerprint_setup_browsertest.cc
+++ b/chrome/browser/chromeos/login/screens/fingerprint_setup_browsertest.cc
@@ -166,7 +166,7 @@
       {"fingerprint-setup-impl", "setupFingerprint"});
 }
 
-IN_PROC_BROWSER_TEST_F(FingerprintSetupTest, DISABLED_FingerprintSetupCancel) {
+IN_PROC_BROWSER_TEST_F(FingerprintSetupTest, FingerprintSetupCancel) {
   quick_unlock::EnabledForTesting(true);
   fingerprint_setup_screen_->Show();
   OobeScreenWaiter(FingerprintSetupScreenView::kScreenId).Wait();
diff --git a/chrome/browser/chromeos/login/screens/hid_detection_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/hid_detection_screen_browsertest.cc
index 320c478..70a5461 100644
--- a/chrome/browser/chromeos/login/screens/hid_detection_screen_browsertest.cc
+++ b/chrome/browser/chromeos/login/screens/hid_detection_screen_browsertest.cc
@@ -135,9 +135,7 @@
 
 // Test that if there is any Bluetooth device connected on HID screen, the
 // Bluetooth adapter should not be disabled after advancing to the next screen.
-// Flaky: https://crbug.com/1014951
-IN_PROC_BROWSER_TEST_F(HIDDetectionScreenTest,
-                       DISABLED_BluetoothDeviceConnected) {
+IN_PROC_BROWSER_TEST_F(HIDDetectionScreenTest, BluetoothDeviceConnected) {
   OobeScreenWaiter(HIDDetectionView::kScreenId).Wait();
   EXPECT_TRUE(adapter()->IsPowered());
 
diff --git a/chrome/browser/chromeos/login/screens/recommend_apps_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/recommend_apps_screen_browsertest.cc
index 6907021..89655fe 100644
--- a/chrome/browser/chromeos/login/screens/recommend_apps_screen_browsertest.cc
+++ b/chrome/browser/chromeos/login/screens/recommend_apps_screen_browsertest.cc
@@ -605,8 +605,7 @@
   EXPECT_EQ(base::Value(base::Value::Type::LIST), *fast_reinstall_packages);
 }
 
-// Disabled due to flakiness: https://crbug.com/1015013
-IN_PROC_BROWSER_TEST_F(RecommendAppsScreenTest, DISABLED_ParseError) {
+IN_PROC_BROWSER_TEST_F(RecommendAppsScreenTest, ParseError) {
   recommend_apps_screen_->Show();
 
   OobeScreenWaiter screen_waiter(RecommendAppsScreenView::kScreenId);
diff --git a/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc
index 9c2a4f4..1742e58 100644
--- a/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc
+++ b/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc
@@ -196,8 +196,7 @@
       {"connect", "welcomeScreen", "enableDebuggingLink"});
 }
 
-// Flaky: crbug.com/1014952
-IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest, DISABLED_WelcomeScreenNext) {
+IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest, WelcomeScreenNext) {
   welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   test::OobeJS().TapOnPath({"connect", "welcomeScreen", "welcomeNextButton"});
diff --git a/chrome/browser/devtools/devtools_eye_dropper.cc b/chrome/browser/devtools/devtools_eye_dropper.cc
index e2c3244..9c37d65 100644
--- a/chrome/browser/devtools/devtools_eye_dropper.cc
+++ b/chrome/browser/devtools/devtools_eye_dropper.cc
@@ -310,7 +310,8 @@
     base::ReadOnlySharedMemoryMapping mapping;
     // Prevents FrameSinkVideoCapturer from recycling the shared memory that
     // backs |frame_|.
-    mojo::Remote<viz::mojom::FrameSinkVideoConsumerFrameCallbacks> releaser;
+    mojo::PendingRemote<viz::mojom::FrameSinkVideoConsumerFrameCallbacks>
+        releaser;
   };
   frame_.installPixels(
       SkImageInfo::MakeN32(content_rect.width(), content_rect.height(),
@@ -322,7 +323,7 @@
       [](void* addr, void* context) {
         delete static_cast<FramePinner*>(context);
       },
-      new FramePinner{std::move(mapping), std::move(callbacks_remote)});
+      new FramePinner{std::move(mapping), callbacks_remote.Unbind()});
   frame_.setImmutable();
 
   UpdateCursor();
diff --git a/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc b/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc
index 64694816..a7766c8e 100644
--- a/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc
+++ b/chrome/browser/extensions/api/context_menus/context_menu_apitest.cc
@@ -19,7 +19,7 @@
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/common/context_menu_params.h"
 #include "content/public/test/browser_test_utils.h"
-#include "extensions/common/features/feature_channel.h"
+#include "extensions/common/scoped_worker_based_extensions_channel.h"
 #include "extensions/test/result_catcher.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "ui/base/models/menu_model.h"
@@ -134,8 +134,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(ExtensionApiTest, ServiceWorkerContextMenus) {
-  // Service Workers are currently available only in Canary or trunk.
-  ScopedCurrentChannel current_channel_override(version_info::Channel::UNKNOWN);
+  ScopedWorkerBasedExtensionsChannel worker_channel_override;
   ASSERT_TRUE(RunExtensionTestWithFlags("context_menus/event_page",
                                         kFlagRunAsServiceWorkerBasedExtension))
       << message_;
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
index 1e0931f..7931d22 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -194,12 +194,21 @@
   // TODO(crbug.com/495290): Pass the native window directly to the
   // reauth-handling code.
   web_contents_ = web_contents;
-  base::OnceCallback<void(bool)> request_show_password_reply =
-      base::BindOnce(&PasswordsPrivateDelegateImpl::RequestShowPasswordReply,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(callback), id);
-  password_access_authenticator_.EnsureUserIsAuthenticatedAsync(
-      password_manager::ReauthPurpose::VIEW_PASSWORD,
-      std::move(request_show_password_reply));
+  if (!password_access_authenticator_.EnsureUserIsAuthenticated(
+          password_manager::ReauthPurpose::VIEW_PASSWORD)) {
+    std::move(callback).Run(base::nullopt);
+    return;
+  }
+
+  // Request the password. When it is retrieved, ShowPassword() will be called.
+  const std::string* sort_key = password_id_generator_.TryGetSortKey(id);
+  if (!sort_key) {
+    std::move(callback).Run(base::nullopt);
+    return;
+  }
+
+  password_manager_presenter_->RequestShowPassword(*sort_key,
+                                                   std::move(callback));
 }
 
 bool PasswordsPrivateDelegateImpl::OsReauthCall(
@@ -318,12 +327,15 @@
   // TODO(crbug.com/495290): Pass the native window directly to the
   // reauth-handling code.
   web_contents_ = web_contents;
-  base::OnceCallback<void(bool)> export_password_reply = base::BindOnce(
-      &PasswordsPrivateDelegateImpl::ExportPasswordReply,
-      weak_ptr_factory_.GetWeakPtr(), std::move(callback), web_contents);
-  password_access_authenticator_.ForceUserReauthenticationAsync(
-      password_manager::ReauthPurpose::EXPORT,
-      std::move(export_password_reply));
+  if (!password_access_authenticator_.ForceUserReauthentication(
+          password_manager::ReauthPurpose::EXPORT)) {
+    std::move(callback).Run(kReauthenticationFailed);
+    return;
+  }
+
+  password_manager_porter_->set_web_contents(web_contents);
+  bool accepted = password_manager_porter_->Store();
+  std::move(callback).Run(accepted ? std::string() : kExportInProgress);
 }
 
 void PasswordsPrivateDelegateImpl::CancelExportPasswords() {
@@ -371,40 +383,6 @@
   pre_initialization_callbacks_.push_back(callback);
 }
 
-void PasswordsPrivateDelegateImpl::ExportPasswordReply(
-    base::OnceCallback<void(const std::string&)> callback,
-    content::WebContents* web_contents,
-    bool authenticated) {
-  if (!authenticated) {
-    std::move(callback).Run(kReauthenticationFailed);
-    return;
-  }
-
-  password_manager_porter_->set_web_contents(web_contents);
-  bool accepted = password_manager_porter_->Store();
-  std::move(callback).Run(accepted ? std::string() : kExportInProgress);
-}
-
-void PasswordsPrivateDelegateImpl::RequestShowPasswordReply(
-    PlaintextPasswordCallback callback,
-    int id,
-    bool authenticated) {
-  if (!authenticated) {
-    std::move(callback).Run(base::nullopt);
-    return;
-  }
-
-  // Request the password. When it is retrieved, ShowPassword() will be called.
-  const std::string* sort_key = password_id_generator_.TryGetSortKey(id);
-  if (!sort_key) {
-    std::move(callback).Run(base::nullopt);
-    return;
-  }
-
-  password_manager_presenter_->RequestShowPassword(*sort_key,
-                                                   std::move(callback));
-}
-
 void PasswordsPrivateDelegateImpl::InitializeIfNecessary() {
   if (is_initialized_ || !current_entries_initialized_ ||
       !current_exceptions_initialized_)
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
index a6c9820..03d191b7 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
@@ -97,17 +97,6 @@
   // has been initialized or by deferring it until initialization has completed.
   void ExecuteFunction(const base::Closure& callback);
 
-  // Called after OS authentication call for export password request.
-  void ExportPasswordReply(
-      base::OnceCallback<void(const std::string&)> accepted,
-      content::WebContents* web_contents,
-      bool authenticated);
-
-  // Called after OS authentication call for show password request.
-  void RequestShowPasswordReply(PlaintextPasswordCallback callback,
-                                int id,
-                                bool authenticated);
-
   void SendSavedPasswordsList();
   void SendPasswordExceptionsList();
 
@@ -159,9 +148,6 @@
   // NativeWindow for the window where the API was called.
   content::WebContents* web_contents_;
 
-  // Weak pointers for different callbacks.
-  base::WeakPtrFactory<PasswordsPrivateDelegateImpl> weak_ptr_factory_{this};
-
   DISALLOW_COPY_AND_ASSIGN(PasswordsPrivateDelegateImpl);
 };
 
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
index 27a16c5..274e5ac 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
@@ -281,7 +281,6 @@
   base::Optional<base::string16> plaintext_password;
   delegate.RequestShowPassword(0, GetCallbackArgument(&plaintext_password),
                                nullptr);
-  task_environment_.RunUntilIdle();
   EXPECT_TRUE(reauth_called);
   EXPECT_TRUE(plaintext_password.has_value());
   EXPECT_EQ(base::ASCIIToUTF16("test"), *plaintext_password);
@@ -302,7 +301,6 @@
   base::Optional<base::string16> plaintext_password;
   delegate.RequestShowPassword(0, GetCallbackArgument(&plaintext_password),
                                nullptr);
-  task_environment_.RunUntilIdle();
   EXPECT_TRUE(reauth_called);
   EXPECT_FALSE(plaintext_password.has_value());
 }
@@ -324,13 +322,11 @@
   EXPECT_CALL(mock_accepted, Run(std::string())).Times(2);
 
   delegate.ExportPasswords(mock_accepted.Get(), nullptr);
-  task_environment_.RunUntilIdle();
   EXPECT_TRUE(reauth_called);
 
   // Export should ignore previous reauthentication results.
   reauth_called = false;
   delegate.ExportPasswords(mock_accepted.Get(), nullptr);
-  task_environment_.RunUntilIdle();
   EXPECT_TRUE(reauth_called);
 }
 
@@ -351,7 +347,6 @@
       &FakeOsReauthCall, &reauth_called, ReauthResult::FAIL));
 
   delegate.ExportPasswords(mock_accepted.Get(), nullptr);
-  task_environment_.RunUntilIdle();
   EXPECT_TRUE(reauth_called);
 }
 
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc
index 8b5b0e6..7fb8a00 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.cc
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc
@@ -33,7 +33,6 @@
 #include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/extensions/menu_manager.h"
 #include "chrome/browser/extensions/updater/chrome_update_client_config.h"
-#include "chrome/browser/extensions/user_script_listener.h"
 #include "chrome/browser/external_protocol/external_protocol_handler.h"
 #include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/profiles/profile.h"
@@ -520,11 +519,7 @@
 }
 
 UserScriptListener* ChromeExtensionsBrowserClient::GetUserScriptListener() {
-  // Create lazily since this accesses g_browser_process which may not be set up
-  // when ChromeExtensionsBrowserClient is created.
-  if (!user_script_listener_)
-    user_script_listener_ = std::make_unique<UserScriptListener>();
-  return user_script_listener_.get();
+  return &user_script_listener_;
 }
 
 std::string ChromeExtensionsBrowserClient::GetUserAgent() const {
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.h b/chrome/browser/extensions/chrome_extensions_browser_client.h
index cf44bce..476f427 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.h
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.h
@@ -14,6 +14,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "build/build_config.h"
+#include "chrome/browser/extensions/user_script_listener.h"
 #include "extensions/browser/extensions_browser_client.h"
 #include "extensions/browser/kiosk/kiosk_delegate.h"
 
@@ -165,7 +166,7 @@
 
   std::unique_ptr<KioskDelegate> kiosk_delegate_;
 
-  std::unique_ptr<UserScriptListener> user_script_listener_;
+  UserScriptListener user_script_listener_;
 
   DISALLOW_COPY_AND_ASSIGN(ChromeExtensionsBrowserClient);
 };
diff --git a/chrome/browser/extensions/user_script_listener.cc b/chrome/browser/extensions/user_script_listener.cc
index a91ff55f..09d5eaf 100644
--- a/chrome/browser/extensions/user_script_listener.cc
+++ b/chrome/browser/extensions/user_script_listener.cc
@@ -179,9 +179,7 @@
 
 void UserScriptListener::ReplaceURLPatterns(content::BrowserContext* context,
                                             const URLPatterns& patterns) {
-  // TODO(estade): enable this check once it no longer fails.
-  // DCHECK_EQ(1U, profile_data_.count(context));
-
+  DCHECK_EQ(1U, profile_data_.count(context));
   profile_data_[context].url_patterns = patterns;
 }
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 9674299e..e521711 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1131,7 +1131,12 @@
   {
     "name": "enable-cros-ime-input-logic-fst",
     "owners": [ "essential-inputs-team@google.com" ],
-    "expiry_milestone": 77
+    "expiry_milestone": 80
+  },
+  {
+    "name": "enable-cros-ime-native-decoder",
+    "owners": [ "essential-inputs-team@google.com" ],
+    "expiry_milestone": 85
   },
   {
     "name": "enable-cssom-view-scroll-coordinates",
@@ -1268,7 +1273,7 @@
   {
     "name": "enable-experimental-kernel-vm-support",
     "owners": [ "jflat", "zwisler" ],
-    "expiry_milestone": 78
+    "expiry_milestone": 82
   },
   {
     "name": "enable-experimental-productivity-features",
@@ -1453,6 +1458,11 @@
     "expiry_milestone": 78
   },
   {
+    "name": "enable-media-internals-devtools",
+    "owners": ["tmathmeyer"],
+    "expiry_milestone": 82
+  },
+  {
     "name": "enable-media-session-notifications",
     "owners": [ "beccahughes", "media-dev" ],
     "expiry_milestone": 82
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index d2351b3a..193b7ac 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1268,6 +1268,13 @@
 const char kMarkHttpAsName[] = "Mark non-secure origins as non-secure";
 const char kMarkHttpAsDescription[] = "Change the UI treatment for HTTP pages";
 
+extern const char kMediaInspectorLoggingName[] =
+    "Enable media log in developer tools";
+extern const char kMediaInspectorLoggingDescription[] =
+    "Move media logging from chrome://media-internals into the developer tools "
+    "project; #enable-devtools-experiments must also be enabled as well on "
+    "desktop platforms";
+
 const char kMediaRouterCastAllowAllIPsName[] =
     "Connect to Cast devices on all IP addresses";
 const char kMediaRouterCastAllowAllIPsDescription[] =
@@ -2180,14 +2187,6 @@
 const char kUiPartialSwapName[] = "Partial swap";
 const char kUiPartialSwapDescription[] = "Sets partial swap behavior.";
 
-const char kUsePdfCompositorServiceName[] =
-    "Use PDF compositor service for printing";
-const char kUsePdfCompositorServiceDescription[] =
-    "When enabled, use PDF compositor service to composite and generate PDF "
-    "files for printing. When site isolation is enabled, disabling this will "
-    "not stop using PDF compositor service since the service is required for "
-    "printing out-of-process iframes correctly.";
-
 const char kUserActivationV2Name[] = "User Activation v2";
 const char kUserActivationV2Description[] =
     "Enable simple user activation for APIs that are otherwise controlled by "
@@ -3555,6 +3554,10 @@
 const char kImeInputLogicFstDescription[] =
     "Enable FST Input Logic to replace the IME legacy input logic on NaCl";
 
+const char kImeNativeDecoderName[] = "Enable native decoders in IME Service";
+const char kImeNativeDecoderDescription[] =
+    "Enable native decoders in IME service to deprecate NaCl decoders";
+
 const char kListAllDisplayModesName[] = "List all display modes";
 const char kListAllDisplayModesDescription[] =
     "Enables listing all external displays' modes in the display settings.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 014b264e..cd014f9 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -767,6 +767,9 @@
 extern const char kMarkHttpAsWarningAndDangerousOnFormEdits[];
 extern const char kMarkHttpAsWarningAndDangerousOnPasswordsAndCreditCards[];
 
+extern const char kMediaInspectorLoggingName[];
+extern const char kMediaInspectorLoggingDescription[];
+
 extern const char kMediaRouterCastAllowAllIPsName[];
 extern const char kMediaRouterCastAllowAllIPsDescription[];
 
@@ -1279,9 +1282,6 @@
 extern const char kUiPartialSwapName[];
 extern const char kUiPartialSwapDescription[];
 
-extern const char kUsePdfCompositorServiceName[];
-extern const char kUsePdfCompositorServiceDescription[];
-
 extern const char kUserActivationV2Name[];
 extern const char kUserActivationV2Description[];
 
@@ -2112,6 +2112,9 @@
 extern const char kImeInputLogicFstName[];
 extern const char kImeInputLogicFstDescription[];
 
+extern const char kImeNativeDecoderName[];
+extern const char kImeNativeDecoderDescription[];
+
 extern const char kListAllDisplayModesName[];
 extern const char kListAllDisplayModesDescription[];
 
diff --git a/chrome/browser/media/encrypted_media_browsertest.cc b/chrome/browser/media/encrypted_media_browsertest.cc
index e1d4710..f7c37eee 100644
--- a/chrome/browser/media/encrypted_media_browsertest.cc
+++ b/chrome/browser/media/encrypted_media_browsertest.cc
@@ -581,13 +581,6 @@
 
 IN_PROC_BROWSER_TEST_P(EncryptedMediaTest,
                        Playback_VideoOnly_WebM_VP9Profile2) {
-#if BUILDFLAG(ENABLE_WIDEVINE)
-  // TODO(crbug.com/707128): Update Widevine CDM to support VP9 profile 1/2/3.
-  if (IsWidevine(CurrentKeySystem())) {
-    DVLOG(0) << "Skipping test - Widevine CDM does not support VP9 profile 2";
-    return;
-  }
-#endif
   TestSimplePlayback("bear-320x240-v-vp9_profile2_subsample_cenc-v.webm");
 }
 
@@ -597,13 +590,6 @@
     DVLOG(0) << "Skipping test; Can only play MP4 encrypted streams by MSE.";
     return;
   }
-#if BUILDFLAG(ENABLE_WIDEVINE)
-  // TODO(crbug.com/707128): Update Widevine CDM to support VP9 profile 1/2/3.
-  if (IsWidevine(CurrentKeySystem())) {
-    DVLOG(0) << "Skipping test - Widevine CDM does not support VP9 profile 2";
-    return;
-  }
-#endif
   TestSimplePlayback("bear-320x240-v-vp9_profile2_subsample_cenc-v.mp4");
 }
 
diff --git a/chrome/browser/media/encrypted_media_supported_types_browsertest.cc b/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
index b6bab1d..8409932 100644
--- a/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
+++ b/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
@@ -1007,6 +1007,8 @@
                                            video_webm_codecs()));
   EXPECT_WV_SUCCESS(IsSupportedByKeySystem(kWidevine, kVideoWebMMimeType,
                                            vp9_profile0_codecs()));
+  EXPECT_WV_SUCCESS(IsSupportedByKeySystem(kWidevine, kVideoWebMMimeType,
+                                           vp9_profile2_codecs()));
   EXPECT_WV_AV1(
       IsSupportedByKeySystem(kWidevine, kVideoWebMMimeType, av1_codecs()));
 
@@ -1014,10 +1016,6 @@
   EXPECT_UNSUPPORTED(IsSupportedByKeySystem(kWidevine, kVideoWebMMimeType,
                                             audio_webm_codecs()));
 
-  // TODO(crbug.com/996372): Change to EXPECT_WV_SUCCESS after new CDM is in.
-  EXPECT_ANY(IsSupportedByKeySystem(kWidevine, kVideoWebMMimeType,
-                                    vp9_profile2_codecs()));
-
   // Invalid or non-Webm codecs.
   EXPECT_UNSUPPORTED(
       IsSupportedByKeySystem(kWidevine, kVideoWebMMimeType, invalid_codecs()));
@@ -1055,6 +1053,8 @@
       IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType, video_mp4_codecs()));
   EXPECT_WV_SUCCESS(IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType,
                                            vp9_profile0_codecs()));
+  EXPECT_WV_SUCCESS(IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType,
+                                           vp9_profile2_codecs()));
   EXPECT_WV_AV1(
       IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType, av1_codecs()));
 
@@ -1068,10 +1068,6 @@
   EXPECT_UNSUPPORTED(IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType,
                                             audio_mp4_flac_codecs()));
 
-  // TODO(crbug.com/996372): Change to EXPECT_WV_SUCCESS after new CDM is in.
-  EXPECT_ANY(IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType,
-                                    vp9_profile2_codecs()));
-
   // Invalid or non-MP4 codecs.
   EXPECT_UNSUPPORTED(
       IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType, invalid_codecs()));
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc
index b0ebb21..aeffae53 100644
--- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc
@@ -2022,9 +2022,6 @@
   feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
-
-  OverrideHeavyAdNoiseProvider(
-      std::make_unique<MockNoiseProvider>(0 /* network noise */));
   RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
 
   // Add enough data to trigger the intervention.
@@ -2043,9 +2040,6 @@
   feature_list.InitAndDisableFeature(features::kHeavyAdIntervention);
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
-
-  OverrideHeavyAdNoiseProvider(
-      std::make_unique<MockNoiseProvider>(0 /* network noise */));
   RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
 
   // Add enough data to trigger the intervention.
@@ -2067,9 +2061,6 @@
   feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
-
-  OverrideHeavyAdNoiseProvider(
-      std::make_unique<MockNoiseProvider>(0 /* network noise */));
   RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
 
   // Add enough data to trigger the intervention.
@@ -2094,9 +2085,6 @@
   feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
-
-  OverrideHeavyAdNoiseProvider(
-      std::make_unique<MockNoiseProvider>(0 /* network noise */));
   RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
 
   // Don't load enough to reach the heavy ad threshold.
diff --git a/chrome/browser/permissions/mock_permission_request.cc b/chrome/browser/permissions/mock_permission_request.cc
index e06e6aa..b528c58 100644
--- a/chrome/browser/permissions/mock_permission_request.cc
+++ b/chrome/browser/permissions/mock_permission_request.cc
@@ -19,7 +19,8 @@
                             "button",
                             GURL("http://www.google.com"),
                             PermissionRequestType::PERMISSION_NOTIFICATIONS,
-                            PermissionRequestGestureType::UNKNOWN) {}
+                            PermissionRequestGestureType::UNKNOWN,
+                            CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {}
 
 MockPermissionRequest::MockPermissionRequest(const std::string& text)
     : MockPermissionRequest(text,
@@ -27,7 +28,8 @@
                             "button",
                             GURL("http://www.google.com"),
                             PermissionRequestType::PERMISSION_NOTIFICATIONS,
-                            PermissionRequestGestureType::UNKNOWN) {}
+                            PermissionRequestGestureType::UNKNOWN,
+                            CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {}
 
 MockPermissionRequest::MockPermissionRequest(
     const std::string& text,
@@ -36,9 +38,10 @@
     : MockPermissionRequest(text,
                             "button",
                             "button",
-                             GURL("http://www.google.com"),
-                             request_type,
-                             gesture_type) {}
+                            GURL("http://www.google.com"),
+                            request_type,
+                            gesture_type,
+                            CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {}
 
 MockPermissionRequest::MockPermissionRequest(const std::string& text,
                                              PermissionRequestType request_type,
@@ -48,7 +51,8 @@
                             "button",
                             url,
                             request_type,
-                            PermissionRequestGestureType::UNKNOWN) {}
+                            PermissionRequestGestureType::UNKNOWN,
+                            CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {}
 
 MockPermissionRequest::MockPermissionRequest(const std::string& text,
                                              const std::string& accept_label,
@@ -58,7 +62,18 @@
                             deny_label,
                             GURL("http://www.google.com"),
                             PermissionRequestType::PERMISSION_NOTIFICATIONS,
-                            PermissionRequestGestureType::UNKNOWN) {}
+                            PermissionRequestGestureType::UNKNOWN,
+                            CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {}
+MockPermissionRequest::MockPermissionRequest(
+    const std::string& text,
+    ContentSettingsType content_settings_type_)
+    : MockPermissionRequest(text,
+                            "button",
+                            "button",
+                            GURL("http://www.google.com"),
+                            PermissionRequestType::PERMISSION_NOTIFICATIONS,
+                            PermissionRequestGestureType::UNKNOWN,
+                            content_settings_type_) {}
 
 MockPermissionRequest::~MockPermissionRequest() {}
 
@@ -115,6 +130,10 @@
   return gesture_type_;
 }
 
+ContentSettingsType MockPermissionRequest::GetContentSettingsType() const {
+  return content_settings_type_;
+}
+
 bool MockPermissionRequest::granted() {
   return granted_;
 }
@@ -133,12 +152,14 @@
     const std::string& deny_label,
     const GURL& origin,
     PermissionRequestType request_type,
-    PermissionRequestGestureType gesture_type)
+    PermissionRequestGestureType gesture_type,
+    ContentSettingsType content_settings_type)
     : granted_(false),
       cancelled_(false),
       finished_(false),
       request_type_(request_type),
-      gesture_type_(gesture_type) {
+      gesture_type_(gesture_type),
+      content_settings_type_(content_settings_type) {
   text_ = base::UTF8ToUTF16(text);
   accept_label_ = base::UTF8ToUTF16(accept_label);
   deny_label_ = base::UTF8ToUTF16(deny_label);
diff --git a/chrome/browser/permissions/mock_permission_request.h b/chrome/browser/permissions/mock_permission_request.h
index c166b6f..df4821b4 100644
--- a/chrome/browser/permissions/mock_permission_request.h
+++ b/chrome/browser/permissions/mock_permission_request.h
@@ -22,6 +22,8 @@
   MockPermissionRequest(const std::string& text,
                         const std::string& accept_label,
                         const std::string& deny_label);
+  MockPermissionRequest(const std::string& text,
+                        ContentSettingsType content_settings_type_);
 
   ~MockPermissionRequest() override;
 
@@ -39,6 +41,7 @@
   void RequestFinished() override;
   PermissionRequestType GetPermissionRequestType() const override;
   PermissionRequestGestureType GetGestureType() const override;
+  ContentSettingsType GetContentSettingsType() const override;
 
   bool granted();
   bool cancelled();
@@ -50,12 +53,14 @@
                         const std::string& deny_label,
                         const GURL& url,
                         PermissionRequestType request_type,
-                        PermissionRequestGestureType gesture_type);
+                        PermissionRequestGestureType gesture_type,
+                        ContentSettingsType content_settings_type);
   bool granted_;
   bool cancelled_;
   bool finished_;
   PermissionRequestType request_type_;
   PermissionRequestGestureType gesture_type_;
+  ContentSettingsType content_settings_type_;
 
   base::string16 text_;
   base::string16 accept_label_;
diff --git a/chrome/browser/permissions/permission_prompt_android.cc b/chrome/browser/permissions/permission_prompt_android.cc
index 6ae03b6..5d9186f 100644
--- a/chrome/browser/permissions/permission_prompt_android.cc
+++ b/chrome/browser/permissions/permission_prompt_android.cc
@@ -23,6 +23,7 @@
     : web_contents_(web_contents),
       delegate_(delegate),
       permission_request_notification_(nullptr),
+      permission_infobar_(nullptr),
       weak_factory_(this) {
   DCHECK(web_contents);
 
@@ -31,8 +32,9 @@
   if (infobar_service &&
       GroupedPermissionInfoBarDelegate::ShouldShowMiniInfobar(
           GetContentSettingType(0u /* position */))) {
-    GroupedPermissionInfoBarDelegate::Create(weak_factory_.GetWeakPtr(),
-                                             infobar_service);
+    permission_infobar_ = GroupedPermissionInfoBarDelegate::Create(
+        weak_factory_.GetWeakPtr(), infobar_service);
+    infobar_service->AddObserver(this);
     return;
   }
 
@@ -46,7 +48,17 @@
   PermissionDialogDelegate::Create(web_contents_, this);
 }
 
-PermissionPromptAndroid::~PermissionPromptAndroid() {}
+PermissionPromptAndroid::~PermissionPromptAndroid() {
+  if (permission_infobar_) {
+    InfoBarService* infobar_service =
+        InfoBarService::FromWebContents(web_contents_);
+
+    // RemoveObserver before RemoveInfoBar to not get notified about the removal
+    // of the `permission_infobar_` infobar.
+    infobar_service->RemoveObserver(this);
+    infobar_service->RemoveInfoBar(permission_infobar_);
+  }
+}
 
 void PermissionPromptAndroid::UpdateAnchorPosition() {
   NOTREACHED() << "UpdateAnchorPosition is not implemented";
@@ -131,6 +143,17 @@
           url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
 }
 
+void PermissionPromptAndroid::OnInfoBarRemoved(infobars::InfoBar* infobar,
+                                               bool animate) {
+  if (infobar != permission_infobar_)
+    return;
+
+  permission_infobar_ = nullptr;
+  InfoBarService* infobar_service =
+      InfoBarService::FromWebContents(web_contents_);
+  infobar_service->RemoveObserver(this);
+}
+
 // static
 std::unique_ptr<PermissionPrompt> PermissionPrompt::Create(
     content::WebContents* web_contents,
diff --git a/chrome/browser/permissions/permission_prompt_android.h b/chrome/browser/permissions/permission_prompt_android.h
index be458112..29b2a86 100644
--- a/chrome/browser/permissions/permission_prompt_android.h
+++ b/chrome/browser/permissions/permission_prompt_android.h
@@ -13,13 +13,18 @@
 #include "chrome/browser/permissions/permission_request_notification_android.h"
 #include "chrome/browser/ui/permission_bubble/permission_prompt.h"
 #include "components/content_settings/core/common/content_settings_types.h"
+#include "components/infobars/core/infobar_manager.h"
 
 namespace content {
 class WebContents;
 }
+namespace infobars {
+class InfoBar;
+}
 class PermissionRequestNotificationAndroid;
 
-class PermissionPromptAndroid : public PermissionPrompt {
+class PermissionPromptAndroid : public PermissionPrompt,
+                                public infobars::InfoBarManager::Observer {
  public:
   PermissionPromptAndroid(content::WebContents* web_contents,
                           Delegate* delegate);
@@ -42,6 +47,9 @@
   base::string16 GetTitleText() const;
   base::string16 GetMessageText() const;
 
+  // InfoBar::Manager:
+  void OnInfoBarRemoved(infobars::InfoBar* infobar, bool animate) override;
+
  private:
   // PermissionPromptAndroid is owned by PermissionRequestManager, so it should
   // be safe to hold a raw WebContents pointer here because this class is
@@ -55,6 +63,10 @@
   std::unique_ptr<PermissionRequestNotificationAndroid>
       permission_request_notification_;
 
+  // The infobar used to display the permission request, if displayed in that
+  // format. Never assume that this pointer is currently alive.
+  infobars::InfoBar* permission_infobar_;
+
   base::WeakPtrFactory<PermissionPromptAndroid> weak_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(PermissionPromptAndroid);
diff --git a/chrome/browser/permissions/permission_prompt_android_unittest.cc b/chrome/browser/permissions/permission_prompt_android_unittest.cc
new file mode 100644
index 0000000..f695c9b7
--- /dev/null
+++ b/chrome/browser/permissions/permission_prompt_android_unittest.cc
@@ -0,0 +1,61 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/permissions/permission_prompt_android.h"
+
+#include "base/run_loop.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/infobars/mock_infobar_service.h"
+#include "chrome/browser/permissions/mock_permission_request.h"
+#include "chrome/browser/permissions/permission_features.h"
+#include "chrome/browser/permissions/permission_request_manager.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/test/base/chrome_render_view_host_test_harness.h"
+
+class PermissionPromptAndroidTest : public ChromeRenderViewHostTestHarness {
+ public:
+  PermissionRequestManager* permission_request_manager() {
+    return permission_request_manager_;
+  }
+
+ private:
+  void SetUp() override {
+    ChromeRenderViewHostTestHarness::SetUp();
+    // Ensure that the test uses the mini-infobar variant.
+    base::FieldTrialParams params;
+    params[kQuietNotificationPromptsUIFlavourParameterName] =
+        kQuietNotificationPromptsMiniInfobar;
+    scoped_feature_list_.InitAndEnableFeatureWithParameters(
+        features::kQuietNotificationPrompts, params);
+
+    MockInfoBarService::CreateForWebContents(web_contents());
+
+    PermissionRequestManager::CreateForWebContents(web_contents());
+    permission_request_manager_ =
+        PermissionRequestManager::FromWebContents(web_contents());
+  }
+
+  base::test::ScopedFeatureList scoped_feature_list_;
+  PermissionRequestManager* permission_request_manager_;
+};
+
+TEST_F(PermissionPromptAndroidTest, TabCloseMiniInfoBarClosesCleanly) {
+  // Create a notification request. This causes an infobar to appear.
+  MockPermissionRequest request("test", CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
+  permission_request_manager()->AddRequest(&request);
+
+  permission_request_manager()->DocumentOnLoadCompletedInMainFrame();
+  base::RunLoop().RunUntilIdle();
+
+  // Now remove the infobar from the infobar service.
+  InfoBarService::FromWebContents(web_contents())->RemoveAllInfoBars(false);
+
+  // At this point close the permission prompt (after the infobar has been
+  // removed already).
+  permission_request_manager()->Deny();
+
+  // If no DCHECK has been hit, and the infobar has been closed, the test
+  // passes.
+  EXPECT_TRUE(request.finished());
+}
diff --git a/chrome/browser/permissions/permission_request_manager.cc b/chrome/browser/permissions/permission_request_manager.cc
index 9c2c275..c12cf7e1 100644
--- a/chrome/browser/permissions/permission_request_manager.cc
+++ b/chrome/browser/permissions/permission_request_manager.cc
@@ -80,7 +80,6 @@
 }
 
 void PermissionRequestManager::AddRequest(PermissionRequest* request) {
-
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kDenyPermissionPrompts)) {
     request->PermissionDenied();
@@ -140,6 +139,12 @@
   }
   queued_requests_.push_back(request);
 
+  // If we're displaying a quiet permission request, kill it in favor of this
+  // permission request.
+  if (ShouldShowQuietPermissionPrompt()) {
+    FinalizeBubble(PermissionAction::IGNORED);
+  }
+
   if (!IsBubbleVisible())
     ScheduleShowBubble();
 }
@@ -553,17 +558,21 @@
 }
 
 bool PermissionRequestManager::ShouldShowQuietPermissionPrompt() {
-  if (!requests_.size())
+  if (!requests_.size() ||
+      requests_.front()->GetPermissionRequestType() !=
+          PermissionRequestType::PERMISSION_NOTIFICATIONS) {
     return false;
+  }
 
-#if !defined(OS_ANDROID)
   const auto ui_flavor = QuietNotificationsPromptConfig::UIFlavorToUse();
-  return (requests_.front()->GetPermissionRequestType() ==
-              PermissionRequestType::PERMISSION_NOTIFICATIONS &&
-          (ui_flavor == QuietNotificationsPromptConfig::STATIC_ICON ||
-           ui_flavor == QuietNotificationsPromptConfig::ANIMATED_ICON));
+#if !defined(OS_ANDROID)
+  return ui_flavor == QuietNotificationsPromptConfig::STATIC_ICON ||
+         ui_flavor == QuietNotificationsPromptConfig::ANIMATED_ICON;
 #else   // OS_ANDROID
-  return false;
+  return ui_flavor == QuietNotificationsPromptConfig::QUIET_NOTIFICATION ||
+         ui_flavor == QuietNotificationsPromptConfig::HEADS_UP_NOTIFICATION ||
+         ui_flavor == QuietNotificationsPromptConfig::MINI_INFOBAR;
+
 #endif  // OS_ANDROID
 }
 
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 1a1dd382..d24d8e2 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -1048,10 +1048,6 @@
     prefs::kSitePerProcess,
     base::Value::Type::BOOLEAN },
 
-  { key::kWebDriverOverridesIncompatiblePolicies,
-    prefs::kWebDriverOverridesIncompatiblePolicies,
-    base::Value::Type::BOOLEAN },
-
   { key::kAbusiveExperienceInterventionEnforce,
     prefs::kAbusiveExperienceInterventionEnforce,
     base::Value::Type::BOOLEAN },
diff --git a/chrome/browser/policy/site_isolation_policy_browsertest.cc b/chrome/browser/policy/site_isolation_policy_browsertest.cc
index 04d82109..b6ac9ae 100644
--- a/chrome/browser/policy/site_isolation_policy_browsertest.cc
+++ b/chrome/browser/policy/site_isolation_policy_browsertest.cc
@@ -91,14 +91,6 @@
                policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
                std::make_unique<base::Value>(policy_value), nullptr);
     provider_.UpdateChromePolicy(values);
-
-    // Append the automation switch which should disable Site Isolation when the
-    // "WebDriverOverridesIncompatiblePolicies" is set. This is tested in the
-    // WebDriverSitePerProcessPolicyBrowserTest class below.
-    // NOTE: This flag is on for some tests per default but we still force it
-    // it here to make sure to avoid possible regressions being missed
-    base::CommandLine::ForCurrentProcess()->AppendSwitch(
-        switches::kEnableAutomation);
   }
 
  private:
@@ -137,31 +129,6 @@
   DISALLOW_COPY_AND_ASSIGN(IsolateOriginsPolicyBrowserTest);
 };
 
-class WebDriverSitePerProcessPolicyBrowserTest
-    : public SitePerProcessPolicyBrowserTestEnabled {
- protected:
-  WebDriverSitePerProcessPolicyBrowserTest() = default;
-
-  void SetUpInProcessBrowserTestFixture() override {
-    // We setup the policy here, because the policy must be 'live' before the
-    // renderer is created, since the value for this policy is passed to the
-    // renderer via a command-line. Setting the policy in the test itself or in
-    // SetUpOnMainThread works for update-able policies, but is too late for
-    // this one.
-    SitePerProcessPolicyBrowserTest::SetUpInProcessBrowserTestFixture();
-
-    policy::PolicyMap values;
-    values.Set(policy::key::kWebDriverOverridesIncompatiblePolicies,
-               policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
-               policy::POLICY_SOURCE_CLOUD, std::make_unique<base::Value>(true),
-               nullptr);
-    provider_.UpdateChromePolicy(values);
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(WebDriverSitePerProcessPolicyBrowserTest);
-};
-
 // Ensure that --disable-site-isolation-trials and/or
 // --disable-site-isolation-for-enterprise-policy do not override policies.
 class NoOverrideSitePerProcessPolicyBrowserTest
@@ -223,14 +190,6 @@
   CheckIsolatedOriginExpectations(expectations2, base::size(expectations2));
 }
 
-IN_PROC_BROWSER_TEST_F(WebDriverSitePerProcessPolicyBrowserTest, Simple) {
-  Expectations expectations[] = {
-      {"https://foo.com/noodles.html", true},
-      {"http://example.org/pumpkins.html", true},
-  };
-  CheckExpectations(expectations, base::size(expectations));
-}
-
 IN_PROC_BROWSER_TEST_F(NoOverrideSitePerProcessPolicyBrowserTest, Simple) {
   Expectations expectations[] = {
       {"https://foo.com/noodles.html", true},
diff --git a/chrome/browser/resources/discards/graph_doc.js b/chrome/browser/resources/discards/graph_doc.js
index ad07b1fa..8eabc87 100644
--- a/chrome/browser/resources/discards/graph_doc.js
+++ b/chrome/browser/resources/discards/graph_doc.js
@@ -28,13 +28,20 @@
     /** @type {string} */
     this.iconUrl = '';
 
-    // Implementation of the d3.ForceNode interface.
-    // See https://github.com/d3/d3-force#simulation_nodes.
-    this.index = null;
-    this.x = null;
-    this.y = null;
-    this.vx = null;
-    this.vy = null;
+    /**
+     * Implementation of the d3.ForceNode interface.
+     * See https://github.com/d3/d3-force#simulation_nodes.
+     * @type {number|undefined}
+     */
+    this.index;
+    /** @type {number|undefined} */
+    this.x;
+    /** @type {number|undefined} */
+    this.y;
+    /** @type {number|undefined} */
+    this.vx;
+    /** @type {number|undefined} */
+    this.vy;
     this.fx = null;
     this.fy = null;
   }
diff --git a/chrome/browser/resources/settings/about_page/BUILD.gn b/chrome/browser/resources/settings/about_page/BUILD.gn
index 794b8aa..41910e9 100644
--- a/chrome/browser/resources/settings/about_page/BUILD.gn
+++ b/chrome/browser/resources/settings/about_page/BUILD.gn
@@ -30,7 +30,6 @@
     "//ui/webui/resources/js:parse_html_subset",
     "//ui/webui/resources/js:web_ui_listener_behavior",
   ]
-  externs_list = [ "$externs_path/web_animations.js" ]
 }
 
 js_library("about_page_browser_proxy") {
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn
index efbf96b0..2a90471 100644
--- a/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_about_page/BUILD.gn
@@ -22,5 +22,4 @@
     "//ui/webui/resources/js:parse_html_subset",
     "//ui/webui/resources/js:web_ui_listener_behavior",
   ]
-  externs_list = [ "$externs_path/web_animations.js" ]
 }
diff --git a/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn
index 3ac49b9..4b5035459 100644
--- a/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn
@@ -14,5 +14,4 @@
   deps = [
     "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar_search_field",
   ]
-  externs_list = [ "$externs_path/web_animations.js" ]
 }
diff --git a/chrome/browser/resources/settings/people_page/BUILD.gn b/chrome/browser/resources/settings/people_page/BUILD.gn
index 05645882..4d65262 100644
--- a/chrome/browser/resources/settings/people_page/BUILD.gn
+++ b/chrome/browser/resources/settings/people_page/BUILD.gn
@@ -101,7 +101,6 @@
     "//ui/webui/resources/js:web_ui_listener_behavior",
     "//ui/webui/resources/js/cr/ui:focus_without_ink",
   ]
-  externs_list = [ "$externs_path/web_animations.js" ]
 }
 
 js_library("import_data_browser_proxy") {
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer_unittest.cc b/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer_unittest.cc
index 917b523..5906829 100644
--- a/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer_unittest.cc
+++ b/chrome/browser/sharing/click_to_call/click_to_call_context_menu_observer_unittest.cc
@@ -17,14 +17,9 @@
 #include "chrome/browser/renderer_context_menu/mock_render_view_context_menu.h"
 #include "chrome/browser/sharing/click_to_call/click_to_call_utils.h"
 #include "chrome/browser/sharing/click_to_call/feature.h"
+#include "chrome/browser/sharing/mock_sharing_service.h"
 #include "chrome/browser/sharing/sharing_constants.h"
-#include "chrome/browser/sharing/sharing_fcm_handler.h"
-#include "chrome/browser/sharing/sharing_fcm_sender.h"
-#include "chrome/browser/sharing/sharing_metrics.h"
-#include "chrome/browser/sharing/sharing_service.h"
 #include "chrome/browser/sharing/sharing_service_factory.h"
-#include "chrome/browser/sharing/sharing_sync_preference.h"
-#include "chrome/browser/sharing/vapid_key_manager.h"
 #include "components/sync_device_info/device_info.h"
 #include "content/public/common/context_menu_params.h"
 #include "content/public/test/browser_task_environment.h"
@@ -47,53 +42,6 @@
 
 constexpr int kSeparatorCommandId = -1;
 
-class MockSharingDeviceRegistration : public SharingDeviceRegistration {
- public:
-  MockSharingDeviceRegistration()
-      : SharingDeviceRegistration(/* pref_service_= */ nullptr,
-                                  /* sharing_sync_preference_= */ nullptr,
-                                  /* instance_id_driver_= */ nullptr,
-                                  /* vapid_key_manager_= */ nullptr) {}
-
-  ~MockSharingDeviceRegistration() override = default;
-
-  MOCK_CONST_METHOD0(IsSharedClipboardSupported, bool());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockSharingDeviceRegistration);
-};
-
-class MockSharingService : public SharingService {
- public:
-  explicit MockSharingService(std::unique_ptr<SharingFCMHandler> fcm_handler)
-      : SharingService(/* sync_prefs= */ nullptr,
-                       /* vapid_key_manager= */ nullptr,
-                       std::make_unique<MockSharingDeviceRegistration>(),
-                       /* fcm_sender= */ nullptr,
-                       std::move(fcm_handler),
-                       /* gcm_driver= */ nullptr,
-                       /* device_info_tracker= */ nullptr,
-                       /* local_device_info_provider= */ nullptr,
-                       /* sync_service */ nullptr,
-                       /* notification_display_service= */ nullptr) {}
-
-  ~MockSharingService() override = default;
-
-  MOCK_CONST_METHOD1(
-      GetDeviceCandidates,
-      std::vector<std::unique_ptr<syncer::DeviceInfo>>(
-          sync_pb::SharingSpecificFields::EnabledFeatures required_feature));
-
-  MOCK_METHOD4(SendMessageToDevice,
-               void(const std::string& device_guid,
-                    base::TimeDelta time_to_live,
-                    SharingMessage message,
-                    SharingService::SendMessageCallback callback));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockSharingService);
-};
-
 class ClickToCallContextMenuObserverTest : public testing::Test {
  public:
   ClickToCallContextMenuObserverTest() = default;
@@ -108,8 +56,7 @@
         menu_.GetBrowserContext(),
         base::BindRepeating([](content::BrowserContext* context)
                                 -> std::unique_ptr<KeyedService> {
-          return std::make_unique<NiceMock<MockSharingService>>(
-              std::make_unique<SharingFCMHandler>(nullptr, nullptr, nullptr));
+          return std::make_unique<NiceMock<MockSharingService>>();
         }));
     observer_ = std::make_unique<ClickToCallContextMenuObserver>(&menu_);
     menu_.SetObserver(observer_.get());
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_ui_controller_unittest.cc b/chrome/browser/sharing/click_to_call/click_to_call_ui_controller_unittest.cc
index 2d43dea..85ed454 100644
--- a/chrome/browser/sharing/click_to_call/click_to_call_ui_controller_unittest.cc
+++ b/chrome/browser/sharing/click_to_call/click_to_call_ui_controller_unittest.cc
@@ -10,13 +10,9 @@
 #include "base/memory/ptr_util.h"
 #include "base/strings/strcat.h"
 #include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/sharing/mock_sharing_service.h"
 #include "chrome/browser/sharing/sharing_constants.h"
-#include "chrome/browser/sharing/sharing_fcm_handler.h"
-#include "chrome/browser/sharing/sharing_fcm_sender.h"
-#include "chrome/browser/sharing/sharing_service.h"
 #include "chrome/browser/sharing/sharing_service_factory.h"
-#include "chrome/browser/sharing/sharing_sync_preference.h"
-#include "chrome/browser/sharing/vapid_key_manager.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/gcm_driver/fake_gcm_driver.h"
 #include "components/gcm_driver/instance_id/instance_id_driver.h"
@@ -36,50 +32,6 @@
 const char kReceiverGuid[] = "test_receiver_guid";
 const char kReceiverName[] = "test_receiver_name";
 
-class MockSharingDeviceRegistration : public SharingDeviceRegistration {
- public:
-  MockSharingDeviceRegistration()
-      : SharingDeviceRegistration(/* pref_service_= */ nullptr,
-                                  /* sharing_sync_preference_= */ nullptr,
-                                  /* instance_id_driver_= */ nullptr,
-                                  /* vapid_key_manager_= */ nullptr) {}
-
-  ~MockSharingDeviceRegistration() override = default;
-
-  MOCK_CONST_METHOD0(IsSharedClipboardSupported, bool());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockSharingDeviceRegistration);
-};
-
-class MockSharingService : public SharingService {
- public:
-  explicit MockSharingService(std::unique_ptr<SharingFCMHandler> fcm_handler)
-      : SharingService(/* sync_prefs= */ nullptr,
-                       /* vapid_key_manager= */ nullptr,
-                       std::make_unique<MockSharingDeviceRegistration>(),
-                       /* fcm_sender= */ nullptr,
-                       std::move(fcm_handler),
-                       /* gcm_driver= */ nullptr,
-                       /* device_info_tracker= */ nullptr,
-                       /* local_device_info_provider= */ nullptr,
-                       /* sync_service= */ nullptr,
-                       /* notification_display_service= */ nullptr) {}
-
-  ~MockSharingService() override = default;
-
-  MOCK_CONST_METHOD1(
-      GetDeviceCandidates,
-      std::vector<std::unique_ptr<syncer::DeviceInfo>>(
-          sync_pb::SharingSpecificFields::EnabledFeatures required_feature));
-
-  MOCK_METHOD4(SendMessageToDevice,
-               void(const std::string& device_guid,
-                    base::TimeDelta time_to_live,
-                    chrome_browser_sharing::SharingMessage message,
-                    SharingService::SendMessageCallback callback));
-};
-
 class ClickToCallUiControllerTest : public testing::Test {
  public:
   ClickToCallUiControllerTest() = default;
@@ -90,8 +42,7 @@
     SharingServiceFactory::GetInstance()->SetTestingFactory(
         &profile_, base::BindRepeating([](content::BrowserContext* context)
                                            -> std::unique_ptr<KeyedService> {
-          return std::make_unique<testing::NiceMock<MockSharingService>>(
-              std::make_unique<SharingFCMHandler>(nullptr, nullptr, nullptr));
+          return std::make_unique<testing::NiceMock<MockSharingService>>();
         }));
     ClickToCallUiController::ShowDialog(
         web_contents_.get(), /*initiating_origin=*/base::nullopt,
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_utils.cc b/chrome/browser/sharing/click_to_call/click_to_call_utils.cc
index 423e29edf..8884e35 100644
--- a/chrome/browser/sharing/click_to_call/click_to_call_utils.cc
+++ b/chrome/browser/sharing/click_to_call/click_to_call_utils.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/sharing/click_to_call/click_to_call_utils.h"
 
 #include "base/metrics/histogram_functions.h"
-#include "base/no_destructor.h"
 #include "base/optional.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -27,14 +26,12 @@
 constexpr int kSelectionTextMaxLength = 30;
 
 // Heuristical regex to search for phone number.
-// (^|\\s) makes sure the pattern begins with a new word.
-// (\\(?\\+[0-9]+\\)?)? checks for optional international code in number.
-// ([.\\s\\-\\(]?[0-9][\\s\\-\\)]?){8,} checks for at least eight occurrences of
-// pattern denoted to reduce false positives.
-// The first pattern matched is (^|\\s) and the second pattern matched is the
-// phone number we are looking for.
+// (^|\p{Z}) makes sure the pattern begins with a new word.
+// (\(?\+[0-9]+\)?) checks for optional international code in number.
+// ([.\p{Z}\-\(]?[0-9][\p{Z}\-\)]?){8,} checks for at least eight occurrences of
+// digits with optional separators to reduce false positives.
 const char kPhoneNumberRegexPattern[] =
-    "(?:^|\\s)((\\(?\\+[0-9]+\\)?)?([.\\s\\-\\(]?[0-9][\\s\\-\\)]?){8,})";
+    R"((?:^|\p{Z})((?:\(?\+[0-9]+\)?)?(?:[.\p{Z}\-(]?[0-9][\p{Z}\-)]?){8,}))";
 
 bool IsClickToCallEnabled(content::BrowserContext* browser_context) {
   SharingService* sharing_service =
@@ -81,16 +78,15 @@
   ScopedUmaHistogramMicrosecondsTimer scoped_uma_timer;
 
   // TODO(crbug.com/992906): Find a better way to parse phone numbers.
-  static const base::NoDestructor<re2::RE2> kPhoneNumberRegex(
-      kPhoneNumberRegexPattern);
+  static const re2::LazyRE2 kPhoneNumberRegex = {kPhoneNumberRegexPattern};
   std::string parsed_phone_number;
   if (!re2::RE2::PartialMatch(selection_text, *kPhoneNumberRegex,
                               &parsed_phone_number)) {
     return base::nullopt;
   }
 
-  return base::TrimWhitespaceASCII(parsed_phone_number, base::TRIM_ALL)
-      .as_string();
+  return base::UTF16ToUTF8(base::TrimWhitespace(
+      base::UTF8ToUTF16(parsed_phone_number), base::TRIM_ALL));
 }
 
 std::string GetUnescapedURLContent(const GURL& url) {
diff --git a/chrome/browser/sharing/click_to_call/click_to_call_utils_unittest.cc b/chrome/browser/sharing/click_to_call/click_to_call_utils_unittest.cc
index 7eab77a..dccc33d4 100644
--- a/chrome/browser/sharing/click_to_call/click_to_call_utils_unittest.cc
+++ b/chrome/browser/sharing/click_to_call/click_to_call_utils_unittest.cc
@@ -178,6 +178,8 @@
   expectations.emplace("9 8 7 6 5 4 3 2 1 0", "9 8 7 6 5 4 3 2 1 0");
   // Two spaces in between.
   expectations.emplace("9  8 7 6 5  4 3 2 1 0", "9  8 7 6 5  4 3 2 1 0");
+  // Non breaking spaces around number.
+  expectations.emplace("\u00A09876543210\u00A0", "9876543210");
 
   for (auto& expectation : expectations) {
     base::Optional<std::string> phone_number =
diff --git a/chrome/browser/sharing/mock_sharing_service.cc b/chrome/browser/sharing/mock_sharing_service.cc
new file mode 100644
index 0000000..9d9491a
--- /dev/null
+++ b/chrome/browser/sharing/mock_sharing_service.cc
@@ -0,0 +1,31 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+#include "chrome/browser/sharing/mock_sharing_service.h"
+
+#include "chrome/browser/sharing/sharing_fcm_handler.h"
+#include "chrome/browser/sharing/sharing_fcm_sender.h"
+#include "chrome/browser/sharing/sharing_sync_preference.h"
+#include "chrome/browser/sharing/vapid_key_manager.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+MockSharingService::MockSharingService()
+    : SharingService(
+          /*sync_prefs=*/nullptr,
+          /*vapid_key_manager=*/nullptr,
+          std::make_unique<SharingDeviceRegistration>(
+              /*pref_service=*/nullptr,
+              /*sharing_sync_preference=*/nullptr,
+              /*instance_id_driver=*/nullptr,
+              /*vapid_key_manager=*/nullptr),
+          /*fcm_sender=*/nullptr,
+          std::make_unique<SharingFCMHandler>(/*gcm_driver=*/nullptr,
+                                              /*sharing_fcm_sender=*/nullptr,
+                                              /*sync_preference=*/nullptr),
+          /*gcm_driver=*/nullptr,
+          /*device_info_tracker=*/nullptr,
+          /*local_device_info_provider=*/nullptr,
+          /*sync_service*/ nullptr,
+          /*notification_display_service=*/nullptr) {}
+
+MockSharingService::~MockSharingService() = default;
diff --git a/chrome/browser/sharing/mock_sharing_service.h b/chrome/browser/sharing/mock_sharing_service.h
new file mode 100644
index 0000000..e8868ce
--- /dev/null
+++ b/chrome/browser/sharing/mock_sharing_service.h
@@ -0,0 +1,36 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SHARING_MOCK_SHARING_SERVICE_H_
+#define CHROME_BROWSER_SHARING_MOCK_SHARING_SERVICE_H_
+
+#include "chrome/browser/sharing/sharing_service.h"
+
+#include "testing/gmock/include/gmock/gmock.h"
+
+class MockSharingService : public SharingService {
+ public:
+  MockSharingService();
+  ~MockSharingService() override;
+
+  MOCK_CONST_METHOD1(
+      GetDeviceCandidates,
+      std::vector<std::unique_ptr<syncer::DeviceInfo>>(
+          sync_pb::SharingSpecificFields::EnabledFeatures required_feature));
+
+  MOCK_METHOD4(SendMessageToDevice,
+               void(const std::string& device_guid,
+                    base::TimeDelta time_to_live,
+                    chrome_browser_sharing::SharingMessage message,
+                    SharingService::SendMessageCallback callback));
+
+  MOCK_CONST_METHOD1(
+      GetDeviceByGuid,
+      std::unique_ptr<syncer::DeviceInfo>(const std::string& guid));
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MockSharingService);
+};
+
+#endif  // CHROME_BROWSER_SHARING_MOCK_SHARING_SERVICE_H_
diff --git a/chrome/browser/sharing/shared_clipboard/shared_clipboard_context_menu_observer_unittest.cc b/chrome/browser/sharing/shared_clipboard/shared_clipboard_context_menu_observer_unittest.cc
index c19fba5..d21d974 100644
--- a/chrome/browser/sharing/shared_clipboard/shared_clipboard_context_menu_observer_unittest.cc
+++ b/chrome/browser/sharing/shared_clipboard/shared_clipboard_context_menu_observer_unittest.cc
@@ -14,13 +14,10 @@
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/renderer_context_menu/mock_render_view_context_menu.h"
+#include "chrome/browser/sharing/mock_sharing_service.h"
 #include "chrome/browser/sharing/shared_clipboard/feature_flags.h"
 #include "chrome/browser/sharing/sharing_constants.h"
-#include "chrome/browser/sharing/sharing_fcm_handler.h"
-#include "chrome/browser/sharing/sharing_fcm_sender.h"
-#include "chrome/browser/sharing/sharing_service.h"
 #include "chrome/browser/sharing/sharing_service_factory.h"
-#include "chrome/browser/sharing/sharing_sync_preference.h"
 #include "chrome/browser/sharing/vapid_key_manager.h"
 #include "components/sync_device_info/device_info.h"
 #include "content/public/common/context_menu_params.h"
@@ -43,53 +40,6 @@
 
 constexpr int kSeparatorCommandId = -1;
 
-class MockSharingDeviceRegistration : public SharingDeviceRegistration {
- public:
-  MockSharingDeviceRegistration()
-      : SharingDeviceRegistration(/* pref_service_= */ nullptr,
-                                  /* sharing_sync_preference_= */ nullptr,
-                                  /* instance_id_driver_= */ nullptr,
-                                  /* vapid_key_manager_= */ nullptr) {}
-
-  ~MockSharingDeviceRegistration() override = default;
-
-  MOCK_CONST_METHOD0(IsSharedClipboardSupported, bool());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockSharingDeviceRegistration);
-};
-
-class MockSharingService : public SharingService {
- public:
-  explicit MockSharingService(std::unique_ptr<SharingFCMHandler> fcm_handler)
-      : SharingService(/* sync_prefs= */ nullptr,
-                       /* vapid_key_manager= */ nullptr,
-                       std::make_unique<MockSharingDeviceRegistration>(),
-                       /* fcm_sender= */ nullptr,
-                       std::move(fcm_handler),
-                       /* gcm_driver= */ nullptr,
-                       /* device_info_tracker= */ nullptr,
-                       /* local_device_info_provider= */ nullptr,
-                       /* sync_service */ nullptr,
-                       /* notification_display_service= */ nullptr) {}
-
-  ~MockSharingService() override = default;
-
-  MOCK_CONST_METHOD1(
-      GetDeviceCandidates,
-      std::vector<std::unique_ptr<syncer::DeviceInfo>>(
-          sync_pb::SharingSpecificFields::EnabledFeatures required_feature));
-
-  MOCK_METHOD4(SendMessageToDevice,
-               void(const std::string& device_guid,
-                    base::TimeDelta time_to_live,
-                    SharingMessage message,
-                    SharingService::SendMessageCallback callback));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockSharingService);
-};
-
 class SharedClipboardContextMenuObserverTest : public testing::Test {
  public:
   SharedClipboardContextMenuObserverTest() = default;
@@ -104,8 +54,7 @@
         menu_.GetBrowserContext(),
         base::BindRepeating([](content::BrowserContext* context)
                                 -> std::unique_ptr<KeyedService> {
-          return std::make_unique<NiceMock<MockSharingService>>(
-              std::make_unique<SharingFCMHandler>(nullptr, nullptr, nullptr));
+          return std::make_unique<NiceMock<MockSharingService>>();
         }));
     observer_ = std::make_unique<SharedClipboardContextMenuObserver>(&menu_);
     menu_.SetObserver(observer_.get());
diff --git a/chrome/browser/sharing/shared_clipboard/shared_clipboard_message_handler_desktop_unittest.cc b/chrome/browser/sharing/shared_clipboard/shared_clipboard_message_handler_desktop_unittest.cc
index 8ee2c516..8cd6f79 100644
--- a/chrome/browser/sharing/shared_clipboard/shared_clipboard_message_handler_desktop_unittest.cc
+++ b/chrome/browser/sharing/shared_clipboard/shared_clipboard_message_handler_desktop_unittest.cc
@@ -9,12 +9,9 @@
 #include "base/guid.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/notifications/stub_notification_display_service.h"
+#include "chrome/browser/sharing/mock_sharing_service.h"
 #include "chrome/browser/sharing/proto/shared_clipboard_message.pb.h"
-#include "chrome/browser/sharing/sharing_fcm_handler.h"
-#include "chrome/browser/sharing/sharing_fcm_sender.h"
-#include "chrome/browser/sharing/sharing_service.h"
-#include "chrome/browser/sharing/sharing_sync_preference.h"
-#include "chrome/browser/sharing/vapid_key_manager.h"
+#include "chrome/browser/sharing/sharing_service_factory.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/sync/protocol/sync_enums.pb.h"
@@ -32,45 +29,6 @@
 const char kDeviceNameInDeviceInfo[] = "DeviceNameInDeviceInfo";
 const char kDeviceNameInMessage[] = "DeviceNameInMessage";
 
-class MockSharingDeviceRegistration : public SharingDeviceRegistration {
- public:
-  MockSharingDeviceRegistration()
-      : SharingDeviceRegistration(/* pref_service_= */ nullptr,
-                                  /* sharing_sync_preference_= */ nullptr,
-                                  /* instance_id_driver_= */ nullptr,
-                                  /* vapid_key_manager_= */ nullptr) {}
-
-  ~MockSharingDeviceRegistration() override = default;
-
-  MOCK_CONST_METHOD0(IsSharedClipboardSupported, bool());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockSharingDeviceRegistration);
-};
-
-class MockSharingService : public SharingService {
- public:
-  explicit MockSharingService(
-      NotificationDisplayService* notification_display_service)
-      : SharingService(
-            /* sync_prefs= */ nullptr,
-            /* vapid_key_manager= */ nullptr,
-            std::make_unique<MockSharingDeviceRegistration>(),
-            /* fcm_sender= */ nullptr,
-            std::make_unique<SharingFCMHandler>(nullptr, nullptr, nullptr),
-            /* gcm_driver= */ nullptr,
-            /* device_info_tracker= */ nullptr,
-            /* local_device_info_provider= */ nullptr,
-            /* sync_service */ nullptr,
-            notification_display_service) {}
-
-  ~MockSharingService() override = default;
-
-  MOCK_CONST_METHOD1(
-      GetDeviceByGuid,
-      std::unique_ptr<syncer::DeviceInfo>(const std::string& guid));
-};
-
 class SharedClipboardMessageHandlerTest : public testing::Test {
  public:
   SharedClipboardMessageHandlerTest() = default;
@@ -78,8 +36,7 @@
   void SetUp() override {
     notification_display_service_ =
         std::make_unique<StubNotificationDisplayService>(&profile_);
-    sharing_service_ = std::make_unique<MockSharingService>(
-        notification_display_service_.get());
+    sharing_service_ = std::make_unique<MockSharingService>();
     message_handler_ = std::make_unique<SharedClipboardMessageHandlerDesktop>(
         sharing_service_.get(), notification_display_service_.get());
   }
diff --git a/chrome/browser/sharing/shared_clipboard/shared_clipboard_ui_controller_unittest.cc b/chrome/browser/sharing/shared_clipboard/shared_clipboard_ui_controller_unittest.cc
index 862f8fb..99f802b 100644
--- a/chrome/browser/sharing/shared_clipboard/shared_clipboard_ui_controller_unittest.cc
+++ b/chrome/browser/sharing/shared_clipboard/shared_clipboard_ui_controller_unittest.cc
@@ -10,13 +10,9 @@
 #include "base/memory/ptr_util.h"
 #include "base/strings/strcat.h"
 #include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/sharing/mock_sharing_service.h"
 #include "chrome/browser/sharing/sharing_constants.h"
-#include "chrome/browser/sharing/sharing_fcm_handler.h"
-#include "chrome/browser/sharing/sharing_fcm_sender.h"
-#include "chrome/browser/sharing/sharing_service.h"
 #include "chrome/browser/sharing/sharing_service_factory.h"
-#include "chrome/browser/sharing/sharing_sync_preference.h"
-#include "chrome/browser/sharing/vapid_key_manager.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/gcm_driver/fake_gcm_driver.h"
 #include "components/gcm_driver/instance_id/instance_id_driver.h"
@@ -36,50 +32,6 @@
 const char kReceiverGuid[] = "test_receiver_guid";
 const char kReceiverName[] = "test_receiver_name";
 
-class MockSharingDeviceRegistration : public SharingDeviceRegistration {
- public:
-  MockSharingDeviceRegistration()
-      : SharingDeviceRegistration(/* pref_service_= */ nullptr,
-                                  /* sharing_sync_preference_= */ nullptr,
-                                  /* instance_id_driver_= */ nullptr,
-                                  /* vapid_key_manager_= */ nullptr) {}
-
-  ~MockSharingDeviceRegistration() override = default;
-
-  MOCK_CONST_METHOD0(IsSharedClipboardSupported, bool());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockSharingDeviceRegistration);
-};
-
-class MockSharingService : public SharingService {
- public:
-  explicit MockSharingService(std::unique_ptr<SharingFCMHandler> fcm_handler)
-      : SharingService(/* sync_prefs= */ nullptr,
-                       /* vapid_key_manager= */ nullptr,
-                       std::make_unique<MockSharingDeviceRegistration>(),
-                       /* fcm_sender= */ nullptr,
-                       std::move(fcm_handler),
-                       /* gcm_driver= */ nullptr,
-                       /* device_info_tracker= */ nullptr,
-                       /* local_device_info_provider= */ nullptr,
-                       /* sync_service */ nullptr,
-                       /* notification_display_service= */ nullptr) {}
-
-  ~MockSharingService() override = default;
-
-  MOCK_CONST_METHOD1(
-      GetDeviceCandidates,
-      std::vector<std::unique_ptr<syncer::DeviceInfo>>(
-          sync_pb::SharingSpecificFields::EnabledFeatures required_feature));
-
-  MOCK_METHOD4(SendMessageToDevice,
-               void(const std::string& device_guid,
-                    base::TimeDelta time_to_live,
-                    chrome_browser_sharing::SharingMessage message,
-                    SharingService::SendMessageCallback callback));
-};
-
 class SharedClipboardUiControllerTest : public testing::Test {
  public:
   SharedClipboardUiControllerTest() = default;
@@ -90,8 +42,7 @@
     SharingServiceFactory::GetInstance()->SetTestingFactory(
         &profile_, base::BindRepeating([](content::BrowserContext* context)
                                            -> std::unique_ptr<KeyedService> {
-          return std::make_unique<testing::NiceMock<MockSharingService>>(
-              std::make_unique<SharingFCMHandler>(nullptr, nullptr, nullptr));
+          return std::make_unique<testing::NiceMock<MockSharingService>>();
         }));
     syncer::DeviceInfo device_info(kReceiverGuid, kReceiverName,
                                    "chrome_version", "user_agent",
diff --git a/chrome/browser/ssl/tls_deprecation_test_utils.cc b/chrome/browser/ssl/tls_deprecation_test_utils.cc
new file mode 100644
index 0000000..09d866be
--- /dev/null
+++ b/chrome/browser/ssl/tls_deprecation_test_utils.cc
@@ -0,0 +1,63 @@
+// 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/ssl/tls_deprecation_test_utils.h"
+
+#include "chrome/browser/ssl/tls_deprecation_config.h"
+#include "chrome/browser/ssl/tls_deprecation_config.pb.h"
+#include "content/public/test/navigation_simulator.h"
+#include "net/cert/x509_certificate.h"
+#include "net/ssl/ssl_config.h"
+#include "net/ssl/ssl_connection_status_flags.h"
+#include "net/ssl/ssl_info.h"
+#include "net/test/cert_test_util.h"
+#include "net/test/test_data_directory.h"
+#include "url/gurl.h"
+
+void InitializeEmptyLegacyTLSConfig() {
+  auto config =
+      std::make_unique<chrome_browser_ssl::LegacyTLSExperimentConfig>();
+  SetRemoteTLSDeprecationConfigProto(std::move(config));
+}
+
+void InitializeLegacyTLSConfigWithControl() {
+  auto config =
+      std::make_unique<chrome_browser_ssl::LegacyTLSExperimentConfig>();
+  config->add_control_site_hashes(kLegacyTlsControlUrlHash);
+  SetRemoteTLSDeprecationConfigProto(std::move(config));
+}
+
+std::unique_ptr<content::NavigationSimulator> CreateTLSNavigation(
+    const GURL& url,
+    content::WebContents* web_contents,
+    uint16_t ssl_protocol_version) {
+  auto navigation_simulator =
+      content::NavigationSimulator::CreateBrowserInitiated(url, web_contents);
+  navigation_simulator->Start();
+
+  // Setup the SSLInfo to specify the TLS version used.
+  auto cert =
+      net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem");
+  net::SSLInfo ssl_info = net::SSLInfo();
+  net::SSLConnectionStatusSetVersion(ssl_protocol_version,
+                                     &ssl_info.connection_status);
+  ssl_info.cert = cert;
+  navigation_simulator->SetSSLInfo(ssl_info);
+
+  return navigation_simulator;
+}
+
+std::unique_ptr<content::NavigationSimulator> CreateLegacyTLSNavigation(
+    const GURL& url,
+    content::WebContents* web_contents) {
+  return CreateTLSNavigation(url, web_contents,
+                             net::SSL_CONNECTION_VERSION_TLS1);
+}
+
+std::unique_ptr<content::NavigationSimulator> CreateNonlegacyTLSNavigation(
+    const GURL& url,
+    content::WebContents* web_contents) {
+  return CreateTLSNavigation(url, web_contents,
+                             net::SSL_CONNECTION_VERSION_TLS1_2);
+}
diff --git a/chrome/browser/ssl/tls_deprecation_test_utils.h b/chrome/browser/ssl/tls_deprecation_test_utils.h
new file mode 100644
index 0000000..22e93cc
--- /dev/null
+++ b/chrome/browser/ssl/tls_deprecation_test_utils.h
@@ -0,0 +1,46 @@
+// 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_SSL_TLS_DEPRECATION_TEST_UTILS_H_
+#define CHROME_BROWSER_SSL_TLS_DEPRECATION_TEST_UTILS_H_
+
+#include <memory>
+
+namespace content {
+class NavigationSimulator;
+class WebContents;
+}  // namespace content
+
+class GURL;
+
+const char kLegacyTLSDefaultURL[] = "https://example.test";
+const char kLegacyTLSControlURL[] = "https://control.test";
+// SHA-256 hash of kMockNonsecureHostname for use in setting a control site in
+// the LegacyTLSExperimentConfig for Legacy TLS tests. Generated with
+// `echo -n "control.test" | openssl sha256`.
+const char kLegacyTlsControlUrlHash[] =
+    "f12b47771bb3c2bcc85a5347d195523013ec5a23b4c761b5d6aacf04bafc5e23";
+
+void InitializeEmptyLegacyTLSConfig();
+
+void InitializeLegacyTLSConfigWithControl();
+
+// Creates and starts a simulated navigation using the specified SSL protocol
+// version (e.g., net::SSL_CONNECTION_VERSION_TLS1_2).
+std::unique_ptr<content::NavigationSimulator> CreateTLSNavigation(
+    const GURL& url,
+    content::WebContents* web_contents,
+    uint16_t ssl_protocol_version);
+
+// Creates and starts a simulated navigation using TLS 1.0.
+std::unique_ptr<content::NavigationSimulator> CreateLegacyTLSNavigation(
+    const GURL& url,
+    content::WebContents* web_contents);
+
+// Creates and starts a simulated navigation using TLS 1.2.
+std::unique_ptr<content::NavigationSimulator> CreateNonlegacyTLSNavigation(
+    const GURL& url,
+    content::WebContents* web_contents);
+
+#endif  // CHROME_BROWSER_SSL_TLS_DEPRECATION_TEST_UTILS_H_
diff --git a/chrome/browser/supervised_user/supervised_user_url_filter.cc b/chrome/browser/supervised_user/supervised_user_url_filter.cc
index 27a0a6f..c8e82f94 100644
--- a/chrome/browser/supervised_user/supervised_user_url_filter.cc
+++ b/chrome/browser/supervised_user/supervised_user_url_filter.cc
@@ -91,8 +91,7 @@
 
 // URL schemes not in this list (e.g., file:// and chrome://) will always be
 // allowed.
-const char* const kFilteredSchemes[] = {"http",   "https", "ftp",
-                                        "gopher", "ws",    "wss"};
+const char* const kFilteredSchemes[] = {"http", "https", "ftp", "ws", "wss"};
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 const char* const kCrxDownloadUrls[] = {
diff --git a/chrome/browser/supervised_user/supervised_user_url_filter_unittest.cc b/chrome/browser/supervised_user/supervised_user_url_filter_unittest.cc
index e149976a..64dbc8d 100644
--- a/chrome/browser/supervised_user/supervised_user_url_filter_unittest.cc
+++ b/chrome/browser/supervised_user/supervised_user_url_filter_unittest.cc
@@ -318,8 +318,6 @@
   EXPECT_TRUE(
       SupervisedUserURLFilter::HasFilteredScheme(GURL("ftp://example.com")));
   EXPECT_TRUE(
-      SupervisedUserURLFilter::HasFilteredScheme(GURL("gopher://example.com")));
-  EXPECT_TRUE(
       SupervisedUserURLFilter::HasFilteredScheme(GURL("ws://example.com")));
   EXPECT_TRUE(
       SupervisedUserURLFilter::HasFilteredScheme(GURL("wss://example.com")));
@@ -333,6 +331,8 @@
       SupervisedUserURLFilter::HasFilteredScheme(GURL("chrome://example.com")));
   EXPECT_FALSE(
       SupervisedUserURLFilter::HasFilteredScheme(GURL("wtf://example.com")));
+  EXPECT_FALSE(
+      SupervisedUserURLFilter::HasFilteredScheme(GURL("gopher://example.com")));
 }
 
 TEST_F(SupervisedUserURLFilterTest, HostMatchesPattern) {
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
index 053274e..05f27a9 100644
--- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
@@ -548,6 +548,15 @@
           features::kAutofillCreditCardUploadFeedback) &&
       previous_bubble_type == BubbleType::UPLOAD_SAVE) {
     current_bubble_type_ = BubbleType::UPLOAD_IN_PROGRESS;
+
+    // Log this metric here since for each bubble, the bubble state will only be
+    // changed to UPLOAD_IN_PROGRESS once. SaveCardIconView::Update is not
+    // guaranteed to be called only once so logging in any functions related to
+    // it is not reliable. Though bubble state change does not update the icon
+    // which is done in OnBubbleClosed, OnBubbleClosed ought to be called
+    // immediately after.
+    AutofillMetrics::LogCreditCardUploadFeedbackMetric(
+        AutofillMetrics::CREDIT_CARD_UPLOAD_FEEDBACK_LOADING_ANIMATION_SHOWN);
   }
 
   // If experiment |kAutofillCreditCardUploadFeedback| is enabled, there will be
@@ -824,7 +833,8 @@
     case BubbleType::SIGN_IN_PROMO:
       break;
     case BubbleType::FAILURE:
-      // TODO(crbug.com/964127): Add metrics.
+      AutofillMetrics::LogCreditCardUploadFeedbackMetric(
+          AutofillMetrics::CREDIT_CARD_UPLOAD_FEEDBACK_FAILURE_BUBBLE_SHOWN);
       break;
     case BubbleType::UPLOAD_IN_PROGRESS:
     case BubbleType::INACTIVE:
@@ -863,7 +873,8 @@
           GetSecurityLevel(), GetSyncState());
       break;
     case BubbleType::FAILURE:
-      // TODO(crbug.com/964127): Add metrics.
+      AutofillMetrics::LogCreditCardUploadFeedbackMetric(
+          AutofillMetrics::CREDIT_CARD_UPLOAD_FEEDBACK_FAILURE_ICON_SHOWN);
       break;
     case BubbleType::UPLOAD_IN_PROGRESS:
     case BubbleType::MANAGE_CARDS:
diff --git a/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc b/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc
index 56f6c99..4fbbcb6 100644
--- a/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc
+++ b/chrome/browser/ui/extensions/extension_action_view_controller_unittest.cc
@@ -23,7 +23,9 @@
 #include "chrome/browser/ui/toolbar/toolbar_actions_bar_unittest.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
+#include "content/public/browser/notification_service.h"
 #include "extensions/browser/extension_system.h"
+#include "extensions/browser/notification_types.h"
 #include "extensions/common/extension_builder.h"
 #include "extensions/common/user_script.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -256,6 +258,13 @@
   permissions_modifier.SetWithholdHostPermissions(true);
   ASSERT_EQ(1u, toolbar_actions_bar()->GetIconCount());
   const GURL kUrl("https://www.google.com/");
+
+  // Make sure UserScriptListener doesn't hold up the navigation.
+  content::NotificationService::current()->Notify(
+      extensions::NOTIFICATION_USER_SCRIPTS_UPDATED,
+      content::Source<Profile>(browser()->profile()),
+      content::NotificationService::NoDetails());
+
   AddTab(browser(), kUrl);
 
   enum class ActionState {
diff --git a/chrome/browser/ui/extensions/hosted_app_browser_controller.cc b/chrome/browser/ui/extensions/hosted_app_browser_controller.cc
index c88432d..7d0a1b48 100644
--- a/chrome/browser/ui/extensions/hosted_app_browser_controller.cc
+++ b/chrome/browser/ui/extensions/hosted_app_browser_controller.cc
@@ -110,82 +110,6 @@
   return true;
 }
 
-bool HostedAppBrowserController::ShouldShowCustomTabBar() const {
-  const Extension* extension = GetExtension();
-  if (!extension)
-    return false;
-
-  DCHECK(extension->is_hosted_app());
-
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-
-  if (!web_contents)
-    return false;
-
-  GURL launch_url = AppLaunchInfo::GetLaunchWebURL(extension);
-  base::StringPiece launch_scheme = launch_url.scheme_piece();
-
-  bool is_internal_launch_scheme = launch_scheme == kExtensionScheme ||
-                                   launch_scheme == content::kChromeUIScheme;
-
-  // The current page must be secure for us to hide the toolbar. However,
-  // the chrome-extension:// and chrome:// launch URL apps can hide the toolbar,
-  // if the current WebContents URLs are the same as the launch scheme.
-  //
-  // Note that the launch scheme may be insecure, but as long as the current
-  // page's scheme is secure, we can hide the toolbar.
-  base::StringPiece secure_page_scheme =
-      is_internal_launch_scheme ? launch_scheme : url::kHttpsScheme;
-
-  auto should_show_toolbar_for_url = [&](const GURL& url) -> bool {
-    // If the url is unset, it doesn't give a signal as to whether the toolbar
-    // should be shown or not. In lieu of more information, do not show the
-    // toolbar.
-    if (url.is_empty())
-      return false;
-
-    // Page URLs that are not within scope
-    // (https://www.w3.org/TR/appmanifest/#dfn-within-scope) of the app
-    // corresponding to |launch_url| show the toolbar.
-    bool out_of_scope = !IsUrlInAppScope(url);
-
-    if (url.scheme_piece() != secure_page_scheme) {
-      // Some origins are (such as localhost) are considered secure even when
-      // served over non-secure schemes. However, in order to hide the toolbar,
-      // the 'considered secure' origin must also be in the app's scope.
-      return out_of_scope || !InstallableManager::IsOriginConsideredSecure(url);
-    }
-
-    if (IsForSystemWebApp()) {
-      DCHECK_EQ(url.scheme_piece(), content::kChromeUIScheme);
-      return false;
-    }
-
-    return out_of_scope;
-  };
-
-  GURL visible_url = web_contents->GetVisibleURL();
-  GURL last_committed_url = web_contents->GetLastCommittedURL();
-
-  if (last_committed_url.is_empty() && visible_url.is_empty())
-    return should_show_toolbar_for_url(initial_url());
-
-  if (should_show_toolbar_for_url(visible_url) ||
-      should_show_toolbar_for_url(last_committed_url)) {
-    return true;
-  }
-
-  // Insecure external web sites show the toolbar.
-  // Note: IsContentSecure is false until a navigation is committed.
-  if (!last_committed_url.is_empty() && !is_internal_launch_scheme &&
-      !InstallableManager::IsContentSecure(web_contents)) {
-    return true;
-  }
-
-  return false;
-}
-
 gfx::ImageSkia HostedAppBrowserController::GetWindowAppIcon() const {
   // TODO(calamity): Use the app name to retrieve the app icon without using the
   // extensions tab helper to make icon load more immediate.
diff --git a/chrome/browser/ui/extensions/hosted_app_browser_controller.h b/chrome/browser/ui/extensions/hosted_app_browser_controller.h
index a642f8a..4e568b4 100644
--- a/chrome/browser/ui/extensions/hosted_app_browser_controller.h
+++ b/chrome/browser/ui/extensions/hosted_app_browser_controller.h
@@ -42,7 +42,6 @@
   // web_app::AppBrowserController:
   base::Optional<std::string> GetAppId() const override;
   bool CreatedForInstalledPwa() const override;
-  bool ShouldShowCustomTabBar() const override;
   gfx::ImageSkia GetWindowAppIcon() const override;
   gfx::ImageSkia GetWindowIcon() const override;
   base::Optional<SkColor> GetThemeColor() const override;
diff --git a/chrome/browser/ui/passwords/settings/password_access_authenticator.cc b/chrome/browser/ui/passwords/settings/password_access_authenticator.cc
index 8085247..0884dd0 100644
--- a/chrome/browser/ui/passwords/settings/password_access_authenticator.cc
+++ b/chrome/browser/ui/passwords/settings/password_access_authenticator.cc
@@ -6,12 +6,8 @@
 
 #include <utility>
 
-#include "base/callback.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task.h"
-#include "base/task/task_traits.h"
 #include "base/time/default_clock.h"
-#include "build/build_config.h"
 #include "components/password_manager/core/browser/password_manager_metrics_util.h"
 
 PasswordAccessAuthenticator::PasswordAccessAuthenticator(
@@ -23,44 +19,34 @@
 
 // TODO(crbug.com/327331): Trigger Re-Auth after closing and opening the
 // settings tab.
-void PasswordAccessAuthenticator::EnsureUserIsAuthenticatedAsync(
-    password_manager::ReauthPurpose purpose,
-    base::OnceCallback<void(bool)> postAuthCallback) {
-  const bool can_skip_reauth = CanSkipReauth();
+bool PasswordAccessAuthenticator::EnsureUserIsAuthenticated(
+    password_manager::ReauthPurpose purpose) {
+  const bool can_skip_reauth =
+      last_authentication_time_.has_value() &&
+      clock_->Now() - *last_authentication_time_ <=
+          base::TimeDelta::FromSeconds(kAuthValidityPeriodSeconds);
   if (can_skip_reauth) {
     UMA_HISTOGRAM_ENUMERATION(
         "PasswordManager.ReauthToAccessPasswordInSettings",
         password_manager::metrics_util::REAUTH_SKIPPED,
         password_manager::metrics_util::REAUTH_COUNT);
-    std::move(postAuthCallback).Run(can_skip_reauth);
-    return;
+    return true;
   }
 
-  ForceUserReauthenticationAsync(purpose, std::move(postAuthCallback));
+  return ForceUserReauthentication(purpose);
 }
 
-void PasswordAccessAuthenticator::ForceUserReauthenticationAsync(
-    password_manager::ReauthPurpose purpose,
-    base::OnceCallback<void(bool)> postAuthCallback) {
-#if defined(OS_WIN)
-  // In Windows it is possible to move OS authentication to separate thread.
-  ReauthCallback os_reauth_call(os_reauth_call_);
-  base::PostTaskAndReplyWithResult(
-      FROM_HERE,
-      {base::ThreadPool(), base::TaskPriority::USER_VISIBLE, base::MayBlock(),
-       base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
-      base::BindOnce(std::move(os_reauth_call), purpose),
-      base::BindOnce(
-          &PasswordAccessAuthenticator::ProcessReauthenticationResult,
-          weak_ptr_factory_.GetWeakPtr(), purpose,
-          std::move(postAuthCallback)));
-#else
-  // For MAC OS, user input to a process is pulled in by OS prompt,
-  // if OS prompt is in open state.
+bool PasswordAccessAuthenticator::ForceUserReauthentication(
+    password_manager::ReauthPurpose purpose) {
   bool authenticated = os_reauth_call_.Run(purpose);
-  ProcessReauthenticationResult(purpose, std::move(postAuthCallback),
-                                authenticated);
-#endif  // OS_WIN
+  if (authenticated)
+    last_authentication_time_ = clock_->Now();
+  UMA_HISTOGRAM_ENUMERATION(
+      "PasswordManager.ReauthToAccessPasswordInSettings",
+      authenticated ? password_manager::metrics_util::REAUTH_SUCCESS
+                    : password_manager::metrics_util::REAUTH_FAILURE,
+      password_manager::metrics_util::REAUTH_COUNT);
+  return authenticated;
 }
 
 void PasswordAccessAuthenticator::SetOsReauthCallForTesting(
@@ -71,24 +57,3 @@
 void PasswordAccessAuthenticator::SetClockForTesting(base::Clock* clock) {
   clock_ = clock;
 }
-
-bool PasswordAccessAuthenticator::CanSkipReauth() const {
-  return last_authentication_time_.has_value() &&
-         clock_->Now() - *last_authentication_time_ <=
-             base::TimeDelta::FromSeconds(kAuthValidityPeriodSeconds);
-}
-
-void PasswordAccessAuthenticator::ProcessReauthenticationResult(
-    password_manager::ReauthPurpose purpose,
-    base::OnceCallback<void(bool)> postAuthCallback,
-    bool authenticated) {
-  if (authenticated)
-    last_authentication_time_ = clock_->Now();
-  UMA_HISTOGRAM_ENUMERATION(
-      "PasswordManager.ReauthToAccessPasswordInSettings",
-      authenticated ? password_manager::metrics_util::REAUTH_SUCCESS
-                    : password_manager::metrics_util::REAUTH_FAILURE,
-      password_manager::metrics_util::REAUTH_COUNT);
-
-  std::move(postAuthCallback).Run(authenticated);
-}
diff --git a/chrome/browser/ui/passwords/settings/password_access_authenticator.h b/chrome/browser/ui/passwords/settings/password_access_authenticator.h
index c86a535..68a06da2 100644
--- a/chrome/browser/ui/passwords/settings/password_access_authenticator.h
+++ b/chrome/browser/ui/passwords/settings/password_access_authenticator.h
@@ -9,7 +9,6 @@
 
 #include "base/callback.h"
 #include "base/macros.h"
-#include "base/memory/weak_ptr.h"
 #include "base/optional.h"
 #include "base/time/clock.h"
 #include "base/time/time.h"
@@ -36,23 +35,16 @@
 
   ~PasswordAccessAuthenticator();
 
-  // Checks whether user is already authenticated or not, if yes,
-  // execute |postAuthCallback|. Otherwise call
-  // |ForceUserReauthenticationAsync| function for presenting OS
-  // authentication challenge.
-  // This function and |postAuthCallback| callback should be executed
-  // on main thread only.
-  void EnsureUserIsAuthenticatedAsync(
-      password_manager::ReauthPurpose purpose,
-      base::OnceCallback<void(bool)> postAuthCallback);
+  // Returns whether the user is able to pass the authentication challenge,
+  // which is represented by |os_reauth_call_| returning true. A successful
+  // result of |os_reauth_call_| is cached for |kAuthValidityPeriodSeconds|
+  // seconds.
+  bool EnsureUserIsAuthenticated(password_manager::ReauthPurpose purpose);
 
-  // Presents the authentication challenge to the user on the
-  // background thread for Windows, and on UI thread for other platforms.
-  // This call is guaranteed to present the challenge to the user.
-  // This function should be executed on main thread only.
-  void ForceUserReauthenticationAsync(
-      password_manager::ReauthPurpose purpose,
-      base::OnceCallback<void(bool)> postAuthCallback);
+  // Presents the reauthentication challenge to the user and returns whether
+  // the user passed the challenge. This call is guaranteed to present the
+  // challenge to the user.
+  bool ForceUserReauthentication(password_manager::ReauthPurpose purpose);
 
   // Use this in tests to mock the OS-level reauthentication.
   void SetOsReauthCallForTesting(ReauthCallback os_reauth_call);
@@ -61,19 +53,6 @@
   void SetClockForTesting(base::Clock* clock);
 
  private:
-  // Returns whether the user can skip Reauth, based on
-  // |last_authentication_time_| and |kAuthValidityPeriodSeconds|
-  bool CanSkipReauth() const;
-
-  // This function will be called on main thread and it will run
-  // |postAuthCallback| on main thread.
-  // A successful result of |os_reauth_call_| is cached for
-  // |kAuthValidityPeriodSeconds| seconds.
-  void ProcessReauthenticationResult(
-      password_manager::ReauthPurpose purpose,
-      base::OnceCallback<void(bool)> postAuthCallback,
-      bool authenticated);
-
   // The last time the user was successfully authenticated.
   base::Optional<base::Time> last_authentication_time_;
 
@@ -84,9 +63,6 @@
   // prompt) to the user.
   ReauthCallback os_reauth_call_;
 
-  // Weak pointers for different callbacks.
-  base::WeakPtrFactory<PasswordAccessAuthenticator> weak_ptr_factory_{this};
-
   DISALLOW_COPY_AND_ASSIGN(PasswordAccessAuthenticator);
 };
 
diff --git a/chrome/browser/ui/passwords/settings/password_access_authenticator_unittest.cc b/chrome/browser/ui/passwords/settings/password_access_authenticator_unittest.cc
index 24bd940..ea1e203 100644
--- a/chrome/browser/ui/passwords/settings/password_access_authenticator_unittest.cc
+++ b/chrome/browser/ui/passwords/settings/password_access_authenticator_unittest.cc
@@ -7,10 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
-#include "base/test/mock_callback.h"
 #include "base/test/simple_test_clock.h"
-#include "base/test/task_environment.h"
-#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using ::testing::TestWithParam;
@@ -18,9 +15,6 @@
 
 namespace {
 
-// Callback to be executed post os authentication.
-using PostAuthCallback = base::OnceCallback<void(bool)>;
-
 enum class ReauthResult { PASS, FAIL };
 bool FakeOsReauthCall(bool* reauth_called,
                       ReauthResult result,
@@ -38,11 +32,7 @@
   ~PasswordAccessAuthenticatorTest() = default;
 
  protected:
-  base::test::TaskEnvironment& task_env() { return task_env_; }
   password_manager::ReauthPurpose purpose_;
-
- private:
-  base::test::TaskEnvironment task_env_;
 };
 
 // Check that a passed authentication does not expire before
@@ -58,27 +48,20 @@
       &FakeOsReauthCall, &reauth_called, ReauthResult::PASS));
   authenticator.SetClockForTesting(&clock);
 
-  base::MockCallback<PostAuthCallback> callback;
-  EXPECT_CALL(callback, Run(true));
-  authenticator.EnsureUserIsAuthenticatedAsync(purpose_, callback.Get());
-  task_env().RunUntilIdle();
+  EXPECT_TRUE(authenticator.EnsureUserIsAuthenticated(purpose_));
   EXPECT_TRUE(reauth_called);
 
   clock.Advance(base::TimeDelta::FromSeconds(
       PasswordAccessAuthenticator::kAuthValidityPeriodSeconds - 1));
   reauth_called = false;
 
-  EXPECT_CALL(callback, Run(true));
-  authenticator.EnsureUserIsAuthenticatedAsync(purpose_, callback.Get());
-  task_env().RunUntilIdle();
+  EXPECT_TRUE(authenticator.EnsureUserIsAuthenticated(purpose_));
   EXPECT_FALSE(reauth_called);
 
   clock.Advance(base::TimeDelta::FromSeconds(2));
   reauth_called = false;
 
-  EXPECT_CALL(callback, Run(true));
-  authenticator.EnsureUserIsAuthenticatedAsync(purpose_, callback.Get());
-  task_env().RunUntilIdle();
+  EXPECT_TRUE(authenticator.EnsureUserIsAuthenticated(purpose_));
   EXPECT_TRUE(reauth_called);
 }
 
@@ -93,19 +76,14 @@
       &FakeOsReauthCall, &reauth_called, ReauthResult::PASS));
   authenticator.SetClockForTesting(&clock);
 
-  base::MockCallback<PostAuthCallback> callback;
-  EXPECT_CALL(callback, Run(true));
-  authenticator.EnsureUserIsAuthenticatedAsync(purpose_, callback.Get());
-  task_env().RunUntilIdle();
+  EXPECT_TRUE(authenticator.EnsureUserIsAuthenticated(purpose_));
   EXPECT_TRUE(reauth_called);
 
   clock.Advance(base::TimeDelta::FromSeconds(
-      PasswordAccessAuthenticator::kAuthValidityPeriodSeconds + 1));
+      PasswordAccessAuthenticator::kAuthValidityPeriodSeconds - 1));
   reauth_called = false;
 
-  EXPECT_CALL(callback, Run(true));
-  authenticator.EnsureUserIsAuthenticatedAsync(purpose_, callback.Get());
-  task_env().RunUntilIdle();
+  EXPECT_TRUE(authenticator.ForceUserReauthentication(purpose_));
   EXPECT_TRUE(reauth_called);
 }
 
@@ -121,10 +99,7 @@
       &FakeOsReauthCall, &reauth_called, ReauthResult::FAIL));
   authenticator.SetClockForTesting(&clock);
 
-  base::MockCallback<PostAuthCallback> callback;
-  EXPECT_CALL(callback, Run(false));
-  authenticator.EnsureUserIsAuthenticatedAsync(purpose_, callback.Get());
-  task_env().RunUntilIdle();
+  EXPECT_FALSE(authenticator.EnsureUserIsAuthenticated(purpose_));
   EXPECT_TRUE(reauth_called);
 
   // Advance just a little bit, so that if |authenticator| starts the grace
@@ -132,9 +107,7 @@
   clock.Advance(base::TimeDelta::FromSeconds(1));
   reauth_called = false;
 
-  EXPECT_CALL(callback, Run(false));
-  authenticator.EnsureUserIsAuthenticatedAsync(purpose_, callback.Get());
-  task_env().RunUntilIdle();
+  EXPECT_FALSE(authenticator.EnsureUserIsAuthenticated(purpose_));
   EXPECT_TRUE(reauth_called);
 }
 
@@ -151,10 +124,7 @@
       &FakeOsReauthCall, &reauth_called, ReauthResult::PASS));
   authenticator.SetClockForTesting(&clock);
 
-  base::MockCallback<PostAuthCallback> callback;
-  EXPECT_CALL(callback, Run(true));
-  authenticator.EnsureUserIsAuthenticatedAsync(purpose_, callback.Get());
-  task_env().RunUntilIdle();
+  EXPECT_TRUE(authenticator.EnsureUserIsAuthenticated(purpose_));
   EXPECT_TRUE(reauth_called);
 }
 
diff --git a/chrome/browser/ui/thumbnails/thumbnail_tab_helper.cc b/chrome/browser/ui/thumbnails/thumbnail_tab_helper.cc
index 45d91f1..4fe559e 100644
--- a/chrome/browser/ui/thumbnails/thumbnail_tab_helper.cc
+++ b/chrome/browser/ui/thumbnails/thumbnail_tab_helper.cc
@@ -254,7 +254,8 @@
     base::ReadOnlySharedMemoryMapping mapping;
     // Prevents FrameSinkVideoCapturer from recycling the shared memory that
     // backs |frame_|.
-    mojo::Remote<viz::mojom::FrameSinkVideoConsumerFrameCallbacks> releaser;
+    mojo::PendingRemote<viz::mojom::FrameSinkVideoConsumerFrameCallbacks>
+        releaser;
   };
 
   content::RenderWidgetHostView* const source_view = GetView();
@@ -289,7 +290,7 @@
       [](void* addr, void* context) {
         delete static_cast<FramePinner*>(context);
       },
-      new FramePinner{std::move(mapping), std::move(callbacks_remote)});
+      new FramePinner{std::move(mapping), callbacks_remote.Unbind()});
   frame.setImmutable();
 
   SkBitmap cropped_frame;
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
index a78cfa7..418e2fd 100644
--- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
@@ -2820,9 +2820,11 @@
 }
 
 // Ensures the card saving throbber animation in the status chip behaves
-// correctly during credit card upload process.
+// correctly during credit card upload process. Also ensures the credit card
+// icon goes away when upload succeeds.
 IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTestForStatusChip,
-                       Feedback_CardSavingAnimation) {
+                       Feedback_Success) {
+  base::HistogramTester histogram_tester;
   // Start sync.
   harness_->SetupSync();
 
@@ -2848,9 +2850,88 @@
                                DialogEvent::SHOW_CARD_SAVED_FEEDBACK});
   WaitForObservedEvent();
 
-  // Ensures the animation should not be animating.
+  // Ensures icon is not visible.
+  EXPECT_FALSE(GetSaveCardIconView()->GetVisible());
+
+  // UMA should have been logged.
+  histogram_tester.ExpectTotalCount("Autofill.CreditCardUploadFeedback", 1);
+  histogram_tester.ExpectBucketCount(
+      "Autofill.CreditCardUploadFeedback",
+      AutofillMetrics::CREDIT_CARD_UPLOAD_FEEDBACK_LOADING_ANIMATION_SHOWN, 1);
+  histogram_tester.ExpectBucketCount(
+      "Autofill.CreditCardUploadFeedback",
+      AutofillMetrics::CREDIT_CARD_UPLOAD_FEEDBACK_FAILURE_ICON_SHOWN, 0);
+  histogram_tester.ExpectBucketCount(
+      "Autofill.CreditCardUploadFeedback",
+      AutofillMetrics::CREDIT_CARD_UPLOAD_FEEDBACK_FAILURE_BUBBLE_SHOWN, 0);
+}
+
+// Ensures the card saving throbber animation in the status chip behaves
+// correctly during credit card upload process. Also ensures the credit card
+// icon and the save card failure bubble behave correctly when upload failed.
+IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTestForStatusChip,
+                       Feedback_Failure) {
+  base::HistogramTester histogram_tester;
+  // Start sync.
+  harness_->SetupSync();
+
+  FillForm();
+  SubmitFormAndWaitForCardUploadSaveBubble();
+
+  // Ensures icon is visible and animation is not.
+  EXPECT_TRUE(GetSaveCardIconView()->GetVisible());
   EXPECT_FALSE(
       GetSaveCardIconView()->loading_indicator_for_testing()->IsAnimating());
+
+  ResetEventWaiterForSequence({DialogEvent::SENT_UPLOAD_CARD_REQUEST});
+  ClickOnDialogViewWithIdAndWait(DialogViewId::OK_BUTTON);
+  WaitForObservedEvent();
+
+  // Ensures icon and the animation are visible.
+  EXPECT_TRUE(GetSaveCardIconView()->GetVisible());
+  EXPECT_TRUE(
+      GetSaveCardIconView()->loading_indicator_for_testing()->IsAnimating());
+
+  SetUploadCardRpcPaymentsFails();
+  ResetEventWaiterForSequence({DialogEvent::RECEIVED_UPLOAD_CARD_RESPONSE,
+                               DialogEvent::STRIKE_CHANGE_COMPLETE,
+                               DialogEvent::SHOW_CARD_SAVED_FEEDBACK});
+  WaitForObservedEvent();
+
+  // Ensures icon is visible and the animation is not animating.
+  EXPECT_TRUE(GetSaveCardIconView()->GetVisible());
+  EXPECT_FALSE(
+      GetSaveCardIconView()->loading_indicator_for_testing()->IsAnimating());
+
+  // UMA should have been logged.
+  histogram_tester.ExpectTotalCount("Autofill.CreditCardUploadFeedback", 2);
+  histogram_tester.ExpectBucketCount(
+      "Autofill.CreditCardUploadFeedback",
+      AutofillMetrics::CREDIT_CARD_UPLOAD_FEEDBACK_LOADING_ANIMATION_SHOWN, 1);
+  histogram_tester.ExpectBucketCount(
+      "Autofill.CreditCardUploadFeedback",
+      AutofillMetrics::CREDIT_CARD_UPLOAD_FEEDBACK_FAILURE_ICON_SHOWN, 1);
+  histogram_tester.ExpectBucketCount(
+      "Autofill.CreditCardUploadFeedback",
+      AutofillMetrics::CREDIT_CARD_UPLOAD_FEEDBACK_FAILURE_BUBBLE_SHOWN, 0);
+
+  // Click on the icon.
+  AddEventObserverToController();
+  ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN});
+  ClickOnView(GetSaveCardIconView());
+  WaitForObservedEvent();
+
+  // UMA should have been logged.
+  histogram_tester.ExpectTotalCount("Autofill.CreditCardUploadFeedback", 3);
+  histogram_tester.ExpectBucketCount(
+      "Autofill.CreditCardUploadFeedback",
+      AutofillMetrics::CREDIT_CARD_UPLOAD_FEEDBACK_LOADING_ANIMATION_SHOWN, 1);
+  histogram_tester.ExpectBucketCount(
+      "Autofill.CreditCardUploadFeedback",
+      AutofillMetrics::CREDIT_CARD_UPLOAD_FEEDBACK_FAILURE_ICON_SHOWN, 1);
+  histogram_tester.ExpectBucketCount(
+      "Autofill.CreditCardUploadFeedback",
+      AutofillMetrics::CREDIT_CARD_UPLOAD_FEEDBACK_FAILURE_BUBBLE_SHOWN, 1);
 }
 
 // Tests the sign in promo bubble. Ensures that clicking the [Save] button
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
index 047390e..7c4edd36 100644
--- a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
+++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
@@ -247,10 +247,16 @@
       scroll_view_(nullptr),
       handled_result_(false),
       install_button_enabled_(false) {
+  DCHECK(prompt_->extension());
+
   DialogDelegate::set_default_button(ui::DIALOG_BUTTON_CANCEL);
   DialogDelegate::set_draggable(true);
   if (prompt_->has_webstore_data())
     DialogDelegate::SetExtraView(CreatePromptLink(this));
+  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_OK,
+                                   prompt_->GetAcceptButtonLabel());
+  DialogDelegate::set_button_label(ui::DIALOG_BUTTON_CANCEL,
+                                   prompt_->GetAbortButtonLabel());
   set_close_on_deactivate(false);
   CreateContents();
 
@@ -404,19 +410,6 @@
   return buttons;
 }
 
-base::string16 ExtensionInstallDialogView::GetDialogButtonLabel(
-    ui::DialogButton button) const {
-  switch (button) {
-    case ui::DIALOG_BUTTON_OK:
-      return prompt_->GetAcceptButtonLabel();
-    case ui::DIALOG_BUTTON_CANCEL:
-      return prompt_->GetAbortButtonLabel();
-    default:
-      NOTREACHED();
-      return base::string16();
-  }
-}
-
 bool ExtensionInstallDialogView::IsDialogButtonEnabled(
     ui::DialogButton button) const {
   if (button == ui::DIALOG_BUTTON_OK)
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view.h b/chrome/browser/ui/views/extensions/extension_install_dialog_view.h
index c1101de..8679a34 100644
--- a/chrome/browser/ui/views/extensions/extension_install_dialog_view.h
+++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view.h
@@ -60,7 +60,6 @@
   bool Cancel() override;
   bool Accept() override;
   int GetDialogButtons() const override;
-  base::string16 GetDialogButtonLabel(ui::DialogButton button) const override;
   bool IsDialogButtonEnabled(ui::DialogButton button) const override;
   bool ShouldShowCloseButton() const override;
 
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc
index be1a0139..e307893 100644
--- a/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc
+++ b/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc
@@ -45,8 +45,10 @@
     https_server_.AddDefaultHandlers(GetChromeTestDataDir());
     ASSERT_TRUE(https_server_.Start());
 
+    const GURL app_url = GetAppUrl();
     auto web_app_info = std::make_unique<WebApplicationInfo>();
-    web_app_info->app_url = GetAppUrl();
+    web_app_info->app_url = app_url;
+    web_app_info->scope = app_url.GetWithoutFilename();
     web_app_info->theme_color = SK_ColorBLUE;
 
     app_id = InstallWebApp(std::move(web_app_info));
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
index 3fe98f6..9a7415e 100644
--- a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
+++ b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
@@ -132,14 +132,6 @@
     text_->SetVisible(true);
     text_->SetText(
         l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_NOT_WORKING_DESCRIPTION));
-  } else if (intermediate_step_ == IntermediateStep::kBlockingIsOn) {
-    header_view_->SetVisible(true);
-    header_view_->SetImage(
-        ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
-            IDR_COOKIE_BLOCKING_ON_HEADER));
-    text_->SetVisible(true);
-    text_->SetText(
-        l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE));
   } else if (status_ == CookieControlsController::Status::kEnabled) {
     header_view_->SetVisible(true);
     header_view_->SetImage(
@@ -232,8 +224,6 @@
   switch (intermediate_step_) {
     case IntermediateStep::kTurnOffButton:
       return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_NOT_WORKING_TITLE);
-    case IntermediateStep::kBlockingIsOn:
-      return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_TURNED_ON_TITLE);
     case IntermediateStep::kNone: {
       // Determine title based on status_ instead.
     }
@@ -278,10 +268,9 @@
     DCHECK_EQ(status_, CookieControlsController::Status::kDisabledForSite);
     DCHECK_EQ(intermediate_step_, IntermediateStep::kNone);
     base::RecordAction(UserMetricsAction("CookieControls.Bubble.TurnOn"));
-    intermediate_step_ = IntermediateStep::kBlockingIsOn;
     controller_->OnCookieBlockingEnabledForSite(true);
   }
-  return false;
+  return true;
 }
 
 bool CookieControlsBubbleView::Close() {
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h
index 9d9d14f..1eaad6b 100644
--- a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h
+++ b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h
@@ -47,8 +47,6 @@
     kNone,
     // Show a button to disable cookie blocking on the current site.
     kTurnOffButton,
-    // Show a confirmation that cookie blocking was turned on.
-    kBlockingIsOn,
   };
 
   CookieControlsBubbleView(views::View* anchor_view,
diff --git a/chrome/browser/ui/views/location_bar/custom_tab_bar_view_browsertest.cc b/chrome/browser/ui/views/location_bar/custom_tab_bar_view_browsertest.cc
index f9308ba..7375fce 100644
--- a/chrome/browser/ui/views/location_bar/custom_tab_bar_view_browsertest.cc
+++ b/chrome/browser/ui/views/location_bar/custom_tab_bar_view_browsertest.cc
@@ -213,6 +213,7 @@
   void InstallBookmark(const GURL& app_url) {
     auto web_app_info = std::make_unique<WebApplicationInfo>();
     web_app_info->app_url = app_url;
+    web_app_info->scope = app_url.GetOrigin();
     web_app_info->open_as_window = true;
     Install(std::move(web_app_info));
   }
@@ -676,8 +677,10 @@
       app_view->toolbar()->custom_tab_bar()->IsShowingOriginForTesting());
 }
 
-// TODO(crbug.com/966290): Support kUnifiedControllerWithWebApp/BookmarkApp
 INSTANTIATE_TEST_SUITE_P(
     /* no prefix */,
     CustomTabBarViewBrowserTest,
-    ::testing::Values(web_app::ControllerType::kHostedAppController));
+    ::testing::Values(
+        web_app::ControllerType::kHostedAppController,
+        web_app::ControllerType::kUnifiedControllerWithBookmarkApp,
+        web_app::ControllerType::kUnifiedControllerWithWebApp));
diff --git a/chrome/browser/ui/web_applications/app_browser_controller.cc b/chrome/browser/ui/web_applications/app_browser_controller.cc
index b031d27..f46248b 100644
--- a/chrome/browser/ui/web_applications/app_browser_controller.cc
+++ b/chrome/browser/ui/web_applications/app_browser_controller.cc
@@ -5,6 +5,8 @@
 #include "chrome/browser/ui/web_applications/app_browser_controller.h"
 
 #include "base/feature_list.h"
+#include "base/strings/string_piece.h"
+#include "chrome/browser/installable/installable_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ssl/security_state_tab_helper.h"
 #include "chrome/browser/ui/browser.h"
@@ -25,7 +27,9 @@
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/common/url_constants.h"
 #include "extensions/browser/extension_registry.h"
+#include "extensions/common/constants.h"
 #include "net/base/escape.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/gfx/favicon_size.h"
@@ -91,6 +95,80 @@
   return false;
 }
 
+bool AppBrowserController::ShouldShowCustomTabBar() const {
+  if (!IsInstalled())
+    return false;
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+
+  if (!web_contents)
+    return false;
+
+  GURL launch_url = GetAppLaunchURL();
+  base::StringPiece launch_scheme = launch_url.scheme_piece();
+
+  bool is_internal_launch_scheme =
+      launch_scheme == extensions::kExtensionScheme ||
+      launch_scheme == content::kChromeUIScheme;
+
+  // The current page must be secure for us to hide the toolbar. However,
+  // chrome:// launch URL apps can hide the toolbar,
+  // if the current WebContents URLs are the same as the launch scheme.
+  //
+  // Note that the launch scheme may be insecure, but as long as the current
+  // page's scheme is secure, we can hide the toolbar.
+  base::StringPiece secure_page_scheme =
+      is_internal_launch_scheme ? launch_scheme : url::kHttpsScheme;
+
+  auto should_show_toolbar_for_url = [&](const GURL& url) -> bool {
+    // If the url is unset, it doesn't give a signal as to whether the toolbar
+    // should be shown or not. In lieu of more information, do not show the
+    // toolbar.
+    if (url.is_empty())
+      return false;
+
+    // Page URLs that are not within scope
+    // (https://www.w3.org/TR/appmanifest/#dfn-within-scope) of the app
+    // corresponding to |launch_url| show the toolbar.
+    bool out_of_scope = !IsUrlInAppScope(url);
+
+    if (url.scheme_piece() != secure_page_scheme) {
+      // Some origins are (such as localhost) are considered secure even when
+      // served over non-secure schemes. However, in order to hide the toolbar,
+      // the 'considered secure' origin must also be in the app's scope.
+      return out_of_scope || !InstallableManager::IsOriginConsideredSecure(url);
+    }
+
+    if (IsForSystemWebApp()) {
+      DCHECK_EQ(url.scheme_piece(), content::kChromeUIScheme);
+      return false;
+    }
+
+    return out_of_scope;
+  };
+
+  GURL visible_url = web_contents->GetVisibleURL();
+  GURL last_committed_url = web_contents->GetLastCommittedURL();
+
+  if (last_committed_url.is_empty() && visible_url.is_empty())
+    return should_show_toolbar_for_url(initial_url());
+
+  if (should_show_toolbar_for_url(visible_url) ||
+      should_show_toolbar_for_url(last_committed_url)) {
+    return true;
+  }
+
+  // Insecure external web sites show the toolbar.
+  // Note: IsContentSecure is false until a navigation is committed.
+  if (!last_committed_url.is_empty() && !is_internal_launch_scheme &&
+      !InstallableManager::IsContentSecure(web_contents)) {
+    return true;
+  }
+
+  return false;
+}
+
 bool AppBrowserController::HasTabStrip() const {
   // Show tabs for Terminal only.
   // TODO(crbug.com/846546): Generalise this as a SystemWebApp capability.
diff --git a/chrome/browser/ui/web_applications/app_browser_controller.h b/chrome/browser/ui/web_applications/app_browser_controller.h
index 5e75e43..2788a1a 100644
--- a/chrome/browser/ui/web_applications/app_browser_controller.h
+++ b/chrome/browser/ui/web_applications/app_browser_controller.h
@@ -54,7 +54,7 @@
   virtual bool CreatedForInstalledPwa() const;
 
   // Whether the custom tab bar should be visible.
-  virtual bool ShouldShowCustomTabBar() const = 0;
+  virtual bool ShouldShowCustomTabBar() const;
 
   // Whether the browser should include the tab strip.
   virtual bool HasTabStrip() const;
diff --git a/chrome/browser/ui/web_applications/web_app_browser_controller.cc b/chrome/browser/ui/web_applications/web_app_browser_controller.cc
index 075f673..342a7ab 100644
--- a/chrome/browser/ui/web_applications/web_app_browser_controller.cc
+++ b/chrome/browser/ui/web_applications/web_app_browser_controller.cc
@@ -11,6 +11,7 @@
 #include "chrome/browser/web_applications/components/app_icon_manager.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
+#include "content/public/browser/web_contents.h"
 #include "ui/gfx/favicon_size.h"
 #include "ui/gfx/image/image.h"
 #include "url/gurl.h"
@@ -41,11 +42,6 @@
   callback_for_testing_ = std::move(callback);
 }
 
-bool WebAppBrowserController::ShouldShowCustomTabBar() const {
-  // TODO(https://crbug.com/966290): Complete implementation.
-  return false;
-}
-
 gfx::ImageSkia WebAppBrowserController::GetWindowAppIcon() const {
   if (app_icon_)
     return *app_icon_;
diff --git a/chrome/browser/ui/web_applications/web_app_browser_controller.h b/chrome/browser/ui/web_applications/web_app_browser_controller.h
index 0e8596ea..505d58d 100644
--- a/chrome/browser/ui/web_applications/web_app_browser_controller.h
+++ b/chrome/browser/ui/web_applications/web_app_browser_controller.h
@@ -39,7 +39,6 @@
   // AppBrowserController:
   base::Optional<AppId> GetAppId() const override;
   bool CreatedForInstalledPwa() const override;
-  bool ShouldShowCustomTabBar() const override;
   gfx::ImageSkia GetWindowAppIcon() const override;
   gfx::ImageSkia GetWindowIcon() const override;
   base::Optional<SkColor> GetThemeColor() const override;
diff --git a/chrome/browser/web_applications/components/BUILD.gn b/chrome/browser/web_applications/components/BUILD.gn
index f91bf3ca..6eca45e9 100644
--- a/chrome/browser/web_applications/components/BUILD.gn
+++ b/chrome/browser/web_applications/components/BUILD.gn
@@ -13,6 +13,7 @@
     "app_registry_controller.h",
     "app_shortcut_manager.cc",
     "app_shortcut_manager.h",
+    "app_shortcut_observer.h",
     "external_install_options.cc",
     "external_install_options.h",
     "externally_installed_web_app_prefs.cc",
@@ -111,6 +112,7 @@
   testonly = true
 
   sources = [
+    "app_shortcut_manager_unittest.cc",
     "file_handler_manager_unittest.cc",
     "pending_app_manager_unittest.cc",
     "web_app_data_retriever_unittest.cc",
diff --git a/chrome/browser/web_applications/components/app_shortcut_manager.cc b/chrome/browser/web_applications/components/app_shortcut_manager.cc
index 57380c0a..9bf3898 100644
--- a/chrome/browser/web_applications/components/app_shortcut_manager.cc
+++ b/chrome/browser/web_applications/components/app_shortcut_manager.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/web_applications/components/app_shortcut_manager.h"
 
 #include "base/callback.h"
+#include "chrome/browser/web_applications/components/app_shortcut_observer.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 
@@ -37,6 +38,14 @@
   registrar_ = registrar;
 }
 
+void AppShortcutManager::AddObserver(AppShortcutObserver* observer) {
+  observers_.AddObserver(observer);
+}
+
+void AppShortcutManager::RemoveObserver(AppShortcutObserver* observer) {
+  observers_.RemoveObserver(observer);
+}
+
 bool AppShortcutManager::CanCreateShortcuts() const {
 #if defined(OS_CHROMEOS)
   return false;
@@ -48,10 +57,25 @@
 void AppShortcutManager::CreateShortcuts(const AppId& app_id,
                                          bool add_to_desktop,
                                          CreateShortcutsCallback callback) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(CanCreateShortcuts());
-  GetShortcutInfoForApp(app_id,
-                        base::BindOnce(&OnShortcutInfoRetrievedCreateShortcuts,
-                                       add_to_desktop, std::move(callback)));
+  GetShortcutInfoForApp(
+      app_id,
+      base::BindOnce(&OnShortcutInfoRetrievedCreateShortcuts, add_to_desktop,
+                     base::BindOnce(&AppShortcutManager::OnShortcutsCreated,
+                                    weak_ptr_factory_.GetWeakPtr(), app_id,
+                                    std::move(callback))));
+}
+
+void AppShortcutManager::OnShortcutsCreated(const AppId& app_id,
+                                            CreateShortcutsCallback callback,
+                                            bool success) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  if (success) {
+    for (auto& observer : observers_)
+      observer.OnShortcutsCreated(app_id);
+  }
+  std::move(callback).Run(success);
 }
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/components/app_shortcut_manager.h b/chrome/browser/web_applications/components/app_shortcut_manager.h
index 78f9623..4b6cfda 100644
--- a/chrome/browser/web_applications/components/app_shortcut_manager.h
+++ b/chrome/browser/web_applications/components/app_shortcut_manager.h
@@ -9,6 +9,8 @@
 
 #include "base/callback_forward.h"
 #include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/observer_list.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/browser/web_applications/components/web_app_shortcut.h"
 
@@ -17,6 +19,7 @@
 namespace web_app {
 
 class AppRegistrar;
+class AppShortcutObserver;
 struct ShortcutInfo;
 
 // TODO(crbug.com/860581): Migrate functions from
@@ -31,6 +34,9 @@
 
   void SetSubsystems(AppRegistrar* registrar);
 
+  void AddObserver(AppShortcutObserver* observer);
+  void RemoveObserver(AppShortcutObserver* observer);
+
   // virtual for testing.
   virtual bool CanCreateShortcuts() const;
 
@@ -48,6 +54,10 @@
                                      GetShortcutInfoCallback callback) = 0;
 
  protected:
+  void OnShortcutsCreated(const AppId& app_id,
+                          CreateShortcutsCallback callback,
+                          bool success);
+
   AppRegistrar* registrar() { return registrar_; }
   Profile* profile() { return profile_; }
 
@@ -55,6 +65,10 @@
   AppRegistrar* registrar_ = nullptr;
   Profile* const profile_;
 
+  base::ObserverList<AppShortcutObserver, /*check_empty=*/true> observers_;
+
+  base::WeakPtrFactory<AppShortcutManager> weak_ptr_factory_{this};
+
   DISALLOW_COPY_AND_ASSIGN(AppShortcutManager);
 };
 
diff --git a/chrome/browser/web_applications/components/app_shortcut_manager_unittest.cc b/chrome/browser/web_applications/components/app_shortcut_manager_unittest.cc
new file mode 100644
index 0000000..3fb1a89
--- /dev/null
+++ b/chrome/browser/web_applications/components/app_shortcut_manager_unittest.cc
@@ -0,0 +1,94 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/test/bind_test_util.h"
+#include "chrome/browser/web_applications/components/app_shortcut_observer.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
+#include "chrome/browser/web_applications/test/test_app_shortcut_manager.h"
+#include "chrome/browser/web_applications/test/web_app_test.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace web_app {
+
+namespace {
+
+class TestShortcutObserver : public AppShortcutObserver {
+ public:
+  TestShortcutObserver() {}
+
+  void OnShortcutsCreated(const AppId& app_id) override {
+    on_shortcuts_created_calls_++;
+  }
+
+  size_t on_shortcuts_created_calls() const {
+    return on_shortcuts_created_calls_;
+  }
+
+ private:
+  size_t on_shortcuts_created_calls_ = 0;
+};
+
+}  // namespace
+
+constexpr char kAppId[] = "app-id";
+
+class AppShortcutManagerTest : public WebAppTest {
+ protected:
+  AppShortcutManagerTest() {}
+
+  void SetUp() override {
+    WebAppTest::SetUp();
+
+    shortcut_manager_ = std::make_unique<TestAppShortcutManager>(profile());
+    shortcut_observer_ = std::make_unique<TestShortcutObserver>();
+
+    shortcut_manager_->AddObserver(shortcut_observer_.get());
+  }
+
+  void TearDown() override {
+    WebAppTest::TearDown();
+
+    shortcut_manager_->RemoveObserver(shortcut_observer_.get());
+  }
+
+  TestAppShortcutManager& shortcut_manager() {
+    return *shortcut_manager_.get();
+  }
+
+  TestShortcutObserver& shortcut_observer() {
+    return *shortcut_observer_.get();
+  }
+
+  void CreateShortcuts(const AppId& app_id, bool add_to_desktop) {
+    base::RunLoop loop;
+    shortcut_manager().CreateShortcuts(
+        app_id, add_to_desktop,
+        base::BindLambdaForTesting([&loop](bool /*success*/) { loop.Quit(); }));
+    loop.Run();
+  }
+
+ private:
+  std::unique_ptr<TestAppShortcutManager> shortcut_manager_;
+  std::unique_ptr<TestShortcutObserver> shortcut_observer_;
+};
+
+TEST_F(AppShortcutManagerTest, OnShortcutsCreatedFiresOnSuccess) {
+  shortcut_manager().SetNextCreateShortcutsResult(kAppId, /*success=*/true);
+
+  CreateShortcuts(kAppId, true);
+
+  EXPECT_EQ(1u, shortcut_manager().num_create_shortcuts_calls());
+  EXPECT_EQ(1u, shortcut_observer().on_shortcuts_created_calls());
+}
+
+TEST_F(AppShortcutManagerTest, OnShortcutsCreatedDoesNotFireOnFailure) {
+  shortcut_manager().SetNextCreateShortcutsResult(kAppId, /*success=*/false);
+
+  CreateShortcuts(kAppId, true);
+
+  EXPECT_EQ(1u, shortcut_manager().num_create_shortcuts_calls());
+  EXPECT_EQ(0u, shortcut_observer().on_shortcuts_created_calls());
+}
+
+}  // namespace web_app
diff --git a/chrome/browser/web_applications/components/app_shortcut_observer.h b/chrome/browser/web_applications/components/app_shortcut_observer.h
new file mode 100644
index 0000000..d9075e3d
--- /dev/null
+++ b/chrome/browser/web_applications/components/app_shortcut_observer.h
@@ -0,0 +1,20 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_APP_SHORTCUT_OBSERVER_H_
+#define CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_APP_SHORTCUT_OBSERVER_H_
+
+#include "base/observer_list_types.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
+
+namespace web_app {
+
+class AppShortcutObserver : public base::CheckedObserver {
+ public:
+  virtual void OnShortcutsCreated(const AppId& app_id) {}
+};
+
+}  // namespace web_app
+
+#endif  // CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_APP_SHORTCUT_OBSERVER_H_
diff --git a/chrome/browser/web_applications/test/test_app_shortcut_manager.cc b/chrome/browser/web_applications/test/test_app_shortcut_manager.cc
index c15524fe4..02c2430 100644
--- a/chrome/browser/web_applications/test/test_app_shortcut_manager.cc
+++ b/chrome/browser/web_applications/test/test_app_shortcut_manager.cc
@@ -39,7 +39,9 @@
   }
 
   base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(std::move(callback), success));
+      FROM_HERE, base::BindOnce(&TestAppShortcutManager::OnShortcutsCreated,
+                                weak_ptr_factory_.GetWeakPtr(), app_id,
+                                std::move(callback), success));
 }
 
 void TestAppShortcutManager::GetShortcutInfoForApp(
diff --git a/chrome/browser/web_applications/test/test_app_shortcut_manager.h b/chrome/browser/web_applications/test/test_app_shortcut_manager.h
index ea4a61e5..b74c726 100644
--- a/chrome/browser/web_applications/test/test_app_shortcut_manager.h
+++ b/chrome/browser/web_applications/test/test_app_shortcut_manager.h
@@ -7,6 +7,7 @@
 
 #include <map>
 
+#include "base/memory/weak_ptr.h"
 #include "base/optional.h"
 #include "chrome/browser/web_applications/components/app_shortcut_manager.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
@@ -48,6 +49,8 @@
 
   bool can_create_shortcuts_ = true;
   std::map<AppId, bool> next_create_shortcut_results_;
+
+  base::WeakPtrFactory<TestAppShortcutManager> weak_ptr_factory_{this};
 };
 
 }  // namespace web_app
diff --git a/chrome/common/chrome_content_client.cc b/chrome/common/chrome_content_client.cc
index c0b96ef..a5c5055 100644
--- a/chrome/common/chrome_content_client.cc
+++ b/chrome/common/chrome_content_client.cc
@@ -411,9 +411,7 @@
   capability.video_codecs.push_back(media::VideoCodec::kCodecVP8);
   capability.video_codecs.push_back(media::VideoCodec::kCodecVP9);
   capability.video_codecs.push_back(media::VideoCodec::kCodecAV1);
-  // TODO(crbug.com/899403): Update this and tests after Widevine CDM supports
-  // VP9 profile 2.
-  capability.supports_vp9_profile2 = false;
+  capability.supports_vp9_profile2 = true;
 #if BUILDFLAG(USE_PROPRIETARY_CODECS)
   capability.video_codecs.push_back(media::VideoCodec::kCodecH264);
 #endif  // BUILDFLAG(USE_PROPRIETARY_CODECS)
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index c894bde3..13ade0c 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -2733,11 +2733,6 @@
 const char kUserTriggeredIsolatedOrigins[] =
     "site_isolation.user_triggered_isolated_origins";
 
-// Boolean that specifies if the web driver flag is allowed to override policies
-// which prevent it from operating normally. (e.g. SitePerProcess.)
-const char kWebDriverOverridesIncompatiblePolicies[] =
-    "webdriver.override_incompatible_policy";
-
 #if !defined(OS_ANDROID)
 // Boolean that specifies whether media (audio/video) autoplay is allowed.
 const char kAutoplayAllowed[] = "media.autoplay_allowed";
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 940a8f2..a2801a5 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -952,7 +952,6 @@
 extern const char kIsolateOrigins[];
 extern const char kSitePerProcess[];
 extern const char kUserTriggeredIsolatedOrigins[];
-extern const char kWebDriverOverridesIncompatiblePolicies[];
 
 #if !defined(OS_ANDROID)
 extern const char kAutoplayAllowed[];
diff --git a/chrome/installer/linux/common/installer.include b/chrome/installer/linux/common/installer.include
index 2739358..21ae329 100644
--- a/chrome/installer/linux/common/installer.include
+++ b/chrome/installer/linux/common/installer.include
@@ -166,7 +166,6 @@
 
   # V8 snapshot files; Necessary when the GN v8_use_external_startup_data flag
   # is true.
-  install -m 644 "${BUILDDIR}/natives_blob.bin" "${STAGEDIR}/${INSTALLDIR}/"
   # Use v8_context_snapshot.bin instead of snapshot_blob.bin if it is available.
   # TODO(crbug.com/764576): Unship snapshot_blob.bin on ChromeOS and drop this branch
   if [ -f "${BUILDDIR}/v8_context_snapshot.bin" ]; then
diff --git a/chrome/installer/mini_installer/BUILD.gn b/chrome/installer/mini_installer/BUILD.gn
index 99a1bc7..8ca6ec2 100644
--- a/chrome/installer/mini_installer/BUILD.gn
+++ b/chrome/installer/mini_installer/BUILD.gn
@@ -219,7 +219,6 @@
     }
 
     if (v8_use_external_startup_data) {
-      inputs += [ "$root_out_dir/natives_blob.bin" ]
       deps += [ "//v8" ]
       if (use_v8_context_snapshot) {
         inputs += [ "$root_out_dir/v8_context_snapshot.bin" ]
diff --git a/chrome/installer/mini_installer/chrome.release b/chrome/installer/mini_installer/chrome.release
index 1f894b7..029bf08 100644
--- a/chrome/installer/mini_installer/chrome.release
+++ b/chrome/installer/mini_installer/chrome.release
@@ -33,7 +33,6 @@
 nacl64.exe: %(VersionDir)s\
 nacl_irt_x86_32.nexe: %(VersionDir)s\
 nacl_irt_x86_64.nexe: %(VersionDir)s\
-natives_blob.bin: %(VersionDir)s\
 notification_helper.exe: %(VersionDir)s\
 resources.pak: %(VersionDir)s\
 v8_context_snapshot.bin: %(VersionDir)s\
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index a7f44f9..cd9f5de 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3221,6 +3221,8 @@
     "../browser/sessions/restore_on_startup_policy_handler_unittest.cc",
     "../browser/sessions/session_common_utils_unittest.cc",
     "../browser/sharing/ack_message_handler_unittest.cc",
+    "../browser/sharing/mock_sharing_service.cc",
+    "../browser/sharing/mock_sharing_service.h",
     "../browser/sharing/sharing_device_registration_unittest.cc",
     "../browser/sharing/sharing_fcm_handler_unittest.cc",
     "../browser/sharing/sharing_fcm_sender_unittest.cc",
@@ -3634,6 +3636,7 @@
       "../browser/password_manager/save_password_infobar_delegate_android_unittest.cc",
       "../browser/password_manager/touch_to_fill_controller_unittest.cc",
       "../browser/password_manager/update_password_infobar_delegate_android_unittest.cc",
+      "../browser/permissions/permission_prompt_android_unittest.cc",
       "../browser/permissions/permission_request_notification_android_unittest.cc",
       "../browser/permissions/permission_request_notification_handler_unittest.cc",
       "../browser/translate/translate_manager_render_view_host_android_unittest.cc",
diff --git a/chrome/test/base/browser_tests_main_chromeos.cc b/chrome/test/base/browser_tests_main_chromeos.cc
index 55106b29..5426703 100644
--- a/chrome/test/base/browser_tests_main_chromeos.cc
+++ b/chrome/test/base/browser_tests_main_chromeos.cc
@@ -30,8 +30,10 @@
  public:
   int RunTestSuite(int argc, char** argv) override {
     BrowserTestSuiteChromeOS test_suite(argc, argv);
-    // Browser tests are expected not to tear-down various globals.
+    // Browser tests are expected not to tear-down various globals and may
+    // complete with the thread priority being above NORMAL.
     test_suite.DisableCheckForLeakedGlobals();
+    test_suite.DisableCheckForThreadPriorityAtTestEnd();
     return test_suite.Run();
   }
 };
diff --git a/chrome/test/base/chrome_test_launcher.cc b/chrome/test/base/chrome_test_launcher.cc
index 5e3c3d32..346c4b5a 100644
--- a/chrome/test/base/chrome_test_launcher.cc
+++ b/chrome/test/base/chrome_test_launcher.cc
@@ -77,8 +77,10 @@
 
 int ChromeTestSuiteRunner::RunTestSuite(int argc, char** argv) {
   ChromeTestSuite test_suite(argc, argv);
-  // Browser tests are expected not to tear-down various globals.
+  // Browser tests are expected not to tear-down various globals and may
+  // complete with the thread priority being above NORMAL.
   test_suite.DisableCheckForLeakedGlobals();
+  test_suite.DisableCheckForThreadPriorityAtTestEnd();
 #if defined(OS_ANDROID)
   // Android browser tests run child processes as threads instead.
   content::ContentTestSuiteBase::RegisterInProcessThreads();
diff --git a/chrome/test/base/interactive_ui_tests_main.cc b/chrome/test/base/interactive_ui_tests_main.cc
index 051d4b3..abc8ab2 100644
--- a/chrome/test/base/interactive_ui_tests_main.cc
+++ b/chrome/test/base/interactive_ui_tests_main.cc
@@ -41,8 +41,10 @@
  protected:
   // ChromeTestSuite overrides:
   void Initialize() override {
-    // Browser tests are expected not to tear-down various globals.
+    // Browser tests are expected not to tear-down various globals and may
+    // complete with the thread priority being above NORMAL.
     base::TestSuite::DisableCheckForLeakedGlobals();
+    base::TestSuite::DisableCheckForThreadPriorityAtTestEnd();
 
     ChromeTestSuite::Initialize();
 
diff --git a/chrome/test/base/testing_browser_process.cc b/chrome/test/base/testing_browser_process.cc
index bbd1316..916d1931 100644
--- a/chrome/test/base/testing_browser_process.cc
+++ b/chrome/test/base/testing_browser_process.cc
@@ -70,7 +70,12 @@
 // static
 void TestingBrowserProcess::CreateInstance() {
   DCHECK(!g_browser_process);
-  g_browser_process = new TestingBrowserProcess;
+  TestingBrowserProcess* process = new TestingBrowserProcess;
+  // Set |g_browser_process| before initializing the TestingBrowserProcess
+  // because some members may depend on |g_browser_process| (in particular,
+  // ChromeExtensionsBrowserClient).
+  g_browser_process = process;
+  process->Init();
 }
 
 // static
@@ -84,28 +89,7 @@
 TestingBrowserProcess::TestingBrowserProcess()
     : notification_service_(content::NotificationService::Create()),
       app_locale_("en"),
-      is_shutting_down_(false),
-      local_state_(nullptr),
-      rappor_service_(nullptr),
-      platform_part_(new TestingBrowserProcessPlatformPart()),
-      test_network_connection_tracker_(
-          network::TestNetworkConnectionTracker::CreateInstance()) {
-  content::SetNetworkConnectionTrackerForTesting(
-      test_network_connection_tracker_.get());
-
-#if BUILDFLAG(ENABLE_EXTENSIONS)
-  extensions_browser_client_.reset(
-      new extensions::ChromeExtensionsBrowserClient);
-  extensions_browser_client_->AddAPIProvider(
-      std::make_unique<chrome_apps::ChromeAppsBrowserAPIProvider>());
-  extensions::AppWindowClient::Set(ChromeAppWindowClient::GetInstance());
-  extensions::ExtensionsBrowserClient::Set(extensions_browser_client_.get());
-#endif
-
-#if !defined(OS_ANDROID)
-  KeepAliveRegistry::GetInstance()->SetIsShuttingDown(false);
-#endif
-}
+      platform_part_(new TestingBrowserProcessPlatformPart()) {}
 
 TestingBrowserProcess::~TestingBrowserProcess() {
   EXPECT_FALSE(local_state_);
@@ -122,6 +106,26 @@
   DCHECK_EQ(static_cast<BrowserProcess*>(nullptr), g_browser_process);
 }
 
+void TestingBrowserProcess::Init() {
+  test_network_connection_tracker_ =
+      network::TestNetworkConnectionTracker::CreateInstance();
+  content::SetNetworkConnectionTrackerForTesting(
+      test_network_connection_tracker_.get());
+
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+  extensions_browser_client_ =
+      std::make_unique<extensions::ChromeExtensionsBrowserClient>();
+  extensions_browser_client_->AddAPIProvider(
+      std::make_unique<chrome_apps::ChromeAppsBrowserAPIProvider>());
+  extensions::AppWindowClient::Set(ChromeAppWindowClient::GetInstance());
+  extensions::ExtensionsBrowserClient::Set(extensions_browser_client_.get());
+#endif
+
+#if !defined(OS_ANDROID)
+  KeepAliveRegistry::GetInstance()->SetIsShuttingDown(false);
+#endif
+}
+
 void TestingBrowserProcess::FlushLocalStateAndReply(base::OnceClosure reply) {
   // This could be implemented the same way as in BrowserProcessImpl but it's
   // not currently expected to be used by TestingBrowserProcess users so we
diff --git a/chrome/test/base/testing_browser_process.h b/chrome/test/base/testing_browser_process.h
index 808be62..c5c2365 100644
--- a/chrome/test/base/testing_browser_process.h
+++ b/chrome/test/base/testing_browser_process.h
@@ -163,9 +163,11 @@
   TestingBrowserProcess();
   ~TestingBrowserProcess() override;
 
+  void Init();
+
   std::unique_ptr<content::NotificationService> notification_service_;
   std::string app_locale_;
-  bool is_shutting_down_;
+  bool is_shutting_down_ = false;
 
   std::unique_ptr<policy::ChromeBrowserPolicyConnector>
       browser_policy_connector_;
@@ -198,9 +200,9 @@
   std::unique_ptr<network_time::NetworkTimeTracker> network_time_tracker_;
 
   // The following objects are not owned by TestingBrowserProcess:
-  PrefService* local_state_;
+  PrefService* local_state_ = nullptr;
   scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_;
-  rappor::RapporServiceImpl* rappor_service_;
+  rappor::RapporServiceImpl* rappor_service_ = nullptr;
 
   std::unique_ptr<BrowserProcessPlatformPart> platform_part_;
   std::unique_ptr<network::TestNetworkConnectionTracker>
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index c2bf89d6..62ba17c1 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -1147,13 +1147,7 @@
   },
 
   "WebDriverOverridesIncompatiblePolicies": {
-    "os": ["win", "linux", "mac"],
-    "test_policy": { "WebDriverOverridesIncompatiblePolicies": true },
-    "pref_mappings": [
-      { "pref": "webdriver.override_incompatible_policy",
-        "local_state": true
-      }
-    ]
+    "note": "This policy has been removed since Chrome 79."
   },
 
   "DefaultDownloadDirectory": {
diff --git a/chrome/tools/build/chromeos/FILES.cfg b/chrome/tools/build/chromeos/FILES.cfg
index 23ba4d2a..12f15ad 100644
--- a/chrome/tools/build/chromeos/FILES.cfg
+++ b/chrome/tools/build/chromeos/FILES.cfg
@@ -65,10 +65,6 @@
     'buildtype': ['dev', 'official'],
   },
   {
-    'filename': 'natives_blob.bin',
-    'buildtype': ['dev', 'official'],
-  },
-  {
     'filename': 'snapshot_blob.bin',
     'buildtype': ['dev', 'official'],
   },
diff --git a/chrome/tools/build/linux/FILES.cfg b/chrome/tools/build/linux/FILES.cfg
index ca79c7d6..eb04636 100644
--- a/chrome/tools/build/linux/FILES.cfg
+++ b/chrome/tools/build/linux/FILES.cfg
@@ -64,10 +64,6 @@
     'buildtype': ['dev', 'official'],
   },
   {
-    'filename': 'natives_blob.bin',
-    'buildtype': ['dev', 'official'],
-  },
-  {
     'filename': 'product_logo_48.png',
     'buildtype': ['dev', 'official'],
   },
@@ -268,12 +264,6 @@
     'optional': ['dev'],
   },
   {
-    'filename': 'natives_blob.bin',
-    'buildtype': ['dev'],
-    'archive': 'content-shell.zip',
-    'optional': ['dev'],
-  },
-  {
     'filename': 'v8_context_snapshot.bin',
     'buildtype': ['dev'],
     'archive': 'content-shell.zip',
diff --git a/chrome/tools/build/mac/FILES.cfg b/chrome/tools/build/mac/FILES.cfg
index 55c45c1..2089a89 100644
--- a/chrome/tools/build/mac/FILES.cfg
+++ b/chrome/tools/build/mac/FILES.cfg
@@ -105,12 +105,6 @@
     'optional': ['dev'],
   },
   {
-    'filename': 'natives_blob.bin',
-    'buildtype': ['dev'],
-    'archive': 'content-shell.zip',
-    'optional': ['dev'],
-  },
-  {
     'filename': 'v8_context_snapshot.bin',
     'buildtype': ['dev'],
     'archive': 'content-shell.zip',
diff --git a/chrome/tools/build/win/FILES.cfg b/chrome/tools/build/win/FILES.cfg
index 3828e7df..66c0f78 100644
--- a/chrome/tools/build/win/FILES.cfg
+++ b/chrome/tools/build/win/FILES.cfg
@@ -108,11 +108,6 @@
     'optional': ['dev', 'official'],
   },
   {
-    'filename': 'natives_blob.bin',
-    'buildtype': ['dev', 'official'],
-    'optional': ['dev', 'official'],
-  },
-  {
     'filename': 'v8_context_snapshot.bin',
     'buildtype': ['dev', 'official'],
     'optional': ['dev', 'official'],
@@ -788,12 +783,6 @@
     'optional': ['dev'],
   },
   {
-    'filename': 'natives_blob.bin',
-    'buildtype': ['dev'],
-    'archive': 'content-shell.zip',
-    'optional': ['dev'],
-  },
-  {
     'filename': 'v8_context_snapshot.bin',
     'buildtype': ['dev'],
     'archive': 'content-shell.zip',
diff --git a/chromecast/app/cast_test_launcher.cc b/chromecast/app/cast_test_launcher.cc
index 186c3147f2..ca0544c 100644
--- a/chromecast/app/cast_test_launcher.cc
+++ b/chromecast/app/cast_test_launcher.cc
@@ -24,8 +24,10 @@
 
   int RunTestSuite(int argc, char** argv) override {
     base::TestSuite test_suite(argc, argv);
-    // Browser tests are expected not to tear-down various globals.
+    // Browser tests are expected not to tear-down various globals and may
+    // complete with the thread priority being above NORMAL.
     test_suite.DisableCheckForLeakedGlobals();
+    test_suite.DisableCheckForThreadPriorityAtTestEnd();
     return test_suite.Run();
   }
 
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 1ef6df3..62dae915 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-12613.0.0
\ No newline at end of file
+12616.0.0
\ No newline at end of file
diff --git a/chromeos/services/ime/ime_service_unittest.cc b/chromeos/services/ime/ime_service_unittest.cc
index 572789e..2904cd5 100644
--- a/chromeos/services/ime/ime_service_unittest.cc
+++ b/chromeos/services/ime/ime_service_unittest.cc
@@ -156,6 +156,116 @@
   EXPECT_EQ(1, count);
 }
 
+TEST_F(ImeServiceTest, RuleBasedDoesNotHandleModifierKeys) {
+  bool success = false;
+  TestClientChannel test_channel;
+  mojo::Remote<mojom::InputChannel> to_engine_remote;
+
+  remote_manager_->ConnectToImeEngine(
+      "m17n:ar", to_engine_remote.BindNewPipeAndPassReceiver(),
+      test_channel.CreatePendingRemote(), extra,
+      base::BindOnce(&ConnectCallback, &success));
+  remote_manager_.FlushForTesting();
+  EXPECT_TRUE(success);
+
+  constexpr const char* kModifierKeys[] = {
+      "Shift",    "ShiftLeft", "ShiftRight", "Alt",         "AltLeft",
+      "AltRight", "AltGraph",  "CapsLock",   "ControlLeft", "ControlRight"};
+
+  for (const auto* modifier_key : kModifierKeys) {
+    mojom::KeypressResponseForRulebased response;
+    to_engine_remote->ProcessKeypressForRulebased(
+        mojom::KeypressInfoForRulebased::New("keydown", modifier_key, false,
+                                             false, false, false, false),
+        base::BindOnce(&TestProcessKeypressForRulebasedCallback, &response));
+    to_engine_remote.FlushForTesting();
+
+    EXPECT_EQ(response.result, false);
+    ASSERT_EQ(0U, response.operations.size());
+  }
+}
+
+TEST_F(ImeServiceTest, RuleBasedDoesNotHandleCtrlShortCut) {
+  bool success = false;
+  TestClientChannel test_channel;
+  mojo::Remote<mojom::InputChannel> to_engine_remote;
+
+  remote_manager_->ConnectToImeEngine(
+      "m17n:ar", to_engine_remote.BindNewPipeAndPassReceiver(),
+      test_channel.CreatePendingRemote(), extra,
+      base::BindOnce(&ConnectCallback, &success));
+  remote_manager_.FlushForTesting();
+  EXPECT_TRUE(success);
+
+  mojom::KeypressResponseForRulebased response;
+  to_engine_remote->ProcessKeypressForRulebased(
+      mojom::KeypressInfoForRulebased::New("keydown", "ControlLeft", false,
+                                           false, false, false, false),
+      base::BindOnce(&TestProcessKeypressForRulebasedCallback, &response));
+  to_engine_remote->ProcessKeypressForRulebased(
+      mojom::KeypressInfoForRulebased::New("keydown", "A", false, false, false,
+                                           true, false),
+      base::BindOnce(&TestProcessKeypressForRulebasedCallback, &response));
+  to_engine_remote.FlushForTesting();
+
+  EXPECT_EQ(response.result, false);
+  ASSERT_EQ(0U, response.operations.size());
+}
+
+TEST_F(ImeServiceTest, RuleBasedDoesNotHandleAltShortCut) {
+  bool success = false;
+  TestClientChannel test_channel;
+  mojo::Remote<mojom::InputChannel> to_engine_remote;
+
+  remote_manager_->ConnectToImeEngine(
+      "m17n:ar", to_engine_remote.BindNewPipeAndPassReceiver(),
+      test_channel.CreatePendingRemote(), extra,
+      base::BindOnce(&ConnectCallback, &success));
+  remote_manager_.FlushForTesting();
+  EXPECT_TRUE(success);
+
+  mojom::KeypressResponseForRulebased response;
+  to_engine_remote->ProcessKeypressForRulebased(
+      mojom::KeypressInfoForRulebased::New("keydown", "AltLeft", false, false,
+                                           false, false, false),
+      base::BindOnce(&TestProcessKeypressForRulebasedCallback, &response));
+  to_engine_remote->ProcessKeypressForRulebased(
+      mojom::KeypressInfoForRulebased::New("keydown", "A", false, false, false,
+                                           false, true),
+      base::BindOnce(&TestProcessKeypressForRulebasedCallback, &response));
+  to_engine_remote.FlushForTesting();
+
+  EXPECT_EQ(response.result, false);
+  ASSERT_EQ(0U, response.operations.size());
+}
+
+TEST_F(ImeServiceTest, RuleBasedHandlesAltRight) {
+  bool success = false;
+  TestClientChannel test_channel;
+  mojo::Remote<mojom::InputChannel> to_engine_remote;
+
+  remote_manager_->ConnectToImeEngine(
+      "m17n:ar", to_engine_remote.BindNewPipeAndPassReceiver(),
+      test_channel.CreatePendingRemote(), extra,
+      base::BindOnce(&ConnectCallback, &success));
+  remote_manager_.FlushForTesting();
+  EXPECT_TRUE(success);
+
+  mojom::KeypressResponseForRulebased response;
+  to_engine_remote->ProcessKeypressForRulebased(
+      mojom::KeypressInfoForRulebased::New("keydown", "AltRight", false, false,
+                                           false, false, false),
+      base::BindOnce(&TestProcessKeypressForRulebasedCallback, &response));
+  to_engine_remote->ProcessKeypressForRulebased(
+      mojom::KeypressInfoForRulebased::New("keydown", "A", false, false, false,
+                                           false, true),
+      base::BindOnce(&TestProcessKeypressForRulebasedCallback, &response));
+  to_engine_remote.FlushForTesting();
+
+  EXPECT_EQ(response.result, false);
+  ASSERT_EQ(0U, response.operations.size());
+}
+
 // Tests that the rule-based Arabic keyboard can work correctly.
 TEST_F(ImeServiceTest, RuleBasedArabic) {
   bool success = false;
diff --git a/chromeos/services/ime/input_engine.cc b/chromeos/services/ime/input_engine.cc
index 1b1e46ac..c48abfb 100644
--- a/chromeos/services/ime/input_engine.cc
+++ b/chromeos/services/ime/input_engine.cc
@@ -57,6 +57,13 @@
   return keypress_response;
 }
 
+bool IsModifierKey(const std::string& key_code) {
+  return key_code == "AltLeft" || key_code == "AltRight" ||
+         key_code == "ShiftLeft" || key_code == "ShiftRight" ||
+         key_code == "ControlLeft" || key_code == "ControlRight" ||
+         key_code == "CapsLock";
+}
+
 }  // namespace
 
 InputEngineContext::InputEngineContext(const std::string& ime) : ime_spec(ime) {
@@ -104,8 +111,29 @@
   auto& context = channel_receivers_.current_context();
   auto& engine = context.get()->engine;
 
+  // According to the W3C spec, |altKey| is false if the AltGr key
+  // is pressed [1]. However, all rule-based input methods on Chrome OS use
+  // the US QWERTY layout as a base layout, with AltGr implemented at this
+  // layer. This means the right Alt key reports as being a normal Alt key, so
+  // |altKey| is true. Thus, we need to take |altKey| and exclude the
+  // right Alt key to determine the status of the "true" Alt key.
+  // [1] https://www.w3.org/TR/uievents-key/#keys-modifier
+  // TODO(https://crbug.com/1014778): Change the base layouts for the
+  // rule-based input methods so that |altKey| is false when AltGr is pressed.
+  if (keypress_info->code == "AltRight") {
+    isAltRightDown_ = keypress_info->type == "keydown";
+  }
+
+  const bool isAltDown = keypress_info->alt && !isAltRightDown_;
+
+  // - Shift/AltRight/Caps/Ctrl are modifier keys for the characters which the
+  // Mojo service may accept, but don't send the keys themselves to Mojo.
+  // - Ctrl+? and Alt+? are shortcut keys, so don't send them to the rule based
+  // engine.
   if (!engine || keypress_info->type.empty() ||
-      keypress_info->type != "keydown") {
+      keypress_info->type != "keydown" ||
+      (IsModifierKey(keypress_info->code) || keypress_info->ctrl ||
+       isAltDown)) {
     std::move(callback).Run(mojom::KeypressResponseForRulebased::New(
         false, std::vector<mojom::OperationForRulebasedPtr>(0)));
     return;
@@ -129,6 +157,7 @@
   if (engine) {
     engine->Reset();
   }
+  isAltRightDown_ = false;
 }
 
 void InputEngine::GetRulebasedKeypressCountForTesting(
diff --git a/chromeos/services/ime/input_engine.h b/chromeos/services/ime/input_engine.h
index c648abe..61ff83d 100644
--- a/chromeos/services/ime/input_engine.h
+++ b/chromeos/services/ime/input_engine.h
@@ -61,6 +61,9 @@
   mojo::ReceiverSet<mojom::InputChannel, std::unique_ptr<InputEngineContext>>
       channel_receivers_;
 
+  // Whether the AltRight key is held down or not. Only used for rule-based.
+  bool isAltRightDown_ = false;
+
   DISALLOW_COPY_AND_ASSIGN(InputEngine);
 };
 
diff --git a/components/autofill/core/browser/autofill_metrics.cc b/components/autofill/core/browser/autofill_metrics.cc
index 2de8650c..04a9a984 100644
--- a/components/autofill/core/browser/autofill_metrics.cc
+++ b/components/autofill/core/browser/autofill_metrics.cc
@@ -774,6 +774,14 @@
 }
 
 // static
+void AutofillMetrics::LogCreditCardUploadFeedbackMetric(
+    CreditCardUploadFeedbackMetric metric) {
+  DCHECK_LT(metric, NUM_CREDIT_CARD_UPLOAD_FEEDBACK_METRICS);
+  UMA_HISTOGRAM_ENUMERATION("Autofill.CreditCardUploadFeedback", metric,
+                            NUM_CREDIT_CARD_UPLOAD_FEEDBACK_METRICS);
+}
+
+// static
 void AutofillMetrics::LogManageCardsPromptMetric(ManageCardsPromptMetric metric,
                                                  bool is_upload_save) {
   DCHECK_LT(metric, NUM_MANAGE_CARDS_PROMPT_METRICS);
diff --git a/components/autofill/core/browser/autofill_metrics.h b/components/autofill/core/browser/autofill_metrics.h
index 9fe5e80..7ba794dd 100644
--- a/components/autofill/core/browser/autofill_metrics.h
+++ b/components/autofill/core/browser/autofill_metrics.h
@@ -302,6 +302,17 @@
     NUM_SAVE_CARD_PROMPT_METRICS,
   };
 
+  enum CreditCardUploadFeedbackMetric {
+    // The loading indicator animation which indicates uploading is in progress
+    // is successfully shown.
+    CREDIT_CARD_UPLOAD_FEEDBACK_LOADING_ANIMATION_SHOWN,
+    // The credit card icon with the saving failure badge is shown.
+    CREDIT_CARD_UPLOAD_FEEDBACK_FAILURE_ICON_SHOWN,
+    // The failure icon is clicked and the save card failure bubble is shown.
+    CREDIT_CARD_UPLOAD_FEEDBACK_FAILURE_BUBBLE_SHOWN,
+    NUM_CREDIT_CARD_UPLOAD_FEEDBACK_METRICS,
+  };
+
   // Metrics to measure user interaction with the Manage Cards view
   // shown when user clicks on the save card icon after accepting
   // to save a card.
@@ -1009,6 +1020,8 @@
       SaveCardPromptMetric metric,
       bool is_uploading,
       security_state::SecurityLevel security_level);
+  static void LogCreditCardUploadFeedbackMetric(
+      CreditCardUploadFeedbackMetric metric);
   static void LogManageCardsPromptMetric(ManageCardsPromptMetric metric,
                                          bool is_uploading);
   static void LogScanCreditCardPromptMetric(ScanCreditCardPromptMetric metric);
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc b/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc
index c08bf92..d553e0e 100644
--- a/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc
@@ -274,8 +274,7 @@
     key_info.SetKey("credential_id", base::Value(kCredentialId));
     request_options.SetKey("key_info", base::Value(base::Value::Type::LIST));
     request_options.FindKeyOfType("key_info", base::Value::Type::LIST)
-        ->GetList()
-        .push_back(std::move(key_info));
+        ->Append(std::move(key_info));
     return request_options;
   }
 
diff --git a/components/autofill/core/browser/payments/credit_card_fido_authenticator_unittest.cc b/components/autofill/core/browser/payments/credit_card_fido_authenticator_unittest.cc
index 064d4d2..ca0aa5d 100644
--- a/components/autofill/core/browser/payments/credit_card_fido_authenticator_unittest.cc
+++ b/components/autofill/core/browser/payments/credit_card_fido_authenticator_unittest.cc
@@ -185,13 +185,11 @@
     key_info
         .FindKeyOfType("authenticator_transport_support",
                        base::Value::Type::LIST)
-        ->GetList()
-        .push_back(base::Value("INTERNAL"));
+        ->Append("INTERNAL");
 
     request_options.SetKey("key_info", base::Value(base::Value::Type::LIST));
     request_options.FindKeyOfType("key_info", base::Value::Type::LIST)
-        ->GetList()
-        .push_back(std::move(key_info));
+        ->Append(std::move(key_info));
     return request_options;
   }
 
diff --git a/components/autofill/core/browser/payments/test_payments_client.cc b/components/autofill/core/browser/payments/test_payments_client.cc
index 144de65..55925dd 100644
--- a/components/autofill/core/browser/payments/test_payments_client.cc
+++ b/components/autofill/core/browser/payments/test_payments_client.cc
@@ -122,14 +122,12 @@
                   base::Value(base::Value::Type::LIST));
   key_info
       .FindKeyOfType("authenticator_transport_support", base::Value::Type::LIST)
-      ->GetList()
-      .push_back(base::Value("INTERNAL"));
+      ->Append("INTERNAL");
   unmask_details_.fido_request_options.SetKey(
       "key_info", base::Value(base::Value::Type::LIST));
   unmask_details_.fido_request_options
       .FindKeyOfType("key_info", base::Value::Type::LIST)
-      ->GetList()
-      .push_back(std::move(key_info));
+      ->Append(std::move(key_info));
 }
 
 void TestPaymentsClient::SetServerIdForCardUpload(std::string server_id) {
diff --git a/components/autofill/core/common/logging/log_buffer.cc b/components/autofill/core/common/logging/log_buffer.cc
index 5abd4da..0f9e6c3 100644
--- a/components/autofill/core/common/logging/log_buffer.cc
+++ b/components/autofill/core/common/logging/log_buffer.cc
@@ -101,11 +101,10 @@
   if (!children || children->GetList().empty())
     return base::Value();
 
-  // If the fragment has a single child, return that directly.
+  // If the fragment has a single child, remove it from |children| and return
+  // that directly.
   if (children->GetList().size() == 1) {
-    base::Value result = std::move(children->GetList().back());
-    children->GetList().pop_back();
-    return result;
+    return std::move(children->TakeList().back());
   }
 
   return std::exchange(buffer_.back(), CreateEmptyFragment());
diff --git a/components/autofill_assistant/browser/actions/use_credit_card_action.cc b/components/autofill_assistant/browser/actions/use_credit_card_action.cc
index 1aafb22..1b426206 100644
--- a/components/autofill_assistant/browser/actions/use_credit_card_action.cc
+++ b/components/autofill_assistant/browser/actions/use_credit_card_action.cc
@@ -21,6 +21,7 @@
 #include "components/autofill_assistant/browser/client_status.h"
 
 namespace autofill_assistant {
+UseCreditCardAction::FallbackData::FallbackData() {}
 
 UseCreditCardAction::UseCreditCardAction(ActionDelegate* delegate,
                                          const ActionProto& proto)
@@ -98,6 +99,10 @@
   fallback_data->cvc = base::UTF16ToUTF8(cvc);
   fallback_data->expiration_month = card->expiration_month();
   fallback_data->expiration_year = card->expiration_year();
+  fallback_data->card_holder_name =
+      base::UTF16ToUTF8(card->GetRawInfo(autofill::CREDIT_CARD_NAME_FULL));
+  fallback_data->card_number =
+      base::UTF16ToUTF8(card->GetRawInfo(autofill::CREDIT_CARD_NUMBER));
 
   delegate_->FillCardForm(
       std::move(card), cvc, selector_,
@@ -280,6 +285,14 @@
         return base::NumberToString(fallback_data.expiration_year);
       break;
 
+    case UseCreditCardProto::RequiredField::CREDIT_CARD_CARD_HOLDER_NAME:
+      return fallback_data.card_holder_name;
+      break;
+
+    case UseCreditCardProto::RequiredField::CREDIT_CARD_NUMBER:
+      return fallback_data.card_number;
+      break;
+
     case UseCreditCardProto::RequiredField::UNDEFINED:
       NOTREACHED();
       return "";
diff --git a/components/autofill_assistant/browser/actions/use_credit_card_action.h b/components/autofill_assistant/browser/actions/use_credit_card_action.h
index 9d572c2..f02778a 100644
--- a/components/autofill_assistant/browser/actions/use_credit_card_action.h
+++ b/components/autofill_assistant/browser/actions/use_credit_card_action.h
@@ -52,11 +52,13 @@
   // separate struct to make sure we don't keep it for longer than strictly
   // necessary.
   struct FallbackData {
-    FallbackData() = default;
+    FallbackData();
     ~FallbackData() = default;
 
     // Card information for UseCreditCard fallback.
     std::string cvc;
+    std::string card_holder_name;
+    std::string card_number;
     int expiration_year = 0;
     int expiration_month = 0;
 
diff --git a/components/autofill_assistant/browser/actions/use_credit_card_action_unittest.cc b/components/autofill_assistant/browser/actions/use_credit_card_action_unittest.cc
index 0e000c7..820d93c 100644
--- a/components/autofill_assistant/browser/actions/use_credit_card_action_unittest.cc
+++ b/components/autofill_assistant/browser/actions/use_credit_card_action_unittest.cc
@@ -171,6 +171,12 @@
   AddRequiredField(
       &action, UseCreditCardProto::RequiredField::CREDIT_CARD_EXP_4_DIGIT_YEAR,
       "#expyear4");
+  AddRequiredField(
+      &action, UseCreditCardProto::RequiredField::CREDIT_CARD_CARD_HOLDER_NAME,
+      "#card_name");
+  AddRequiredField(&action,
+                   UseCreditCardProto::RequiredField::CREDIT_CARD_NUMBER,
+                   "#card_number");
 
   // First validation fails.
   EXPECT_CALL(mock_web_controller_, OnGetFieldValue(Selector({"#cvc"}), _))
@@ -181,6 +187,12 @@
       .WillOnce(RunOnceCallback<1>(OkClientStatus(), ""));
   EXPECT_CALL(mock_web_controller_, OnGetFieldValue(Selector({"#expyear4"}), _))
       .WillOnce(RunOnceCallback<1>(OkClientStatus(), ""));
+  EXPECT_CALL(mock_web_controller_,
+              OnGetFieldValue(Selector({"#card_name"}), _))
+      .WillOnce(RunOnceCallback<1>(OkClientStatus(), ""));
+  EXPECT_CALL(mock_web_controller_,
+              OnGetFieldValue(Selector({"#card_number"}), _))
+      .WillOnce(RunOnceCallback<1>(OkClientStatus(), ""));
 
   // Expect fields to be filled
   Expectation set_cvc =
@@ -199,6 +211,15 @@
       EXPECT_CALL(mock_action_delegate_,
                   OnSetFieldValue(Selector({"#expyear4"}), "2024", _))
           .WillOnce(RunOnceCallback<2>(OkClientStatus()));
+  Expectation set_cardholder_name =
+      EXPECT_CALL(mock_action_delegate_,
+                  OnSetFieldValue(Selector({"#card_name"}), "Jon Doe", _))
+          .WillOnce(RunOnceCallback<2>(OkClientStatus()));
+  Expectation set_card_number =
+      EXPECT_CALL(
+          mock_action_delegate_,
+          OnSetFieldValue(Selector({"#card_number"}), "4111111111111111", _))
+          .WillOnce(RunOnceCallback<2>(OkClientStatus()));
 
   // After fallback, second validation succeeds.
   EXPECT_CALL(mock_web_controller_, OnGetFieldValue(Selector({"#cvc"}), _))
@@ -213,10 +234,22 @@
   EXPECT_CALL(mock_web_controller_, OnGetFieldValue(Selector({"#expyear4"}), _))
       .After(set_expyear4)
       .WillOnce(RunOnceCallback<1>(OkClientStatus(), "not empty"));
+  EXPECT_CALL(mock_web_controller_,
+              OnGetFieldValue(Selector({"#card_name"}), _))
+      .After(set_expyear4)
+      .WillOnce(RunOnceCallback<1>(OkClientStatus(), "not empty"));
+  EXPECT_CALL(mock_web_controller_,
+              OnGetFieldValue(Selector({"#card_number"}), _))
+      .After(set_expyear4)
+      .WillOnce(RunOnceCallback<1>(OkClientStatus(), "not empty"));
 
   autofill::CreditCard credit_card;
   credit_card.SetExpirationMonth(9);
   credit_card.SetExpirationYear(2024);
+  credit_card.SetRawInfo(autofill::CREDIT_CARD_NAME_FULL,
+                         base::UTF8ToUTF16("Jon Doe"));
+  credit_card.SetRawInfo(autofill::CREDIT_CARD_NUMBER,
+                         base::UTF8ToUTF16("4111111111111111"));
   client_memory_.set_selected_card(
       std::make_unique<autofill::CreditCard>(credit_card));
   EXPECT_CALL(mock_action_delegate_, OnGetFullCard(_))
diff --git a/components/autofill_assistant/browser/features.cc b/components/autofill_assistant/browser/features.cc
index 9e1396c..fb8d8314 100644
--- a/components/autofill_assistant/browser/features.cc
+++ b/components/autofill_assistant/browser/features.cc
@@ -20,4 +20,4 @@
     "AutofillAssistantDirectActions", base::FEATURE_DISABLED_BY_DEFAULT};
 
 }  // namespace features
-}  // namespace autofill_assistant
\ No newline at end of file
+}  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto
index 998f935..1173953 100644
--- a/components/autofill_assistant/browser/service.proto
+++ b/components/autofill_assistant/browser/service.proto
@@ -908,6 +908,8 @@
       CREDIT_CARD_EXP_MONTH = 2;
       CREDIT_CARD_EXP_2_DIGIT_YEAR = 3;
       CREDIT_CARD_EXP_4_DIGIT_YEAR = 4;
+      CREDIT_CARD_CARD_HOLDER_NAME = 5;
+      CREDIT_CARD_NUMBER = 6;
     }
 
     optional CardField card_field = 1;
diff --git a/components/base32/BUILD.gn b/components/base32/BUILD.gn
index e9d7c533..be3d2780 100644
--- a/components/base32/BUILD.gn
+++ b/components/base32/BUILD.gn
@@ -2,6 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//testing/libfuzzer/fuzzer_test.gni")
+
 static_library("base32") {
   sources = [
     "base32.cc",
@@ -38,3 +40,15 @@
     "//testing/gtest",
   ]
 }
+
+fuzzer_test("base32_fuzzer") {
+  sources = [
+    "base32_fuzzer.cc",
+  ]
+
+  deps = [
+    ":base32",
+    ":base32_test_util",
+    "//base",
+  ]
+}
diff --git a/components/base32/base32_fuzzer.cc b/components/base32/base32_fuzzer.cc
new file mode 100644
index 0000000..76c3230
--- /dev/null
+++ b/components/base32/base32_fuzzer.cc
@@ -0,0 +1,41 @@
+// 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 <stddef.h>
+#include <stdint.h>
+
+#include <limits>
+
+#include "base/logging.h"
+#include "base/stl_util.h"
+#include "components/base32/base32.h"
+#include "components/base32/base32_test_util.h"
+
+base32::Base32EncodePolicy GetBase32EncodePolicyFromUint8(uint8_t value) {
+  // Dummy switch to detect changes to the enum definition.
+  switch (base32::Base32EncodePolicy()) {
+    case base32::Base32EncodePolicy::INCLUDE_PADDING:
+    case base32::Base32EncodePolicy::OMIT_PADDING:
+      break;
+  }
+
+  return (value % 2) == 0 ? base32::Base32EncodePolicy::INCLUDE_PADDING
+                          : base32::Base32EncodePolicy::OMIT_PADDING;
+}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  if (size < 2 || size > std::numeric_limits<size_t>::max() / 5)
+    return 0;
+
+  const base32::Base32EncodePolicy encode_policy =
+      GetBase32EncodePolicyFromUint8(data[0]);
+  const base::StringPiece string_piece_input(
+      reinterpret_cast<const char*>(data + 1), size - 1);
+  std::string encoded_string =
+      base32::Base32Encode(string_piece_input, encode_policy);
+  std::string decoded_string = base32::Base32Decode(encoded_string);
+
+  CHECK_EQ(string_piece_input, decoded_string);
+  return 0;
+}
diff --git a/components/invalidation/impl/ticl_invalidation_service.cc b/components/invalidation/impl/ticl_invalidation_service.cc
index 8614121..f5fd0c4 100644
--- a/components/invalidation/impl/ticl_invalidation_service.cc
+++ b/components/invalidation/impl/ticl_invalidation_service.cc
@@ -362,15 +362,6 @@
           url_loader_factory_->Clone(), network_connection_tracker_,
           gcm_invalidation_bridge_->CreateDelegate());
 
-  // TODO(crbug.com/912042): Deprecate this histogram, now that it only has one
-  // possible value.
-  enum InvalidationNetworkChannel {
-    // Deprecated: PUSH_CLIENT_CHANNEL = 0,
-    GCM_NETWORK_CHANNEL = 1,
-    NETWORK_CHANNELS_COUNT = 2
-  };
-  UMA_HISTOGRAM_ENUMERATION("Invalidations.NetworkChannel", GCM_NETWORK_CHANNEL,
-                            NETWORK_CHANNELS_COUNT);
   invalidator_ = std::make_unique<syncer::NonBlockingInvalidator>(
       network_channel_creator,
       invalidation_state_tracker_->GetInvalidatorClientId(),
diff --git a/components/nacl/loader/BUILD.gn b/components/nacl/loader/BUILD.gn
index 39bb50e4..3699bde3 100644
--- a/components/nacl/loader/BUILD.gn
+++ b/components/nacl/loader/BUILD.gn
@@ -139,7 +139,10 @@
     if (is_chromeos) {
       # NaCl is not working with compiler-rt in ChromeOS.
       # Force libgcc as a workaround. See https://crbug.com/761103
-      ldflags = [ "-rtlib=libgcc" ]
+      ldflags = [
+        "-rtlib=libgcc",
+        "--unwindlib=libgcc",
+      ]
 
       # nacl_helper needs to link with libgcc_s. We already have -lgcc_s in
       # the final link command line, but it was placed within "--as-needed"
diff --git a/components/open_from_clipboard/clipboard_recent_content_generic.cc b/components/open_from_clipboard/clipboard_recent_content_generic.cc
index f830c884..27094ba 100644
--- a/components/open_from_clipboard/clipboard_recent_content_generic.cc
+++ b/components/open_from_clipboard/clipboard_recent_content_generic.cc
@@ -16,8 +16,7 @@
     // TODO(mpearson): add support for chrome:// URLs.  Right now the scheme
     // for that lives in content and is accessible via
     // GetEmbedderRepresentationOfAboutScheme() or content::kChromeUIScheme
-    // TODO(mpearson): when adding desktop support, add kFileScheme, kFtpScheme,
-    // and kGopherScheme.
+    // TODO(mpearson): when adding desktop support, add kFileScheme, kFtpScheme.
 };
 
 }  // namespace
diff --git a/components/paint_preview/common/subset_font.cc b/components/paint_preview/common/subset_font.cc
index a218d63..5f659a2 100644
--- a/components/paint_preview/common/subset_font.cc
+++ b/components/paint_preview/common/subset_font.cc
@@ -7,11 +7,12 @@
 #include <memory>
 #include <utility>
 
+#include <hb-subset.h>
+#include <hb.h>
+
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/macros.h"
-#include "third_party/harfbuzz-ng/src/src/hb-subset.h"
-#include "third_party/harfbuzz-ng/src/src/hb.h"
 #include "third_party/skia/include/core/SkStream.h"
 #include "third_party/skia/include/core/SkTypeface.h"
 
@@ -88,7 +89,6 @@
       hb_subset_input_glyph_set(input.get());  // Owned by |input|.
   usage.ForEach(base::BindRepeating(&AddGlyphs, base::Unretained(glyphs)));
   hb_subset_input_set_retain_gids(input.get(), true);
-  hb_subset_input_set_drop_hints(input.get(), true);
 
   HbFace subset_face(hb_subset(face.get(), input.get()));
   HbBlob subset_blob(hb_face_reference_blob(subset_face.get()));
diff --git a/components/password_manager/core/browser/hash_password_manager.cc b/components/password_manager/core/browser/hash_password_manager.cc
index 7720576..98606bdd5d 100644
--- a/components/password_manager/core/browser/hash_password_manager.cc
+++ b/components/password_manager/core/browser/hash_password_manager.cc
@@ -7,6 +7,7 @@
 #include <vector>
 
 #include "base/base64.h"
+#include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "components/os_crypt/os_crypt.h"
 #include "components/password_manager/core/common/password_manager_pref_names.h"
@@ -58,26 +59,6 @@
   return encrypted_base64_text;
 }
 
-void RemoveOldestSignInPasswordHashData(
-    std::vector<base::Value>* password_hash_data_list) {
-  auto oldest_it = password_hash_data_list->end();
-  double oldest_signin_time = base::Time::Now().ToDoubleT();
-  for (auto it = password_hash_data_list->begin();
-       it != password_hash_data_list->end(); it++) {
-    const base::Value* last_signin_value = it->FindKey(kLastSignInTimeFieldKey);
-    DCHECK(last_signin_value);
-
-    double signin_time = last_signin_value->GetDouble();
-    if (signin_time < oldest_signin_time) {
-      oldest_signin_time = signin_time;
-      oldest_it = it;
-    }
-  }
-
-  DCHECK(oldest_it != password_hash_data_list->end());
-  password_hash_data_list->erase(oldest_it);
-}
-
 std::string GetAndDecryptField(const base::Value& dict,
                                const std::string& field_key) {
   const base::Value* encrypted_field_value = dict.FindKey(field_key);
@@ -200,17 +181,14 @@
 
 void HashPasswordManager::ClearSavedPasswordHash(const std::string& username,
                                                  bool is_gaia_password) {
-  if (prefs_) {
-    ListPrefUpdate update(prefs_, prefs::kPasswordHashDataList);
-    for (auto it = update->GetList().begin(); it != update->GetList().end();) {
-      if (AreUsernamesSame(GetAndDecryptField(*it, kUsernameFieldKey),
-                           IsGaiaPassword(*it), username, is_gaia_password)) {
-        it = update->GetList().erase(it);
-      } else {
-        it++;
-      }
-    }
-  }
+  if (!prefs_)
+    return;
+
+  ListPrefUpdate update(prefs_, prefs::kPasswordHashDataList);
+  update->EraseListValueIf([&](const auto& dict) {
+    return AreUsernamesSame(GetAndDecryptField(dict, kUsernameFieldKey),
+                            IsGaiaPassword(dict), username, is_gaia_password);
+  });
 }
 
 void HashPasswordManager::ClearAllPasswordHash(bool is_gaia_password) {
@@ -218,14 +196,10 @@
     return;
 
   ListPrefUpdate update(prefs_, prefs::kPasswordHashDataList);
-  for (auto it = update->GetList().begin(); it != update->GetList().end();) {
-    if (GetAndDecryptField(*it, kIsGaiaFieldKey) ==
-        BooleanToString(is_gaia_password)) {
-      it = update->GetList().erase(it);
-    } else {
-      it++;
-    }
-  }
+  update->EraseListValueIf([&](const auto& dict) {
+    return GetAndDecryptField(dict, kIsGaiaFieldKey) ==
+           BooleanToString(is_gaia_password);
+  });
 }
 
 void HashPasswordManager::ClearAllNonGmailPasswordHash() {
@@ -233,8 +207,7 @@
     return;
 
   ListPrefUpdate update(prefs_, prefs::kPasswordHashDataList);
-
-  base::EraseIf(update->GetList(), [](const base::Value& data) {
+  update->EraseListValueIf([](const base::Value& data) {
     if (GetAndDecryptField(data, kIsGaiaFieldKey) == "false") {
       return false;
     }
@@ -342,24 +315,22 @@
   encrypted_password_hash_entry.SetKey(
       kLastSignInTimeFieldKey, base::Value(base::Time::Now().ToDoubleT()));
   ListPrefUpdate update(prefs_, prefs::kPasswordHashDataList);
-  bool replace_old_entry = false;
-  for (auto it = update->GetList().begin(); it != update->GetList().end();) {
-    if (AreUsernamesSame(GetAndDecryptField(*it, kUsernameFieldKey),
-                         IsGaiaPassword(*it), password_hash_data.username,
-                         password_hash_data.is_gaia_password)) {
-      it = update->GetList().erase(it);
-      replace_old_entry = true;
-    } else {
-      it++;
-    }
-  }
-  if (replace_old_entry) {
-    update->Append(std::move(encrypted_password_hash_entry));
-    return true;
-  }
+  size_t num_erased = update->EraseListValueIf([&](const auto& dict) {
+    return AreUsernamesSame(GetAndDecryptField(dict, kUsernameFieldKey),
+                            IsGaiaPassword(dict), password_hash_data.username,
+                            password_hash_data.is_gaia_password);
+  });
 
-  if (update->GetList().size() >= kMaxPasswordHashDataDictSize)
-    RemoveOldestSignInPasswordHashData(&update->GetList());
+  if (num_erased == 0 &&
+      update->GetList().size() >= kMaxPasswordHashDataDictSize) {
+    // Erase the oldest sign-in password hash data.
+    update->EraseListIter(std::min_element(
+        update->GetList().begin(), update->GetList().end(),
+        [](const auto& lhs, const auto& rhs) {
+          return lhs.FindKey(kLastSignInTimeFieldKey)->GetDouble() <
+                 rhs.FindKey(kLastSignInTimeFieldKey)->GetDouble();
+        }));
+  }
 
   update->Append(std::move(encrypted_password_hash_entry));
   return true;
diff --git a/components/password_manager/core/browser/hash_password_manager.h b/components/password_manager/core/browser/hash_password_manager.h
index e0e49dc..ed34617 100644
--- a/components/password_manager/core/browser/hash_password_manager.h
+++ b/components/password_manager/core/browser/hash_password_manager.h
@@ -57,7 +57,9 @@
   void set_prefs(PrefService* prefs) { prefs_ = prefs; }
 
   // Adds a listener for when |kPasswordHashDataList| list might have changed.
-  // Should only be called on the UI thread.
+  // Should only be called on the UI thread. The callback is only called when
+  // the sign-in isn't the first change on the |kPasswordHashDataList| and
+  // saving the password hash actually succeeded.
   virtual std::unique_ptr<StateSubscription> RegisterStateCallback(
       const base::Callback<void(const std::string& username)>& callback);
 
@@ -68,7 +70,9 @@
   PrefService* prefs_ = nullptr;
 
   // Callbacks when |kPasswordHashDataList| might have changed.
-  // Should only be accessed on the UI thread.
+  // Should only be accessed on the UI thread. The callback is only called when
+  // the sign-in isn't the first change on the |kPasswordHashDataList| and
+  // saving the password hash actually succeeded.
   base::CallbackList<void(const std::string& username)> state_callback_list_;
 
   DISALLOW_COPY_AND_ASSIGN(HashPasswordManager);
diff --git a/components/policy/core/browser/url_blacklist_manager_unittest.cc b/components/policy/core/browser/url_blacklist_manager_unittest.cc
index 68f820db..5fb1c8c43 100644
--- a/components/policy/core/browser/url_blacklist_manager_unittest.cc
+++ b/components/policy/core/browser/url_blacklist_manager_unittest.cc
@@ -530,7 +530,6 @@
   EXPECT_TRUE(IsMatch("example.com", "ftp://example.com"));
   EXPECT_TRUE(IsMatch("example.com", "http://example.com"));
   EXPECT_TRUE(IsMatch("example.com", "https://example.com"));
-  EXPECT_TRUE(IsMatch("example.com", "gopher://example.com"));
   EXPECT_TRUE(IsMatch("example.com", "ws://example.com"));
   EXPECT_TRUE(IsMatch("example.com", "wss://example.com"));
 
@@ -540,6 +539,7 @@
   EXPECT_FALSE(IsMatch("example.com/*", "filesystem:///something"));
   EXPECT_FALSE(IsMatch("example.com", "custom://example.com"));
   EXPECT_FALSE(IsMatch("example", "custom://example"));
+  EXPECT_FALSE(IsMatch("example.com", "gopher://example.com"));
 
   // An optional '.' (dot) can prefix the host field to disable subdomain
   // matching, see below for details.
diff --git a/components/policy/core/browser/url_util_unittest.cc b/components/policy/core/browser/url_util_unittest.cc
index d055ec7d..79d7155 100644
--- a/components/policy/core/browser/url_util_unittest.cc
+++ b/components/policy/core/browser/url_util_unittest.cc
@@ -488,7 +488,6 @@
   EXPECT_TRUE(MatchFilters({"example.com"}, "ftp://example.com"));
   EXPECT_TRUE(MatchFilters({"example.com"}, "http://example.com"));
   EXPECT_TRUE(MatchFilters({"example.com"}, "https://example.com"));
-  EXPECT_TRUE(MatchFilters({"example.com"}, "gopher://example.com"));
   EXPECT_TRUE(MatchFilters({"example.com"}, "ws://example.com"));
   EXPECT_TRUE(MatchFilters({"example.com"}, "wss://example.com"));
 
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto
index 2a5cba6..e67f9c9 100644
--- a/components/policy/proto/device_management_backend.proto
+++ b/components/policy/proto/device_management_backend.proto
@@ -1020,10 +1020,10 @@
   repeated int32 cpu_utilization_pct_samples = 12;
 
   // Total RAM on the device.
+  // To deprecate: Use SystemFreeRamInfo instead.
   optional int64 system_ram_total = 14;
 
   // Samples of free RAM [in bytes] (unreliable due to GC).
-  // To deprecate: Use SystemFreeRamInfo instead.
   repeated int64 system_ram_free_samples = 15;
 
   // Samples of CPU temperatures in Celsius, plus associated labels
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 5c5563b..d5cb7fd 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -2771,7 +2771,7 @@
       'id': 19,
       'caption': '''Specify a list of disabled plugins''',
       'tags': [],
-      'desc': '''This policy is deprecated. Please use the <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME">DefaultPluginsSetting</ph> to control the avalability of the Flash plugin and <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME">AlwaysOpenPdfExternally</ph> to control whether the integrated PDF viewer should be used for opening PDF files.
+      'desc': '''This policy is deprecated. Please use the <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME">DefaultPluginsSetting</ph> to control the availability of the Flash plugin and <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME">AlwaysOpenPdfExternally</ph> to control whether the integrated PDF viewer should be used for opening PDF files.
 
       Specifies a list of plugins that are disabled in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> and prevents users from changing this setting.
 
@@ -2802,7 +2802,7 @@
       'id': 78,
       'caption': '''Specify a list of enabled plugins''',
       'tags': ['system-security'],
-      'desc': '''This policy is deprecated. Please use the <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME">DefaultPluginsSetting</ph> to control the avalability of the Flash plugin and <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME">AlwaysOpenPdfExternally</ph> to control whether the integrated PDF viewer should be used for opening PDF files.
+      'desc': '''This policy is deprecated. Please use the <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME">DefaultPluginsSetting</ph> to control the availability of the Flash plugin and <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME">AlwaysOpenPdfExternally</ph> to control whether the integrated PDF viewer should be used for opening PDF files.
 
       Specifies a list of plugins that are enabled in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> and prevents users from changing this setting.
 
@@ -2833,7 +2833,7 @@
       'id': 79,
       'caption': '''Specify a list of plugins that the user can enable or disable''',
       'tags': [],
-      'desc': '''This policy is deprecated. Please use the <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME">DefaultPluginsSetting</ph> to control the avalability of the Flash plugin and <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME">AlwaysOpenPdfExternally</ph> to control whether the integrated PDF viewer should be used for opening PDF files.
+      'desc': '''This policy is deprecated. Please use the <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME">DefaultPluginsSetting</ph> to control the availability of the Flash plugin and <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME">AlwaysOpenPdfExternally</ph> to control whether the integrated PDF viewer should be used for opening PDF files.
 
       Specifies a list of plugins that user can enable or disable in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>.
 
@@ -14348,7 +14348,7 @@
       'owners': ['file://components/policy/resources/OWNERS'],
       'type': 'main',
       'schema': { 'type': 'boolean' },
-      'supported_on': ['chrome.*:65-'],
+      'supported_on': ['chrome.*:65-79'],
       'device_only': False,
       'features': {
         'dynamic_refresh': False,
@@ -14358,7 +14358,11 @@
       'id': 414,
       'caption': '''Allow WebDriver to Override Incompatible Policies''',
       'tags': ['system-security'],
-      'desc': '''This policy allows users of the WebDriver feature to override
+      'desc': '''
+      This policy was removed in M80, because it is not necessary anymore as
+      WebDriver is now compatible with all existing policies.
+
+      This policy allows users of the WebDriver feature to override
       policies which can interfere with its operation.
 
       Currently this policy disables SitePerProcess and IsolateOrigins policies.
@@ -14638,7 +14642,7 @@
       'id': 410,
       'caption': '''Restrict accounts that are visible in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>''',
       'tags': [],
-      'desc': '''Contains a list of patterns which are used to control the visiblity of accounts in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>.
+      'desc': '''Contains a list of patterns which are used to control the visibility of accounts in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>.
 
       Each Google account on the device will be compared to patterns stored in this policy to determine the account visibility in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>. The account will be visible if its name matches any pattern on the list. Otherwise, the account will be hidden.
 
@@ -18507,7 +18511,7 @@
       'tags': [],
       'desc': '''Use the legacy <ph name="CORS">CORS</ph> implementation rather than new <ph name="CORS">CORS</ph>.
 
-      If this setting is set to True, the legacy implementation is used that should be compatibile with previous versions.
+      If this setting is set to True, the legacy implementation is used that should be compatible with previous versions.
 
       If this setting is set to False, or is not set, the new implementation is used that might cause enterprise specific compatibility issues potentially.
 
diff --git a/components/printing/browser/features.cc b/components/printing/browser/features.cc
index 5bbbdd0..501987b 100644
--- a/components/printing/browser/features.cc
+++ b/components/printing/browser/features.cc
@@ -7,14 +7,6 @@
 namespace printing {
 namespace features {
 
-#if defined(OS_ANDROID)
-const base::Feature kUsePdfCompositorServiceForPrint{
-    "UsePdfCompositorServiceForPrint", base::FEATURE_DISABLED_BY_DEFAULT};
-#else
-const base::Feature kUsePdfCompositorServiceForPrint{
-    "UsePdfCompositorServiceForPrint", base::FEATURE_ENABLED_BY_DEFAULT};
-#endif
-
 #if defined(OS_MACOSX)
 const base::Feature kEnableCustomMacPaperSizes{
     "EnableCustomMacPaperSizes", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/printing/browser/features.h b/components/printing/browser/features.h
index 0dddcfa..8d113ef2 100644
--- a/components/printing/browser/features.h
+++ b/components/printing/browser/features.h
@@ -11,9 +11,6 @@
 namespace printing {
 namespace features {
 
-// Use pdf compositor service to generate PDF files for printing.
-extern const base::Feature kUsePdfCompositorServiceForPrint;
-
 #if defined(OS_MACOSX)
 extern const base::Feature kEnableCustomMacPaperSizes;
 #endif
diff --git a/components/printing/browser/print_manager_utils.cc b/components/printing/browser/print_manager_utils.cc
index c1073ba..0d7c4f74 100644
--- a/components/printing/browser/print_manager_utils.cc
+++ b/components/printing/browser/print_manager_utils.cc
@@ -4,7 +4,6 @@
 
 #include "components/printing/browser/print_manager_utils.h"
 
-#include "components/printing/browser/features.h"
 #include "components/printing/browser/print_composite_client.h"
 #include "components/printing/common/print_messages.h"
 #include "content/public/browser/site_isolation_policy.h"
@@ -36,9 +35,7 @@
   // where OOPIF is used such as isolate-extensions, but should be good for
   // feature testing purpose. Eventually, we will remove this check and use pdf
   // compositor service by default for printing.
-  if (content::SiteIsolationPolicy::ShouldPdfCompositorBeEnabledForOopifs() ||
-      base::FeatureList::IsEnabled(
-          features::kUsePdfCompositorServiceForPrint)) {
+  if (content::SiteIsolationPolicy::ShouldPdfCompositorBeEnabledForOopifs()) {
     PrintCompositeClient::CreateForWebContents(web_contents);
     PrintCompositeClient::FromWebContents(web_contents)
         ->SetUserAgent(user_agent);
diff --git a/components/security_state/core/security_state.cc b/components/security_state/core/security_state.cc
index 69d0d29f..1fab298 100644
--- a/components/security_state/core/security_state.cc
+++ b/components/security_state/core/security_state.cc
@@ -267,6 +267,11 @@
       connection_used_legacy_tls(false),
       should_suppress_legacy_tls_warning(false) {}
 
+VisibleSecurityState::VisibleSecurityState(const VisibleSecurityState& other) =
+    default;
+VisibleSecurityState& VisibleSecurityState::operator=(
+    const VisibleSecurityState& other) = default;
+
 VisibleSecurityState::~VisibleSecurityState() {}
 
 bool IsSchemeCryptographic(const GURL& url) {
@@ -293,6 +298,22 @@
   return prefix + "." + GetHistogramSuffixForSafetyTipStatus(safety_tip_status);
 }
 
+bool GetLegacyTLSWarningStatus(
+    const VisibleSecurityState& visible_security_state) {
+  return visible_security_state.connection_used_legacy_tls &&
+         !visible_security_state.should_suppress_legacy_tls_warning;
+}
+
+std::string GetLegacyTLSHistogramName(
+    const std::string& prefix,
+    const VisibleSecurityState& visible_security_state) {
+  if (GetLegacyTLSWarningStatus(visible_security_state)) {
+    return prefix + "." + "LegacyTLS_Triggered";
+  } else {
+    return prefix + "." + "LegacyTLS_NotTriggered";
+  }
+}
+
 bool IsSHA1InChain(const VisibleSecurityState& visible_security_state) {
   return visible_security_state.certificate &&
          (visible_security_state.cert_status &
diff --git a/components/security_state/core/security_state.h b/components/security_state/core/security_state.h
index 8772e62..fbe66c6 100644
--- a/components/security_state/core/security_state.h
+++ b/components/security_state/core/security_state.h
@@ -143,7 +143,10 @@
 // for a page. This is the input to GetSecurityLevel().
 struct VisibleSecurityState {
   VisibleSecurityState();
+  VisibleSecurityState(const VisibleSecurityState& other);
+  VisibleSecurityState& operator=(const VisibleSecurityState& other);
   ~VisibleSecurityState();
+
   GURL url;
 
   MaliciousContentStatus malicious_content_status;
@@ -240,6 +243,18 @@
 std::string GetSafetyTipHistogramName(const std::string& prefix,
                                       SafetyTipStatus safety_tip_status);
 
+// Returns whether the given VisibleSecurityState would trigger a legacy TLS
+// warning (i.e., uses legacy TLS and isn't in the control group), if the user
+// were in the appropriate field trial.
+bool GetLegacyTLSWarningStatus(
+    const VisibleSecurityState& visible_security_state);
+
+// Returns the given prefix suffixed with a dot and the legacy TLS status
+// derived from the VisibleSecurityStatus.
+std::string GetLegacyTLSHistogramName(
+    const std::string& prefix,
+    const VisibleSecurityState& visible_security_state);
+
 bool IsSHA1InChain(const VisibleSecurityState& visible_security_state);
 
 }  // namespace security_state
diff --git a/components/security_state/core/security_state_unittest.cc b/components/security_state/core/security_state_unittest.cc
index e155a46..8671a7d 100644
--- a/components/security_state/core/security_state_unittest.cc
+++ b/components/security_state/core/security_state_unittest.cc
@@ -443,6 +443,28 @@
   EXPECT_FALSE(IsSslCertificateValid(SecurityLevel::WARNING));
 }
 
+// Tests GetLegacyTLSWarningStatus function.
+TEST(SecurityStateTest, LegacyTLSWarningStatus) {
+  const struct {
+    bool connection_used_legacy_tls;
+    bool should_suppress_legacy_tls_warning;
+    bool expected_legacy_tls_warning_status;
+  } kTestCases[] = {
+      {true, false, true},
+      {true, true, false},
+      {false, false, false},
+      {false, true, false},
+  };
+  for (auto testcase : kTestCases) {
+    auto state = VisibleSecurityState();
+    state.connection_used_legacy_tls = testcase.connection_used_legacy_tls;
+    state.should_suppress_legacy_tls_warning =
+        testcase.should_suppress_legacy_tls_warning;
+    EXPECT_EQ(testcase.expected_legacy_tls_warning_status,
+              GetLegacyTLSWarningStatus(state));
+  }
+}
+
 // Tests that WARNING is not set for error pages.
 TEST(SecurityStateTest, ErrorPage) {
   TestSecurityStateHelper helper;
diff --git a/components/signin/core/browser/account_reconcilor.cc b/components/signin/core/browser/account_reconcilor.cc
index ad4c5b3..f33a42cd 100644
--- a/components/signin/core/browser/account_reconcilor.cc
+++ b/components/signin/core/browser/account_reconcilor.cc
@@ -40,14 +40,6 @@
 using signin::AccountReconcilorDelegate;
 using signin_metrics::AccountReconcilorState;
 
-#if defined(OS_ANDROID) || defined(OS_IOS)
-const base::Feature kUseMultiloginEndpoint{"UseMultiloginEndpoint",
-                                           base::FEATURE_ENABLED_BY_DEFAULT};
-#else
-const base::Feature kUseMultiloginEndpoint{"UseMultiloginEndpoint",
-                                           base::FEATURE_DISABLED_BY_DEFAULT};
-#endif
-
 namespace {
 
 class AccountEqualToFunc {
@@ -1027,11 +1019,7 @@
 }
 
 bool AccountReconcilor::IsMultiloginEndpointEnabled() const {
-#if defined(OS_ANDROID)
-  if (base::FeatureList::IsEnabled(signin::kMiceFeature))
-    return true;  // Mice is only implemented with multilogin.
-#endif
-  return base::FeatureList::IsEnabled(kUseMultiloginEndpoint);
+  return delegate_->IsMultiloginEndpointEnabled();
 }
 
 bool AccountReconcilor::CookieNeedsUpdate(
diff --git a/components/signin/core/browser/account_reconcilor.h b/components/signin/core/browser/account_reconcilor.h
index b4b9cf2e..1ed8510 100644
--- a/components/signin/core/browser/account_reconcilor.h
+++ b/components/signin/core/browser/account_reconcilor.h
@@ -10,7 +10,6 @@
 
 #include "base/callback_forward.h"
 #include "base/compiler_specific.h"
-#include "base/feature_list.h"
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
@@ -29,9 +28,6 @@
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "google_apis/gaia/google_service_auth_error.h"
 
-// Enables usage of Gaia Auth Multilogin endpoint for identity consistency.
-extern const base::Feature kUseMultiloginEndpoint;
-
 namespace signin {
 class AccountReconcilorDelegate;
 class ConsistencyCookieManagerBase;
@@ -138,10 +134,10 @@
   friend class BaseAccountReconcilorTestTable;
   FRIEND_TEST_ALL_PREFIXES(AccountReconcilorTestForceDiceMigration,
                            TableRowTestCheckNoOp);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            IdentityManagerRegistration);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest, Reauth);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest, Reauth);
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            ProfileAlreadyConnected);
   FRIEND_TEST_ALL_PREFIXES(AccountReconcilorTestTable, TableRowTest);
   FRIEND_TEST_ALL_PREFIXES(AccountReconcilorTestTable,
@@ -179,58 +175,53 @@
   FRIEND_TEST_ALL_PREFIXES(AccountReconcilorTest, DiceDeleteCookie);
   FRIEND_TEST_ALL_PREFIXES(AccountReconcilorDiceEndpointParamTest,
                            MigrationClearAllTokens);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
-                           TokensNotLoaded);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest, TokensNotLoaded);
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            StartReconcileCookiesDisabled);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            StartReconcileContentSettings);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            StartReconcileContentSettingsGaiaUrl);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            StartReconcileContentSettingsNonGaiaUrl);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            StartReconcileContentSettingsInvalidPattern);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            GetAccountsFromCookieSuccess);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            GetAccountsFromCookieFailure);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            ExtraCookieChangeNotification);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
-                           StartReconcileNoop);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest, StartReconcileNoop);
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            StartReconcileNoopWithDots);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            StartReconcileNoopMultiple);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            StartReconcileAddToCookie);
   FRIEND_TEST_ALL_PREFIXES(AccountReconcilorTest, AuthErrorTriggersListAccount);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            SignoutAfterErrorDoesNotRecordUma);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
-                           TokenErrorOnPrimary);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest, TokenErrorOnPrimary);
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            StartReconcileRemoveFromCookie);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            StartReconcileAddToCookieTwice);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            StartReconcileBadPrimary);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
-                           StartReconcileOnlyOnce);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest, Lock);
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest, StartReconcileOnlyOnce);
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest, Lock);
   FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMethodParamTest,
                            StartReconcileWithSessionInfoExpiredDefault);
   FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMethodParamTest,
                            AccountReconcilorStateScheduled);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            AddAccountToCookieCompletedWithBogusAccount);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
-                           NoLoopWithBadPrimary);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest, NoLoopWithBadPrimary);
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            WontMergeAccountsWithError);
   FRIEND_TEST_ALL_PREFIXES(AccountReconcilorTest, DelegateTimeoutIsCalled);
-  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorEndpointParamTest,
+  FRIEND_TEST_ALL_PREFIXES(AccountReconcilorMirrorTest,
                            DelegateTimeoutIsNotCalled);
   FRIEND_TEST_ALL_PREFIXES(AccountReconcilorTest,
                            DelegateTimeoutIsNotCalledIfTimeoutIsNotReached);
diff --git a/components/signin/core/browser/account_reconcilor_delegate.cc b/components/signin/core/browser/account_reconcilor_delegate.cc
index f5c62206..3424d04 100644
--- a/components/signin/core/browser/account_reconcilor_delegate.cc
+++ b/components/signin/core/browser/account_reconcilor_delegate.cc
@@ -14,6 +14,10 @@
   return false;
 }
 
+bool AccountReconcilorDelegate::IsMultiloginEndpointEnabled() const {
+  return true;
+}
+
 bool AccountReconcilorDelegate::IsAccountConsistencyEnforced() const {
   return false;
 }
diff --git a/components/signin/core/browser/account_reconcilor_delegate.h b/components/signin/core/browser/account_reconcilor_delegate.h
index 6a26da3..68c825d 100644
--- a/components/signin/core/browser/account_reconcilor_delegate.h
+++ b/components/signin/core/browser/account_reconcilor_delegate.h
@@ -47,6 +47,11 @@
   // false.
   virtual bool IsReconcileEnabled() const;
 
+  // Returns whether the OAuth multilogin endpoint can be used to build the Gaia
+  // cookies.
+  // Default implementation returns true.
+  virtual bool IsMultiloginEndpointEnabled() const;
+
   // Returns true if account consistency is enforced (Mirror or Dice).
   // If this is false, reconcile is done, but its results are discarded and no
   // changes to the accounts are made. Defaults to false.
diff --git a/components/signin/core/browser/account_reconcilor_unittest.cc b/components/signin/core/browser/account_reconcilor_unittest.cc
index ba43864..fcd0858 100644
--- a/components/signin/core/browser/account_reconcilor_unittest.cc
+++ b/components/signin/core/browser/account_reconcilor_unittest.cc
@@ -299,8 +299,8 @@
 class AccountReconcilorMiceTest : public AccountReconcilorTest {
  public:
   AccountReconcilorMiceTest() {
-    scoped_feature_list_.InitAndEnableFeature(signin::kMiceFeature);
     SetAccountConsistency(signin::AccountConsistencyMethod::kMirror);
+    scoped_feature_list_.InitAndEnableFeature(signin::kMiceFeature);
   }
 
  private:
@@ -309,24 +309,14 @@
 };
 #endif
 
-class AccountReconcilorMirrorEndpointParamTest
-    : public AccountReconcilorTest,
-      public ::testing::WithParamInterface<bool> {
+class AccountReconcilorMirrorTest : public AccountReconcilorTest {
  public:
-  AccountReconcilorMirrorEndpointParamTest() {
+  AccountReconcilorMirrorTest() {
     SetAccountConsistency(signin::AccountConsistencyMethod::kMirror);
-    if (IsMultiloginEnabled())
-      scoped_feature_list_.InitAndEnableFeature(kUseMultiloginEndpoint);
-    else
-      scoped_feature_list_.InitAndDisableFeature(kUseMultiloginEndpoint);
   }
-  bool IsMultiloginEnabled() { return GetParam(); }
-
- protected:
-  base::test::ScopedFeatureList scoped_feature_list_;
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(AccountReconcilorMirrorEndpointParamTest);
+  DISALLOW_COPY_AND_ASSIGN(AccountReconcilorMirrorTest);
 };
 
 // For tests that must be run with multiple account consistency methods.
@@ -796,7 +786,7 @@
 
 #if !defined(OS_CHROMEOS)
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest, IdentityManagerRegistration) {
+TEST_F(AccountReconcilorMirrorTest, IdentityManagerRegistration) {
   AccountReconcilor* reconcilor = GetMockReconcilor();
   ASSERT_TRUE(reconcilor);
   ASSERT_FALSE(reconcilor->IsRegisteredWithIdentityManager());
@@ -810,7 +800,7 @@
   ASSERT_FALSE(reconcilor->IsRegisteredWithIdentityManager());
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest, Reauth) {
+TEST_F(AccountReconcilorMirrorTest, Reauth) {
   const std::string email = "user@gmail.com";
   AccountInfo account_info = ConnectProfileToAccount(email);
 
@@ -829,7 +819,7 @@
 
 #endif  // !defined(OS_CHROMEOS)
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest, ProfileAlreadyConnected) {
+TEST_F(AccountReconcilorMirrorTest, ProfileAlreadyConnected) {
   ConnectProfileToAccount("user@gmail.com");
 
   AccountReconcilor* reconcilor = GetMockReconcilor();
@@ -1910,9 +1900,6 @@
  public:
   AccountReconcilorTestMirrorMultilogin() = default;
 
- protected:
-  base::test::ScopedFeatureList scoped_feature_list_;
-
  private:
   DISALLOW_COPY_AND_ASSIGN(AccountReconcilorTestMirrorMultilogin);
 };
@@ -1921,7 +1908,6 @@
 TEST_P(AccountReconcilorTestMirrorMultilogin, TableRowTest) {
   // Enable Mirror.
   SetAccountConsistency(signin::AccountConsistencyMethod::kMirror);
-  scoped_feature_list_.InitAndEnableFeature(kUseMultiloginEndpoint);
 
   // Setup tokens.
   SetupTokens(GetParam().tokens);
@@ -1954,10 +1940,10 @@
             account_to_send,
             accounts_[GetParam().cookies_after_reconcile[i]].email));
       }
-      const signin::MultiloginParameters params(
+      const signin::MultiloginParameters ml_params(
           gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
           accounts_to_send);
-      EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params))
+      EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(ml_params))
           .Times(1);
     }
   }
@@ -2021,95 +2007,29 @@
 // This table encodes the initial state and expectations of a reconcile.
 // See kDiceParams for documentation of the syntax.
 // -------------------------------------------------------------------------
-// Tokens  |Cookies |First Run     |Gaia calls|Tokens aft.|Cookies aft.|M.calls|
+// Tokens  |Cookies |First Run     |Gaia calls|Tokens aft.|Cookies aft |
 // -------------------------------------------------------------------------
-{  "ABC",   "ABC",   IsFirstReconcile::kBoth,   "",    "ABC",   "ABC",   "" },
-{  "ABC",   "",      IsFirstReconcile::kBoth,   "",    "ABC",   "ABC",   "U"},
-{  "",      "ABC",   IsFirstReconcile::kBoth,   "X",   "",      "",      "X"},
+{  "ABC",   "ABC",   IsFirstReconcile::kBoth,   "" ,    "ABC",   "ABC" },
+{  "ABC",   "",      IsFirstReconcile::kBoth,   "U",    "ABC",   "ABC" },
+{  "",      "ABC",   IsFirstReconcile::kBoth,   "X",    "",      "",   },
 // Order of Gaia accounts can be different from chrome accounts.
-{  "ABC",   "CBA",   IsFirstReconcile::kBoth,   "",    "ABC",   "CBA",   "" },
-{  "ABC",   "CB",    IsFirstReconcile::kBoth,   "",    "ABC",   "CBA",   "U"},
+{  "ABC",   "CBA",   IsFirstReconcile::kBoth,   "" ,    "ABC",   "CBA" },
+{  "ABC",   "CB",    IsFirstReconcile::kBoth,   "U",    "ABC",   "CBA" },
 // Gaia accounts which are not present in chrome accounts should be removed. In
 // this case Gaia accounts are going to be in the same order as chrome accounts.
-{  "A",     "AB",    IsFirstReconcile::kBoth,   "X",   "A",     "A",     "U"},
-{  "AB",    "CBA",   IsFirstReconcile::kBoth,   "X",   "AB",    "AB",    "U"},
-{  "AB",    "C",     IsFirstReconcile::kBoth,   "X",   "AB",    "AB",    "U"},
+// this case Gaia accounts are going to be in thcousame order as chromcnts.
+{  "A",     "AB",    IsFirstReconcile::kBoth,   "U",   "A",     "A"   },
+{  "AB",    "CBA",   IsFirstReconcile::kBoth,   "U",   "AB",    "AB"  },
+{  "AB",    "C",     IsFirstReconcile::kBoth,   "U",   "AB",    "AB"  },
 // Cookies can be refreshed in pace, without logout.
-{  "AB",    "xAxB",  IsFirstReconcile::kBoth,   "",    "AB",    "AB",    "U"},
+{  "AB",    "xAxB",  IsFirstReconcile::kBoth,   "U",    "AB",    "AB"  },
 // Token error on the account - remove it from cookies
-{  "AxB",   "AB",    IsFirstReconcile::kBoth,   "X",   "AxB",   "A",     "U"},
-{  "xAxB",  "AB",    IsFirstReconcile::kBoth,   "X",   "xAxB",  "",      "X"},
+{  "AxB",   "AB",    IsFirstReconcile::kBoth,   "U",   "AxB",    "A"   },
+{  "xAxB",  "AB",    IsFirstReconcile::kBoth,   "X",   "xAxB",   ""    },
 };
 // clang-format on
 
-TEST_P(AccountReconcilorTestActiveDirectory, TableRowTestMergeSession) {
-  // Setup tokens.
-  std::vector<Token> tokens = ParseTokenString(GetParam().tokens);
-  SetupTokens(GetParam().tokens);
-
-  // Setup cookies.
-  std::vector<Cookie> cookies = ParseCookieString(GetParam().cookies);
-  ConfigureCookieManagerService(cookies);
-
-  // Call list accounts now so that the next call completes synchronously.
-  identity_test_env()->identity_manager()->GetAccountsInCookieJar();
-  base::RunLoop().RunUntilIdle();
-
-  testing::InSequence mock_sequence;
-  MockAccountReconcilor* reconcilor = GetMockReconcilor(
-      std::make_unique<signin::ActiveDirectoryAccountReconcilorDelegate>());
-
-  // Setup expectations.
-  bool logout_all_accounts = false;
-  for (int i = 0; GetParam().gaia_api_calls[i] != '\0'; ++i) {
-    if (GetParam().gaia_api_calls[i] == 'X') {
-      logout_all_accounts = true;
-      break;
-    }
-  }
-  if (logout_all_accounts)
-    EXPECT_CALL(*reconcilor, PerformLogoutAllAccountsAction);
-
-  for (auto& account : tokens) {
-    if (account.has_error)
-      continue;
-    Cookie account_cookie{account.gaia_id, true /*is_valid*/};
-    if (logout_all_accounts || !base::Contains(cookies, account_cookie)) {
-      EXPECT_CALL(*reconcilor,
-                  PerformMergeAction(CoreAccountId(account.email)));
-    }
-  }
-
-  // Reconcile.
-  ASSERT_TRUE(reconcilor);
-  ASSERT_TRUE(reconcilor->first_execution_);
-  reconcilor->first_execution_ =
-      GetParam().is_first_reconcile == IsFirstReconcile::kFirst ? true : false;
-  reconcilor->StartReconcile();
-
-  SimulateSetAccountsInCookieCompleted(
-      reconcilor, signin::SetAccountsInCookieResult::kSuccess);
-
-  ASSERT_FALSE(reconcilor->is_reconcile_started_);
-  ASSERT_EQ(signin_metrics::ACCOUNT_RECONCILOR_OK, reconcilor->GetState());
-  VerifyCurrentTokens(ParseTokenString(GetParam().tokens_after_reconcile));
-
-  testing::Mock::VerifyAndClearExpectations(reconcilor);
-
-  // Another reconcile is sometimes triggered if Chrome accounts have
-  // changed. Allow it to finish.
-  EXPECT_CALL(*reconcilor, PerformSetCookiesAction(testing::_))
-      .WillRepeatedly(testing::Return());
-  EXPECT_CALL(*reconcilor, PerformLogoutAllAccountsAction())
-      .WillRepeatedly(testing::Return());
-  ConfigureCookieManagerService({});
-  base::RunLoop().RunUntilIdle();
-}
-
 TEST_P(AccountReconcilorTestActiveDirectory, TableRowTestMultilogin) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(kUseMultiloginEndpoint);
-
   // Setup tokens.
   std::vector<Token> tokens = ParseTokenString(GetParam().tokens);
   SetupTokens(GetParam().tokens);
@@ -2128,14 +2048,14 @@
 
   // Setup expectations.
   bool logout_action = false;
-  for (int i = 0; GetParam().gaia_api_calls_multilogin[i] != '\0'; ++i) {
-    if (GetParam().gaia_api_calls_multilogin[i] == 'X') {
+  for (int i = 0; GetParam().gaia_api_calls[i] != '\0'; ++i) {
+    if (GetParam().gaia_api_calls[i] == 'X') {
       logout_action = true;
       EXPECT_CALL(*reconcilor, PerformLogoutAllAccountsAction()).Times(1);
       cookies.clear();
       continue;
     }
-    if (GetParam().gaia_api_calls_multilogin[i] == 'U') {
+    if (GetParam().gaia_api_calls[i] == 'U') {
       std::vector<CoreAccountId> accounts_to_send;
       for (int i = 0; GetParam().cookies_after_reconcile[i] != '\0'; ++i) {
         char cookie = GetParam().cookies_after_reconcile[i];
@@ -2225,8 +2145,7 @@
 TEST_P(AccountReconcilorTestMiceMultilogin, TableRowTest) {
   // Enable Mirror.
   SetAccountConsistency(signin::AccountConsistencyMethod::kMirror);
-  scoped_feature_list_.InitWithFeatures(
-      {kUseMultiloginEndpoint, signin::kMiceFeature}, {});
+  scoped_feature_list_.InitAndEnableFeature(signin::kMiceFeature);
 
   // Setup cookies.
   std::vector<Cookie> cookies = ParseCookieString(GetParam().cookies);
@@ -2376,7 +2295,7 @@
 
 // Tests that reconcile cannot start before the tokens are loaded, and is
 // automatically started when tokens are loaded.
-TEST_P(AccountReconcilorMirrorEndpointParamTest, TokensNotLoaded) {
+TEST_F(AccountReconcilorMirrorTest, TokensNotLoaded) {
   const CoreAccountId account_id =
       ConnectProfileToAccount("user@gmail.com").account_id;
   signin::SetListAccountsResponseNoAccounts(&test_url_loader_factory_);
@@ -2390,29 +2309,23 @@
   // When tokens are loaded, reconcile starts automatically.
   identity_test_env()->ReloadAccountsFromDisk();
 
-  if (!IsMultiloginEnabled()) {
-    EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction(account_id));
-  } else {
-    std::vector<CoreAccountId> accounts_to_send = {account_id};
-    const signin::MultiloginParameters params(
-        gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
-        accounts_to_send);
-    EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params));
-  }
+  std::vector<CoreAccountId> accounts_to_send = {account_id};
+  const signin::MultiloginParameters params(
+      gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
+      accounts_to_send);
+  EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params));
+
   ASSERT_TRUE(reconcilor->is_reconcile_started_);
   base::RunLoop().RunUntilIdle();
-  if (!IsMultiloginEnabled()) {
-    SimulateAddAccountToCookieCompleted(
-        reconcilor, account_id, GoogleServiceAuthError::AuthErrorNone());
-  } else {
-    SimulateSetAccountsInCookieCompleted(
-        reconcilor, signin::SetAccountsInCookieResult::kSuccess);
-  }
+
+  SimulateSetAccountsInCookieCompleted(
+      reconcilor, signin::SetAccountsInCookieResult::kSuccess);
+
   ASSERT_FALSE(reconcilor->is_reconcile_started_);
   ASSERT_EQ(signin_metrics::ACCOUNT_RECONCILOR_OK, reconcilor->GetState());
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest, GetAccountsFromCookieSuccess) {
+TEST_F(AccountReconcilorMirrorTest, GetAccountsFromCookieSuccess) {
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
   const CoreAccountId account_id = account_info.account_id;
   signin::SetListAccountsResponseOneAccountWithParams(
@@ -2420,15 +2333,11 @@
        false /* signed_out */, true /* verified */},
       &test_url_loader_factory_);
 
-  if (!IsMultiloginEnabled()) {
-    EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction(account_id));
-  } else {
-    std::vector<CoreAccountId> accounts_to_send = {account_id};
-    const signin::MultiloginParameters params(
-        gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
-        accounts_to_send);
-    EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params));
-  }
+  std::vector<CoreAccountId> accounts_to_send = {account_id};
+  const signin::MultiloginParameters params(
+      gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
+      accounts_to_send);
+  EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params));
 
   AccountReconcilor* reconcilor = GetMockReconcilor();
   ASSERT_TRUE(reconcilor);
@@ -2448,7 +2357,7 @@
   ASSERT_EQ(0u, accounts_in_cookie_jar_info.signed_out_accounts.size());
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest, GetAccountsFromCookieFailure) {
+TEST_F(AccountReconcilorMirrorTest, GetAccountsFromCookieFailure) {
   ConnectProfileToAccount("user@gmail.com");
   signin::SetListAccountsResponseWithUnexpectedServiceResponse(
       &test_url_loader_factory_);
@@ -2474,8 +2383,7 @@
 }
 
 // Regression test for https://crbug.com/923716
-TEST_P(AccountReconcilorMirrorEndpointParamTest,
-       ExtraCookieChangeNotification) {
+TEST_F(AccountReconcilorMirrorTest, ExtraCookieChangeNotification) {
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
   const CoreAccountId account_id = account_info.account_id;
   signin::CookieParams cookie_params = {
@@ -2485,15 +2393,11 @@
   signin::SetListAccountsResponseOneAccountWithParams(
       cookie_params, &test_url_loader_factory_);
 
-  if (!IsMultiloginEnabled()) {
-    EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction(account_id));
-  } else {
-    std::vector<CoreAccountId> accounts_to_send = {account_id};
-    const signin::MultiloginParameters params(
-        gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
-        accounts_to_send);
-    EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params));
-  }
+  std::vector<CoreAccountId> accounts_to_send = {account_id};
+  const signin::MultiloginParameters params(
+      gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
+      accounts_to_send);
+  EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params));
 
   AccountReconcilor* reconcilor = GetMockReconcilor();
   ASSERT_TRUE(reconcilor);
@@ -2513,18 +2417,14 @@
 
   base::RunLoop().RunUntilIdle();
 
-  if (!IsMultiloginEnabled()) {
-    SimulateAddAccountToCookieCompleted(
-        reconcilor, account_id, GoogleServiceAuthError::AuthErrorNone());
-  } else {
-    SimulateSetAccountsInCookieCompleted(
-        reconcilor, signin::SetAccountsInCookieResult::kSuccess);
-  }
+  SimulateSetAccountsInCookieCompleted(
+      reconcilor, signin::SetAccountsInCookieResult::kSuccess);
+
   ASSERT_FALSE(reconcilor->is_reconcile_started_);
   ASSERT_EQ(signin_metrics::ACCOUNT_RECONCILOR_OK, reconcilor->GetState());
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest, StartReconcileNoop) {
+TEST_F(AccountReconcilorMirrorTest, StartReconcileNoop) {
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
 
   AccountReconcilor* reconcilor = GetMockReconcilor();
@@ -2538,18 +2438,9 @@
 
   base::RunLoop().RunUntilIdle();
   ASSERT_FALSE(reconcilor->is_reconcile_started_);
-
-  if (!IsMultiloginEnabled()) {
-    histogram_tester()->ExpectTotalCount(
-        "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 1);
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
-        signin_metrics::ACCOUNTS_SAME, 1);
-  }
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest,
-       StartReconcileCookiesDisabled) {
+TEST_F(AccountReconcilorMirrorTest, StartReconcileCookiesDisabled) {
   const CoreAccountId account_id =
       ConnectProfileToAccount("user@gmail.com").account_id;
   identity_test_env()->SetRefreshTokenForAccount(account_id);
@@ -2570,8 +2461,7 @@
   ASSERT_FALSE(reconcilor->is_reconcile_started_);
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest,
-       StartReconcileContentSettings) {
+TEST_F(AccountReconcilorMirrorTest, StartReconcileContentSettings) {
   const CoreAccountId account_id =
       ConnectProfileToAccount("user@gmail.com").account_id;
   identity_test_env()->SetRefreshTokenForAccount(account_id);
@@ -2590,8 +2480,7 @@
   ASSERT_TRUE(reconcilor->is_reconcile_started_);
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest,
-       StartReconcileContentSettingsGaiaUrl) {
+TEST_F(AccountReconcilorMirrorTest, StartReconcileContentSettingsGaiaUrl) {
   const CoreAccountId account_id =
       ConnectProfileToAccount("user@gmail.com").account_id;
   identity_test_env()->SetRefreshTokenForAccount(account_id);
@@ -2605,8 +2494,7 @@
   ASSERT_TRUE(reconcilor->is_reconcile_started_);
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest,
-       StartReconcileContentSettingsNonGaiaUrl) {
+TEST_F(AccountReconcilorMirrorTest, StartReconcileContentSettingsNonGaiaUrl) {
   const CoreAccountId account_id =
       ConnectProfileToAccount("user@gmail.com").account_id;
   identity_test_env()->SetRefreshTokenForAccount(account_id);
@@ -2620,7 +2508,7 @@
   ASSERT_FALSE(reconcilor->is_reconcile_started_);
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest,
+TEST_F(AccountReconcilorMirrorTest,
        StartReconcileContentSettingsInvalidPattern) {
   const CoreAccountId account_id =
       ConnectProfileToAccount("user@gmail.com").account_id;
@@ -2645,7 +2533,7 @@
 // which removes dots.  This tests makes sure that an email like
 // "Dot.S@hmail.com", as seen by the token service, will be considered the same
 // as "dots@gmail.com" as returned by gaia::ParseListAccountsData().
-TEST_P(AccountReconcilorMirrorEndpointParamTest, StartReconcileNoopWithDots) {
+TEST_F(AccountReconcilorMirrorTest, StartReconcileNoopWithDots) {
   if (identity_test_env()->identity_manager()->GetAccountIdMigrationState() !=
       signin::IdentityManager::AccountIdMigrationState::MIGRATION_NOT_STARTED) {
     return;
@@ -2660,15 +2548,9 @@
   reconcilor->StartReconcile();
   base::RunLoop().RunUntilIdle();
   ASSERT_FALSE(reconcilor->is_reconcile_started_);
-
-  if (!IsMultiloginEnabled()) {
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
-        signin_metrics::ACCOUNTS_SAME, 1);
-  }
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest, StartReconcileNoopMultiple) {
+TEST_F(AccountReconcilorMirrorTest, StartReconcileNoopMultiple) {
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
   AccountInfo account_info_2 =
       identity_test_env()->MakeAccountAvailable("other@gmail.com");
@@ -2682,17 +2564,9 @@
   reconcilor->StartReconcile();
   base::RunLoop().RunUntilIdle();
   ASSERT_FALSE(reconcilor->is_reconcile_started_);
-
-  if (!IsMultiloginEnabled()) {
-    histogram_tester()->ExpectTotalCount(
-        "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun", 1);
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
-        signin_metrics::ACCOUNTS_SAME, 1);
-  }
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest, StartReconcileAddToCookie) {
+TEST_F(AccountReconcilorMirrorTest, StartReconcileAddToCookie) {
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
   const CoreAccountId account_id = account_info.account_id;
   identity_test_env()->SetRefreshTokenForAccount(account_id);
@@ -2702,39 +2576,22 @@
   const CoreAccountId account_id2 =
       identity_test_env()->MakeAccountAvailable("other@gmail.com").account_id;
 
-  if (!IsMultiloginEnabled()) {
-    EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction(account_id2));
-  } else {
     std::vector<CoreAccountId> accounts_to_send = {account_id, account_id2};
     const signin::MultiloginParameters params(
         gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
         accounts_to_send);
     EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params));
-  }
 
   AccountReconcilor* reconcilor = GetMockReconcilor();
   reconcilor->StartReconcile();
 
   base::RunLoop().RunUntilIdle();
   ASSERT_TRUE(reconcilor->is_reconcile_started_);
-  if (!IsMultiloginEnabled()) {
-    SimulateAddAccountToCookieCompleted(
-        reconcilor, account_id2, GoogleServiceAuthError::AuthErrorNone());
-  } else {
-    SimulateSetAccountsInCookieCompleted(
-        reconcilor, signin::SetAccountsInCookieResult::kSuccess);
-  }
-  ASSERT_FALSE(reconcilor->is_reconcile_started_);
 
-  if (!IsMultiloginEnabled()) {
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
-        signin_metrics::ACCOUNTS_SAME, 1);
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.AddedToCookieJar.FirstRun", 1, 1);
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.RemovedFromCookieJar.FirstRun", 0, 1);
-  }
+  SimulateSetAccountsInCookieCompleted(
+      reconcilor, signin::SetAccountsInCookieResult::kSuccess);
+
+  ASSERT_FALSE(reconcilor->is_reconcile_started_);
 
   base::HistogramTester::CountsMap expected_counts;
   expected_counts["Signin.Reconciler.Duration.UpTo3mins.Success"] = 1;
@@ -2801,8 +2658,7 @@
 // This test does not run on ChromeOS because it clears the primary account,
 // which is not a flow that exists on ChromeOS.
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest,
-       SignoutAfterErrorDoesNotRecordUma) {
+TEST_F(AccountReconcilorMirrorTest, SignoutAfterErrorDoesNotRecordUma) {
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
   const CoreAccountId account_id = account_info.account_id;
   identity_test_env()->SetRefreshTokenForAccount(account_id);
@@ -2812,30 +2668,21 @@
   const CoreAccountId account_id2 =
       identity_test_env()->MakeAccountAvailable("other@gmail.com").account_id;
 
-  if (!IsMultiloginEnabled()) {
-    EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction(account_id2));
-  } else {
     std::vector<CoreAccountId> accounts_to_send = {account_id, account_id2};
     const signin::MultiloginParameters params(
         gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
         accounts_to_send);
     EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params));
-  }
 
   AccountReconcilor* reconcilor = GetMockReconcilor();
   reconcilor->StartReconcile();
 
   base::RunLoop().RunUntilIdle();
   ASSERT_TRUE(reconcilor->is_reconcile_started_);
-  if (!IsMultiloginEnabled()) {
-    SimulateAddAccountToCookieCompleted(
-        reconcilor, account_id2,
-        GoogleServiceAuthError(
-            GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
-  } else {
-    SimulateSetAccountsInCookieCompleted(
-        reconcilor, signin::SetAccountsInCookieResult::kPersistentError);
-  }
+
+  SimulateSetAccountsInCookieCompleted(
+      reconcilor, signin::SetAccountsInCookieResult::kPersistentError);
+
   ASSERT_FALSE(reconcilor->is_reconcile_started_);
 
   EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction());
@@ -2843,17 +2690,11 @@
 
   base::HistogramTester::CountsMap expected_counts;
   expected_counts["Signin.Reconciler.Duration.UpTo3mins.Failure"] = 1;
-  if (!IsMultiloginEnabled()) {
-    EXPECT_THAT(histogram_tester()->GetTotalCountsForPrefix(
-                    "Signin.Reconciler.Duration.UpTo3mins.Failure"),
-                testing::ContainerEq(expected_counts));
-  }
 }
 
 #endif  // !defined(OS_CHROMEOS)
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest,
-       StartReconcileRemoveFromCookie) {
+TEST_F(AccountReconcilorMirrorTest, StartReconcileRemoveFromCookie) {
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
   const CoreAccountId account_id = account_info.account_id;
   identity_test_env()->SetRefreshTokenForAccount(account_id);
@@ -2861,16 +2702,11 @@
       account_info.email, account_info.gaia, "other@gmail.com", "12345",
       &test_url_loader_factory_);
 
-  if (!IsMultiloginEnabled()) {
-    EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction());
-    EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction(account_id));
-  } else {
     std::vector<CoreAccountId> accounts_to_send = {account_id};
     const signin::MultiloginParameters params(
         gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
         accounts_to_send);
     EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params));
-  }
 
   AccountReconcilor* reconcilor = GetMockReconcilor();
   reconcilor->StartReconcile();
@@ -2878,28 +2714,14 @@
 
   base::RunLoop().RunUntilIdle();
 
-  if (!IsMultiloginEnabled()) {
-    SimulateAddAccountToCookieCompleted(
-        reconcilor, account_id, GoogleServiceAuthError::AuthErrorNone());
-  } else {
-    SimulateSetAccountsInCookieCompleted(
-        reconcilor, signin::SetAccountsInCookieResult::kSuccess);
-  }
-  ASSERT_FALSE(reconcilor->is_reconcile_started_);
+  SimulateSetAccountsInCookieCompleted(
+      reconcilor, signin::SetAccountsInCookieResult::kSuccess);
 
-  if (!IsMultiloginEnabled()) {
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
-        signin_metrics::ACCOUNTS_SAME, 1);
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.AddedToCookieJar.FirstRun", 0, 1);
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.RemovedFromCookieJar.FirstRun", 1, 1);
-  }
+  ASSERT_FALSE(reconcilor->is_reconcile_started_);
 }
 
 // Check that reconcile is aborted if there is token error on primary account.
-TEST_P(AccountReconcilorMirrorEndpointParamTest, TokenErrorOnPrimary) {
+TEST_F(AccountReconcilorMirrorTest, TokenErrorOnPrimary) {
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
   signin::UpdatePersistentErrorOfRefreshTokenForAccount(
       identity_test_env()->identity_manager(), account_info.account_id,
@@ -2916,8 +2738,7 @@
   ASSERT_FALSE(reconcilor->is_reconcile_started_);
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest,
-       StartReconcileAddToCookieTwice) {
+TEST_F(AccountReconcilorMirrorTest, StartReconcileAddToCookieTwice) {
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
   const CoreAccountId account_id = account_info.account_id;
   AccountInfo account_info2 =
@@ -2931,40 +2752,22 @@
   signin::SetListAccountsResponseOneAccount(
       account_info.email, account_info.gaia, &test_url_loader_factory_);
 
-  if (!IsMultiloginEnabled()) {
-    EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction(account_id2));
-    EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction(account_id3));
-  } else {
-    std::vector<CoreAccountId> accounts_to_send = {account_id, account_id2};
-    const signin::MultiloginParameters params(
-        gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
-        accounts_to_send);
-    EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params));
-  }
+  std::vector<CoreAccountId> accounts_to_send_1 = {account_id, account_id2};
+  const signin::MultiloginParameters ml_params_1(
+      gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
+      accounts_to_send_1);
+  EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(ml_params_1));
 
   AccountReconcilor* reconcilor = GetMockReconcilor();
   reconcilor->StartReconcile();
 
   base::RunLoop().RunUntilIdle();
   ASSERT_TRUE(reconcilor->is_reconcile_started_);
-  if (!IsMultiloginEnabled()) {
-    SimulateAddAccountToCookieCompleted(
-        reconcilor, account_id2, GoogleServiceAuthError::AuthErrorNone());
-  } else {
-    SimulateSetAccountsInCookieCompleted(
-        reconcilor, signin::SetAccountsInCookieResult::kSuccess);
-  }
+
+  SimulateSetAccountsInCookieCompleted(
+      reconcilor, signin::SetAccountsInCookieResult::kSuccess);
   ASSERT_FALSE(reconcilor->is_reconcile_started_);
 
-  if (!IsMultiloginEnabled()) {
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
-        signin_metrics::ACCOUNTS_SAME, 1);
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.AddedToCookieJar.FirstRun", 1, 1);
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.RemovedFromCookieJar.FirstRun", 0, 1);
-  }
 
   // Do another pass after I've added a third account to the token service
   signin::SetListAccountsResponseTwoAccounts(
@@ -2974,45 +2777,23 @@
 
   // This will cause the reconcilor to fire.
   identity_test_env()->MakeAccountAvailable(email3);
-  if (IsMultiloginEnabled()) {
-    std::vector<CoreAccountId> accounts_to_send = {account_id, account_id2,
+  std::vector<CoreAccountId> accounts_to_send_2 = {account_id, account_id2,
                                                    account_id3};
-    const signin::MultiloginParameters params(
-        gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
-        accounts_to_send);
-    EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params));
-  }
+  const signin::MultiloginParameters ml_params_2(
+      gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
+      accounts_to_send_2);
+  EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(ml_params_2));
   base::RunLoop().RunUntilIdle();
 
   ASSERT_TRUE(reconcilor->is_reconcile_started_);
-  if (!IsMultiloginEnabled()) {
-    SimulateAddAccountToCookieCompleted(
-        reconcilor, account_id3, GoogleServiceAuthError::AuthErrorNone());
-  } else {
-    SimulateSetAccountsInCookieCompleted(
-        reconcilor, signin::SetAccountsInCookieResult::kSuccess);
-  }
-  ASSERT_FALSE(reconcilor->is_reconcile_started_);
 
-  if (!IsMultiloginEnabled()) {
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
-        signin_metrics::ACCOUNTS_SAME, 1);
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.AddedToCookieJar.FirstRun", 1, 1);
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.RemovedFromCookieJar.FirstRun", 0, 1);
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.DifferentPrimaryAccounts.SubsequentRun",
-        signin_metrics::ACCOUNTS_SAME, 1);
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.AddedToCookieJar.SubsequentRun", 1, 1);
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.RemovedFromCookieJar.SubsequentRun", 0, 1);
-  }
+  SimulateSetAccountsInCookieCompleted(
+      reconcilor, signin::SetAccountsInCookieResult::kSuccess);
+
+  ASSERT_FALSE(reconcilor->is_reconcile_started_);
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest, StartReconcileBadPrimary) {
+TEST_F(AccountReconcilorMirrorTest, StartReconcileBadPrimary) {
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
   const CoreAccountId account_id = account_info.account_id;
 
@@ -3023,47 +2804,25 @@
       account_info2.email, account_info2.gaia, account_info.email,
       account_info.gaia, &test_url_loader_factory_);
 
-  if (!IsMultiloginEnabled()) {
-    EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction());
-    EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction(account_id));
-    EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction(account_id2));
-  } else {
     std::vector<CoreAccountId> accounts_to_send = {account_id, account_id2};
     const signin::MultiloginParameters params(
         gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
         accounts_to_send);
     EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params));
-  }
 
   AccountReconcilor* reconcilor = GetMockReconcilor();
   reconcilor->StartReconcile();
 
   base::RunLoop().RunUntilIdle();
   ASSERT_TRUE(reconcilor->is_reconcile_started_);
-  if (!IsMultiloginEnabled()) {
-    SimulateAddAccountToCookieCompleted(
-        reconcilor, account_id2, GoogleServiceAuthError::AuthErrorNone());
-    ASSERT_TRUE(reconcilor->is_reconcile_started_);
-    SimulateAddAccountToCookieCompleted(
-        reconcilor, account_id, GoogleServiceAuthError::AuthErrorNone());
-  } else {
-    SimulateSetAccountsInCookieCompleted(
-        reconcilor, signin::SetAccountsInCookieResult::kSuccess);
-  }
-  ASSERT_FALSE(reconcilor->is_reconcile_started_);
 
-  if (!IsMultiloginEnabled()) {
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.DifferentPrimaryAccounts.FirstRun",
-        signin_metrics::COOKIE_AND_TOKEN_PRIMARIES_DIFFERENT, 1);
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.AddedToCookieJar.FirstRun", 0, 1);
-    histogram_tester()->ExpectUniqueSample(
-        "Signin.Reconciler.RemovedFromCookieJar.FirstRun", 0, 1);
-  }
+  SimulateSetAccountsInCookieCompleted(
+      reconcilor, signin::SetAccountsInCookieResult::kSuccess);
+
+  ASSERT_FALSE(reconcilor->is_reconcile_started_);
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest, StartReconcileOnlyOnce) {
+TEST_F(AccountReconcilorMirrorTest, StartReconcileOnlyOnce) {
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
   signin::SetListAccountsResponseOneAccount(
       account_info.email, account_info.gaia, &test_url_loader_factory_);
@@ -3079,7 +2838,7 @@
   ASSERT_FALSE(reconcilor->is_reconcile_started_);
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest, Lock) {
+TEST_F(AccountReconcilorMirrorTest, Lock) {
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
   signin::SetListAccountsResponseOneAccount(
       account_info.email, account_info.gaia, &test_url_loader_factory_);
@@ -3322,7 +3081,7 @@
             reconcilor->GetState());
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest,
+TEST_F(AccountReconcilorMirrorTest,
        AddAccountToCookieCompletedWithBogusAccount) {
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
   const CoreAccountId account_id = account_info.account_id;
@@ -3331,15 +3090,11 @@
        false /* signed_out */, true /* verified */},
       &test_url_loader_factory_);
 
-  if (!IsMultiloginEnabled()) {
-    EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction(account_id));
-  } else {
     std::vector<CoreAccountId> accounts_to_send = {account_id};
     const signin::MultiloginParameters params(
         gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
         accounts_to_send);
     EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params));
-  }
 
   AccountReconcilor* reconcilor = GetMockReconcilor();
   ASSERT_TRUE(reconcilor);
@@ -3352,17 +3107,14 @@
 
   // If an unknown account id is sent, it should not upset the state.
   ASSERT_TRUE(reconcilor->is_reconcile_started_);
-  if (!IsMultiloginEnabled()) {
-    SimulateAddAccountToCookieCompleted(
-        reconcilor, account_id, GoogleServiceAuthError::AuthErrorNone());
-  } else {
-    SimulateSetAccountsInCookieCompleted(
-        reconcilor, signin::SetAccountsInCookieResult::kSuccess);
-  }
+
+  SimulateSetAccountsInCookieCompleted(
+      reconcilor, signin::SetAccountsInCookieResult::kSuccess);
+
   ASSERT_FALSE(reconcilor->is_reconcile_started_);
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest, NoLoopWithBadPrimary) {
+TEST_F(AccountReconcilorMirrorTest, NoLoopWithBadPrimary) {
   // Connect profile to a primary account and then add a secondary account.
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
   const CoreAccountId account_id1 = account_info.account_id;
@@ -3370,17 +3122,12 @@
       identity_test_env()->MakeAccountAvailable("other@gmail.com");
   const CoreAccountId account_id2 = account_info2.account_id;
 
-  if (!IsMultiloginEnabled()) {
-    EXPECT_CALL(*GetMockReconcilor(), PerformLogoutAllAccountsAction());
-    EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction(account_id1));
-    EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction(account_id2));
-  } else {
     std::vector<CoreAccountId> accounts_to_send = {account_id1, account_id2};
     const signin::MultiloginParameters params(
         gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
         accounts_to_send);
     EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params));
-  }
+
   // The primary account is in auth error, so it is not in the cookie.
   signin::SetListAccountsResponseOneAccountWithParams(
       {account_info2.email, account_info2.gaia, false /* valid */,
@@ -3398,14 +3145,8 @@
       GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
 
   // The primary cannot be added to cookie, so it fails.
-  if (!IsMultiloginEnabled()) {
-    SimulateAddAccountToCookieCompleted(reconcilor, account_id1, error);
-    SimulateAddAccountToCookieCompleted(
-        reconcilor, account_id2, GoogleServiceAuthError::AuthErrorNone());
-  } else {
-    SimulateSetAccountsInCookieCompleted(
-        reconcilor, signin::SetAccountsInCookieResult::kPersistentError);
-  }
+  SimulateSetAccountsInCookieCompleted(
+      reconcilor, signin::SetAccountsInCookieResult::kPersistentError);
   base::RunLoop().RunUntilIdle();
   ASSERT_FALSE(reconcilor->is_reconcile_started_);
   ASSERT_NE(GoogleServiceAuthError::State::NONE,
@@ -3424,7 +3165,7 @@
   testing::Mock::VerifyAndClearExpectations(GetMockReconcilor());
 }
 
-TEST_P(AccountReconcilorMirrorEndpointParamTest, WontMergeAccountsWithError) {
+TEST_F(AccountReconcilorMirrorTest, WontMergeAccountsWithError) {
   // Connect profile to a primary account and then add a secondary account.
   const CoreAccountId account_id1 =
       ConnectProfileToAccount("user@gmail.com").account_id;
@@ -3442,15 +3183,11 @@
   // Since the cookie jar starts empty, the reconcilor should attempt to merge
   // accounts into it.  However, it should only try accounts not in auth
   // error state.
-  if (!IsMultiloginEnabled()) {
-    EXPECT_CALL(*GetMockReconcilor(), PerformMergeAction(account_id1));
-  } else {
     std::vector<CoreAccountId> accounts_to_send = {account_id1};
     const signin::MultiloginParameters params(
         gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
         accounts_to_send);
     EXPECT_CALL(*GetMockReconcilor(), PerformSetCookiesAction(params));
-  }
 
   AccountReconcilor* reconcilor = GetMockReconcilor();
   ASSERT_TRUE(reconcilor);
@@ -3459,13 +3196,8 @@
   base::RunLoop().RunUntilIdle();
   ASSERT_TRUE(reconcilor->is_reconcile_started_);
 
-  if (!IsMultiloginEnabled()) {
-    SimulateAddAccountToCookieCompleted(
-        reconcilor, account_id1, GoogleServiceAuthError::AuthErrorNone());
-  } else {
-    SimulateSetAccountsInCookieCompleted(
-        reconcilor, signin::SetAccountsInCookieResult::kSuccess);
-  }
+  SimulateSetAccountsInCookieCompleted(
+      reconcilor, signin::SetAccountsInCookieResult::kSuccess);
   base::RunLoop().RunUntilIdle();
   ASSERT_FALSE(reconcilor->is_reconcile_started_);
   ASSERT_EQ(GoogleServiceAuthError::State::NONE,
@@ -3497,7 +3229,7 @@
 
 // Test that delegate timeout is not called when the delegate does not offer a
 // valid timeout.
-TEST_P(AccountReconcilorMirrorEndpointParamTest, DelegateTimeoutIsNotCalled) {
+TEST_F(AccountReconcilorMirrorTest, DelegateTimeoutIsNotCalled) {
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
   signin::SetListAccountsResponseOneAccount(
       account_info.email, account_info.gaia, &test_url_loader_factory_);
@@ -3512,10 +3244,6 @@
   EXPECT_FALSE(timer->IsRunning());
 }
 
-INSTANTIATE_TEST_SUITE_P(TestMirrorEndpoint,
-                         AccountReconcilorMirrorEndpointParamTest,
-                         ::testing::ValuesIn({false, true}));
-
 TEST_F(AccountReconcilorTest, DelegateTimeoutIsNotCalledIfTimeoutIsNotReached) {
   AccountInfo account_info = ConnectProfileToAccount("user@gmail.com");
   signin::SetListAccountsResponseOneAccount(
@@ -3577,8 +3305,6 @@
     }
   };
 
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(kUseMultiloginEndpoint);
   MockAccountReconcilor* reconcilor =
       GetMockReconcilor(std::make_unique<MultiloginLogoutDelegate>());
   signin::SetListAccountsResponseOneAccount("user@gmail.com", "123456",
diff --git a/components/signin/core/browser/dice_account_reconcilor_delegate.cc b/components/signin/core/browser/dice_account_reconcilor_delegate.cc
index 2adffa0..570be5a1 100644
--- a/components/signin/core/browser/dice_account_reconcilor_delegate.cc
+++ b/components/signin/core/browser/dice_account_reconcilor_delegate.cc
@@ -13,6 +13,9 @@
 #include "components/signin/public/base/signin_client.h"
 #include "components/signin/public/base/signin_pref_names.h"
 
+const base::Feature kUseMultiloginEndpoint{"UseMultiloginEndpoint",
+                                           base::FEATURE_DISABLED_BY_DEFAULT};
+
 namespace signin {
 
 DiceAccountReconcilorDelegate::DiceAccountReconcilorDelegate(
@@ -33,6 +36,10 @@
   return true;
 }
 
+bool DiceAccountReconcilorDelegate::IsMultiloginEndpointEnabled() const {
+  return base::FeatureList::IsEnabled(kUseMultiloginEndpoint);
+}
+
 bool DiceAccountReconcilorDelegate::IsAccountConsistencyEnforced() const {
   return account_consistency_ == AccountConsistencyMethod::kDice;
 }
diff --git a/components/signin/core/browser/dice_account_reconcilor_delegate.h b/components/signin/core/browser/dice_account_reconcilor_delegate.h
index f1efaba..c83dc22 100644
--- a/components/signin/core/browser/dice_account_reconcilor_delegate.h
+++ b/components/signin/core/browser/dice_account_reconcilor_delegate.h
@@ -13,6 +13,9 @@
 
 class SigninClient;
 
+// Enables usage of Gaia Auth Multilogin endpoint for identity consistency.
+extern const base::Feature kUseMultiloginEndpoint;
+
 namespace signin {
 
 // AccountReconcilorDelegate specialized for Dice.
@@ -25,6 +28,7 @@
 
   // AccountReconcilorDelegate:
   bool IsReconcileEnabled() const override;
+  bool IsMultiloginEndpointEnabled() const override;
   bool IsAccountConsistencyEnforced() const override;
   void MaybeLogInconsistencyReason(
       const CoreAccountId& primary_account,
diff --git a/components/sync/driver/about_sync_util.cc b/components/sync/driver/about_sync_util.cc
index 4336e2e..3b1dd0f 100644
--- a/components/sync/driver/about_sync_util.cc
+++ b/components/sync/driver/about_sync_util.cc
@@ -454,18 +454,22 @@
       service->GetLastCycleSnapshotForDebugging();
   const SyncTokenStatus& token_status =
       service->GetSyncTokenStatusForDebugging();
+  bool is_local_sync_enabled_state = service->IsLocalSyncEnabled();
 
   // Version Info.
   // |client_version| was already set above.
-  server_url->Set(service->GetSyncServiceUrlForDebugging().spec());
+  if (!is_local_sync_enabled_state)
+    server_url->Set(service->GetSyncServiceUrlForDebugging().spec());
 
   // Identity.
   if (is_status_valid && !full_status.sync_id.empty())
     sync_client_id->Set(full_status.sync_id);
   if (is_status_valid && !full_status.invalidator_client_id.empty())
     invalidator_id->Set(full_status.invalidator_client_id);
-  username->Set(service->GetAuthenticatedAccountInfo().email);
-  user_is_primary->Set(service->IsAuthenticatedAccountPrimary());
+  if (!is_local_sync_enabled_state) {
+    username->Set(service->GetAuthenticatedAccountInfo().email);
+    user_is_primary->Set(service->IsAuthenticatedAccountPrimary());
+  }
 
   // Credentials.
   token_request_time->Set(GetTimeStr(token_status.token_request_time, "n/a"));
@@ -483,8 +487,8 @@
   is_setup_complete->Set(service->GetUserSettings()->IsFirstSetupComplete());
   if (is_status_valid)
     is_syncing->Set(full_status.syncing);
-  is_local_sync_enabled->Set(service->IsLocalSyncEnabled());
-  if (service->IsLocalSyncEnabled() && is_status_valid)
+  is_local_sync_enabled->Set(is_local_sync_enabled_state);
+  if (is_local_sync_enabled_state && is_status_valid)
     local_backend_path->Set(full_status.local_sync_folder);
 
   // Network.
diff --git a/components/sync/driver/glue/sync_engine_backend.cc b/components/sync/driver/glue/sync_engine_backend.cc
index c58e366..ec6b8ff 100644
--- a/components/sync/driver/glue/sync_engine_backend.cc
+++ b/components/sync/driver/glue/sync_engine_backend.cc
@@ -10,8 +10,8 @@
 #include "base/files/file_util.h"
 #include "base/location.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/sequenced_task_runner.h"
 #include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/memory_dump_manager.h"
 #include "components/invalidation/public/invalidation_util.h"
 #include "components/invalidation/public/object_id_invalidation_map.h"
@@ -62,17 +62,6 @@
 const base::FilePath::CharType kNigoriStorageFilename[] =
     FILE_PATH_LITERAL("Nigori.bin");
 
-void RecordPerModelTypeInvalidation(ModelTypeForHistograms value,
-                                    bool is_grouped) {
-  UMA_HISTOGRAM_ENUMERATION("Sync.InvalidationPerModelType", value);
-  if (!is_grouped) {
-    // When recording metrics it's important to distinguish between
-    // many/one case, since "many" aka grouped case is only common in
-    // the deprecated implementation.
-    UMA_HISTOGRAM_ENUMERATION("Sync.NonGroupedInvalidation", value);
-  }
-}
-
 bool ShouldEnableUSSNigori() {
   // USS implementation of Nigori is not compatible with Directory
   // implementations of Passwords and Bookmarks.
@@ -91,7 +80,7 @@
                                      const base::WeakPtr<SyncEngineImpl>& host)
     : name_(name), sync_data_folder_(sync_data_folder), host_(host) {
   DCHECK(host);
-  // This is constructed on the UI thread but used from the sync thread.
+  // This is constructed on the UI thread but used from another thread.
   DETACH_FROM_SEQUENCE(sequence_checker_);
 }
 
@@ -292,8 +281,8 @@
       DLOG(WARNING) << "Notification has invalid id: "
                     << ObjectIdToString(object_id);
     } else {
-      bool is_grouped = (ids.size() != 1);
-      RecordPerModelTypeInvalidation(ModelTypeHistogramValue(type), is_grouped);
+      UMA_HISTOGRAM_ENUMERATION("Sync.InvalidationPerModelType",
+                                ModelTypeHistogramValue(type));
       SingleObjectInvalidationSet invalidation_set =
           invalidation_map.ForObject(object_id);
       for (Invalidation invalidation : invalidation_set) {
@@ -301,10 +290,6 @@
           continue;
         }
 
-        if (!is_grouped && !invalidation.is_unknown_version()) {
-          UMA_HISTOGRAM_ENUMERATION("Sync.NonGroupedInvalidationKnownVersion",
-                                    ModelTypeHistogramValue(type));
-        }
         std::unique_ptr<InvalidationInterface> inv_adapter(
             new InvalidationAdapter(invalidation));
         sync_manager_->OnIncomingInvalidation(type, std::move(inv_adapter));
@@ -395,8 +380,9 @@
   args.birthday = params.birthday;
   args.bag_of_chips = params.bag_of_chips;
   sync_manager_->Init(&args);
-  base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
-      this, "SyncDirectory", base::ThreadTaskRunnerHandle::Get());
+  base::trace_event::MemoryDumpManager::GetInstance()
+      ->RegisterDumpProviderWithSequencedTaskRunner(
+          this, "SyncDirectory", base::SequencedTaskRunnerHandle::Get(), {});
 }
 
 void SyncEngineBackend::DoUpdateCredentials(
@@ -404,7 +390,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // UpdateCredentials can be called during backend initialization, possibly
   // when backend initialization has failed but hasn't notified the UI thread
-  // yet. In that case, the sync manager may have been destroyed on the sync
+  // yet. In that case, the sync manager may have been destroyed on another
   // thread before this task was executed, so we do nothing.
   if (sync_manager_) {
     sync_manager_->UpdateCredentials(credentials);
diff --git a/components/url_formatter/elide_url_unittest.cc b/components/url_formatter/elide_url_unittest.cc
index 2aba822..c545876d 100644
--- a/components/url_formatter/elide_url_unittest.cc
+++ b/components/url_formatter/elide_url_unittest.cc
@@ -453,9 +453,8 @@
      L"https://www.google.com", L"www.google.com", L"www.google.com"},
     {"Unusual secure scheme (wss)", "wss://www.google.com/",
      L"wss://www.google.com", L"wss://www.google.com", L"www.google.com"},
-    {"Unusual non-secure scheme (gopher)", "gopher://www.google.com/",
-     L"gopher://www.google.com", L"gopher://www.google.com",
-     L"gopher://www.google.com"},
+    {"Unusual non-secure scheme (ftp)", "ftp://www.google.com/",
+     L"ftp://www.google.com", L"ftp://www.google.com", L"ftp://www.google.com"},
     {"Unlisted scheme (chrome)", "chrome://version", L"chrome://version",
      L"chrome://version", L"chrome://version"},
     {"HTTP IP address", "http://173.194.65.103", L"http://173.194.65.103",
diff --git a/components/viz/host/client_frame_sink_video_capturer.cc b/components/viz/host/client_frame_sink_video_capturer.cc
index 95b8fde0..7e8ed72 100644
--- a/components/viz/host/client_frame_sink_video_capturer.cc
+++ b/components/viz/host/client_frame_sink_video_capturer.cc
@@ -34,7 +34,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   format_.emplace(format, color_space);
-  capturer_->SetFormat(format, color_space);
+  capturer_remote_->SetFormat(format, color_space);
 }
 
 void ClientFrameSinkVideoCapturer::SetMinCapturePeriod(
@@ -42,7 +42,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   min_capture_period_ = min_capture_period;
-  capturer_->SetMinCapturePeriod(min_capture_period);
+  capturer_remote_->SetMinCapturePeriod(min_capture_period);
 }
 
 void ClientFrameSinkVideoCapturer::SetMinSizeChangePeriod(
@@ -50,7 +50,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   min_size_change_period_ = min_period;
-  capturer_->SetMinSizeChangePeriod(min_period);
+  capturer_remote_->SetMinSizeChangePeriod(min_period);
 }
 
 void ClientFrameSinkVideoCapturer::SetResolutionConstraints(
@@ -60,15 +60,15 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   resolution_constraints_.emplace(min_size, max_size, use_fixed_aspect_ratio);
-  capturer_->SetResolutionConstraints(min_size, max_size,
-                                      use_fixed_aspect_ratio);
+  capturer_remote_->SetResolutionConstraints(min_size, max_size,
+                                             use_fixed_aspect_ratio);
 }
 
 void ClientFrameSinkVideoCapturer::SetAutoThrottlingEnabled(bool enabled) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   auto_throttling_enabled_ = enabled;
-  capturer_->SetAutoThrottlingEnabled(enabled);
+  capturer_remote_->SetAutoThrottlingEnabled(enabled);
 }
 
 void ClientFrameSinkVideoCapturer::ChangeTarget(
@@ -76,7 +76,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   target_ = frame_sink_id;
-  capturer_->ChangeTarget(frame_sink_id);
+  capturer_remote_->ChangeTarget(frame_sink_id);
 }
 
 void ClientFrameSinkVideoCapturer::Start(
@@ -93,7 +93,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   is_started_ = false;
-  capturer_->Stop();
+  capturer_remote_->Stop();
 }
 
 void ClientFrameSinkVideoCapturer::StopAndResetConsumer() {
@@ -107,7 +107,7 @@
 void ClientFrameSinkVideoCapturer::RequestRefreshFrame() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  capturer_->RequestRefreshFrame();
+  capturer_remote_->RequestRefreshFrame();
 }
 
 std::unique_ptr<ClientFrameSinkVideoCapturer::Overlay>
@@ -127,8 +127,8 @@
   auto overlay =
       std::make_unique<Overlay>(weak_factory_.GetWeakPtr(), stacking_index);
   overlays_.push_back(overlay.get());
-  if (capturer_)
-    overlays_.back()->EstablishConnection(capturer_.get());
+  if (capturer_remote_)
+    overlays_.back()->EstablishConnection(capturer_remote_.get());
   return overlay;
 }
 
@@ -166,27 +166,29 @@
 void ClientFrameSinkVideoCapturer::EstablishConnection() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  establish_connection_callback_.Run(mojo::MakeRequest(&capturer_));
-  capturer_.set_connection_error_handler(
+  capturer_remote_.reset();
+  establish_connection_callback_.Run(
+      capturer_remote_.BindNewPipeAndPassReceiver());
+  capturer_remote_.set_disconnect_handler(
       base::BindOnce(&ClientFrameSinkVideoCapturer::OnConnectionError,
                      base::Unretained(this)));
   if (format_)
-    capturer_->SetFormat(format_->pixel_format, format_->color_space);
+    capturer_remote_->SetFormat(format_->pixel_format, format_->color_space);
   if (min_capture_period_)
-    capturer_->SetMinCapturePeriod(*min_capture_period_);
+    capturer_remote_->SetMinCapturePeriod(*min_capture_period_);
   if (min_size_change_period_)
-    capturer_->SetMinSizeChangePeriod(*min_size_change_period_);
+    capturer_remote_->SetMinSizeChangePeriod(*min_size_change_period_);
   if (resolution_constraints_) {
-    capturer_->SetResolutionConstraints(
+    capturer_remote_->SetResolutionConstraints(
         resolution_constraints_->min_size, resolution_constraints_->max_size,
         resolution_constraints_->use_fixed_aspect_ratio);
   }
   if (auto_throttling_enabled_)
-    capturer_->SetAutoThrottlingEnabled(*auto_throttling_enabled_);
+    capturer_remote_->SetAutoThrottlingEnabled(*auto_throttling_enabled_);
   if (target_)
-    capturer_->ChangeTarget(target_);
+    capturer_remote_->ChangeTarget(target_);
   for (Overlay* overlay : overlays_)
-    overlay->EstablishConnection(capturer_.get());
+    overlay->EstablishConnection(capturer_remote_.get());
   if (is_started_)
     StartInternal();
 }
@@ -204,7 +206,7 @@
 void ClientFrameSinkVideoCapturer::StartInternal() {
   if (consumer_receiver_.is_bound())
     consumer_receiver_.reset();
-  capturer_->Start(consumer_receiver_.BindNewPipeAndPassRemote());
+  capturer_remote_->Start(consumer_receiver_.BindNewPipeAndPassRemote());
 }
 
 void ClientFrameSinkVideoCapturer::OnOverlayDestroyed(Overlay* overlay) {
diff --git a/components/viz/host/client_frame_sink_video_capturer.h b/components/viz/host/client_frame_sink_video_capturer.h
index baed9a5b..ec47c88 100644
--- a/components/viz/host/client_frame_sink_video_capturer.h
+++ b/components/viz/host/client_frame_sink_video_capturer.h
@@ -13,7 +13,9 @@
 #include "components/viz/common/surfaces/frame_sink_id.h"
 #include "components/viz/host/viz_host_export.h"
 #include "media/base/video_types.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
 #include "services/viz/privileged/mojom/compositing/frame_sink_video_capture.mojom.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/gfx/geometry/rect_f.h"
@@ -64,8 +66,8 @@
     DISALLOW_COPY_AND_ASSIGN(Overlay);
   };
 
-  using EstablishConnectionCallback =
-      base::RepeatingCallback<void(mojom::FrameSinkVideoCapturerRequest)>;
+  using EstablishConnectionCallback = base::RepeatingCallback<void(
+      mojo::PendingReceiver<mojom::FrameSinkVideoCapturer>)>;
 
   explicit ClientFrameSinkVideoCapturer(EstablishConnectionCallback callback);
   ~ClientFrameSinkVideoCapturer() override;
@@ -152,7 +154,7 @@
 
   mojom::FrameSinkVideoConsumer* consumer_ = nullptr;
   EstablishConnectionCallback establish_connection_callback_;
-  mojom::FrameSinkVideoCapturerPtr capturer_;
+  mojo::Remote<mojom::FrameSinkVideoCapturer> capturer_remote_;
   mojo::Receiver<mojom::FrameSinkVideoConsumer> consumer_receiver_{this};
 
   base::WeakPtrFactory<ClientFrameSinkVideoCapturer> weak_factory_{this};
diff --git a/components/viz/host/host_frame_sink_manager.cc b/components/viz/host/host_frame_sink_manager.cc
index 2d235bc0..374c0bfa 100644
--- a/components/viz/host/host_frame_sink_manager.cc
+++ b/components/viz/host/host_frame_sink_manager.cc
@@ -282,16 +282,16 @@
 }
 
 void HostFrameSinkManager::CreateVideoCapturer(
-    mojom::FrameSinkVideoCapturerRequest request) {
-  frame_sink_manager_->CreateVideoCapturer(std::move(request));
+    mojo::PendingReceiver<mojom::FrameSinkVideoCapturer> receiver) {
+  frame_sink_manager_->CreateVideoCapturer(std::move(receiver));
 }
 
 std::unique_ptr<ClientFrameSinkVideoCapturer>
 HostFrameSinkManager::CreateVideoCapturer() {
   return std::make_unique<ClientFrameSinkVideoCapturer>(base::BindRepeating(
       [](base::WeakPtr<HostFrameSinkManager> self,
-         mojom::FrameSinkVideoCapturerRequest request) {
-        self->CreateVideoCapturer(std::move(request));
+         mojo::PendingReceiver<mojom::FrameSinkVideoCapturer> receiver) {
+        self->CreateVideoCapturer(std::move(receiver));
       },
       weak_ptr_factory_.GetWeakPtr()));
 }
diff --git a/components/viz/host/host_frame_sink_manager.h b/components/viz/host/host_frame_sink_manager.h
index 458da8d4..2fcfcab 100644
--- a/components/viz/host/host_frame_sink_manager.h
+++ b/components/viz/host/host_frame_sink_manager.h
@@ -164,7 +164,8 @@
   void AddVideoDetectorObserver(mojom::VideoDetectorObserverPtr observer);
 
   // Creates a FrameSinkVideoCapturer instance in viz.
-  void CreateVideoCapturer(mojom::FrameSinkVideoCapturerRequest request);
+  void CreateVideoCapturer(
+      mojo::PendingReceiver<mojom::FrameSinkVideoCapturer> receiver);
 
   // Creates a FrameSinkVideoCapturer instance in viz and returns a
   // ClientFrameSinkVideoCapturer that's connected to it. Clients should prefer
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
index 0a4b974..aa40c9e 100644
--- a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
+++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
@@ -278,9 +278,9 @@
 }
 
 void FrameSinkManagerImpl::CreateVideoCapturer(
-    mojom::FrameSinkVideoCapturerRequest request) {
+    mojo::PendingReceiver<mojom::FrameSinkVideoCapturer> receiver) {
   video_capturers_.emplace(std::make_unique<FrameSinkVideoCapturerImpl>(
-      this, std::move(request),
+      this, std::move(receiver),
       std::make_unique<media::VideoCaptureOracle>(
           true /* enable_auto_throttling */)));
 }
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.h b/components/viz/service/frame_sinks/frame_sink_manager_impl.h
index a8af755..ce56904 100644
--- a/components/viz/service/frame_sinks/frame_sink_manager_impl.h
+++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.h
@@ -124,7 +124,7 @@
   void AddVideoDetectorObserver(
       mojom::VideoDetectorObserverPtr observer) override;
   void CreateVideoCapturer(
-      mojom::FrameSinkVideoCapturerRequest request) override;
+      mojo::PendingReceiver<mojom::FrameSinkVideoCapturer> receiver) override;
   void EvictSurfaces(const std::vector<SurfaceId>& surface_ids) override;
   void RequestCopyOfOutput(const SurfaceId& surface_id,
                            std::unique_ptr<CopyOutputRequest> request) override;
diff --git a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc
index fab4ba1..adf88bd2 100644
--- a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc
+++ b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc
@@ -62,10 +62,9 @@
 
 FrameSinkVideoCapturerImpl::FrameSinkVideoCapturerImpl(
     FrameSinkVideoCapturerManager* frame_sink_manager,
-    mojom::FrameSinkVideoCapturerRequest request,
+    mojo::PendingReceiver<mojom::FrameSinkVideoCapturer> receiver,
     std::unique_ptr<media::VideoCaptureOracle> oracle)
     : frame_sink_manager_(frame_sink_manager),
-      binding_(this),
       copy_request_source_(base::UnguessableToken::Create()),
       clock_(base::DefaultTickClock::GetInstance()),
       oracle_(std::move(oracle)),
@@ -77,9 +76,9 @@
   // Instantiate a default base::OneShotTimer instance.
   refresh_frame_retry_timer_.emplace();
 
-  if (request.is_pending()) {
-    binding_.Bind(std::move(request));
-    binding_.set_connection_error_handler(
+  if (receiver.is_valid()) {
+    receiver_.Bind(std::move(receiver));
+    receiver_.set_disconnect_handler(
         base::BindOnce(&FrameSinkVideoCapturerManager::OnCapturerConnectionLost,
                        base::Unretained(frame_sink_manager_), this));
   }
diff --git a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.h b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.h
index 746856c..dc6c4a7 100644
--- a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.h
+++ b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.h
@@ -29,8 +29,9 @@
 #include "components/viz/service/viz_service_export.h"
 #include "media/base/video_frame.h"
 #include "media/capture/content/video_capture_oracle.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 "services/viz/privileged/mojom/compositing/frame_sink_video_capture.mojom.h"
 #include "ui/gfx/geometry/rect.h"
@@ -73,11 +74,12 @@
       public mojom::FrameSinkVideoCapturer {
  public:
   // |frame_sink_manager| must outlive this instance. Binds this instance to the
-  // Mojo message pipe endpoint in |request|, but |request| may be empty for
+  // Mojo message pipe endpoint in |receiver|, but |receiver| may be empty for
   // unit testing.
-  FrameSinkVideoCapturerImpl(FrameSinkVideoCapturerManager* frame_sink_manager,
-                             mojom::FrameSinkVideoCapturerRequest request,
-                             std::unique_ptr<media::VideoCaptureOracle> oracle);
+  FrameSinkVideoCapturerImpl(
+      FrameSinkVideoCapturerManager* frame_sink_manager,
+      mojo::PendingReceiver<mojom::FrameSinkVideoCapturer> receiver,
+      std::unique_ptr<media::VideoCaptureOracle> oracle);
 
   ~FrameSinkVideoCapturerImpl() final;
 
@@ -228,8 +230,8 @@
   // Owner/Manager of this instance.
   FrameSinkVideoCapturerManager* const frame_sink_manager_;
 
-  // Mojo binding for this instance.
-  mojo::Binding<mojom::FrameSinkVideoCapturer> binding_;
+  // Mojo receiver for this instance.
+  mojo::Receiver<mojom::FrameSinkVideoCapturer> receiver_{this};
 
   // Represents this instance as an issuer of CopyOutputRequests. The Surface
   // uses this to auto-cancel stale requests (i.e., prior requests that did not
diff --git a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc
index 91bea87..153ae35 100644
--- a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc
+++ b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc
@@ -22,6 +22,7 @@
 #include "media/base/limits.h"
 #include "media/base/video_util.h"
 #include "media/capture/mojom/video_capture_types.mojom.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 "services/viz/privileged/mojom/compositing/frame_sink_video_capture.mojom.h"
@@ -378,8 +379,7 @@
         true /* enable_auto_throttling */);
     oracle_ = oracle.get();
     capturer_ = std::make_unique<FrameSinkVideoCapturerImpl>(
-        &frame_sink_manager_, mojom::FrameSinkVideoCapturerRequest(),
-        std::move(oracle));
+        &frame_sink_manager_, mojo::NullReceiver(), std::move(oracle));
   }
 
   void SetUp() override {
diff --git a/components/viz/test/test_frame_sink_manager.h b/components/viz/test/test_frame_sink_manager.h
index f410a7d..fab6922 100644
--- a/components/viz/test/test_frame_sink_manager.h
+++ b/components/viz/test/test_frame_sink_manager.h
@@ -50,7 +50,7 @@
   void AddVideoDetectorObserver(
       mojom::VideoDetectorObserverPtr observer) override {}
   void CreateVideoCapturer(
-      mojom::FrameSinkVideoCapturerRequest request) override {}
+      mojo::PendingReceiver<mojom::FrameSinkVideoCapturer> receiver) override {}
   void EvictSurfaces(const std::vector<SurfaceId>& surface_ids) override {}
   void RequestCopyOfOutput(
       const SurfaceId& surface_id,
diff --git a/content/app/content_main_runner_impl.cc b/content/app/content_main_runner_impl.cc
index 998ef86..0c81dac 100644
--- a/content/app/content_main_runner_impl.cc
+++ b/content/app/content_main_runner_impl.cc
@@ -223,24 +223,6 @@
   gin::V8Initializer::LoadV8Snapshot(kSnapshotType);
 #endif  // !CHROME_MULTIPLE_DLL_BROWSER
 }
-
-void LoadV8NativesFile() {
-#if defined(OS_POSIX) && !defined(OS_MACOSX)
-  base::FileDescriptorStore& file_descriptor_store =
-      base::FileDescriptorStore::GetInstance();
-  base::MemoryMappedFile::Region region;
-  base::ScopedFD fd =
-      file_descriptor_store.MaybeTakeFD(kV8NativesDataDescriptor, &region);
-  if (fd.is_valid()) {
-    base::File file(fd.release());
-    gin::V8Initializer::LoadV8NativesFromFile(std::move(file), &region);
-    return;
-  }
-#endif  // OS_POSIX && !OS_MACOSX
-#if !defined(CHROME_MULTIPLE_DLL_BROWSER)
-  gin::V8Initializer::LoadV8Natives();
-#endif  // !CHROME_MULTIPLE_DLL_BROWSER
-}
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 
 void InitializeV8IfNeeded(const base::CommandLine& command_line,
@@ -250,7 +232,6 @@
 
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
   LoadV8SnapshotFile();
-  LoadV8NativesFile();
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 }
 
diff --git a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
index ac47f93..70fc8de 100644
--- a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
@@ -106,7 +106,14 @@
     ax::mojom::Event event_type,
     BrowserAccessibility* node) {
   BrowserAccessibilityManager::FireBlinkEvent(event_type, node);
-  // Need to implement.
+
+  switch (event_type) {
+    case ax::mojom::Event::kScrolledToAnchor:
+      ToBrowserAccessibilityAuraLinux(node)->GetNode()->OnScrolledToAnchor();
+      break;
+    default:
+      break;
+  }
 }
 
 void BrowserAccessibilityManagerAuraLinux::FireNameChangedEvent(
diff --git a/content/browser/android/synchronous_compositor_host.cc b/content/browser/android/synchronous_compositor_host.cc
index dc26aed2..3ff44b95 100644
--- a/content/browser/android/synchronous_compositor_host.cc
+++ b/content/browser/android/synchronous_compositor_host.cc
@@ -157,7 +157,8 @@
     const gfx::Rect& viewport_rect_for_tile_priority,
     const gfx::Transform& transform_for_tile_priority) {
   invalidate_needs_draw_ = false;
-  scoped_refptr<FrameFuture> frame_future = new FrameFuture();
+  scoped_refptr<FrameFuture> frame_future =
+      new FrameFuture(rwhva_->GetLocalSurfaceIdAllocation().local_surface_id());
   if (compute_scroll_needs_synchronous_draw_ || !allow_async_draw_) {
     allow_async_draw_ = allow_async_draw_ || IsReadyForSynchronousCall();
     compute_scroll_needs_synchronous_draw_ = false;
diff --git a/content/browser/devtools/devtools_video_consumer_unittest.cc b/content/browser/devtools/devtools_video_consumer_unittest.cc
index 93257b0..fc7886c 100644
--- a/content/browser/devtools/devtools_video_consumer_unittest.cc
+++ b/content/browser/devtools/devtools_video_consumer_unittest.cc
@@ -42,9 +42,10 @@
 
   bool is_bound() const { return receiver_.is_bound(); }
 
-  void Bind(viz::mojom::FrameSinkVideoCapturerRequest request) {
+  void Bind(
+      mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer> receiver) {
     DCHECK(!receiver_.is_bound());
-    receiver_.Bind(std::move(request));
+    receiver_.Bind(std::move(receiver));
   }
 
   void Reset() {
@@ -237,9 +238,8 @@
     return std::make_unique<viz::ClientFrameSinkVideoCapturer>(
         base::BindRepeating(
             [](base::WeakPtr<DevToolsVideoConsumerTest> self,
-               viz::mojom::FrameSinkVideoCapturerRequest request) {
-              self->capturer_.Bind(std::move(request));
-            },
+               mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer>
+                   receiver) { self->capturer_.Bind(std::move(receiver)); },
             weak_factory_.GetWeakPtr()));
   }
 
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc
index 9eae307..2453575 100644
--- a/content/browser/frame_host/navigation_request.cc
+++ b/content/browser/frame_host/navigation_request.cc
@@ -342,7 +342,7 @@
 // Should match the definition of
 // blink::SchemeRegistry::ShouldTreatURLSchemeAsLegacy.
 bool ShouldTreatURLSchemeAsLegacy(const GURL& url) {
-  return url.SchemeIs(url::kFtpScheme) || url.SchemeIs(url::kGopherScheme);
+  return url.SchemeIs(url::kFtpScheme);
 }
 
 bool ShouldPropagateUserActivation(const url::Origin& previous_origin,
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 3cb20e8..9d4a5c3 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1850,7 +1850,7 @@
 
   // Ensure that the AssociatedRemote<blink::mojom::LocalFrame> works after a
   // crash.
-  local_frame_remote_.reset();
+  local_frame_.reset();
 
   // Any termination disablers in content loaded by the new process will
   // be sent again.
@@ -3194,13 +3194,13 @@
     blink::mojom::LocalFrame::GetTextSurroundingSelectionCallback callback,
     int max_length) {
   DCHECK(!callback.is_null());
-  GetAssociatedLocalFrameRemote()->GetTextSurroundingSelection(
-      max_length, std::move(callback));
+  GetAssociatedLocalFrame()->GetTextSurroundingSelection(max_length,
+                                                         std::move(callback));
 }
 
 void RenderFrameHostImpl::SendInterventionReport(const std::string& id,
                                                  const std::string& message) {
-  GetAssociatedLocalFrameRemote()->SendInterventionReport(id, message);
+  GetAssociatedLocalFrame()->SendInterventionReport(id, message);
 }
 
 void RenderFrameHostImpl::AllowBindings(int bindings_flags) {
@@ -3929,8 +3929,7 @@
 
     RenderFrameProxyHost* child_proxy =
         node->render_manager()->GetRenderFrameProxyHost(parent_site_instance);
-    child_proxy->Send(
-        new FrameMsg_WillEnterFullscreen(child_proxy->GetRoutingID()));
+    child_proxy->GetAssociatedRemoteFrame()->WillEnterFullscreen();
     notified_instances.insert(parent_site_instance);
   }
 
@@ -5979,10 +5978,10 @@
 }
 
 const mojo::AssociatedRemote<blink::mojom::LocalFrame>&
-RenderFrameHostImpl::GetAssociatedLocalFrameRemote() {
-  if (!local_frame_remote_)
-    GetRemoteAssociatedInterfaces()->GetInterface(&local_frame_remote_);
-  return local_frame_remote_;
+RenderFrameHostImpl::GetAssociatedLocalFrame() {
+  if (!local_frame_)
+    GetRemoteAssociatedInterfaces()->GetInterface(&local_frame_);
+  return local_frame_;
 }
 
 void RenderFrameHostImpl::ResetLoadingState() {
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index 5079bf8..ac28986 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -816,7 +816,7 @@
 
   // Returns associated remote for the blink::mojom::LocalFrame Mojo interface.
   const mojo::AssociatedRemote<blink::mojom::LocalFrame>&
-  GetAssociatedLocalFrameRemote();
+  GetAssociatedLocalFrame();
 
   // Resets the loading state. Following this call, the RenderFrameHost will be
   // in a non-loading state.
@@ -2172,7 +2172,7 @@
   mojo::AssociatedRemote<blink::mojom::FindInPage> find_in_page_;
 
   // Holder of Mojo connection with the Frame service in Blink.
-  mojo::AssociatedRemote<blink::mojom::LocalFrame> local_frame_remote_;
+  mojo::AssociatedRemote<blink::mojom::LocalFrame> local_frame_;
 
   // Holds a NavigationRequest when it's about to commit, ie. after
   // OnCrossDocumentCommitProcessed has returned a positive answer for this
diff --git a/content/browser/frame_host/render_frame_proxy_host.cc b/content/browser/frame_host/render_frame_proxy_host.cc
index 7c7fcf73..47a94045 100644
--- a/content/browser/frame_host/render_frame_proxy_host.cc
+++ b/content/browser/frame_host/render_frame_proxy_host.cc
@@ -32,6 +32,7 @@
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_features.h"
 #include "ipc/ipc_message.h"
+#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 
 namespace content {
 
@@ -251,6 +252,30 @@
       mojom::RenderFrameProxyHostAssociatedRequest(std::move(handle)));
 }
 
+blink::AssociatedInterfaceProvider*
+RenderFrameProxyHost::GetRemoteAssociatedInterfaces() {
+  if (!remote_associated_interfaces_) {
+    mojo::AssociatedRemote<blink::mojom::AssociatedInterfaceProvider>
+        remote_interfaces;
+    IPC::ChannelProxy* channel = GetProcess()->GetChannel();
+    if (channel) {
+      RenderProcessHostImpl* process =
+          static_cast<RenderProcessHostImpl*>(GetProcess());
+      process->GetRemoteRouteProvider()->GetRoute(
+          GetRoutingID(), remote_interfaces.BindNewEndpointAndPassReceiver());
+    } else {
+      // The channel may not be initialized in some tests environments. In this
+      // case we set up a dummy interface provider.
+      ignore_result(remote_interfaces
+                        .BindNewEndpointAndPassDedicatedReceiverForTesting());
+    }
+    remote_associated_interfaces_ =
+        std::make_unique<blink::AssociatedInterfaceProvider>(
+            remote_interfaces.Unbind());
+  }
+  return remote_associated_interfaces_.get();
+}
+
 void RenderFrameProxyHost::SetRenderFrameProxyCreated(bool created) {
   if (!created) {
     // If the renderer process has gone away, created can be false. In that
@@ -260,6 +285,13 @@
   render_frame_proxy_created_ = created;
 }
 
+const mojo::AssociatedRemote<blink::mojom::RemoteFrame>&
+RenderFrameProxyHost::GetAssociatedRemoteFrame() {
+  if (!remote_frame_)
+    GetRemoteAssociatedInterfaces()->GetInterface(&remote_frame_);
+  return remote_frame_;
+}
+
 void RenderFrameProxyHost::UpdateOpener() {
   // Another frame in this proxy's SiteInstance may reach the new opener by
   // first reaching this proxy and then referencing its window.opener.  Ensure
diff --git a/content/browser/frame_host/render_frame_proxy_host.h b/content/browser/frame_host/render_frame_proxy_host.h
index df46015..aa66c22a 100644
--- a/content/browser/frame_host/render_frame_proxy_host.h
+++ b/content/browser/frame_host/render_frame_proxy_host.h
@@ -15,6 +15,7 @@
 #include "content/common/frame_proxy.mojom.h"
 #include "ipc/ipc_listener.h"
 #include "ipc/ipc_sender.h"
+#include "third_party/blink/public/mojom/frame/frame.mojom.h"
 #include "third_party/blink/public/platform/web_focus_type.h"
 #include "third_party/blink/public/platform/web_scroll_types.h"
 
@@ -22,6 +23,7 @@
 struct FrameMsg_PostMessage_Params;
 
 namespace blink {
+class AssociatedInterfaceProvider;
 struct WebScrollIntoViewParams;
 }
 
@@ -137,6 +139,10 @@
   // Returns if the RenderFrameProxy for this host is alive.
   bool is_render_frame_proxy_live() { return render_frame_proxy_created_; }
 
+  // Returns associated remote for the blink::mojom::RemoteFrame Mojo interface.
+  const mojo::AssociatedRemote<blink::mojom::RemoteFrame>&
+  GetAssociatedRemoteFrame();
+
  private:
   // IPC Message handlers.
   void OnDetach();
@@ -152,6 +158,8 @@
       const std::string& interface_name,
       mojo::ScopedInterfaceEndpointHandle handle) override;
 
+  blink::AssociatedInterfaceProvider* GetRemoteAssociatedInterfaces();
+
   // mojom::RenderFrameProxyHost
   void FrameFocused() override;
 
@@ -188,10 +196,16 @@
   // some form of page context.
   scoped_refptr<RenderViewHostImpl> render_view_host_;
 
+  std::unique_ptr<blink::AssociatedInterfaceProvider>
+      remote_associated_interfaces_;
+
   // Mojo binding to this RenderFrameProxyHost.
   mojo::AssociatedBinding<mojom::RenderFrameProxyHost>
       frame_proxy_host_associated_binding_;
 
+  // Holder of Mojo connection with the Frame service in Blink.
+  mojo::AssociatedRemote<blink::mojom::RemoteFrame> remote_frame_;
+
   DISALLOW_COPY_AND_ASSIGN(RenderFrameProxyHost);
 };
 
diff --git a/content/browser/media/capture/aura_window_video_capture_device.cc b/content/browser/media/capture/aura_window_video_capture_device.cc
index 07c6e93..a3d33bf 100644
--- a/content/browser/media/capture/aura_window_video_capture_device.cc
+++ b/content/browser/media/capture/aura_window_video_capture_device.cc
@@ -19,7 +19,8 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/desktop_media_id.h"
 #include "media/base/bind_to_current_loop.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_observer.h"
 #include "ui/aura/window_occlusion_tracker.h"
@@ -157,12 +158,13 @@
 
 #if defined(OS_CHROMEOS)
 void AuraWindowVideoCaptureDevice::CreateCapturer(
-    viz::mojom::FrameSinkVideoCapturerRequest request) {
+    mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer> receiver) {
   base::PostTask(
       FROM_HERE, {BrowserThread::UI},
       base::BindOnce(
           [](base::WeakPtr<WindowTracker> tracker_ptr,
-             viz::mojom::FrameSinkVideoCapturerRequest request) {
+             mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer>
+                 receiver) {
             WindowTracker* const tracker = tracker_ptr.get();
             if (!tracker) {
               // WindowTracker was destroyed in the meantime, due to early
@@ -173,17 +175,17 @@
             if (tracker->target_type() == DesktopMediaID::TYPE_WINDOW) {
               VLOG(1) << "AuraWindowVideoCaptureDevice is using the LAME "
                          "capturer. :(";
-              mojo::StrongBinding<viz::mojom::FrameSinkVideoCapturer>::Create(
+              mojo::MakeSelfOwnedReceiver(
                   std::make_unique<LameWindowCapturerChromeOS>(
                       tracker->target_window()),
-                  std::move(request));
+                  std::move(receiver));
             } else {
               VLOG(1) << "AuraWindowVideoCaptureDevice is using the frame "
                          "sink capturer. :)";
-              CreateCapturerViaGlobalManager(std::move(request));
+              CreateCapturerViaGlobalManager(std::move(receiver));
             }
           },
-          tracker_->AsWeakPtr(), std::move(request)));
+          tracker_->AsWeakPtr(), std::move(receiver)));
 }
 #endif
 
diff --git a/content/browser/media/capture/aura_window_video_capture_device.h b/content/browser/media/capture/aura_window_video_capture_device.h
index 0295b3d..1299e74 100644
--- a/content/browser/media/capture/aura_window_video_capture_device.h
+++ b/content/browser/media/capture/aura_window_video_capture_device.h
@@ -13,6 +13,7 @@
 #include "content/browser/media/capture/frame_sink_video_capture_device.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/browser_thread.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 
 namespace aura {
 class Window;
@@ -37,7 +38,8 @@
   // LameWindowCapturerChromeOS for window capture where compositor frame sinks
   // are not present. See class comments for LameWindowCapturerChromeOS for
   // further details.
-  void CreateCapturer(viz::mojom::FrameSinkVideoCapturerRequest request) final;
+  void CreateCapturer(
+      mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer> receiver) final;
 #endif
 
  private:
diff --git a/content/browser/media/capture/frame_sink_video_capture_device.cc b/content/browser/media/capture/frame_sink_video_capture_device.cc
index 65b3c80..1efe067a 100644
--- a/content/browser/media/capture/frame_sink_video_capture_device.cc
+++ b/content/browser/media/capture/frame_sink_video_capture_device.cc
@@ -297,24 +297,26 @@
 void FrameSinkVideoCaptureDevice::DidStop() {}
 
 void FrameSinkVideoCaptureDevice::CreateCapturer(
-    viz::mojom::FrameSinkVideoCapturerRequest request) {
-  CreateCapturerViaGlobalManager(std::move(request));
+    mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer> receiver) {
+  CreateCapturerViaGlobalManager(std::move(receiver));
 }
 
 // static
 void FrameSinkVideoCaptureDevice::CreateCapturerViaGlobalManager(
-    viz::mojom::FrameSinkVideoCapturerRequest request) {
-  // Send the request to UI thread because that's where HostFrameSinkManager
+    mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer> receiver) {
+  // Send the receiver to UI thread because that's where HostFrameSinkManager
   // lives.
-  base::PostTask(FROM_HERE, {BrowserThread::UI},
-                 base::BindOnce(
-                     [](viz::mojom::FrameSinkVideoCapturerRequest request) {
-                       viz::HostFrameSinkManager* const manager =
-                           GetHostFrameSinkManager();
-                       DCHECK(manager);
-                       manager->CreateVideoCapturer(std::move(request));
-                     },
-                     std::move(request)));
+  base::PostTask(
+      FROM_HERE, {BrowserThread::UI},
+      base::BindOnce(
+          [](mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer>
+                 receiver) {
+            viz::HostFrameSinkManager* const manager =
+                GetHostFrameSinkManager();
+            DCHECK(manager);
+            manager->CreateVideoCapturer(std::move(receiver));
+          },
+          std::move(receiver)));
 }
 
 void FrameSinkVideoCaptureDevice::MaybeStartConsuming() {
diff --git a/content/browser/media/capture/frame_sink_video_capture_device.h b/content/browser/media/capture/frame_sink_video_capture_device.h
index 607362d..a368b1e 100644
--- a/content/browser/media/capture/frame_sink_video_capture_device.h
+++ b/content/browser/media/capture/frame_sink_video_capture_device.h
@@ -22,6 +22,7 @@
 #include "media/capture/video/video_capture_device.h"
 #include "media/capture/video/video_frame_receiver.h"
 #include "media/capture/video_capture_types.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/wake_lock.mojom.h"
@@ -101,12 +102,12 @@
   // implementation calls CreateCapturerViaGlobalManager(), but subclasses
   // and/or tests may provide alternatives.
   virtual void CreateCapturer(
-      viz::mojom::FrameSinkVideoCapturerRequest request);
+      mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer> receiver);
 
   // Establishes connection to FrameSinkVideoCapturer using the global
   // viz::HostFrameSinkManager.
   static void CreateCapturerViaGlobalManager(
-      viz::mojom::FrameSinkVideoCapturerRequest request);
+      mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer> receiver);
 
  private:
   using BufferId = decltype(media::VideoCaptureDevice::Client::Buffer::id);
diff --git a/content/browser/media/capture/frame_sink_video_capture_device_unittest.cc b/content/browser/media/capture/frame_sink_video_capture_device_unittest.cc
index 855a4861..d8dcd4d 100644
--- a/content/browser/media/capture/frame_sink_video_capture_device_unittest.cc
+++ b/content/browser/media/capture/frame_sink_video_capture_device_unittest.cc
@@ -19,7 +19,6 @@
 #include "media/capture/video/video_frame_receiver.h"
 #include "media/capture/video_capture_types.h"
 #include "mojo/public/cpp/base/shared_memory_utils.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"
@@ -83,13 +82,14 @@
 // Mock for the FrameSinkVideoCapturer running in the VIZ process.
 class MockFrameSinkVideoCapturer : public viz::mojom::FrameSinkVideoCapturer {
  public:
-  MockFrameSinkVideoCapturer() : binding_(this) {}
+  MockFrameSinkVideoCapturer() = default;
 
-  bool is_bound() const { return binding_.is_bound(); }
+  bool is_bound() const { return receiver_.is_bound(); }
 
-  void Bind(viz::mojom::FrameSinkVideoCapturerRequest request) {
+  void Bind(
+      mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer> receiver) {
     DCHECK_NOT_ON_DEVICE_THREAD();
-    binding_.Bind(std::move(request));
+    receiver_.Bind(std::move(receiver));
   }
 
   MOCK_METHOD2(SetFormat,
@@ -129,7 +129,7 @@
                receiver));
 
  private:
-  mojo::Binding<viz::mojom::FrameSinkVideoCapturer> binding_;
+  mojo::Receiver<viz::mojom::FrameSinkVideoCapturer> receiver_{this};
   mojo::Remote<viz::mojom::FrameSinkVideoConsumer> consumer_;
 };
 
@@ -272,14 +272,15 @@
       : capturer_(capturer) {}
 
  protected:
-  void CreateCapturer(viz::mojom::FrameSinkVideoCapturerRequest request) final {
-    base::PostTask(FROM_HERE, {BrowserThread::UI},
-                   base::BindOnce(
-                       [](MockFrameSinkVideoCapturer* capturer,
-                          viz::mojom::FrameSinkVideoCapturerRequest request) {
-                         capturer->Bind(std::move(request));
-                       },
-                       capturer_, std::move(request)));
+  void CreateCapturer(mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer>
+                          receiver) final {
+    base::PostTask(
+        FROM_HERE, {BrowserThread::UI},
+        base::BindOnce(
+            [](MockFrameSinkVideoCapturer* capturer,
+               mojo::PendingReceiver<viz::mojom::FrameSinkVideoCapturer>
+                   receiver) { capturer->Bind(std::move(receiver)); },
+            capturer_, std::move(receiver)));
   }
 
   MockFrameSinkVideoCapturer* const capturer_;
diff --git a/content/browser/media/capture/mouse_cursor_overlay_controller_aura.cc b/content/browser/media/capture/mouse_cursor_overlay_controller_aura.cc
index 2d642ca6..aedcb71 100644
--- a/content/browser/media/capture/mouse_cursor_overlay_controller_aura.cc
+++ b/content/browser/media/capture/mouse_cursor_overlay_controller_aura.cc
@@ -155,8 +155,11 @@
 
   if (auto* window = Observer::GetTargetWindow(observer_)) {
     if (auto* host = window->GetHost()) {
-      const gfx::NativeCursor cursor = host->last_cursor();
+      gfx::NativeCursor cursor = host->last_cursor();
       if (cursor != ui::CursorType::kNull) {
+        if (cursor.device_scale_factor() < 1.0f) {
+          cursor.set_device_scale_factor(1.0f);
+        }
         return cursor;
       }
     }
diff --git a/content/browser/renderer_host/media/service_video_capture_provider.cc b/content/browser/renderer_host/media/service_video_capture_provider.cc
index 9134d195..2475661 100644
--- a/content/browser/renderer_host/media/service_video_capture_provider.cc
+++ b/content/browser/renderer_host/media/service_video_capture_provider.cc
@@ -157,10 +157,10 @@
   // change events when virtual devices are added to or removed from the
   // service.
   auto service_connection = LazyConnectToService();
-  video_capture::mojom::DevicesChangedObserverPtr observer;
-  mojo::MakeStrongBinding(
+  mojo::PendingRemote<video_capture::mojom::DevicesChangedObserver> observer;
+  mojo::MakeSelfOwnedReceiver(
       std::make_unique<VirtualVideoCaptureDevicesChangedObserver>(),
-      mojo::MakeRequest(&observer));
+      observer.InitWithNewPipeAndPassReceiver());
   service_connection->source_provider()->RegisterVirtualDevicesChangedObserver(
       std::move(observer),
       true /*raise_event_if_virtual_devices_already_present*/);
diff --git a/content/browser/resources/media/media_internals.css b/content/browser/resources/media/media_internals.css
index a86c5c9..a7e24a9 100644
--- a/content/browser/resources/media/media_internals.css
+++ b/content/browser/resources/media/media_internals.css
@@ -5,11 +5,11 @@
 html,
 body,
 #container {
+  font-family: Arial;
+  height: 100%;
   margin: 0;
   padding: 0;
   width: 100%;
-  height: 100%;
-  font-family:Arial;
 }
 
 tabbox {
@@ -29,27 +29,27 @@
 }
 
 table {
-  font-family: sans-serif;
   -webkit-font-smoothing: antialiased;
-  font-size: 115%;
-  width: auto;
-  overflow: auto;
   display: block;
+  font-family: sans-serif;
+  font-size: 115%;
+  overflow: auto;
+  width: auto;
 }
 th {
-  background-color: #4AA9E4;
-  font-weight: normal;
+  background-color: rgb(74, 169, 228);
   color: white;
+  font-weight: normal;
+  min-width: 230px;
   padding: 2px;
   text-align: center;
-  min-width: 230px;
 }
 td {
   background-color: rgb(238, 238, 238);
-  padding: 2px;
   color: rgb(111, 111, 111);
-  word-wrap: break-word;
   min-width: 230px;
+  padding: 2px;
+  word-wrap: break-word;
 }
 
 h1,
@@ -59,32 +59,32 @@
 }
 
 #container {
+  align-content: stretch;
+  align-items: flex-start;
   display: flex;
   flex-direction: row;
   flex-wrap: wrap;
   justify-content: space-between;
-  align-items: flex-start;
-  align-content: stretch;
 }
 
 #container > * {
-  padding: 0;
-  padding-left: 25px;
   margin: 0;
+  padding: 0;
+  padding-inline-start: 25px;
 }
 
 #list-wrapper {
+  align-content: stretch;
+  align-items: flex-start;
   display: flex;
   flex-direction: column;
   justify-content: space-between;
-  align-items: flex-start;
-  align-content: stretch;
 }
 
 #player-list-wrapper,
 #audio-component-list-wrapper {
-  flex-grow: 1;
   align-self: stretch;
+  flex-grow: 1;
   min-width: 200px;
   overflow: auto;
 }
@@ -93,25 +93,25 @@
 #player-list-wrapper li,
 #audio-component-list-wrapper ul,
 #audio-component-list-wrapper li {
-  padding: 0px;
   list-style-type: none;
+  padding: 0;
 }
 #list-wrapper button {
-  padding: 0px;
+  padding: 0;
 }
 
 .property-wrapper,
 #log-wrapper {
   align-self: stretch;
-  display:block;
+  display: block;
   flex-grow: 0.25;
-  overflow: auto;
   margin-bottom: 10px;
+  overflow: auto;
 }
 
 #video-capture-capabilities-wrapper {
-  flex-grow: 0.5;
   align-self: stretch;
+  flex-grow: 0.5;
   overflow: auto;
 }
 
@@ -124,9 +124,9 @@
 }
 
 #clipboard-dialog {
-  top: 0;
   bottom: 0;
   padding-top: 0;
+  top: 0;
 }
 
 ::backdrop {
@@ -139,58 +139,58 @@
 }
 
 #video-capture-capabilities-table {
-  margin-bottom:30px;
+  margin-bottom: 30px;
 }
 
 #video-capture-capabilities-table th,
 #video-capture-capabilities-table td {
-  min-width:120px;
+  min-width: 120px;
 }
 
 #video-capture-capabilities-table td {
-  padding:5px;
+  padding: 5px;
 }
 
 #video-capture-capabilities-table tr td {
-  font-size:13px;
-  text-align:center;
+  font-size: 13px;
+  text-align: center;
 }
 
 #video-capture-capabilities-table .video-capture-formats-table th,
 #video-capture-capabilities-table .video-capture-formats-table td {
-  text-align:right;
-  min-width:80px;
+  min-width: 80px;
+  text-align: end;
 }
 
 #video-capture-capabilities-table .video-capture-formats-table th {
-  background:none;
-  color:#666;
-  font-size:13px;
-  font-weight:bold;
+  background: none;
+  color: #666;
+  font-size: 13px;
+  font-weight: bold;
 }
 
 #video-capture-capabilities-table .video-capture-formats-table td {
-  padding:2px;
+  padding: 2px;
 }
 
-.show-none-if-empty:empty:after {
-  content: "none";
+.show-none-if-empty:empty::after {
   color: rgba(0, 0, 0, .5);
+  content: 'none';
 }
 
 label.audio-focus-session,
 label.selectable-button {
-  display: block;
   border: solid 1px #999;
   border-radius: 3px;
-  padding: 6px;
-  margin: 4px 0;
+  display: block;
   line-height: 1.4;
+  margin: 4px 0;
+  padding: 6px;
   word-break: break-all;
 }
 
 label.selectable-button {
-  background: #BDF;
+  background: rgb(187, 221, 255);
   cursor: pointer;
   user-select: none;
 }
@@ -200,7 +200,7 @@
 }
 
 input.selectable-button:checked + label.selectable-button {
-  background-color: #2196F3;
+  background-color: rgb(33, 150, 243);
   border-color: #666;
   color: #FFF;
 }
@@ -220,9 +220,9 @@
 
 .player-frame {
   font-style: italic;
-  white-space: nowrap;
   overflow: hidden;
   text-overflow: ellipsis;
+  white-space: nowrap;
 }
 
 .no-players-selected #players .property-wrapper,
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc
index dfa0fdd..0c2496d 100644
--- a/content/browser/security_exploit_browsertest.cc
+++ b/content/browser/security_exploit_browsertest.cc
@@ -1602,17 +1602,11 @@
   RenderProcessHostKillWaiter process_kill_waiter(rfh->GetProcess());
 
   mojo::PendingAssociatedRemote<mojom::NavigationClient> navigation_client;
-  if (IsPerNavigationMojoInterfaceEnabled()) {
-    auto navigation_client_receiver =
-        navigation_client.InitWithNewEndpointAndPassReceiver();
-    rfh->frame_host_receiver_for_testing().impl()->BeginNavigation(
-        std::move(common_params), std::move(begin_params), mojo::NullRemote(),
-        std::move(navigation_client), mojo::NullRemote());
-  } else {
-    rfh->frame_host_receiver_for_testing().impl()->BeginNavigation(
-        std::move(common_params), std::move(begin_params), mojo::NullRemote(),
-        mojo::NullAssociatedRemote(), mojo::NullRemote());
-  }
+  auto navigation_client_receiver =
+      navigation_client.InitWithNewEndpointAndPassReceiver();
+  rfh->frame_host_receiver_for_testing().impl()->BeginNavigation(
+      std::move(common_params), std::move(begin_params), mojo::NullRemote(),
+      std::move(navigation_client), mojo::NullRemote());
   EXPECT_EQ(bad_message::RFH_BASE_URL_FOR_DATA_URL_SPECIFIED,
             process_kill_waiter.Wait());
 
diff --git a/content/browser/site_instance_impl_unittest.cc b/content/browser/site_instance_impl_unittest.cc
index f605946..7f46eff6 100644
--- a/content/browser/site_instance_impl_unittest.cc
+++ b/content/browser/site_instance_impl_unittest.cc
@@ -415,10 +415,10 @@
 
   // Blob URLs extract the site from the origin.
   test_url = GURL(
-      "blob:gopher://www.ftp.chromium.org/"
+      "blob:https://www.ftp.chromium.org/"
       "4d4ff040-6d61-4446-86d3-13ca07ec9ab9");
   site_url = SiteInstance::GetSiteForURL(&context, test_url);
-  EXPECT_EQ(GURL("gopher://chromium.org"), site_url);
+  EXPECT_EQ(GURL("https://chromium.org"), site_url);
 
   // Blob URLs with file origin also extract the site from the origin.
   test_url = GURL("blob:file:///1029e5a4-2983-4b90-a585-ed217563acfeb");
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index be5287c..31a0971 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -11843,109 +11843,6 @@
 
 }  // namespace
 
-// Regression test for https://crbug.com/877239, simulating the following
-// scenario:
-//
-//  1) http://a.com/empty.html is loaded in a main frame.
-//  2) Dynamically by JS, a same-site child frame is added:
-//       <iframe 'src=http://a.com/title1.html'/>.
-//  3) The initial byte of the response for `title1.html` arrives, causing
-//     FrameMsg_CommitNavigation to be sent to the same renderer.
-//  4) Just before processing this message, however, `main.html` navigates
-//     the iframe to http://baz.com/title2.html, which results in mojom::Frame::
-//     BeginNavigation being called on the RenderFrameHost.
-//  5) Suppose that immediately afterwards, `main.html` enters a busy-loop.
-//  6) The cross site navigation in the child frame starts, the first response
-//     byte arrives quickly, and thus the navigation commits quickly.
-//  6.1) FrameTreeNode::has_committed_real_load is set to true for the child.
-//  6.2) The same-site RenderFrame in the child FrameTreeNode is swapped out,
-//       i.e. UnfreezableFrameMsg_SwapOut is sent.
-//  7) The renderer for site instance `a.com` exits from the busy loop,
-//     and starts processing messages in order:
-//  7.1) The first being processed is FrameMsg_CommitNavigation, so a
-//       provisional load is created and immediately committed to
-//       http://a.com/title1.html.
-//  7.2) Because at the time the same-site child RenderFrame was created,
-//       there had been no real load committed in the child frame, and because
-//       the navigation from the initial empty document to the first real
-//       document was same-origin, the global object is reused and the
-//       RemoteInterfaceProvider of the RenderFrame is not rebound.
-//  7.3) The obsoleted load in the same-site child frame commits, calling
-//       mojom::Frame::DidCommitProvisionalLoad, however, with
-//       |interface_provider_request| being null.
-//  8) RenderFrameHostImpl::DidCommitProvisionalLoad sees that a real load was
-//     already committed in the frame, but |interface_provider_request| is
-//     missing. However, it also sees that the frame was waiting for a swap-out
-//     ACK, so ignores the commit, and does not kill the renderer process.
-//
-// In the simulation of this scenario, we simulate (5) not by delaying
-// renderer-side processing of the CommmitNavigation message, but by delaying
-// browser-side processing of the response to it, of DidCommitProvisionalLoad.
-IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
-                       InterfaceProviderRequestIsOptionalForRaceyFirstCommits) {
-  // This test does not make sense anymore for the new NavigationClient way
-  // of doing navigations. The first iframe navigation will get instantly
-  // destroyed by the NavigationClient disconnection handle
-  // NavigationRequest::OnRendererAbortedNavigation.
-  // The pipe gets closed in the renderer when the javascript starts the
-  // second navigation.
-  // TODO(ahemery): Remove this test when IsPerNavigationMojoInterfaceEnabled
-  // is on by default.
-  if (IsPerNavigationMojoInterfaceEnabled())
-    return;
-
-  const GURL kMainFrameUrl(
-      embedded_test_server()->GetURL("a.com", "/empty.html"));
-  const GURL kSubframeSameSiteUrl(
-      embedded_test_server()->GetURL("a.com", "/title1.html"));
-  const GURL kCrossSiteSubframeUrl(
-      embedded_test_server()->GetURL("baz.com", "/title2.html"));
-
-  const auto kAddSameSiteDynamicSubframe = JsReplace(
-      "var f = document.createElement(\"iframe\");"
-      "f.src=$1;"
-      "document.body.append(f);",
-      kSubframeSameSiteUrl);
-  const auto kNavigateSubframeCrossSite =
-      JsReplace("f.src = $1;", kCrossSiteSubframeUrl);
-  const std::string kExtractSubframeUrl =
-      "window.domAutomationController.send(f.src);";
-
-  ASSERT_TRUE(NavigateToURL(shell(), kMainFrameUrl));
-
-  const auto* main_rfh_site_instance =
-      shell()->web_contents()->GetMainFrame()->GetSiteInstance();
-
-  auto did_start_deferring_commit_callback =
-      base::BindLambdaForTesting([&](RenderFrameHost* subframe_rfh) {
-        // Verify that the subframe starts out as same-process with its parent.
-        ASSERT_EQ(main_rfh_site_instance, subframe_rfh->GetSiteInstance());
-
-        // Trigger the second commit now that we are deferring the first one.
-        ASSERT_TRUE(ExecuteScript(shell(), kNavigateSubframeCrossSite));
-      });
-
-  CommitMessageOrderReverser commit_order_reverser(
-      shell()->web_contents(), kSubframeSameSiteUrl /* deferred_url */,
-      std::move(did_start_deferring_commit_callback));
-
-  ASSERT_TRUE(ExecuteScript(shell(), kAddSameSiteDynamicSubframe));
-  commit_order_reverser.WaitForBothCommits();
-
-  // Verify that:
-  //  - The cross-site navigation in the sub-frame was committed and the
-  //    same-site navigation was ignored.
-  //  - The parent frame thinks so, too.
-  //  - The renderer process corresponding to the sub-frame with the ignored
-  //    commit was not killed. This is verified implicitly: this is the same
-  //    renderer process where the parent RenderFrame lives, so if the call to
-  //    ExecuteScriptAndExtractString succeeds here, the process is still alive.
-  std::string actual_subframe_url;
-  ASSERT_TRUE(ExecuteScriptAndExtractString(shell(), kExtractSubframeUrl,
-                                            &actual_subframe_url));
-  EXPECT_EQ(kCrossSiteSubframeUrl.spec(), actual_subframe_url);
-}
-
 // Create an out-of-process iframe that causes itself to be detached during
 // its layout/animate phase. See https://crbug.com/802932.
 // Disabled on Android due to flakiness, https://crbug.com/809580.
diff --git a/content/browser/web_package/signed_exchange_signature_header_field.cc b/content/browser/web_package/signed_exchange_signature_header_field.cc
index c91184e..dace4ea 100644
--- a/content/browser/web_package/signed_exchange_signature_header_field.cc
+++ b/content/browser/web_package/signed_exchange_signature_header_field.cc
@@ -34,22 +34,48 @@
   std::vector<Signature> signatures;
   signatures.reserve(values->size());
   for (auto& value : *values) {
+    if (!value.identifier.is_token()) {
+      signed_exchange_utils::ReportErrorAndTraceEvent(
+          devtools_proxy, "Failed to parse signature header.");
+      return base::nullopt;
+    }
     signatures.push_back(Signature());
     Signature& sig = signatures.back();
-    sig.label = value.identifier;
-    sig.sig = value.params[kSig];
+    sig.label = value.identifier.string();
+
+    const auto& sig_item = value.params[kSig];
+    if (!sig_item.is_byte_sequence()) {
+      signed_exchange_utils::ReportErrorAndTraceEvent(
+          devtools_proxy, "Failed to parse 'sig' parameter.");
+      return base::nullopt;
+    }
+    sig.sig = sig_item.string();
     if (sig.sig.empty()) {
       signed_exchange_utils::ReportErrorAndTraceEvent(
           devtools_proxy, "'sig' parameter is not set,");
       return base::nullopt;
     }
-    sig.integrity = value.params[kIntegrity];
+
+    const auto& integrity_item = value.params[kIntegrity];
+    if (!integrity_item.is_string()) {
+      signed_exchange_utils::ReportErrorAndTraceEvent(
+          devtools_proxy, "Failed to parse 'integrity' parameter.");
+      return base::nullopt;
+    }
+    sig.integrity = integrity_item.string();
     if (sig.integrity.empty()) {
       signed_exchange_utils::ReportErrorAndTraceEvent(
           devtools_proxy, "'integrity' parameter is not set.");
       return base::nullopt;
     }
-    sig.cert_url = GURL(value.params[kCertUrl]);
+
+    const auto& cert_url_item = value.params[kCertUrl];
+    if (!cert_url_item.is_string()) {
+      signed_exchange_utils::ReportErrorAndTraceEvent(
+          devtools_proxy, "Failed to parse 'cert-url' parameter.");
+      return base::nullopt;
+    }
+    sig.cert_url = GURL(cert_url_item.string());
     if (!sig.cert_url.is_valid() || sig.cert_url.has_ref()) {
       // TODO(https://crbug.com/819467) : When we will support "ed25519Key", the
       // params may not have "cert-url".
@@ -62,7 +88,14 @@
           devtools_proxy, "'cert-url' should have 'https' or 'data' scheme.");
       return base::nullopt;
     }
-    const std::string cert_sha256_string = value.params[kCertSha256Key];
+
+    const auto& cert_sha256_item = value.params[kCertSha256Key];
+    if (!cert_sha256_item.is_byte_sequence()) {
+      signed_exchange_utils::ReportErrorAndTraceEvent(
+          devtools_proxy, "Failed to parse 'cert-sha256' parameter.");
+      return base::nullopt;
+    }
+    const std::string& cert_sha256_string = cert_sha256_item.string();
     if (cert_sha256_string.size() != crypto::kSHA256Length) {
       // TODO(https://crbug.com/819467) : When we will support "ed25519Key", the
       // params may not have "cert-sha256".
@@ -73,10 +106,18 @@
     net::SHA256HashValue cert_sha256;
     memcpy(&cert_sha256.data, cert_sha256_string.data(), crypto::kSHA256Length);
     sig.cert_sha256 = std::move(cert_sha256);
+
     // TODO(https://crbug.com/819467): Support ed25519key.
     // sig.ed25519_key = value.params["ed25519Key"];
+
+    const auto& validity_url_item = value.params[kValidityUrlKey];
+    if (!validity_url_item.is_string()) {
+      signed_exchange_utils::ReportErrorAndTraceEvent(
+          devtools_proxy, "Failed to parse 'validity-url' parameter.");
+      return base::nullopt;
+    }
     sig.validity_url =
-        signed_exchange_utils::URLWithRawString(value.params[kValidityUrlKey]);
+        signed_exchange_utils::URLWithRawString(validity_url_item.string());
     if (!sig.validity_url.url.is_valid()) {
       signed_exchange_utils::ReportErrorAndTraceEvent(
           devtools_proxy, "'validity-url' parameter is not a valid URL.");
@@ -92,16 +133,22 @@
           devtools_proxy, "'validity-url' should have 'https' scheme.");
       return base::nullopt;
     }
-    if (!base::StringToUint64(value.params[kDateKey], &sig.date)) {
+
+    const auto& date_item = value.params[kDateKey];
+    if (!date_item.is_integer()) {
       signed_exchange_utils::ReportErrorAndTraceEvent(
           devtools_proxy, "'date' parameter is not a number.");
       return base::nullopt;
     }
-    if (!base::StringToUint64(value.params[kExpiresKey], &sig.expires)) {
+    sig.date = date_item.integer();
+
+    const auto& expires_item = value.params[kExpiresKey];
+    if (!expires_item.is_integer()) {
       signed_exchange_utils::ReportErrorAndTraceEvent(
           devtools_proxy, "'expires' parameter is not a number.");
       return base::nullopt;
     }
+    sig.expires = expires_item.integer();
   }
   return signatures;
 }
diff --git a/content/browser/webrtc/webrtc_video_capture_service_enumeration_browsertest.cc b/content/browser/webrtc/webrtc_video_capture_service_enumeration_browsertest.cc
index 263959b..c946104 100644
--- a/content/browser/webrtc/webrtc_video_capture_service_enumeration_browsertest.cc
+++ b/content/browser/webrtc/webrtc_video_capture_service_enumeration_browsertest.cc
@@ -14,7 +14,8 @@
 #include "content/public/test/content_browser_test_utils.h"
 #include "content/shell/browser/shell.h"
 #include "media/base/media_switches.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/test/embedded_test_server/embedded_test_server.h"
 #include "services/video_capture/public/cpp/mock_producer.h"
 #include "services/video_capture/public/mojom/device_factory.mojom.h"
@@ -64,16 +65,16 @@
       public testing::WithParamInterface<TestParams>,
       public video_capture::mojom::DevicesChangedObserver {
  public:
-  WebRtcVideoCaptureServiceEnumerationBrowserTest()
-      : devices_changed_observer_binding_(this) {
+  WebRtcVideoCaptureServiceEnumerationBrowserTest() {
     scoped_feature_list_.InitAndEnableFeature(features::kMojoVideoCapture);
   }
 
   ~WebRtcVideoCaptureServiceEnumerationBrowserTest() override {}
 
   void ConnectToService() {
-    video_capture::mojom::DevicesChangedObserverPtr observer;
-    devices_changed_observer_binding_.Bind(mojo::MakeRequest(&observer));
+    mojo::PendingRemote<video_capture::mojom::DevicesChangedObserver> observer;
+    devices_changed_observer_receiver_.Bind(
+        observer.InitWithNewPipeAndPassReceiver());
     switch (GetParam().api_to_use) {
       case ServiceApi::kSingleClient:
         GetVideoCaptureService().ConnectToDeviceFactory(
@@ -225,8 +226,8 @@
       shared_memory_devices_by_id_;
 
  private:
-  mojo::Binding<video_capture::mojom::DevicesChangedObserver>
-      devices_changed_observer_binding_;
+  mojo::Receiver<video_capture::mojom::DevicesChangedObserver>
+      devices_changed_observer_receiver_{this};
   base::test::ScopedFeatureList scoped_feature_list_;
   video_capture::mojom::DeviceFactoryPtr factory_;
   video_capture::mojom::VideoSourceProviderPtr video_source_provider_;
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index 9a11ac30..594f554 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -813,12 +813,6 @@
 // support cross-process focused frame changes.
 IPC_MESSAGE_ROUTED0(FrameMsg_SetFocusedFrame)
 
-// Sent to a frame proxy when its real frame is preparing to enter fullscreen
-// in another process.  Actually entering fullscreen will be done separately as
-// part of ViewMsg_Resize, once the browser process has resized the tab for
-// fullscreen.
-IPC_MESSAGE_ROUTED0(FrameMsg_WillEnterFullscreen)
-
 // Send to the RenderFrame to set text tracks state and style settings.
 // Sent for top-level frames.
 IPC_MESSAGE_ROUTED1(FrameMsg_SetTextTrackSettings,
diff --git a/content/ppapi_plugin/ppapi_plugin_main.cc b/content/ppapi_plugin/ppapi_plugin_main.cc
index b7eedca..cc06d25 100644
--- a/content/ppapi_plugin/ppapi_plugin_main.cc
+++ b/content/ppapi_plugin/ppapi_plugin_main.cc
@@ -117,7 +117,6 @@
 
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
   gin::V8Initializer::LoadV8Snapshot();
-  gin::V8Initializer::LoadV8Natives();
 #endif
 
 #if defined(OS_LINUX)
diff --git a/content/public/app/v8_snapshot_overlay_manifest.cc b/content/public/app/v8_snapshot_overlay_manifest.cc
index b07152e..636511a 100644
--- a/content/public/app/v8_snapshot_overlay_manifest.cc
+++ b/content/public/app/v8_snapshot_overlay_manifest.cc
@@ -16,8 +16,6 @@
   static base::NoDestructor<service_manager::Manifest> manifest {
     service_manager::ManifestBuilder()
 #if defined(OS_LINUX)
-        .PreloadFile(kV8NativesDataDescriptor,
-                     base::FilePath(FILE_PATH_LITERAL("natives_blob.bin")))
 #if defined(USE_V8_CONTEXT_SNAPSHOT)
         .PreloadFile(
             kV8ContextSnapshotDataDescriptor,
@@ -27,9 +25,6 @@
                      base::FilePath(FILE_PATH_LITERAL("snapshot_blob.bin")))
 #endif  // defined(USE_V8_CONTEXT_SNAPSHOT)
 #elif defined(OS_ANDROID)
-        .PreloadFile(
-            kV8NativesDataDescriptor,
-            base::FilePath(FILE_PATH_LITERAL("assets/natives_blob.bin")))
 #if defined(USE_V8_CONTEXT_SNAPSHOT)
 #if defined(ARCH_CPU_64_BITS)
         .PreloadFile(kV8Snapshot64DataDescriptor,
diff --git a/content/public/browser/android/synchronous_compositor.cc b/content/public/browser/android/synchronous_compositor.cc
index 2d50df9b..8d0b645 100644
--- a/content/public/browser/android/synchronous_compositor.cc
+++ b/content/public/browser/android/synchronous_compositor.cc
@@ -19,9 +19,11 @@
     : layer_tree_frame_sink_id(rhs.layer_tree_frame_sink_id),
       frame(std::move(rhs.frame)) {}
 
-SynchronousCompositor::FrameFuture::FrameFuture()
+SynchronousCompositor::FrameFuture::FrameFuture(
+    viz::LocalSurfaceId local_surface_id)
     : waitable_event_(base::WaitableEvent::ResetPolicy::MANUAL,
-                      base::WaitableEvent::InitialState::NOT_SIGNALED) {}
+                      base::WaitableEvent::InitialState::NOT_SIGNALED),
+      local_surface_id_(local_surface_id) {}
 
 SynchronousCompositor::FrameFuture::~FrameFuture() {}
 
diff --git a/content/public/browser/android/synchronous_compositor.h b/content/public/browser/android/synchronous_compositor.h
index 95a2e0b..f31f8a8 100644
--- a/content/public/browser/android/synchronous_compositor.h
+++ b/content/public/browser/android/synchronous_compositor.h
@@ -14,6 +14,7 @@
 #include "base/time/time.h"
 #include "components/viz/common/frame_timing_details_map.h"
 #include "components/viz/common/resources/returned_resource.h"
+#include "components/viz/common/surfaces/local_surface_id.h"
 #include "content/common/content_export.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
@@ -61,9 +62,10 @@
 
   class FrameFuture : public base::RefCountedThreadSafe<FrameFuture> {
    public:
-    FrameFuture();
+    explicit FrameFuture(viz::LocalSurfaceId local_surface_id);
     void SetFrame(std::unique_ptr<Frame> frame);
     std::unique_ptr<Frame> GetFrame();
+    const viz::LocalSurfaceId& local_surface_id() { return local_surface_id_; }
 
    private:
     friend class base::RefCountedThreadSafe<FrameFuture>;
@@ -71,6 +73,7 @@
 
     base::WaitableEvent waitable_event_;
     std::unique_ptr<Frame> frame_;
+    viz::LocalSurfaceId local_surface_id_;
 #if DCHECK_IS_ON()
     bool waited_ = false;
 #endif
diff --git a/content/public/common/content_descriptor_keys.cc b/content/public/common/content_descriptor_keys.cc
index d2a6ba0..9a8e656 100644
--- a/content/public/common/content_descriptor_keys.cc
+++ b/content/public/common/content_descriptor_keys.cc
@@ -6,8 +6,6 @@
 
 namespace content {
 
-const char kV8NativesDataDescriptor[] = "v8_natives_data";
-
 const char kV8SnapshotDataDescriptor[] = "v8_snapshot_data";
 
 const char kV8Snapshot32DataDescriptor[] = "v8_snapshot_32_data";
diff --git a/content/public/common/content_descriptor_keys.h b/content/public/common/content_descriptor_keys.h
index bfe2b0ce..cd4fe52 100644
--- a/content/public/common/content_descriptor_keys.h
+++ b/content/public/common/content_descriptor_keys.h
@@ -10,7 +10,6 @@
 // This is a list of global descriptor keys to be used with the
 // base::FileDescriptorStore object (see base/file_descriptor_store.h)
 
-extern const char kV8NativesDataDescriptor[];
 extern const char kV8SnapshotDataDescriptor[];
 extern const char kV8Snapshot32DataDescriptor[];
 extern const char kV8Snapshot64DataDescriptor[];
diff --git a/content/public/common/url_utils.cc b/content/public/common/url_utils.cc
index e1879aa..9dbda56 100644
--- a/content/public/common/url_utils.cc
+++ b/content/public/common/url_utils.cc
@@ -64,7 +64,7 @@
 
 bool IsURLHandledByNetworkService(const GURL& url) {
   return url.SchemeIsHTTPOrHTTPS() || url.SchemeIsWSOrWSS() ||
-         url.SchemeIs(url::kFtpScheme) || url.SchemeIs(url::kGopherScheme);
+         url.SchemeIs(url::kFtpScheme);
 }
 
 bool IsRendererDebugURL(const GURL& url) {
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc
index 0ad5f91..eff7bff 100644
--- a/content/public/test/browser_test_base.cc
+++ b/content/public/test/browser_test_base.cc
@@ -383,7 +383,6 @@
 
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
   gin::V8Initializer::LoadV8Snapshot();
-  gin::V8Initializer::LoadV8Natives();
 #endif
 
   ContentMainDelegate* delegate = GetContentMainDelegateForTesting();
diff --git a/content/public/test/content_test_suite_base.cc b/content/public/test/content_test_suite_base.cc
index 48d0da47..f84bb55 100644
--- a/content/public/test/content_test_suite_base.cc
+++ b/content/public/test/content_test_suite_base.cc
@@ -69,7 +69,6 @@
 
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
   gin::V8Initializer::LoadV8Snapshot(kSnapshotType);
-  gin::V8Initializer::LoadV8Natives();
 #endif
 
   ui::MaterialDesignController::Initialize();
diff --git a/content/public/test/test_synchronous_compositor_android.cc b/content/public/test/test_synchronous_compositor_android.cc
index 7fce6de..89b2001 100644
--- a/content/public/test/test_synchronous_compositor_android.cc
+++ b/content/public/test/test_synchronous_compositor_android.cc
@@ -31,7 +31,8 @@
     const gfx::Size& viewport_size,
     const gfx::Rect& viewport_rect_for_tile_priority,
     const gfx::Transform& transform_for_tile_priority) {
-  auto future = base::MakeRefCounted<FrameFuture>();
+  auto future = base::MakeRefCounted<FrameFuture>(
+      viz::LocalSurfaceId(1, base::UnguessableToken::Create()));
   future->SetFrame(std::move(hardware_frame_));
   return future;
 }
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc
index 112c703..d64c68b 100644
--- a/content/renderer/render_frame_proxy.cc
+++ b/content/renderer/render_frame_proxy.cc
@@ -29,6 +29,7 @@
 #include "content/renderer/child_frame_compositing_helper.h"
 #include "content/renderer/frame_owner_properties.h"
 #include "content/renderer/loader/web_url_request_util.h"
+#include "content/renderer/mojo/blink_interface_registry_impl.h"
 #include "content/renderer/render_frame_impl.h"
 #include "content/renderer/render_thread_impl.h"
 #include "content/renderer/render_view_impl.h"
@@ -85,8 +86,8 @@
   // When a RenderFrame is replaced by a RenderProxy, the WebRemoteFrame should
   // always come from WebRemoteFrame::create and a call to WebFrame::swap must
   // follow later.
-  blink::WebRemoteFrame* web_frame =
-      blink::WebRemoteFrame::Create(scope, proxy.get());
+  blink::WebRemoteFrame* web_frame = blink::WebRemoteFrame::Create(
+      scope, proxy.get(), proxy->blink_interface_registry_.get());
 
   bool parent_is_local =
       !frame_to_replace->GetWebFrame()->Parent() ||
@@ -133,7 +134,8 @@
     // Create a top level WebRemoteFrame.
     render_view = RenderViewImpl::FromRoutingID(render_view_routing_id);
     web_frame = blink::WebRemoteFrame::CreateMainFrame(
-        render_view->GetWebView(), proxy.get(), opener);
+        render_view->GetWebView(), proxy.get(),
+        proxy->blink_interface_registry_.get(), opener);
     render_widget = render_view->GetWidget();
   } else {
     // Create a frame under an existing parent. The parent is always expected
@@ -143,7 +145,8 @@
         replicated_state.scope,
         blink::WebString::FromUTF8(replicated_state.name),
         replicated_state.frame_policy,
-        replicated_state.frame_owner_element_type, proxy.get(), opener);
+        replicated_state.frame_owner_element_type, proxy.get(),
+        proxy->blink_interface_registry_.get(), opener);
     proxy->unique_name_ = replicated_state.unique_name;
     render_view = parent->render_view();
     render_widget = parent->render_widget_;
@@ -172,7 +175,8 @@
       new RenderFrameProxy(proxy_routing_id));
   proxy->devtools_frame_token_ = devtools_frame_token;
   blink::WebRemoteFrame* web_frame = blink::WebRemoteFrame::CreateForPortal(
-      blink::WebTreeScopeType::kDocument, proxy.get(), portal_element);
+      blink::WebTreeScopeType::kDocument, proxy.get(),
+      proxy->blink_interface_registry_.get(), portal_element);
   proxy->Init(web_frame, parent->render_view(),
               parent->GetLocalRootRenderWidget(), true);
   return proxy.release();
@@ -218,6 +222,8 @@
       g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this));
   CHECK(result.second) << "Inserting a duplicate item.";
   RenderThread::Get()->AddRoute(routing_id_, this);
+  blink_interface_registry_.reset(new BlinkInterfaceRegistryImpl(
+      binder_registry_.GetWeakPtr(), associated_interfaces_.GetWeakPtr()));
 }
 
 RenderFrameProxy::~RenderFrameProxy() {
@@ -421,7 +427,6 @@
     IPC_MESSAGE_HANDLER(FrameMsg_EnableAutoResize, OnEnableAutoResize)
     IPC_MESSAGE_HANDLER(FrameMsg_DisableAutoResize, OnDisableAutoResize)
     IPC_MESSAGE_HANDLER(FrameMsg_SetFocusedFrame, OnSetFocusedFrame)
-    IPC_MESSAGE_HANDLER(FrameMsg_WillEnterFullscreen, OnWillEnterFullscreen)
     IPC_MESSAGE_HANDLER(FrameMsg_UpdateUserActivationState,
                         OnUpdateUserActivationState)
     IPC_MESSAGE_HANDLER(FrameMsg_TransferUserActivationFrom,
@@ -439,6 +444,12 @@
   return handled;
 }
 
+void RenderFrameProxy::OnAssociatedInterfaceRequest(
+    const std::string& interface_name,
+    mojo::ScopedInterfaceEndpointHandle handle) {
+  associated_interfaces_.TryBindInterface(interface_name, &handle);
+}
+
 bool RenderFrameProxy::Send(IPC::Message* message) {
   return RenderThread::Get()->Send(message);
 }
@@ -558,10 +569,6 @@
   render_view_->webview()->FocusDocumentView(web_frame_);
 }
 
-void RenderFrameProxy::OnWillEnterFullscreen() {
-  web_frame_->WillEnterFullscreen();
-}
-
 void RenderFrameProxy::OnUpdateUserActivationState(
     blink::UserActivationUpdateType update_type) {
   web_frame_->UpdateUserActivationState(update_type);
diff --git a/content/renderer/render_frame_proxy.h b/content/renderer/render_frame_proxy.h
index 2762cd10..ee5f73b 100644
--- a/content/renderer/render_frame_proxy.h
+++ b/content/renderer/render_frame_proxy.h
@@ -18,7 +18,9 @@
 #include "ipc/ipc_listener.h"
 #include "ipc/ipc_sender.h"
 #include "mojo/public/cpp/bindings/associated_remote.h"
+#include "services/service_manager/public/cpp/binder_registry.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
+#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
 #include "third_party/blink/public/common/feature_policy/feature_policy.h"
 #include "third_party/blink/public/common/frame/user_activation_update_type.h"
 #include "third_party/blink/public/platform/web_focus_type.h"
@@ -35,6 +37,7 @@
 
 namespace content {
 
+class BlinkInterfaceRegistryImpl;
 class ChildFrameCompositingHelper;
 class RenderFrameImpl;
 class RenderViewImpl;
@@ -122,6 +125,9 @@
 
   // IPC::Listener
   bool OnMessageReceived(const IPC::Message& msg) override;
+  void OnAssociatedInterfaceRequest(
+      const std::string& interface_name,
+      mojo::ScopedInterfaceEndpointHandle handle) override;
 
   // Propagate VisualProperties updates from a local root RenderWidget to the
   // child RenderWidget represented by this proxy, which is hosted in another
@@ -323,6 +329,10 @@
   // The layer used to embed the out-of-process content.
   scoped_refptr<cc::Layer> embedded_layer_;
 
+  service_manager::BinderRegistry binder_registry_;
+  blink::AssociatedInterfaceRegistry associated_interfaces_;
+  std::unique_ptr<BlinkInterfaceRegistryImpl> blink_interface_registry_;
+
   DISALLOW_COPY_AND_ASSIGN(RenderFrameProxy);
 };
 
diff --git a/content/shell/BUILD.gn b/content/shell/BUILD.gn
index f3f65eb..1400a8c 100644
--- a/content/shell/BUILD.gn
+++ b/content/shell/BUILD.gn
@@ -678,7 +678,6 @@
     }
 
     if (v8_use_external_startup_data) {
-      sources += [ "$root_out_dir/natives_blob.bin" ]
       public_deps += [ "//v8" ]
       if (use_v8_context_snapshot) {
         sources += [ "$root_out_dir/v8_context_snapshot.bin" ]
diff --git a/content/test/content_test_launcher.cc b/content/test/content_test_launcher.cc
index 37aec6f6..7fd5bcb2 100644
--- a/content/test/content_test_launcher.cc
+++ b/content/test/content_test_launcher.cc
@@ -39,9 +39,10 @@
 
  protected:
   void Initialize() override {
-    // Browser tests are expected not to tear-down various globals. (Must run
-    // before the base class is initialized.)
+    // Browser tests are expected not to tear-down various globals and may
+    // complete with the thread priority being above NORMAL.
     base::TestSuite::DisableCheckForLeakedGlobals();
+    base::TestSuite::DisableCheckForThreadPriorityAtTestEnd();
 
     ContentTestSuiteBase::Initialize();
 
diff --git a/content/test/data/accessibility/display-locking/activatable-activated.html b/content/test/data/accessibility/display-locking/activatable-activated.html
index 6be1c7e..e233996d 100644
--- a/content/test/data/accessibility/display-locking/activatable-activated.html
+++ b/content/test/data/accessibility/display-locking/activatable-activated.html
@@ -2,9 +2,9 @@
 @BLINK-ALLOW:offscreen
 -->
 <div>
-  <div id="locked" rendersubtree="invisible">
+  <div id="locked" rendersubtree="invisible skip-viewport-activation">
     <div>child</div>
-    <div id="nested" rendersubtree="invisible">nested locked element!</div>
+    <div id="nested" rendersubtree="invisible skip-viewport-activation">nested locked element!</div>
     <div id="nonActivatable" rendersubtree="invisible skip-activation">nested non activatable locked element</div>
   </div>
 </div>
diff --git a/content/test/data/accessibility/display-locking/activatable.html b/content/test/data/accessibility/display-locking/activatable.html
index 49a5d52f..a868edf 100644
--- a/content/test/data/accessibility/display-locking/activatable.html
+++ b/content/test/data/accessibility/display-locking/activatable.html
@@ -2,9 +2,9 @@
 @BLINK-ALLOW:offscreen
 -->
 <div>
-  <div id="locked" rendersubtree="invisible">
+  <div id="locked" rendersubtree="invisible skip-viewport-activation">
     <div>child</div>
-    <div id="nested" rendersubtree="invisible">nested locked element!</div>
+    <div id="nested" rendersubtree="invisible skip-viewport-activation">nested locked element!</div>
     <div id="nonActivatable" rendersubtree="invisible skip-activation">nested non activatable locked element</div>
   </div>
 </div>
diff --git a/content/test/data/accessibility/display-locking/all-committed.html b/content/test/data/accessibility/display-locking/all-committed.html
index 2266d984..5ffc4cf 100644
--- a/content/test/data/accessibility/display-locking/all-committed.html
+++ b/content/test/data/accessibility/display-locking/all-committed.html
@@ -2,9 +2,9 @@
 @BLINK-ALLOW:offscreen
 -->
 <div>
-  <div id="locked" rendersubtree="invisible skip-activation">
+  <div id="locked" rendersubtree="invisible skip-viewport-activation">
     <div>child</div>
-    <div id="nested" rendersubtree="invisible skip-activation">nested locked element!</div>
+    <div id="nested" rendersubtree="invisible skip-viewport-activation">nested locked element!</div>
     <div id="nonActivatable" rendersubtree="invisible skip-activation">nested non activatable locked element</div>
     <!--
       TODO(rakina): Make display:none, visibility:hidden, aria-hidden nodes
diff --git a/content/test/data/accessibility/display-locking/all.html b/content/test/data/accessibility/display-locking/all.html
index 32bee4b..fbdfd07 100644
--- a/content/test/data/accessibility/display-locking/all.html
+++ b/content/test/data/accessibility/display-locking/all.html
@@ -2,9 +2,9 @@
 @BLINK-ALLOW:offscreen
 -->
 <div>
-  <div id="locked" rendersubtree="invisible">
+  <div id="locked" rendersubtree="invisible skip-viewport-activation">
     <div>child</div>
-    <div id="nested" rendersubtree="invisible">nested locked element!</div>
+    <div id="nested" rendersubtree="invisible skip-viewport-activation">nested locked element!</div>
     <div id="nonActivatable" rendersubtree="invisible skip-activation">nested non activatable locked element</div>
     <!--
       TODO(rakina): Make display:none, visibility:hidden, aria-hidden nodes
diff --git a/content/test/data/accessibility/display-locking/non-activatable.html b/content/test/data/accessibility/display-locking/non-activatable.html
index 15f436e..8597805a 100644
--- a/content/test/data/accessibility/display-locking/non-activatable.html
+++ b/content/test/data/accessibility/display-locking/non-activatable.html
@@ -5,6 +5,6 @@
   <div id="locked" rendersubtree="invisible skip-activation">
     <div>child</div>
     <div id="nested" rendersubtree="invisible skip-activation">nested locked element!</div>
-    <div id="activatable" rendersubtree="invisible skip-activation">non activatable locked element</div>
+    <div id="activatable" rendersubtree="invisible skip-viewport-activation">activatable locked element</div>
   </div>
 </div>
diff --git a/content/test/fuzzer/fuzzer_support.cc b/content/test/fuzzer/fuzzer_support.cc
index 24cbf73..3d84dcb 100644
--- a/content/test/fuzzer/fuzzer_support.cc
+++ b/content/test/fuzzer/fuzzer_support.cc
@@ -42,7 +42,6 @@
 
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
   gin::V8Initializer::LoadV8Snapshot(kSnapshotType);
-  gin::V8Initializer::LoadV8Natives();
 #endif
   gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
                                  gin::ArrayBufferAllocator::SharedInstance());
diff --git a/content/test/test_blink_web_unit_test_support.cc b/content/test/test_blink_web_unit_test_support.cc
index c5eece4..57d2139 100644
--- a/content/test/test_blink_web_unit_test_support.cc
+++ b/content/test/test_blink_web_unit_test_support.cc
@@ -138,7 +138,6 @@
 
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
   gin::V8Initializer::LoadV8Snapshot(kSnapshotType);
-  gin::V8Initializer::LoadV8Natives();
 #endif
 
   scoped_refptr<base::SingleThreadTaskRunner> dummy_task_runner;
diff --git a/device/udev_linux/udev_watcher.cc b/device/udev_linux/udev_watcher.cc
index 00ae2d34..753f187 100644
--- a/device/udev_linux/udev_watcher.cc
+++ b/device/udev_linux/udev_watcher.cc
@@ -4,6 +4,8 @@
 
 #include "device/udev_linux/udev_watcher.h"
 
+#include <utility>
+
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/threading/scoped_blocking_call.h"
@@ -115,8 +117,8 @@
       observer_(observer),
       udev_filters_(filters) {
   file_watcher_ = base::FileDescriptorWatcher::WatchReadable(
-      monitor_fd,
-      base::Bind(&UdevWatcher::OnMonitorReadable, base::Unretained(this)));
+      monitor_fd, base::BindRepeating(&UdevWatcher::OnMonitorReadable,
+                                      base::Unretained(this)));
 }
 
 void UdevWatcher::OnMonitorReadable() {
diff --git a/device/udev_linux/udev_watcher.h b/device/udev_linux/udev_watcher.h
index 7ee8982..8e012a6 100644
--- a/device/udev_linux/udev_watcher.h
+++ b/device/udev_linux/udev_watcher.h
@@ -6,6 +6,7 @@
 #define DEVICE_UDEV_LINUX_UDEV_WATCHER_H_
 
 #include <memory>
+#include <string>
 #include <vector>
 
 #include "base/files/file_descriptor_watcher_posix.h"
diff --git a/extensions/common/features/simple_feature_unittest.cc b/extensions/common/features/simple_feature_unittest.cc
index 148dcd5..562a60a 100644
--- a/extensions/common/features/simple_feature_unittest.cc
+++ b/extensions/common/features/simple_feature_unittest.cc
@@ -22,6 +22,7 @@
 #include "extensions/common/features/feature_session_type.h"
 #include "extensions/common/manifest.h"
 #include "extensions/common/manifest_handlers/background_info.h"
+#include "extensions/common/scoped_worker_based_extensions_channel.h"
 #include "extensions/common/switches.h"
 #include "extensions/common/value_builder.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -991,8 +992,7 @@
 }
 
 TEST(SimpleFeatureUnitTest, DisallowForServiceWorkers) {
-  // Service Worker features are only available on the trunk.
-  ScopedCurrentChannel current_channel_override(version_info::Channel::UNKNOWN);
+  ScopedWorkerBasedExtensionsChannel worker_channel_override;
 
   SimpleFeature feature;
   feature.set_name("somefeature");
diff --git a/extensions/renderer/bindings/api_binding_test.cc b/extensions/renderer/bindings/api_binding_test.cc
index f13dfd1..ec652b54 100644
--- a/extensions/renderer/bindings/api_binding_test.cc
+++ b/extensions/renderer/bindings/api_binding_test.cc
@@ -26,7 +26,6 @@
   // gin::V8Test.
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
   gin::V8Initializer::LoadV8Snapshot();
-  gin::V8Initializer::LoadV8Natives();
 #endif
 
   gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
diff --git a/extensions/shell/BUILD.gn b/extensions/shell/BUILD.gn
index d4c96f2f..b247dd9e 100644
--- a/extensions/shell/BUILD.gn
+++ b/extensions/shell/BUILD.gn
@@ -290,8 +290,6 @@
   data = [
     "//extensions/test/data/",
     "$root_out_dir/extensions_shell_and_test.pak",
-
-    #"$root_out_dir/natives_blob.bin", # move to gin
   ]
 
   deps = [
diff --git a/extensions/shell/test/shell_test_launcher_delegate.cc b/extensions/shell/test/shell_test_launcher_delegate.cc
index 2f680e4..d0a9430e 100644
--- a/extensions/shell/test/shell_test_launcher_delegate.cc
+++ b/extensions/shell/test/shell_test_launcher_delegate.cc
@@ -13,8 +13,10 @@
 
 int AppShellTestLauncherDelegate::RunTestSuite(int argc, char** argv) {
   base::TestSuite test_suite(argc, argv);
-  // Browser tests are expected not to tear-down various globals.
+  // Browser tests are expected not to tear-down various globals and may
+  // complete with the thread priority being above NORMAL.
   test_suite.DisableCheckForLeakedGlobals();
+  test_suite.DisableCheckForThreadPriorityAtTestEnd();
   return test_suite.Run();
 }
 
diff --git a/fuchsia/engine/test/web_engine_test_launcher.cc b/fuchsia/engine/test/web_engine_test_launcher.cc
index 169667f..f739f25 100644
--- a/fuchsia/engine/test/web_engine_test_launcher.cc
+++ b/fuchsia/engine/test/web_engine_test_launcher.cc
@@ -24,8 +24,10 @@
   // content::TestLauncherDelegate implementation:
   int RunTestSuite(int argc, char** argv) override {
     base::TestSuite test_suite(argc, argv);
-    // Browser tests are expected not to tear-down various globals.
+    // Browser tests are expected not to tear-down various globals and may
+    // complete with the thread priority being above NORMAL.
     test_suite.DisableCheckForLeakedGlobals();
+    test_suite.DisableCheckForThreadPriorityAtTestEnd();
     return test_suite.Run();
   }
 
diff --git a/gin/BUILD.gn b/gin/BUILD.gn
index e6ff98edd..9698cb8 100644
--- a/gin/BUILD.gn
+++ b/gin/BUILD.gn
@@ -70,7 +70,6 @@
 
   if (v8_use_external_startup_data) {
     data = [
-      "$root_out_dir/natives_blob.bin",
       "$root_out_dir/snapshot_blob.bin",
     ]
   }
diff --git a/gin/gin_features.cc b/gin/gin_features.cc
index 18fbecbb..2acd379b 100644
--- a/gin/gin_features.cc
+++ b/gin/gin_features.cc
@@ -34,4 +34,8 @@
 const base::Feature kV8GCLessCompaction{"V8GCLessCompaction",
                                         base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Always promote young objects in Mark-Compact GC.
+const base::Feature kV8GCAlwaysPromoteYoungMC{
+    "V8GCAlwaysPromoteYoungMC", base::FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace features
diff --git a/gin/gin_features.h b/gin/gin_features.h
index 2d5652f..810b4a60 100644
--- a/gin/gin_features.h
+++ b/gin/gin_features.h
@@ -17,6 +17,7 @@
 GIN_EXPORT extern const base::Feature kV8HugeMaxOldGenerationSize;
 GIN_EXPORT extern const base::Feature kV8GCBackgroundSchedule;
 GIN_EXPORT extern const base::Feature kV8GCLessCompaction;
+GIN_EXPORT extern const base::Feature kV8GCAlwaysPromoteYoungMC;
 
 }  // namespace features
 
diff --git a/gin/public/isolate_holder.h b/gin/public/isolate_holder.h
index 413e6c5..f23af2d9 100644
--- a/gin/public/isolate_holder.h
+++ b/gin/public/isolate_holder.h
@@ -80,10 +80,7 @@
 
   // Should be invoked once before creating IsolateHolder instances to
   // initialize V8 and Gin. In case V8_USE_EXTERNAL_STARTUP_DATA is
-  // defined, V8's initial natives should be loaded (by calling
-  // V8Initializer::LoadV8NativesFromFD or
-  // V8Initializer::LoadV8Natives) before calling this method.  If the
-  // snapshot file is available, it should also be loaded (by calling
+  // defined and the snapshot file is available, it should be loaded (by calling
   // V8Initializer::LoadV8SnapshotFromFD or
   // V8Initializer::LoadV8Snapshot) before calling this method.
   // If the snapshot file contains customised contexts which have static
diff --git a/gin/public/v8_platform.h b/gin/public/v8_platform.h
index 218ead5..8a3d3035 100644
--- a/gin/public/v8_platform.h
+++ b/gin/public/v8_platform.h
@@ -34,12 +34,6 @@
       std::unique_ptr<v8::Task> task) override;
   void CallDelayedOnWorkerThread(std::unique_ptr<v8::Task> task,
                                  double delay_in_seconds) override;
-  void CallOnForegroundThread(v8::Isolate* isolate, v8::Task* task) override;
-  void CallDelayedOnForegroundThread(v8::Isolate* isolate,
-                                     v8::Task* task,
-                                     double delay_in_seconds) override;
-  void CallIdleOnForegroundThread(v8::Isolate* isolate,
-                                  v8::IdleTask* task) override;
   bool IdleTasksEnabled(v8::Isolate* isolate) override;
   double MonotonicallyIncreasingTime() override;
   double CurrentClockTimeMillis() override;
diff --git a/gin/shell/gin_main.cc b/gin/shell/gin_main.cc
index a447d3b0..1b9e5aa8 100644
--- a/gin/shell/gin_main.cc
+++ b/gin/shell/gin_main.cc
@@ -71,7 +71,6 @@
   base::i18n::InitializeICU();
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
   gin::V8Initializer::LoadV8Snapshot();
-  gin::V8Initializer::LoadV8Natives();
 #endif
 
   base::SingleThreadTaskExecutor main_thread_task_executor;
diff --git a/gin/shell_runner_unittest.cc b/gin/shell_runner_unittest.cc
index c97015f..b4c8e189 100644
--- a/gin/shell_runner_unittest.cc
+++ b/gin/shell_runner_unittest.cc
@@ -30,7 +30,6 @@
 
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
   gin::V8Initializer::LoadV8Snapshot();
-  gin::V8Initializer::LoadV8Natives();
 #endif
 
   gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
diff --git a/gin/test/v8_test.cc b/gin/test/v8_test.cc
index 72d6af0..596b1c177 100644
--- a/gin/test/v8_test.cc
+++ b/gin/test/v8_test.cc
@@ -23,7 +23,6 @@
 void V8Test::SetUp() {
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
   gin::V8Initializer::LoadV8Snapshot();
-  gin::V8Initializer::LoadV8Natives();
 #endif
   gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
                                  gin::ArrayBufferAllocator::SharedInstance());
diff --git a/gin/v8_initializer.cc b/gin/v8_initializer.cc
index 5a028d9..9298a9c 100644
--- a/gin/v8_initializer.cc
+++ b/gin/v8_initializer.cc
@@ -39,8 +39,7 @@
 
 namespace {
 
-// None of these globals are ever freed nor closed.
-base::MemoryMappedFile* g_mapped_natives = nullptr;
+// This global is never freed nor closed.
 base::MemoryMappedFile* g_mapped_snapshot = nullptr;
 
 bool GenerateEntropy(unsigned char* buffer, size_t amount) {
@@ -61,8 +60,6 @@
 
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
 
-const char kNativesFileName[] = "natives_blob.bin";
-
 #if defined(OS_ANDROID)
 const char kV8ContextSnapshotFileName64[] = "v8_context_snapshot_64.bin";
 const char kV8ContextSnapshotFileName32[] = "v8_context_snapshot_32.bin";
@@ -100,9 +97,9 @@
   *path_out =
       base::FilePath(FILE_PATH_LITERAL("assets")).AppendASCII(file_name);
 #elif defined(OS_MACOSX)
-  base::ScopedCFTypeRef<CFStringRef> natives_file_name(
+  base::ScopedCFTypeRef<CFStringRef> bundle_resource(
       base::SysUTF8ToCFStringRef(file_name));
-  *path_out = base::mac::PathForFrameworkBundleResource(natives_file_name);
+  *path_out = base::mac::PathForFrameworkBundleResource(bundle_resource);
 #else
   base::FilePath data_path;
   bool r = base::PathService::Get(base::DIR_ASSETS, &data_path);
@@ -166,17 +163,6 @@
       }
     } else if (file.error_details() != base::File::FILE_ERROR_IN_USE) {
       result = OpenV8FileResult::FAILED_OTHER;
-#ifdef OS_WIN
-      // TODO(oth): temporary diagnostics for http://crbug.com/479537
-      std::string narrow(kNativesFileName);
-      base::FilePath::StringType nativesBlob(narrow.begin(), narrow.end());
-      if (path.BaseName().value() == nativesBlob) {
-        base::File::Error file_error = file.error_details();
-        base::debug::Alias(&file_error);
-        LOG(FATAL) << "Failed to open V8 file '" << path.value()
-                   << "' (reason: " << file.error_details() << ")";
-      }
-#endif  // OS_WIN
       break;
     } else if (kMaxOpenAttempts - 1 != attempt) {
       base::PlatformThread::Sleep(
@@ -260,16 +246,20 @@
                                sizeof(gc_experiment_less_compaction) - 1);
   }
 
+  if (base::FeatureList::IsEnabled(features::kV8GCAlwaysPromoteYoungMC)) {
+    static const char gc_experiment_always_promote_young_mc[] =
+        "--always_promote_young_mc";
+    v8::V8::SetFlagsFromString(
+        gc_experiment_always_promote_young_mc,
+        sizeof(gc_experiment_always_promote_young_mc) - 1);
+  }
+
   if (IsolateHolder::kStrictMode == mode) {
     static const char use_strict[] = "--use_strict";
     v8::V8::SetFlagsFromString(use_strict, sizeof(use_strict) - 1);
   }
 
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
-  // TODO(v8:7624): Remove natives and all remaining infrastructure.
-  v8::StartupData natives;
-  GetMappedFileData(g_mapped_natives, &natives);
-
   if (g_mapped_snapshot) {
     v8::StartupData snapshot;
     GetMappedFileData(g_mapped_snapshot, &snapshot);
@@ -284,22 +274,15 @@
 }
 
 // static
-void V8Initializer::GetV8ExternalSnapshotData(v8::StartupData* natives,
-                                              v8::StartupData* snapshot) {
-  GetMappedFileData(g_mapped_natives, natives);
+void V8Initializer::GetV8ExternalSnapshotData(v8::StartupData* snapshot) {
   GetMappedFileData(g_mapped_snapshot, snapshot);
 }
 
 // static
-void V8Initializer::GetV8ExternalSnapshotData(const char** natives_data_out,
-                                              int* natives_size_out,
-                                              const char** snapshot_data_out,
+void V8Initializer::GetV8ExternalSnapshotData(const char** snapshot_data_out,
                                               int* snapshot_size_out) {
-  v8::StartupData natives;
   v8::StartupData snapshot;
-  GetV8ExternalSnapshotData(&natives, &snapshot);
-  *natives_data_out = natives.data;
-  *natives_size_out = natives.raw_size;
+  GetV8ExternalSnapshotData(&snapshot);
   *snapshot_data_out = snapshot.data;
   *snapshot_size_out = snapshot.raw_size;
 }
@@ -321,16 +304,6 @@
 }
 
 // static
-void V8Initializer::LoadV8Natives() {
-  if (g_mapped_natives)
-    return;
-
-  base::MemoryMappedFile::Region file_region;
-  base::File file = OpenV8File(kNativesFileName, &file_region);
-  LoadV8NativesFromFile(std::move(file), &file_region);
-}
-
-// static
 void V8Initializer::LoadV8SnapshotFromFile(
     base::File snapshot_file,
     base::MemoryMappedFile::Region* snapshot_file_region,
@@ -357,35 +330,8 @@
                             V8_LOAD_MAX_VALUE);
 }
 
-// static
-void V8Initializer::LoadV8NativesFromFile(
-    base::File natives_file,
-    base::MemoryMappedFile::Region* natives_file_region) {
-  if (g_mapped_natives)
-    return;
-
-  CHECK(natives_file.IsValid());
-
-  base::MemoryMappedFile::Region region =
-      base::MemoryMappedFile::Region::kWholeFile;
-  if (natives_file_region) {
-    region = *natives_file_region;
-  }
-
-  if (!MapV8File(std::move(natives_file), region, &g_mapped_natives)) {
-    LOG(FATAL) << "Couldn't mmap v8 natives data file";
-  }
-}
-
 #if defined(OS_ANDROID)
 // static
-base::FilePath V8Initializer::GetNativesFilePath() {
-  base::FilePath path;
-  GetV8FilePath(kNativesFileName, &path);
-  return path;
-}
-
-// static
 base::FilePath V8Initializer::GetSnapshotFilePath(
     bool abi_32_bit,
     V8SnapshotFileType snapshot_file_type) {
diff --git a/gin/v8_initializer.h b/gin/v8_initializer.h
index aa3863a..2918c62 100644
--- a/gin/v8_initializer.h
+++ b/gin/v8_initializer.h
@@ -25,11 +25,8 @@
   // Get address and size information for currently loaded snapshot.
   // If no snapshot is loaded, the return values are null for addresses
   // and 0 for sizes.
-  static void GetV8ExternalSnapshotData(v8::StartupData* natives,
-                                        v8::StartupData* snapshot);
-  static void GetV8ExternalSnapshotData(const char** natives_data_out,
-                                        int* natives_size_out,
-                                        const char** snapshot_data_out,
+  static void GetV8ExternalSnapshotData(v8::StartupData* snapshot);
+  static void GetV8ExternalSnapshotData(const char** snapshot_data_out,
                                         int* snapshot_size_out);
 
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
@@ -45,9 +42,6 @@
   // Load V8 snapshot from default resources, if they are available.
   static void LoadV8Snapshot(
       V8SnapshotFileType snapshot_file_type = V8SnapshotFileType::kDefault);
-  // Load V8 natives source from default resources. Contains asserts
-  // so that it will not return if natives cannot be loaded.
-  static void LoadV8Natives();
 
   // Load V8 snapshot from user provided file.
   // The region argument, if non-zero, specifies the portions
@@ -57,15 +51,8 @@
       base::File snapshot_file,
       base::MemoryMappedFile::Region* snapshot_file_region,
       V8SnapshotFileType snapshot_file_type);
-  // Similar to LoadV8SnapshotFromFile, but for the source of the natives.
-  // Without the natives we cannot continue, so this function contains
-  // release mode asserts and won't return if it fails.
-  static void LoadV8NativesFromFile(
-      base::File natives_file,
-      base::MemoryMappedFile::Region* natives_file_region);
 
 #if defined(OS_ANDROID)
-  static base::FilePath GetNativesFilePath();
   static base::FilePath GetSnapshotFilePath(
       bool abi_32_bit,
       V8SnapshotFileType snapshot_file_type);
diff --git a/gin/v8_platform.cc b/gin/v8_platform.cc
index 4725b6812..cbd61e8 100644
--- a/gin/v8_platform.cc
+++ b/gin/v8_platform.cc
@@ -440,25 +440,6 @@
                         base::TimeDelta::FromSecondsD(delay_in_seconds));
 }
 
-void V8Platform::CallOnForegroundThread(v8::Isolate* isolate, v8::Task* task) {
-  PerIsolateData* data = PerIsolateData::From(isolate);
-  data->task_runner()->PostTask(std::unique_ptr<v8::Task>(task));
-}
-
-void V8Platform::CallDelayedOnForegroundThread(v8::Isolate* isolate,
-                                               v8::Task* task,
-                                               double delay_in_seconds) {
-  PerIsolateData* data = PerIsolateData::From(isolate);
-  data->task_runner()->PostDelayedTask(std::unique_ptr<v8::Task>(task),
-                                       delay_in_seconds);
-}
-
-void V8Platform::CallIdleOnForegroundThread(v8::Isolate* isolate,
-                                            v8::IdleTask* task) {
-  PerIsolateData* data = PerIsolateData::From(isolate);
-  data->task_runner()->PostIdleTask(std::unique_ptr<v8::IdleTask>(task));
-}
-
 bool V8Platform::IdleTasksEnabled(v8::Isolate* isolate) {
   return PerIsolateData::From(isolate)->task_runner()->IdleTasksEnabled();
 }
diff --git a/gpu/angle_deqp_tests_main.cc b/gpu/angle_deqp_tests_main.cc
index 7567b6a..2c1351a 100644
--- a/gpu/angle_deqp_tests_main.cc
+++ b/gpu/angle_deqp_tests_main.cc
@@ -35,8 +35,9 @@
   angle::InitTestHarness(&argc, argv);
   base::TestSuite test_suite(argc, argv);
 
-  // The process priority is lowered by the constructor of tcu::ANGLEPlatform().
-  test_suite.DisableCheckForProcessPriority();
+  // The process and thread priorities are modified by
+  // StabilizeCPUForBenchmarking()/SetLowPriorityProcess().
+  test_suite.DisableCheckForThreadAndProcessPriority();
 
   int rt = base::LaunchUnitTestsSerially(
       argc, argv, base::BindOnce(&RunHelper, base::Unretained(&test_suite)));
diff --git a/gpu/angle_perftests_main.cc b/gpu/angle_perftests_main.cc
index 341410b..09a97d4 100644
--- a/gpu/angle_perftests_main.cc
+++ b/gpu/angle_perftests_main.cc
@@ -27,6 +27,10 @@
   ANGLEProcessPerfTestArgs(&argc, argv);
 
   base::TestSuite test_suite(argc, argv);
+
+  // The thread priority is modified by StabilizeCPUForBenchmarking().
+  test_suite.DisableCheckForThreadAndProcessPriority();
+
   int rt = base::LaunchUnitTestsSerially(
       argc, argv, base::BindOnce(&RunHelper, base::Unretained(&test_suite)));
   return rt;
diff --git a/headless/BUILD.gn b/headless/BUILD.gn
index 7d89091..bf34e98 100644
--- a/headless/BUILD.gn
+++ b/headless/BUILD.gn
@@ -473,7 +473,6 @@
   # use external v8 startup data too.
   if ((is_win && is_component_build) || !is_win) {
     if (v8_use_external_startup_data) {
-      data += [ "$root_out_dir/natives_blob.bin" ]
       public_deps += [ "//v8" ]
       if (use_v8_context_snapshot) {
         data += [ "$root_out_dir/v8_context_snapshot.bin" ]
diff --git a/headless/test/headless_test_launcher.cc b/headless/test/headless_test_launcher.cc
index 6d8ee1c..d0b1430 100644
--- a/headless/test/headless_test_launcher.cc
+++ b/headless/test/headless_test_launcher.cc
@@ -41,8 +41,10 @@
   // content::TestLauncherDelegate implementation:
   int RunTestSuite(int argc, char** argv) override {
     base::TestSuite test_suite(argc, argv);
-    // Browser tests are expected not to tear-down various globals.
+    // Browser tests are expected not to tear-down various globals and may
+    // complete with the thread priority being above NORMAL.
     test_suite.DisableCheckForLeakedGlobals();
+    test_suite.DisableCheckForThreadPriorityAtTestEnd();
     return test_suite.Run();
   }
 
diff --git a/ios/build/bots/chromium.fyi/ios13-beta-simulator.json b/ios/build/bots/chromium.fyi/ios13-beta-simulator.json
index 42cd1a6..2d9f589 100644
--- a/ios/build/bots/chromium.fyi/ios13-beta-simulator.json
+++ b/ios/build/bots/chromium.fyi/ios13-beta-simulator.json
@@ -31,6 +31,15 @@
     {
       "xcode parallelization": true,
       "include": "eg2_tests.json",
+      "device type": "iPhone 7",
+      "os": "13.1",
+      "xcode build version": "11a1027",
+      "pool":"Chrome",
+      "host os": "Mac-10.14.6"
+    },
+    {
+      "xcode parallelization": true,
+      "include": "eg2_tests.json",
       "device type": "iPad (6th generation)",
       "os": "13.1",
       "xcode build version": "11a1027",
diff --git a/ios/build/bots/chromium.mac/ios-simulator-noncq.json b/ios/build/bots/chromium.mac/ios-simulator-noncq.json
index adfcf79..48468a1 100644
--- a/ios/build/bots/chromium.mac/ios-simulator-noncq.json
+++ b/ios/build/bots/chromium.mac/ios-simulator-noncq.json
@@ -30,6 +30,15 @@
     {
       "xcode parallelization": true,
       "include": "eg2_tests.json",
+      "device type": "iPhone 7",
+      "os": "13.1",
+      "xcode build version": "11a1027",
+      "pool":"Chrome",
+      "host os": "Mac-10.14.6"
+    },
+    {
+      "xcode parallelization": true,
+      "include": "eg2_tests.json",
       "device type": "iPad (6th generation)",
       "os": "13.1",
       "xcode build version": "11a1027",
diff --git a/ios/build/bots/chromium.mac/ios13-beta-simulator.json b/ios/build/bots/chromium.mac/ios13-beta-simulator.json
index 30a9880..d11b6e90 100644
--- a/ios/build/bots/chromium.mac/ios13-beta-simulator.json
+++ b/ios/build/bots/chromium.mac/ios13-beta-simulator.json
@@ -31,6 +31,15 @@
     {
       "xcode parallelization": true,
       "include": "eg2_tests.json",
+      "device type": "iPhone 7",
+      "os": "13.1",
+      "xcode build version": "11a1027",
+      "pool":"Chrome",
+      "host os": "Mac-10.14.6"
+    },
+    {
+      "xcode parallelization": true,
+      "include": "eg2_tests.json",
       "device type": "iPad (6th generation)",
       "os": "13.1",
       "xcode build version": "11a1027",
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index d7457f3..fdeeeb0 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -369,9 +369,6 @@
      flag_descriptions::kOmniboxPopupShortcutIconsInZeroStateDescription,
      flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(omnibox::kOmniboxPopupShortcutIconsInZeroState)},
-    {"use-multilogin-endpoint", flag_descriptions::kUseMultiloginEndpointName,
-     flag_descriptions::kUseMultiloginEndpointDescription, flags_ui::kOsIos,
-     FEATURE_VALUE_TYPE(kUseMultiloginEndpoint)},
     {"omnibox-on-device-head-suggestions",
      flag_descriptions::kOmniboxOnDeviceHeadSuggestionsName,
      flag_descriptions::kOmniboxOnDeviceHeadSuggestionsDescription,
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index 1193c161..b2deb84 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -370,10 +370,6 @@
 const char kUseDdljsonApiDescription[] =
     "Enables the new ddljson API to fetch Doodles for the NTP.";
 
-const char kUseMultiloginEndpointName[] = "Use Multilogin endpoint.";
-const char kUseMultiloginEndpointDescription[] =
-    "Use Gaia OAuth multilogin for identity consistency.";
-
 const char kWalletServiceUseSandboxName[] = "Use Google Payments sandbox";
 const char kWalletServiceUseSandboxDescription[] =
     "Uses the sandbox service for Google Payments API calls.";
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index d2534a7..cf327ac 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -326,11 +326,6 @@
 extern const char kUseDdljsonApiName[];
 extern const char kUseDdljsonApiDescription[];
 
-// Title and description for the flag to enable Gaia Auth Mutlilogin endpoint
-// for identity consistency.
-extern const char kUseMultiloginEndpointName[];
-extern const char kUseMultiloginEndpointDescription[];
-
 // Title and description for the flag to control if Google Payments API calls
 // should use the sandbox servers.
 extern const char kWalletServiceUseSandboxName[];
diff --git a/ios/chrome/browser/metrics/BUILD.gn b/ios/chrome/browser/metrics/BUILD.gn
index a2e1ebf..7e35408 100644
--- a/ios/chrome/browser/metrics/BUILD.gn
+++ b/ios/chrome/browser/metrics/BUILD.gn
@@ -109,6 +109,7 @@
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/common",
     "//ios/public/provider/chrome/browser",
+    "//ios/web/common",
     "//ios/web/public/deprecated",
     "//url",
   ]
@@ -144,6 +145,7 @@
     "//ios/chrome/browser/browser_state:test_support",
     "//ios/chrome/browser/web:test_support",
     "//ios/chrome/test:test_support",
+    "//ios/web/common",
     "//ios/web/public:public",
     "//ios/web/public/test",
     "//ios/web/public/test/fakes",
diff --git a/ios/chrome/browser/metrics/features.cc b/ios/chrome/browser/metrics/features.cc
index bed78cc2..8ff416a 100644
--- a/ios/chrome/browser/metrics/features.cc
+++ b/ios/chrome/browser/metrics/features.cc
@@ -3,6 +3,3 @@
 // found in the LICENSE file.
 
 #include "ios/chrome/browser/metrics/features.h"
-
-const base::Feature kLogLoadStartedInDidStartNavigation{
-    "LogLoadStartedInDidStartNavigation", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/metrics/features.h b/ios/chrome/browser/metrics/features.h
index e542485a..304200c 100644
--- a/ios/chrome/browser/metrics/features.h
+++ b/ios/chrome/browser/metrics/features.h
@@ -7,7 +7,4 @@
 
 #include "base/feature_list.h"
 
-// Feature flag to move -LogLoadStarted() to WebStateDidStartNavigation().
-extern const base::Feature kLogLoadStartedInDidStartNavigation;
-
 #endif  // IOS_CHROME_BROWSER_METRICS_FEATURES_H_
diff --git a/ios/chrome/browser/metrics/ios_chrome_stability_metrics_provider.mm b/ios/chrome/browser/metrics/ios_chrome_stability_metrics_provider.mm
index 4a74fd3..7020701 100644
--- a/ios/chrome/browser/metrics/ios_chrome_stability_metrics_provider.mm
+++ b/ios/chrome/browser/metrics/ios_chrome_stability_metrics_provider.mm
@@ -8,6 +8,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
 #include "ios/chrome/browser/metrics/features.h"
+#include "ios/web/common/features.h"
 #import "ios/web/public/navigation/navigation_context.h"
 #include "url/gurl.h"
 
@@ -65,7 +66,8 @@
     return;
 
   UMA_HISTOGRAM_BOOLEAN(kPageLoadCountLoadingStartedMetric, true);
-  if (!base::FeatureList::IsEnabled(kLogLoadStartedInDidStartNavigation))
+  if (!base::FeatureList::IsEnabled(
+          web::features::kLogLoadStartedInDidStartNavigation))
     helper_.LogLoadStarted();
 }
 
@@ -82,7 +84,8 @@
   } else if (navigation_context->IsSameDocument()) {
     type = PageLoadCountNavigationType::SAME_DOCUMENT_WEB_NAVIGATION;
   } else {
-    if (base::FeatureList::IsEnabled(kLogLoadStartedInDidStartNavigation))
+    if (base::FeatureList::IsEnabled(
+            web::features::kLogLoadStartedInDidStartNavigation))
       helper_.LogLoadStarted();
   }
   UMA_HISTOGRAM_ENUMERATION(kPageLoadCountMetric, type,
diff --git a/ios/chrome/browser/metrics/ios_chrome_stability_metrics_provider_unittest.mm b/ios/chrome/browser/metrics/ios_chrome_stability_metrics_provider_unittest.mm
index d61caaf..29e4af3 100644
--- a/ios/chrome/browser/metrics/ios_chrome_stability_metrics_provider_unittest.mm
+++ b/ios/chrome/browser/metrics/ios_chrome_stability_metrics_provider_unittest.mm
@@ -10,6 +10,7 @@
 #include "components/prefs/scoped_user_pref_update.h"
 #include "components/prefs/testing_pref_service.h"
 #include "ios/chrome/browser/metrics/features.h"
+#include "ios/web/common/features.h"
 #import "ios/web/public/test/fakes/fake_navigation_context.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
@@ -33,7 +34,8 @@
 
 TEST_F(IOSChromeStabilityMetricsProviderTest,
        DidStartLoadingEventShouldIncrementPageLoadCount) {
-  if (base::FeatureList::IsEnabled(kLogLoadStartedInDidStartNavigation))
+  if (base::FeatureList::IsEnabled(
+          web::features::kLogLoadStartedInDidStartNavigation))
     return;
   IOSChromeStabilityMetricsProvider provider(&prefs_);
 
@@ -66,7 +68,8 @@
 
 TEST_F(IOSChromeStabilityMetricsProviderTest,
        DidStartNavigationEventShouldIncrementPageLoadCount) {
-  if (!base::FeatureList::IsEnabled(kLogLoadStartedInDidStartNavigation))
+  if (!base::FeatureList::IsEnabled(
+          web::features::kLogLoadStartedInDidStartNavigation))
     return;
 
   web::FakeNavigationContext context;
@@ -185,8 +188,10 @@
 
   metrics::SystemProfileProto system_profile;
   provider.ProvideStabilityMetrics(&system_profile);
-  int page_load_count =
-      base::FeatureList::IsEnabled(kLogLoadStartedInDidStartNavigation) ? 1 : 0;
+  int page_load_count = base::FeatureList::IsEnabled(
+                            web::features::kLogLoadStartedInDidStartNavigation)
+                            ? 1
+                            : 0;
   EXPECT_EQ(page_load_count, system_profile.stability().page_load_count());
 }
 
diff --git a/ios/chrome/browser/ui/content_suggestions/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
index 18d497f..7a776c63 100644
--- a/ios/chrome/browser/ui/content_suggestions/BUILD.gn
+++ b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
@@ -229,13 +229,38 @@
   configs += [ "//build/config/compiler:enable_arc" ]
 }
 
+source_set("eg2_tests") {
+  defines = [ "CHROME_EARL_GREY_2" ]
+  configs += [
+    "//build/config/compiler:enable_arc",
+    "//build/config/ios:xctest_config",
+  ]
+  testonly = true
+  sources = [
+    "content_suggestions_egtest.mm",
+  ]
+  deps = [
+    ":content_suggestions_constant",
+    ":eg_test_support+eg2",
+    "//base",
+    "//base/test:test_support",
+    "//components/strings",
+    "//ios/chrome/app/strings",
+    "//ios/chrome/test/earl_grey:eg_test_support+eg2",
+    "//ios/testing/earl_grey:eg_test_support+eg2",
+    "//ios/third_party/earl_grey2:test_lib",
+    "//net:test_support",
+    "//ui/strings",
+  ]
+  libs = [ "UIKit.framework" ]
+}
+
 source_set("eg_tests") {
+  defines = [ "CHROME_EARL_GREY_1" ]
   testonly = true
   sources = [
     "content_suggestions_egtest.mm",
     "ntp_home_egtest.mm",
-    "ntp_home_provider_test_singleton.h",
-    "ntp_home_provider_test_singleton.mm",
   ]
   deps = [
     ":content_suggestions_constant",
@@ -280,18 +305,86 @@
   configs += [ "//build/config/compiler:enable_arc" ]
 }
 
+source_set("eg_test_support+eg2") {
+  defines = [ "CHROME_EARL_GREY_2" ]
+  configs += [
+    "//build/config/compiler:enable_arc",
+    "//build/config/ios:xctest_config",
+  ]
+  testonly = true
+
+  sources = [
+    "content_suggestions_app_interface.h",
+  ]
+
+  deps = [
+    "//ios/third_party/earl_grey2:test_lib",
+  ]
+}
+
+source_set("eg_app_support+eg2") {
+  configs += [
+    "//build/config/compiler:enable_arc",
+    "//build/config/ios:xctest_config",
+  ]
+  testonly = true
+  defines = [ "CHROME_EARL_GREY_2" ]
+
+  sources = [
+    "content_suggestions_app_interface.h",
+    "content_suggestions_app_interface.mm",
+    "ntp_home_provider_test_singleton.h",
+    "ntp_home_provider_test_singleton.mm",
+    "ntp_home_test_utils.h",
+    "ntp_home_test_utils.mm",
+  ]
+
+  deps = [
+    ":content_suggestions_constant",
+    ":content_suggestions_ui",
+    ":content_suggestions_ui_util",
+    "//base/test:test_support",
+    "//components/keyed_service/ios",
+    "//components/ntp_snippets",
+    "//components/ntp_snippets:test_support",
+    "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/ntp_snippets",
+    "//ios/chrome/browser/ui/util",
+    "//ios/chrome/test/app:test_support",
+    "//ios/testing/earl_grey:eg_app_support+eg2",
+    "//ios/third_party/earl_grey2:app_framework+link",
+    "//testing/gmock",
+    "//testing/gtest:gtest",
+  ]
+}
+
 source_set("test_support") {
   testonly = true
+  defines = [ "CHROME_EARL_GREY_1" ]
   sources = [
+    "content_suggestions_app_interface.h",
+    "content_suggestions_app_interface.mm",
+    "ntp_home_provider_test_singleton.h",
+    "ntp_home_provider_test_singleton.mm",
     "ntp_home_test_utils.h",
     "ntp_home_test_utils.mm",
   ]
   deps = [
+    ":content_suggestions_ui_util",
+    "//components/keyed_service/ios",
     "//components/ntp_snippets",
+    "//components/ntp_snippets:test_support",
+    "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/ntp_snippets",
     "//ios/chrome/browser/ui/content_suggestions",
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant",
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_ui",
+    "//ios/chrome/browser/ui/util",
+    "//ios/chrome/test/app:test_support",
+    "//ios/testing/earl_grey:earl_grey_support",
     "//ios/third_party/earl_grey:earl_grey+link",
+    "//ios/web",
+    "//testing/gmock",
   ]
   configs += [ "//build/config/compiler:enable_arc" ]
 }
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.h
new file mode 100644
index 0000000..bb953429
--- /dev/null
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.h
@@ -0,0 +1,37 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_APP_INTERFACE_H_
+#define IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_APP_INTERFACE_H_
+
+#import <Foundation/Foundation.h>
+
+// App interface for the Content Suggestions.
+@interface ContentSuggestionsAppInterface : NSObject
+
+// Sets the fake service up.
++ (void)setUpService;
+
+// Resets the service to the real, non-fake service to avoid leaking the fake.
++ (void)resetService;
+
+// Marks the suggestions as available.
++ (void)makeSuggestionsAvailable;
+
+// Disables the suggestions.
++ (void)disableSuggestions;
+
+// Adds |numberOfSuggestions| suggestions to the list of suggestions provided.
+// The suggestions have the name "chromium<suggestionNumber>" and the url
+// http://chromium/<suggestionNumber>.
++ (void)addNumberOfSuggestions:(NSInteger)numberOfSuggestions
+      additionalSuggestionsURL:(NSURL*)URL;
+
+// Add one particular suggestion, following the convention explained above, with
+// |suggestionNumber|.
++ (void)addSuggestionNumber:(NSInteger)suggestionNumber;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_APP_INTERFACE_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.mm
new file mode 100644
index 0000000..ffe62a4
--- /dev/null
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.mm
@@ -0,0 +1,138 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.h"
+
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/sys_string_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
+#include "components/ntp_snippets/content_suggestion.h"
+#include "components/ntp_snippets/content_suggestions_service.h"
+#include "components/ntp_snippets/mock_content_suggestions_provider.h"
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#include "ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory.h"
+#include "ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory_util.h"
+#include "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.h"
+#import "ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.h"
+#import "ios/chrome/browser/ui/content_suggestions/ntp_home_test_utils.h"
+#include "ios/chrome/browser/ui/util/ui_util.h"
+#import "ios/chrome/browser/ui/util/uikit_ui_util.h"
+#import "ios/chrome/test/app/chrome_test_util.h"
+#import "net/base/mac/url_conversions.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+using ntp_snippets::AdditionalSuggestionsHelper;
+using ntp_snippets::Category;
+using ntp_snippets::CategoryStatus;
+using ntp_snippets::ContentSuggestion;
+using ntp_snippets::ContentSuggestionsService;
+using ntp_snippets::CreateChromeContentSuggestionsService;
+using ntp_snippets::KnownCategories;
+using ntp_snippets::MockContentSuggestionsProvider;
+using testing::_;
+using testing::Invoke;
+using testing::WithArg;
+
+namespace {
+// Returns a suggestion created from the |category|, |suggestion_id| and the
+// |url|.
+ContentSuggestion CreateSuggestion(Category category,
+                                   std::string suggestion_id,
+                                   GURL url) {
+  ContentSuggestion suggestion(category, suggestion_id, url);
+  suggestion.set_title(base::UTF8ToUTF16(url.spec()));
+
+  return suggestion;
+}
+
+}  // namespace
+
+@implementation ContentSuggestionsAppInterface
+
++ (void)setUpService {
+  ios::ChromeBrowserState* browserState =
+      chrome_test_util::GetOriginalBrowserState();
+  // Sets the ContentSuggestionsService associated with this browserState to a
+  // service with no provider registered, allowing to register fake providers
+  // which do not require internet connection. The previous service is deleted.
+  IOSChromeContentSuggestionsServiceFactory::GetInstance()->SetTestingFactory(
+      browserState,
+      base::BindRepeating(&CreateChromeContentSuggestionsService));
+
+  ContentSuggestionsService* service =
+      IOSChromeContentSuggestionsServiceFactory::GetForBrowserState(
+          browserState);
+  [[ContentSuggestionsTestSingleton sharedInstance]
+      registerArticleProvider:service];
+}
+
++ (void)resetService {
+  ios::ChromeBrowserState* browserState =
+      chrome_test_util::GetOriginalBrowserState();
+
+  // Resets the Service associated with this browserState to a new service with
+  // no providers. The previous service is deleted.
+  IOSChromeContentSuggestionsServiceFactory::GetInstance()->SetTestingFactory(
+      browserState,
+      base::BindRepeating(&CreateChromeContentSuggestionsService));
+}
+
++ (void)makeSuggestionsAvailable {
+  [self provider] -> FireCategoryStatusChanged([self category],
+                                               CategoryStatus::AVAILABLE);
+}
+
++ (void)disableSuggestions {
+  [self provider] -> FireCategoryStatusChanged(
+                      [self category],
+                      CategoryStatus::ALL_SUGGESTIONS_EXPLICITLY_DISABLED);
+}
+
++ (void)addNumberOfSuggestions:(NSInteger)numberOfSuggestions
+      additionalSuggestionsURL:(NSURL*)URL {
+  GURL newURL = net::GURLWithNSURL(URL);
+  std::vector<ContentSuggestion> suggestions;
+  for (NSInteger i = 1; i <= numberOfSuggestions; i++) {
+    std::string index = base::SysNSStringToUTF8(@(i).stringValue);
+    suggestions.push_back(
+        CreateSuggestion([self category], "chromium" + index,
+                         GURL("http://chromium.org/" + index)));
+  }
+  [self provider] -> FireSuggestionsChanged([self category],
+                                            std::move(suggestions));
+
+  // Set up the action when "More" is tapped.
+  [[ContentSuggestionsTestSingleton sharedInstance]
+      resetAdditionalSuggestionsHelperWithURL:newURL];
+  EXPECT_CALL(*[self provider], FetchMock(_, _, _))
+      .WillOnce(WithArg<2>(
+          Invoke([[ContentSuggestionsTestSingleton sharedInstance]
+                     additionalSuggestionsHelper],
+                 &AdditionalSuggestionsHelper::SendAdditionalSuggestions)));
+}
+
++ (void)addSuggestionNumber:(NSInteger)suggestionNumber {
+  std::string index = base::NumberToString(suggestionNumber);
+  std::vector<ContentSuggestion> suggestions;
+  suggestions.push_back(CreateSuggestion([self category], "chromium" + index,
+                                         GURL("http://chromium.org/" + index)));
+  [self provider] -> FireSuggestionsChanged([self category],
+                                            std::move(suggestions));
+}
+
+#pragma mark - Helper
+
++ (MockContentSuggestionsProvider*)provider {
+  return [[ContentSuggestionsTestSingleton sharedInstance] provider];
+}
+
++ (Category)category {
+  return Category::FromKnownCategory(KnownCategories::ARTICLES);
+}
+
+@end
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm
index 2e56688..951100c 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm
@@ -2,9 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import <EarlGrey/EarlGrey.h>
-#import <XCTest/XCTest.h>
-
 #include <memory>
 #include <vector>
 
@@ -14,50 +11,30 @@
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #import "base/test/ios/wait_util.h"
-#include "base/test/scoped_command_line.h"
-#include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
-#include "components/ntp_snippets/content_suggestion.h"
-#include "components/ntp_snippets/content_suggestions_service.h"
-#include "components/ntp_snippets/mock_content_suggestions_provider.h"
 #include "components/strings/grit/components_strings.h"
-#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#include "ios/chrome/browser/chrome_switches.h"
-#include "ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory.h"
-#include "ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory_util.h"
-#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_header_item.h"
-#import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_learn_more_item.h"
-#include "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.h"
+#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_app_interface.h"
 #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h"
-#import "ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.h"
-#import "ios/chrome/browser/ui/content_suggestions/ntp_home_test_utils.h"
-#include "ios/chrome/browser/ui/util/ui_util.h"
-#import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
-#import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
+#import "ios/testing/earl_grey/earl_grey_test.h"
+#import "net/base/mac/url_conversions.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
-#include "testing/gmock/include/gmock/gmock.h"
 #include "ui/strings/grit/ui_strings.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
-using ntp_snippets::AdditionalSuggestionsHelper;
-using ntp_snippets::Category;
-using ntp_snippets::CategoryStatus;
-using ntp_snippets::ContentSuggestion;
-using ntp_snippets::ContentSuggestionsService;
-using ntp_snippets::CreateChromeContentSuggestionsService;
-using ntp_snippets::KnownCategories;
-using ntp_snippets::MockContentSuggestionsProvider;
-using testing::_;
-using testing::Invoke;
-using testing::WithArg;
+#if defined(CHROME_EARL_GREY_2)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wc++98-compat-extra-semi"
+GREY_STUB_CLASS_IN_APP_MAIN_QUEUE(ContentSuggestionsAppInterface);
+#pragma clang diagnostic pop
+#endif  // defined(CHROME_EARL_GREY_2)
 
 namespace {
 
@@ -90,17 +67,6 @@
   return std::move(http_response);
 }
 
-// Returns a suggestion created from the |category|, |suggestion_id| and the
-// |url|.
-ContentSuggestion Suggestion(Category category,
-                             std::string suggestion_id,
-                             GURL url) {
-  ContentSuggestion suggestion(category, suggestion_id, url);
-  suggestion.set_title(base::UTF8ToUTF16(url.spec()));
-
-  return suggestion;
-}
-
 // Select the cell with the |matcher| by scrolling the collection.
 // 200 is a reasonable scroll displacement that works for all UI elements, while
 // not being too slow.
@@ -123,72 +89,47 @@
 // Test case for the ContentSuggestion UI.
 @interface ContentSuggestionsTestCase : ChromeTestCase
 
-// Current non-incognito browser state.
-@property(nonatomic, assign, readonly) ios::ChromeBrowserState* browserState;
-// Mock provider from the singleton.
-@property(nonatomic, assign, readonly) MockContentSuggestionsProvider* provider;
-// Article category, used by the singleton.
-@property(nonatomic, assign, readonly) Category category;
-
 @end
 
 @implementation ContentSuggestionsTestCase
 
 #pragma mark - Setup/Teardown
 
+#if defined(CHROME_EARL_GREY_2)
++ (void)setUpForTestCase {
+  [super setUpForTestCase];
+  [self setUpHelper];
+}
+#elif defined(CHROME_EARL_GREY_1)
 + (void)setUp {
   [super setUp];
+  [self setUpHelper];
+}
+#else
+#error Not an EarlGrey Test
+#endif
 
++ (void)setUpHelper {
   [self closeAllTabs];
-  ios::ChromeBrowserState* browserState =
-      chrome_test_util::GetOriginalBrowserState();
 
-  // Sets the ContentSuggestionsService associated with this browserState to a
-  // service with no provider registered, allowing to register fake providers
-  // which do not require internet connection. The previous service is deleted.
-  IOSChromeContentSuggestionsServiceFactory::GetInstance()->SetTestingFactory(
-      browserState,
-      base::BindRepeating(&CreateChromeContentSuggestionsService));
-
-  ContentSuggestionsService* service =
-      IOSChromeContentSuggestionsServiceFactory::GetForBrowserState(
-          browserState);
-  [[ContentSuggestionsTestSingleton sharedInstance]
-      registerArticleProvider:service];
+  [ContentSuggestionsAppInterface setUpService];
 }
 
 + (void)tearDown {
   [self closeAllTabs];
-  ios::ChromeBrowserState* browserState =
-      chrome_test_util::GetOriginalBrowserState();
 
-  // Resets the Service associated with this browserState to a new service with
-  // no providers. The previous service is deleted.
-  IOSChromeContentSuggestionsServiceFactory::GetInstance()->SetTestingFactory(
-      browserState,
-      base::BindRepeating(&CreateChromeContentSuggestionsService));
+  [ContentSuggestionsAppInterface resetService];
+
   [super tearDown];
 }
 
-// Per crbug.com/845186, Disable flakey iPad Retina tests that are limited
-// to iOS 10.2.
-+ (NSArray*)testInvocations {
-#if TARGET_IPHONE_SIMULATOR
-  if ([ChromeEarlGrey isIPadIdiom] && !base::ios::IsRunningOnOrLater(10, 3, 0))
-    return @[];
-#endif  // TARGET_IPHONE_SIMULATOR
-  return [super testInvocations];
-}
-
 - (void)setUp {
-  self.provider->FireCategoryStatusChanged(self.category,
-                                           CategoryStatus::AVAILABLE);
   [super setUp];
+  [ContentSuggestionsAppInterface makeSuggestionsAvailable];
 }
 
 - (void)tearDown {
-  self.provider->FireCategoryStatusChanged(
-      self.category, CategoryStatus::ALL_SUGGESTIONS_EXPLICITLY_DISABLED);
+  [ContentSuggestionsAppInterface disableSuggestions];
   [ChromeEarlGrey clearBrowsingHistory];
   [super tearDown];
 }
@@ -204,20 +145,9 @@
   const GURL pageURL = self.testServer->GetURL(kPageURL);
 
   // Add 3 suggestions, persisted accross page loads.
-  std::vector<ContentSuggestion> suggestions;
-  suggestions.push_back(
-      Suggestion(self.category, "chromium1", GURL("http://chromium.org/1")));
-  suggestions.push_back(
-      Suggestion(self.category, "chromium2", GURL("http://chromium.org/2")));
-  suggestions.push_back(
-      Suggestion(self.category, "chromium3", GURL("http://chromium.org/3")));
-  self.provider->FireSuggestionsChanged(self.category, std::move(suggestions));
-
-  // Set up the action when "More" is tapped.
-  AdditionalSuggestionsHelper helper(pageURL);
-  EXPECT_CALL(*self.provider, FetchMock(_, _, _))
-      .WillOnce(WithArg<2>(Invoke(
-          &helper, &AdditionalSuggestionsHelper::SendAdditionalSuggestions)));
+  [ContentSuggestionsAppInterface
+        addNumberOfSuggestions:3
+      additionalSuggestionsURL:net::NSURLWithGURL(pageURL)];
 
   // Tap on more, which adds 10 elements.
   [CellWithMatcher(chrome_test_util::ButtonWithAccessibilityLabelId(
@@ -243,20 +173,12 @@
 // Tests that when the page is reloaded using the tools menu, the suggestions
 // are updated.
 - (void)testReloadPage {
-  // Add 2 suggestions.
-  std::vector<ContentSuggestion> suggestions;
-  suggestions.push_back(
-      Suggestion(self.category, "chromium1", GURL("http://chromium.org/1")));
-  suggestions.push_back(
-      Suggestion(self.category, "chromium2", GURL("http://chromium.org/2")));
-  self.provider->FireSuggestionsChanged(self.category, std::move(suggestions));
+  // Add 2 suggestions, persisted accross page loads.
+  [ContentSuggestionsAppInterface addNumberOfSuggestions:2
+                                additionalSuggestionsURL:nil];
 
   // Change the suggestions to have one the second one.
-  std::vector<ContentSuggestion> suggestionsOnly;
-  suggestionsOnly.push_back(
-      Suggestion(self.category, "chromium2", GURL("http://chromium.org/2")));
-  self.provider->FireSuggestionsChanged(self.category,
-                                        std::move(suggestionsOnly));
+  [ContentSuggestionsAppInterface addSuggestionNumber:2];
 
   // Check that the first suggestion is still displayed.
   [CellWithMatcher(grey_accessibilityID(@"http://chromium.org/1"))
@@ -282,28 +204,16 @@
   const GURL pageURL = self.testServer->GetURL(kPageURL);
 
   // Add 3 suggestions, persisted accross page loads.
-  std::vector<ContentSuggestion> suggestions;
-  suggestions.push_back(
-      Suggestion(self.category, "chromium1", GURL("http://chromium.org/1")));
-  suggestions.push_back(
-      Suggestion(self.category, "chromium2", GURL("http://chromium.org/2")));
-  suggestions.push_back(
-      Suggestion(self.category, "chromium3", GURL("http://chromium.org/3")));
-  self.provider->FireSuggestionsChanged(self.category, std::move(suggestions));
-
-  // Set up the action when "More" is tapped.
-  AdditionalSuggestionsHelper helper(pageURL);
-  EXPECT_CALL(*self.provider, FetchMock(_, _, _))
-      .WillOnce(WithArg<2>(Invoke(
-          &helper, &AdditionalSuggestionsHelper::SendAdditionalSuggestions)));
+  [ContentSuggestionsAppInterface
+        addNumberOfSuggestions:3
+      additionalSuggestionsURL:net::NSURLWithGURL(pageURL)];
 
   // Tap on more, which adds 10 elements.
   [CellWithMatcher(chrome_test_util::ButtonWithAccessibilityLabelId(
       IDS_IOS_CONTENT_SUGGESTIONS_FOOTER_TITLE)) performAction:grey_tap()];
 
   // Make sure to scroll to the bottom.
-  [CellWithMatcher(grey_accessibilityID(
-      [ContentSuggestionsLearnMoreItem accessibilityIdentifier]))
+  [CellWithMatcher(grey_accessibilityID(@"Learn more"))
       assertWithMatcher:grey_notNil()];
 
   // Open the last item. After the extra space of the last suggestion is
@@ -338,20 +248,15 @@
 - (void)testLearnMore {
   id<GREYAction> action =
       grey_scrollInDirectionWithStartPoint(kGREYDirectionDown, 200, 0.5, 0.5);
-  [[[EarlGrey selectElementWithMatcher:grey_accessibilityID(
-                                           [ContentSuggestionsLearnMoreItem
-                                               accessibilityIdentifier])]
+  [[[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Learn more")]
          usingSearchAction:action
       onElementWithMatcher:chrome_test_util::ContentSuggestionCollectionView()]
       assertWithMatcher:grey_nil()];
 
-  std::vector<ContentSuggestion> suggestions;
-  suggestions.push_back(
-      Suggestion(self.category, "chromium", GURL("http://chromium.org")));
-  self.provider->FireSuggestionsChanged(self.category, std::move(suggestions));
+  [ContentSuggestionsAppInterface addNumberOfSuggestions:1
+                                additionalSuggestionsURL:nil];
 
-  [CellWithMatcher(grey_accessibilityID(
-      [ContentSuggestionsLearnMoreItem accessibilityIdentifier]))
+  [CellWithMatcher(grey_accessibilityID(@"Learn more"))
       assertWithMatcher:grey_sufficientlyVisible()];
 }
 
@@ -477,7 +382,7 @@
 - (void)testMostVisitedLongPress {
   [self setupMostVisitedTileLongPress];
 
-  if (!IsRegularXRegularSizeClass()) {
+  if (![ChromeEarlGrey isRegularXRegularSizeClass]) {
     [[EarlGrey selectElementWithMatcher:
                    chrome_test_util::ButtonWithAccessibilityLabelId(
                        IDS_APP_CANCEL)] assertWithMatcher:grey_interactable()];
@@ -490,20 +395,6 @@
       assertWithMatcher:grey_nil()];
 }
 
-#pragma mark - Properties
-
-- (ios::ChromeBrowserState*)browserState {
-  return chrome_test_util::GetOriginalBrowserState();
-}
-
-- (MockContentSuggestionsProvider*)provider {
-  return [[ContentSuggestionsTestSingleton sharedInstance] provider];
-}
-
-- (Category)category {
-  return Category::FromKnownCategory(KnownCategories::ARTICLES);
-}
-
 #pragma mark - Test utils
 
 // Setup a most visited tile, and open the context menu by long pressing on it.
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.h b/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.h
index a8c81c8..138057e 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.h
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.h
@@ -10,6 +10,10 @@
 #include "components/ntp_snippets/content_suggestions_service.h"
 #include "components/ntp_snippets/mock_content_suggestions_provider.h"
 
+namespace ntp_snippets {
+class AdditionalSuggestionsHelper;
+}
+
 // Singleton allowing to register the provider in the +setup and still access it
 // from inside the tests.
 @interface ContentSuggestionsTestSingleton : NSObject
@@ -17,6 +21,11 @@
 // Shared instance of this singleton.
 + (instancetype)sharedInstance;
 
+// Resets the stored additionalSuggestions helper with |URL|.
+- (void)resetAdditionalSuggestionsHelperWithURL:(const GURL&)URL;
+// Returns the stored additionalSuggestionsHelper.
+- (ntp_snippets::AdditionalSuggestionsHelper*)additionalSuggestionsHelper;
+
 // Returns the provider registered.
 - (ntp_snippets::MockContentSuggestionsProvider*)provider;
 // Registers a provider in the |service|.
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.mm
index 7c45332..c0bc2e3 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.mm
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_provider_test_singleton.mm
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "components/ntp_snippets/content_suggestion.h"
+#import "ios/chrome/browser/ui/content_suggestions/ntp_home_test_utils.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -15,6 +16,8 @@
 
 @implementation ContentSuggestionsTestSingleton {
   ntp_snippets::MockContentSuggestionsProvider* _provider;
+  std::unique_ptr<ntp_snippets::AdditionalSuggestionsHelper>
+      _additionalSuggestionsHelper;
 }
 
 + (instancetype)sharedInstance {
@@ -26,6 +29,15 @@
   return sharedInstance;
 }
 
+- (void)resetAdditionalSuggestionsHelperWithURL:(const GURL&)URL {
+  _additionalSuggestionsHelper =
+      std::make_unique<ntp_snippets::AdditionalSuggestionsHelper>(URL);
+}
+
+- (ntp_snippets::AdditionalSuggestionsHelper*)additionalSuggestionsHelper {
+  return _additionalSuggestionsHelper.get();
+}
+
 - (ntp_snippets::MockContentSuggestionsProvider*)provider {
   return _provider;
 }
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_test_utils.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_test_utils.mm
index 0a0731b..6e846c9 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_test_utils.mm
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_test_utils.mm
@@ -4,8 +4,6 @@
 
 #import "ios/chrome/browser/ui/content_suggestions/ntp_home_test_utils.h"
 
-#import <EarlGrey/EarlGrey.h>
-
 #include <string>
 
 #include "base/callback.h"
@@ -15,6 +13,7 @@
 #include "components/ntp_snippets/status.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.h"
 #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h"
+#import "ios/testing/earl_grey/earl_grey_app.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -57,10 +56,10 @@
 
 namespace ntp_home {
 id<GREYMatcher> OmniboxWidth(CGFloat width) {
-  MatchesBlock matches = ^BOOL(UIView* view) {
+  GREYMatchesBlock matches = ^BOOL(UIView* view) {
     return fabs(view.bounds.size.width - width) < 0.001;
   };
-  DescribeToBlock describe = ^void(id<GREYDescription> description) {
+  GREYDescribeToBlock describe = ^void(id<GREYDescription> description) {
     [description
         appendText:[NSString stringWithFormat:@"Omnibox has correct width: %g",
                                               width]];
@@ -71,11 +70,11 @@
 }
 
 id<GREYMatcher> OmniboxWidthBetween(CGFloat width, CGFloat margin) {
-  MatchesBlock matches = ^BOOL(UIView* view) {
+  GREYMatchesBlock matches = ^BOOL(UIView* view) {
     return view.bounds.size.width >= width - margin &&
            view.bounds.size.width <= width + margin;
   };
-  DescribeToBlock describe = ^void(id<GREYDescription> description) {
+  GREYDescribeToBlock describe = ^void(id<GREYDescription> description) {
     [description
         appendText:[NSString
                        stringWithFormat:
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_egtest.mm b/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_egtest.mm
index 72d7f6c..4fa1fcc 100644
--- a/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_egtest.mm
+++ b/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_egtest.mm
@@ -114,31 +114,61 @@
 #pragma mark - Test that all fields on the 'Add Credit Card' screen appear
 
 // Tests that 'Name on Card' field appears on screen.
+// TODO(crbug.com/1016353): Test disabled on iOS 13 iPhone.
 - (void)testNameOnCardFieldIsPresent {
+#if TARGET_IPHONE_SIMULATOR
+  if (base::ios::IsRunningOnOrLater(13, 0, 0)) {
+    EARL_GREY_TEST_SKIPPED(@"Test fails iPhone 7 13.0");
+  }
+#endif  // TARGET_IPHONE_SIMULATOR
   [[EarlGrey selectElementWithMatcher:NameOnCardField()]
       assertWithMatcher:grey_sufficientlyVisible()];
 }
 
 // Tests that 'Card Number' field appears on screen.
+// TODO(crbug.com/1016353): Test disabled on iOS 13 iPhone.
 - (void)testCardNumberFieldIsPresent {
+#if TARGET_IPHONE_SIMULATOR
+  if (base::ios::IsRunningOnOrLater(13, 0, 0)) {
+    EARL_GREY_TEST_SKIPPED(@"Test fails iPhone 7 13.0");
+  }
+#endif  // TARGET_IPHONE_SIMULATOR
   [[EarlGrey selectElementWithMatcher:CardNumberField()]
       assertWithMatcher:grey_sufficientlyVisible()];
 }
 
 // Tests that 'Month of Expiry' field appears on screen.
+// TODO(crbug.com/1016353): Test disabled on iOS 13 iPhone.
 - (void)testMonthOfExpiryFieldIsPresent {
+#if TARGET_IPHONE_SIMULATOR
+  if (base::ios::IsRunningOnOrLater(13, 0, 0)) {
+    EARL_GREY_TEST_SKIPPED(@"Test fails iPhone 7 13.0");
+  }
+#endif  // TARGET_IPHONE_SIMULATOR
   [[EarlGrey selectElementWithMatcher:MonthOfExpiryField()]
       assertWithMatcher:grey_sufficientlyVisible()];
 }
 
 // Tests that 'Year of Expiry' field appears on screen.
+// TODO(crbug.com/1016353): Test disabled on iOS 13 iPhone.
 - (void)testYearOfExpiryFieldIsPresent {
+#if TARGET_IPHONE_SIMULATOR
+  if (base::ios::IsRunningOnOrLater(13, 0, 0)) {
+    EARL_GREY_TEST_SKIPPED(@"Test fails iPhone 7 13.0");
+  }
+#endif  // TARGET_IPHONE_SIMULATOR
   [[EarlGrey selectElementWithMatcher:YearOfExpiryField()]
       assertWithMatcher:grey_sufficientlyVisible()];
 }
 
 // Tests that 'Use Camera' button appears on screen only for iOS 13.
+// TODO(crbug.com/1016353): Test disabled on iOS 13 iPhone.
 - (void)testUseCameraButtonIsPresent {
+#if TARGET_IPHONE_SIMULATOR
+  if (base::ios::IsRunningOnOrLater(13, 0, 0)) {
+    EARL_GREY_TEST_SKIPPED(@"Test fails iPhone 7 13.0");
+  }
+#endif  // TARGET_IPHONE_SIMULATOR
   if (@available(iOS 13, *)) {
     [[EarlGrey selectElementWithMatcher:UseCameraButton()]
         assertWithMatcher:grey_sufficientlyVisible()];
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn
index c453c739..560a82c 100644
--- a/ios/chrome/test/earl_grey/BUILD.gn
+++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -364,6 +364,7 @@
     "//ios/chrome/browser/ui/bookmarks:bookmarks_ui",
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_constant",
     "//ios/chrome/browser/ui/content_suggestions:content_suggestions_ui",
+    "//ios/chrome/browser/ui/content_suggestions:eg_app_support+eg2",
     "//ios/chrome/browser/ui/history:constants",
     "//ios/chrome/browser/ui/location_bar:location_bar",
     "//ios/chrome/browser/ui/omnibox:omnibox_internal",
diff --git a/ios/chrome/test/earl_grey2/BUILD.gn b/ios/chrome/test/earl_grey2/BUILD.gn
index 4f88ab0..1001089 100644
--- a/ios/chrome/test/earl_grey2/BUILD.gn
+++ b/ios/chrome/test/earl_grey2/BUILD.gn
@@ -49,6 +49,7 @@
 
   deps = [
     "//ios/chrome/browser/ui/activity_services:eg2_tests",
+    "//ios/chrome/browser/ui/content_suggestions:eg2_tests",
     "//ios/chrome/browser/ui/download:eg2_tests",
     "//ios/chrome/browser/ui/integration_tests:eg2_tests",
     "//ios/chrome/browser/ui/ntp:eg2_tests",
diff --git a/ios/web/common/features.h b/ios/web/common/features.h
index 32213d9..18dff181 100644
--- a/ios/web/common/features.h
+++ b/ios/web/common/features.h
@@ -39,6 +39,16 @@
 // Used to enable committed interstitials for SSL errors.
 extern const base::Feature kSSLCommittedInterstitials;
 
+// Used to enable using WKWebView.loading for WebState::IsLoading.
+extern const base::Feature kUseWKWebViewLoading;
+
+// Feature flag to move -LogLoadStarted() to WebStateDidStartNavigation().
+extern const base::Feature kLogLoadStartedInDidStartNavigation;
+
+// Use WKWebView.loading to update WebState::IsLoading.
+// TODO(crbug.com/1006012): Clean up this flag after experiment.
+bool UseWKWebViewLoading();
+
 }  // namespace features
 }  // namespace web
 
diff --git a/ios/web/common/features.mm b/ios/web/common/features.mm
index f062aed..dd93bf4 100644
--- a/ios/web/common/features.mm
+++ b/ios/web/common/features.mm
@@ -35,5 +35,25 @@
 const base::Feature kSSLCommittedInterstitials{
     "SSLCommittedInterstitials", base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kUseWKWebViewLoading{"UseWKWebViewLoading",
+                                         base::FEATURE_DISABLED_BY_DEFAULT};
+
+const base::Feature kLogLoadStartedInDidStartNavigation{
+    "LogLoadStartedInDidStartNavigation", base::FEATURE_ENABLED_BY_DEFAULT};
+
+// The feature kUseWKWebViewLoading will change the CPM if
+// kLogLoadStartedInDidStartNavigation is not enabled, so
+// kLogLoadStartedInDidStartNavigation is required. The feature flag
+// kUseWKWebViewLoading itself is also required to make sure CPM is not changed
+// even with kLogLoadStartedInDidStartNavigation enabled. The flag
+// kSlimNavigationManager is used here because we only want to fix test failure
+// for slim-nav since it's going to be shipped soon.
+bool UseWKWebViewLoading() {
+  return base::FeatureList::IsEnabled(web::features::kSlimNavigationManager) &&
+         base::FeatureList::IsEnabled(web::features::kUseWKWebViewLoading) &&
+         base::FeatureList::IsEnabled(
+             web::features::kLogLoadStartedInDidStartNavigation);
+}
+
 }  // namespace features
 }  // namespace web
diff --git a/media/blink/run_all_unittests.cc b/media/blink/run_all_unittests.cc
index 7a5cdc3..d496b21 100644
--- a/media/blink/run_all_unittests.cc
+++ b/media/blink/run_all_unittests.cc
@@ -53,7 +53,6 @@
 
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
     gin::V8Initializer::LoadV8Snapshot(kSnapshotType);
-    gin::V8Initializer::LoadV8Natives();
 #endif
 
 #if !defined(OS_IOS)
diff --git a/net/base/mime_sniffer_unittest.cc b/net/base/mime_sniffer_unittest.cc
index 9227535..1b42a50c 100644
--- a/net/base/mime_sniffer_unittest.cc
+++ b/net/base/mime_sniffer_unittest.cc
@@ -50,7 +50,6 @@
     {url::kFileScheme, true},
     {url::kFileSystemScheme, true},
     {url::kFtpScheme, false},
-    {url::kGopherScheme, false},
     {url::kHttpScheme, true},
     {url::kHttpsScheme, true},
     {url::kJavaScriptScheme, false},
diff --git a/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc b/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
index 25edec0..3137059 100644
--- a/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
+++ b/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
@@ -1229,17 +1229,17 @@
   std::unique_ptr<CookieMonster> cookie_monster =
       std::make_unique<CookieMonster>(store_.get(), nullptr);
   ResultSavingCookieCallback<bool> cookie_scheme_callback1;
-  cookie_monster->SetCookieableSchemes({"gopher", "http"},
+  cookie_monster->SetCookieableSchemes({"ftp", "http"},
                                        cookie_scheme_callback1.MakeCallback());
   cookie_scheme_callback1.WaitUntilDone();
   EXPECT_TRUE(cookie_scheme_callback1.result());
   ResultSavingCookieCallback<CanonicalCookie::CookieInclusionStatus>
       set_cookie_callback;
   auto cookie = CanonicalCookie::Create(
-      GURL("gopher://subdomain.gopheriffic.com/page"), "A=B; max-age=3600",
+      GURL("ftp://subdomain.ftperiffic.com/page"), "A=B; max-age=3600",
       base::Time::Now(), base::nullopt /* server_time */);
   cookie_monster->SetCanonicalCookieAsync(
-      std::move(cookie), "gopher", CookieOptions(),
+      std::move(cookie), "ftp", CookieOptions(),
       base::BindOnce(&ResultSavingCookieCallback<
                          CanonicalCookie::CookieInclusionStatus>::Run,
                      base::Unretained(&set_cookie_callback)));
@@ -1276,7 +1276,7 @@
   Create(false, false, true /* want current thread to invoke cookie monster */);
   cookie_monster = std::make_unique<CookieMonster>(store_.get(), nullptr);
   ResultSavingCookieCallback<bool> cookie_scheme_callback2;
-  cookie_monster->SetCookieableSchemes({"gopher", "http"},
+  cookie_monster->SetCookieableSchemes({"ftp", "http"},
                                        cookie_scheme_callback2.MakeCallback());
   cookie_scheme_callback2.WaitUntilDone();
   EXPECT_TRUE(cookie_scheme_callback2.result());
@@ -1284,14 +1284,14 @@
   // Now try to get the cookie back.
   GetCookieListCallback get_callback;
   cookie_monster->GetCookieListWithOptionsAsync(
-      GURL("gopher://subdomain.gopheriffic.com/page"), CookieOptions(),
+      GURL("ftp://subdomain.ftperiffic.com/page"), CookieOptions(),
       base::BindOnce(&GetCookieListCallback::Run,
                      base::Unretained(&get_callback)));
   get_callback.WaitUntilDone();
   ASSERT_EQ(1u, get_callback.cookies().size());
   EXPECT_EQ("A", get_callback.cookies()[0].Name());
   EXPECT_EQ("B", get_callback.cookies()[0].Value());
-  EXPECT_EQ("subdomain.gopheriffic.com", get_callback.cookies()[0].Domain());
+  EXPECT_EQ("subdomain.ftperiffic.com", get_callback.cookies()[0].Domain());
 }
 
 TEST_F(SQLitePersistentCookieStoreTest, OpsIfInitFailed) {
diff --git a/net/proxy_resolution/proxy_resolver_v8.cc b/net/proxy_resolution/proxy_resolver_v8.cc
index f32d0fa..bc8e972 100644
--- a/net/proxy_resolution/proxy_resolver_v8.cc
+++ b/net/proxy_resolution/proxy_resolver_v8.cc
@@ -369,7 +369,6 @@
       if (!has_initialized_v8_) {
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
         gin::V8Initializer::LoadV8Snapshot();
-        gin::V8Initializer::LoadV8Natives();
 #endif
 
         // The performance of the proxy resolver is limited by DNS resolution,
diff --git a/net/url_request/url_request_test_util.cc b/net/url_request/url_request_test_util.cc
index 5170349..36d95ab 100644
--- a/net/url_request/url_request_test_util.cc
+++ b/net/url_request/url_request_test_util.cc
@@ -164,6 +164,16 @@
   }
 }
 
+std::unique_ptr<URLRequest> TestURLRequestContext::CreateFirstPartyRequest(
+    const GURL& url,
+    RequestPriority priority,
+    URLRequest::Delegate* delegate,
+    NetworkTrafficAnnotationTag traffic_annotation) const {
+  auto req = CreateRequest(url, priority, delegate, traffic_annotation);
+  req->set_site_for_cookies(url);
+  return req;
+}
+
 TestURLRequestContextGetter::TestURLRequestContextGetter(
     const scoped_refptr<base::SingleThreadTaskRunner>& network_task_runner)
     : network_task_runner_(network_task_runner) {
diff --git a/net/url_request/url_request_test_util.h b/net/url_request/url_request_test_util.h
index aaaf60bd..23a4eb39 100644
--- a/net/url_request/url_request_test_util.h
+++ b/net/url_request/url_request_test_util.h
@@ -88,6 +88,14 @@
     create_default_http_user_agent_settings_ = value;
   }
 
+  // Like CreateRequest, but also updates |site_for_cookies| to give the request
+  // a 1st-party context.
+  std::unique_ptr<URLRequest> CreateFirstPartyRequest(
+      const GURL& url,
+      RequestPriority priority,
+      URLRequest::Delegate* delegate,
+      NetworkTrafficAnnotationTag traffic_annotation) const;
+
  private:
   bool initialized_ = false;
 
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index cf407a7..6d3ebd2 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -1394,7 +1394,7 @@
     TestNetworkDelegate network_delegate;
     context.set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context.CreateRequest(
+    std::unique_ptr<URLRequest> req(context.CreateFirstPartyRequest(
         test_server.GetURL("/set-cookie?CookieToNotSend=1"), DEFAULT_PRIORITY,
         &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1409,7 +1409,7 @@
     TestNetworkDelegate network_delegate;
     context.set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context.CreateRequest(
+    std::unique_ptr<URLRequest> req(context.CreateFirstPartyRequest(
         test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1533,12 +1533,13 @@
                                          base::Time::Now(),
                                          base::nullopt /* server_time */);
   delayed_cm->SetCanonicalCookieAsync(std::move(cookie1), url.scheme(),
-                                      CookieOptions(),
+                                      net::CookieOptions::MakeAllInclusive(),
                                       CookieStore::SetCookiesCallback());
   auto cookie2 = CanonicalCookie::Create(url, "AlreadySetCookie=1;Secure",
                                          base::Time::Now(),
                                          base::nullopt /* server_time */);
-  cm->SetCanonicalCookieAsync(std::move(cookie2), url.scheme(), CookieOptions(),
+  cm->SetCanonicalCookieAsync(std::move(cookie2), url.scheme(),
+                              net::CookieOptions::MakeAllInclusive(),
                               CookieStore::SetCookiesCallback());
 
   std::vector<std::string> cookie_lines(
@@ -1557,17 +1558,18 @@
   for (auto first_cookie_line : cookie_lines) {
     for (auto second_cookie_line : cookie_lines) {
       // Run with the delayed cookie monster.
-      std::unique_ptr<URLRequest> request = async_context.CreateRequest(
-          test_server.GetURL("/set-cookie?" + first_cookie_line + "&" +
-                             second_cookie_line),
-          DEFAULT_PRIORITY, &async_delegate, TRAFFIC_ANNOTATION_FOR_TESTS);
+      std::unique_ptr<URLRequest> request =
+          async_context.CreateFirstPartyRequest(
+              test_server.GetURL("/set-cookie?" + first_cookie_line + "&" +
+                                 second_cookie_line),
+              DEFAULT_PRIORITY, &async_delegate, TRAFFIC_ANNOTATION_FOR_TESTS);
 
       request->Start();
       async_delegate.RunUntilComplete();
       EXPECT_THAT(async_delegate.request_status(), IsOk());
 
       // Run with the regular cookie monster.
-      request = sync_context.CreateRequest(
+      request = sync_context.CreateFirstPartyRequest(
           test_server.GetURL("/set-cookie?" + first_cookie_line + "&" +
                              second_cookie_line),
           DEFAULT_PRIORITY, &sync_delegate, TRAFFIC_ANNOTATION_FOR_TESTS);
@@ -1616,7 +1618,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/set-cookie?CookieToNotSend=1"), DEFAULT_PRIORITY,
         &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1630,7 +1632,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1647,7 +1649,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->SetLoadFlags(LOAD_DO_NOT_SEND_COOKIES);
@@ -1672,7 +1674,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/set-cookie?CookieToNotUpdate=2"), DEFAULT_PRIORITY,
         &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1688,7 +1690,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
         DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->SetLoadFlags(LOAD_DO_NOT_SAVE_COOKIES);
@@ -1707,7 +1709,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1733,7 +1735,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/set-cookie?CookieToNotSend=1"), DEFAULT_PRIORITY,
         &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1748,7 +1750,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1772,7 +1774,7 @@
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
     network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES);
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1805,7 +1807,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/set-cookie?CookieToNotUpdate=2"), DEFAULT_PRIORITY,
         &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1826,7 +1828,7 @@
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
     network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE);
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
         DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1846,7 +1848,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1871,7 +1873,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/set-cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1892,7 +1894,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/set-cookie?CookieToNotSend=1"), DEFAULT_PRIORITY,
         &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1907,7 +1909,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1926,7 +1928,7 @@
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
     network_delegate.set_cookie_options(TestNetworkDelegate::NO_GET_COOKIES);
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1949,7 +1951,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/set-cookie?CookieToNotUpdate=2"), DEFAULT_PRIORITY,
         &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1965,7 +1967,7 @@
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
     network_delegate.set_cookie_options(TestNetworkDelegate::NO_SET_COOKIE);
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/set-cookie?CookieToNotSave=1&CookieToNotUpdate=1"),
         DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -1981,7 +1983,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -2290,7 +2292,7 @@
   // Try to set a Secure __Secure- cookie.
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context.CreateRequest(
+    std::unique_ptr<URLRequest> req(context.CreateFirstPartyRequest(
         http_server.GetURL("/set-cookie?__Secure-nonsecure-origin=1;Secure"),
         DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -2302,7 +2304,7 @@
   // Verify that the cookie is not set.
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context.CreateRequest(
+    std::unique_ptr<URLRequest> req(context.CreateFirstPartyRequest(
         https_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -2329,7 +2331,7 @@
   // Try to set a non-Secure __Secure- cookie.
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context.CreateRequest(
+    std::unique_ptr<URLRequest> req(context.CreateFirstPartyRequest(
         https_server.GetURL("/set-cookie?__Secure-foo=1"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -2342,7 +2344,7 @@
   // Verify that the cookie is not set.
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context.CreateRequest(
+    std::unique_ptr<URLRequest> req(context.CreateFirstPartyRequest(
         https_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -2368,7 +2370,7 @@
   // Try to set a Secure __Secure- cookie.
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context.CreateRequest(
+    std::unique_ptr<URLRequest> req(context.CreateFirstPartyRequest(
         https_server.GetURL("/set-cookie?__Secure-bar=1;Secure"),
         DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -2380,7 +2382,7 @@
   // Verify that the cookie is set.
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context.CreateRequest(
+    std::unique_ptr<URLRequest> req(context.CreateFirstPartyRequest(
         https_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -2412,7 +2414,7 @@
   // Try to set a Secure cookie, with experimental features enabled.
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context.CreateRequest(
+    std::unique_ptr<URLRequest> req(context.CreateFirstPartyRequest(
         http_server.GetURL("/set-cookie?nonsecure-origin=1;Secure"),
         DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -2424,7 +2426,7 @@
   // Verify that the cookie is not set.
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context.CreateRequest(
+    std::unique_ptr<URLRequest> req(context.CreateFirstPartyRequest(
         https_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -2476,10 +2478,11 @@
       base::FilePath(FILE_PATH_LITERAL("net/data/ssl")));
   ASSERT_TRUE(http_server.Start());
 
-  // Set two test cookies.
+  // Set two test cookies. The set is always done as a first-party. The
+  // partiness for getting the cookies is what varies with GetParam().
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context_.CreateRequest(
+    std::unique_ptr<URLRequest> req(context_.CreateFirstPartyRequest(
         http_server.GetURL(kHost_, "/set-cookie?cookie=value&cookie2=value2"),
         DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -2568,7 +2571,7 @@
   // Set cookies.
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context_.CreateRequest(
+    std::unique_ptr<URLRequest> req(context_.CreateFirstPartyRequest(
         https_server_.GetURL(kHost_,
                              "/set-cookie?session-cookie=value;Secure&"
                              "longlived-cookie=value;Secure;domain=" +
@@ -2616,7 +2619,7 @@
   // Set cookie.
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context_.CreateRequest(
+    std::unique_ptr<URLRequest> req(context_.CreateFirstPartyRequest(
         https_server_.GetURL(kHost_, "/set-cookie?cookie=value;Max-Age=3600"),
         DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -2662,7 +2665,7 @@
   // Set cookies.
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context_.CreateRequest(
+    std::unique_ptr<URLRequest> req(context_.CreateFirstPartyRequest(
         https_server_.GetURL(kHost_,
                              "/set-cookie?session-cookie=value&"
                              "longlived-cookie=value;Max-Age=360000"),
@@ -2710,7 +2713,7 @@
   // Set cookie.
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context_.CreateRequest(
+    std::unique_ptr<URLRequest> req(context_.CreateFirstPartyRequest(
         https_server_.GetURL(kHost_, "/set-cookie?cookie=value;domain=" +
                                          kHost_ + ";Max-Age=3600"),
         DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
@@ -2757,7 +2760,7 @@
   // Set cookies.
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context_.CreateRequest(
+    std::unique_ptr<URLRequest> req(context_.CreateFirstPartyRequest(
         https_server_.GetURL(
             kHost_, "/set-cookie?session-cookie=value;domain=" + kHost_ + "&" +
                         "longlived-cookie=value;domain=" + kHost_ +
@@ -2806,7 +2809,7 @@
   // Set cookie.
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context_.CreateRequest(
+    std::unique_ptr<URLRequest> req(context_.CreateFirstPartyRequest(
         https_server_.GetURL(kHost_, "/set-cookie?cookie=value;domain=" +
                                          kHost_ + ";Max-Age=3600"),
         DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
@@ -2850,7 +2853,7 @@
   // Set cookies.
   {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(context_.CreateRequest(
+    std::unique_ptr<URLRequest> req(context_.CreateFirstPartyRequest(
         https_server_.GetURL(kHost_,
                              "/set-cookie?cookie=value;domain=" + kHost_ +
                                  ";Max-Age=3600&host-cookie=value"),
@@ -2960,7 +2963,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL(
             "/set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"),
         DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
@@ -2972,7 +2975,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -2985,7 +2988,7 @@
     FixedDateNetworkDelegate network_delegate("18-Apr-1977 22:49:13 UTC");
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL(
             "/set-cookie?StillGood=1;expires=Mon,18-Apr-1977,22:50:13,GMT"),
         DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
@@ -2997,7 +3000,7 @@
     TestNetworkDelegate network_delegate;
     default_context().set_network_delegate(&network_delegate);
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         test_server.GetURL("/echoheader?Cookie"), DEFAULT_PRIORITY, &d,
         TRAFFIC_ANNOTATION_FOR_TESTS));
     req->Start();
@@ -3071,7 +3074,7 @@
                               bool include_data) {
     static const char kData[] = "hello world";
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->set_method(request_method);
     if (include_data) {
@@ -3117,7 +3120,7 @@
                                     const std::string& redirect_method,
                                     const std::string& expected_origin_value) {
     TestDelegate d;
-    std::unique_ptr<URLRequest> req(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> req(default_context().CreateFirstPartyRequest(
         redirect_url, DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
     req->set_method(request_method);
     req->SetExtraRequestHeaderByName(HttpRequestHeaders::kOrigin,
@@ -3187,7 +3190,7 @@
 
   bool DoManyCookiesRequest(int num_cookies) {
     TestDelegate d;
-    std::unique_ptr<URLRequest> r(default_context().CreateRequest(
+    std::unique_ptr<URLRequest> r(default_context().CreateFirstPartyRequest(
         test_server_.GetURL("/set-many-cookies?" +
                             base::NumberToString(num_cookies)),
         DEFAULT_PRIORITY, &d, TRAFFIC_ANNOTATION_FOR_TESTS));
@@ -7284,9 +7287,10 @@
     auto another_cookie = CanonicalCookie::Create(
         url_requiring_auth_wo_cookies, "another_cookie=true", base::Time::Now(),
         base::nullopt /* server_time */);
-    cm->SetCanonicalCookieAsync(
-        std::move(another_cookie), url_requiring_auth_wo_cookies.scheme(),
-        CookieOptions(), CookieStore::SetCookiesCallback());
+    cm->SetCanonicalCookieAsync(std::move(another_cookie),
+                                url_requiring_auth_wo_cookies.scheme(),
+                                net::CookieOptions::MakeAllInclusive(),
+                                CookieStore::SetCookiesCallback());
     context.set_cookie_store(cm.get());
     context.Init();
 
@@ -7316,9 +7320,10 @@
     auto one_more_cookie = CanonicalCookie::Create(
         url_requiring_auth_wo_cookies, "one_more_cookie=true",
         base::Time::Now(), base::nullopt /* server_time */);
-    cm->SetCanonicalCookieAsync(
-        std::move(one_more_cookie), url_requiring_auth_wo_cookies.scheme(),
-        CookieOptions(), CookieStore::SetCookiesCallback());
+    cm->SetCanonicalCookieAsync(std::move(one_more_cookie),
+                                url_requiring_auth_wo_cookies.scheme(),
+                                net::CookieOptions::MakeAllInclusive(),
+                                CookieStore::SetCookiesCallback());
 
     request->SetAuth(AuthCredentials(kUser, kSecret));
     delegate.RunUntilComplete();
@@ -7694,7 +7699,8 @@
         original_url, "another_cookie=true", base::Time::Now(),
         base::nullopt /* server_time */);
     cm->SetCanonicalCookieAsync(std::move(another_cookie),
-                                original_url.scheme(), CookieOptions(),
+                                original_url.scheme(),
+                                net::CookieOptions::MakeAllInclusive(),
                                 CookieStore::SetCookiesCallback());
     context.set_cookie_store(cm.get());
     context.Init();
@@ -7724,9 +7730,10 @@
     auto one_more_cookie = CanonicalCookie::Create(
         original_url_wo_cookie, "one_more_cookie=true", base::Time::Now(),
         base::nullopt /* server_time */);
-    cm->SetCanonicalCookieAsync(
-        std::move(one_more_cookie), original_url_wo_cookie.scheme(),
-        CookieOptions(), CookieStore::SetCookiesCallback());
+    cm->SetCanonicalCookieAsync(std::move(one_more_cookie),
+                                original_url_wo_cookie.scheme(),
+                                net::CookieOptions::MakeAllInclusive(),
+                                CookieStore::SetCookiesCallback());
 
     request->FollowDeferredRedirect(base::nullopt, base::nullopt);
     delegate.RunUntilComplete();
diff --git a/net/websockets/websocket_stream_cookie_test.cc b/net/websockets/websocket_stream_cookie_test.cc
index 4638839..c01cf64 100644
--- a/net/websockets/websocket_stream_cookie_test.cc
+++ b/net/websockets/websocket_stream_cookie_test.cc
@@ -154,7 +154,8 @@
       CanonicalCookie::Create(cookie_url, cookie_line, base::Time::Now(),
                               base::nullopt /* server_time */);
   store->SetCanonicalCookieAsync(
-      std::move(cookie), cookie_url.scheme(), CookieOptions(),
+      std::move(cookie), cookie_url.scheme(),
+      net::CookieOptions::MakeAllInclusive(),
       base::BindOnce(&SetCookieHelperFunction, run_loop.QuitClosure(),
                      weak_is_called.GetWeakPtr(),
                      weak_set_cookie_result.GetWeakPtr()));
@@ -204,7 +205,7 @@
       &get_cookie_list_result);
   base::RunLoop run_loop;
   store->GetCookieListWithOptionsAsync(
-      cookie_url, CookieOptions(),
+      cookie_url, net::CookieOptions::MakeAllInclusive(),
       base::BindOnce(&GetCookieListHelperFunction, run_loop.QuitClosure(),
                      weak_is_called.GetWeakPtr(),
                      weak_get_cookie_list_result.GetWeakPtr()));
diff --git a/pdf/BUILD.gn b/pdf/BUILD.gn
index 73a5e19..0f3ef9d 100644
--- a/pdf/BUILD.gn
+++ b/pdf/BUILD.gn
@@ -212,10 +212,7 @@
       ]
 
       if (v8_use_external_startup_data) {
-        data += [
-          "$root_out_dir/natives_blob.bin",
-          "$root_out_dir/snapshot_blob.bin",
-        ]
+        data += [ "$root_out_dir/snapshot_blob.bin" ]
       }
     }
   }
diff --git a/pdf/pdf_ppapi.cc b/pdf/pdf_ppapi.cc
index 22d4ef5..48b58e3 100644
--- a/pdf/pdf_ppapi.cc
+++ b/pdf/pdf_ppapi.cc
@@ -43,15 +43,13 @@
 
 pp::Instance* PDFModule::CreateInstance(PP_Instance instance) {
   if (!g_sdk_initialized_via_pepper) {
-    // TODO(v8:7624): Remove natives and all remaining infrastructure.
-    v8::StartupData natives;
     v8::StartupData snapshot;
     pp::PDF::GetV8ExternalSnapshotData(pp::InstanceHandle(instance),
-                                       &natives.data, &natives.raw_size,
                                        &snapshot.data, &snapshot.raw_size);
-    if (natives.data) {
+    if (snapshot.data) {
       v8::V8::SetSnapshotDataBlob(&snapshot);
     }
+
     InitializeSDK(/*enable_v8=*/true);
     g_sdk_initialized_via_pepper = true;
   }
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
index 1119638..b12fe7c 100644
--- a/pdf/pdfium/pdfium_engine.cc
+++ b/pdf/pdfium/pdfium_engine.cc
@@ -606,8 +606,10 @@
   FPDF_ImportPages(doc(), static_cast<PDFiumEngine*>(engine)->doc(), "1",
                    index);
   pp::Size new_page_size = GetPageSize(index);
-  if (curr_page_size != new_page_size)
-    LoadPageInfo(true);
+  if (curr_page_size != new_page_size) {
+    DCHECK(document_loaded_);
+    LoadPageInfo();
+  }
   client_->Invalidate(GetPageScreenRect(index));
 }
 
@@ -668,8 +670,10 @@
     }
   }
   pending_pages_.swap(still_pending);
-  if (update_pages)
-    LoadPageInfo(true);
+  if (update_pages) {
+    DCHECK(document_loaded_);
+    LoadPageInfo();
+  }
 }
 
 void PDFiumEngine::OnNewDataReceived() {
@@ -716,8 +720,15 @@
     if (IsPageVisible(i))
       client_->Invalidate(GetPageScreenRect(i));
   }
+
+  // Transition |document_loaded_| to true after finishing any calls to
+  // FPDFAvail_IsPageAvail(), since we no longer need to defer calls to this
+  // function from LoadPageInfo(). Note that LoadBody() calls LoadPageInfo()
+  // indirectly, so we cannot make this transition earlier.
+  document_loaded_ = true;
+
   if (need_update)
-    LoadPageInfo(true);
+    LoadPageInfo();
 
   if (called_do_document_action_)
     return;
@@ -1917,7 +1928,8 @@
 void PDFiumEngine::InvalidateAllPages() {
   CancelPaints();
   StopFind();
-  LoadPageInfo(true);
+  DCHECK(document_loaded_);
+  LoadPageInfo();
   client_->Invalidate(pp::Rect(plugin_size_));
 }
 
@@ -2372,7 +2384,8 @@
     pages_.push_back(std::move(page));
   }
 
-  LoadPageInfo(true);
+  DCHECK(document_loaded_);
+  LoadPageInfo();
 }
 
 void PDFiumEngine::LoadDocument() {
@@ -2474,8 +2487,8 @@
     FinishLoadingDocument();
 }
 
-void PDFiumEngine::LoadPageInfo(bool reload) {
-  std::vector<pp::Size> page_sizes = LoadPageSizes(reload);
+void PDFiumEngine::LoadPageInfo() {
+  std::vector<pp::Size> page_sizes = LoadPageSizes();
   if (page_sizes.empty())
     return;
 
@@ -2498,13 +2511,12 @@
   }
 }
 
-std::vector<pp::Size> PDFiumEngine::LoadPageSizes(bool reload) {
+std::vector<pp::Size> PDFiumEngine::LoadPageSizes() {
   std::vector<pp::Size> page_sizes;
   if (!doc_loader_)
     return page_sizes;
-  if (pages_.empty() && reload)
+  if (pages_.empty() && document_loaded_)
     return page_sizes;
-  DCHECK(reload || pages_.empty()) << "!reload expects no existing pages";
 
   pending_pages_.clear();
   size_t new_page_count = FPDF_GetPageCount(doc());
@@ -2513,13 +2525,12 @@
   bool is_linear =
       FPDFAvail_IsLinearized(fpdf_availability()) == PDF_LINEARIZED;
   for (size_t i = 0; i < new_page_count; ++i) {
-    // Get page availability. If |reload| == true and the page is not new,
-    // then the page has been constructed already. Get page availability flag
-    // from already existing PDFiumPage object.
-    // If |reload| == false or the page is new, then the page may not be fully
-    // loaded yet.
+    // Get page availability. If |document_loaded_| == true and the page is not
+    // new, then the page has been constructed already. Get page availability
+    // flag from already existing PDFiumPage object. If |document_loaded_| ==
+    // false or the page is new, then the page may not be fully loaded yet.
     bool page_available;
-    if (reload && i < pages_.size()) {
+    if (document_loaded_ && i < pages_.size()) {
       page_available = pages_[i]->available();
     } else if (is_linear) {
       FX_DOWNLOADHINTS& download_hints = document_->download_hints();
@@ -2535,12 +2546,14 @@
     page_sizes.push_back(size);
   }
 
-  // Add new pages. If !reload, do not mark page as available even if
-  // |doc_complete| is true because FPDFAvail_IsPageAvail() still has to be
-  // called for this page, which will be done in FinishLoadingDocument().
+  // Add new pages. If |document_loaded_| == false, do not mark page as
+  // available even if |doc_complete| is true because FPDFAvail_IsPageAvail()
+  // still has to be called for this page, which will be done in
+  // FinishLoadingDocument().
   for (size_t i = pages_.size(); i < new_page_count; ++i) {
     auto page = std::make_unique<PDFiumPage>(this, i);
-    if (reload && FPDFAvail_IsPageAvail(fpdf_availability(), i, nullptr))
+    if (document_loaded_ &&
+        FPDFAvail_IsPageAvail(fpdf_availability(), i, nullptr))
       page->MarkAvailable();
     pages_.push_back(std::move(page));
   }
@@ -2581,7 +2594,8 @@
       // the document is available, the first page is available as well.
       CheckPageAvailable(FPDFAvail_GetFirstPageNum(doc()), &pending_pages_);
     }
-    LoadPageInfo(false);
+    DCHECK(!document_loaded_);
+    LoadPageInfo();
   }
 }
 
diff --git a/pdf/pdfium/pdfium_engine.h b/pdf/pdfium/pdfium_engine.h
index c3a2f9b..20a28116 100644
--- a/pdf/pdfium/pdfium_engine.h
+++ b/pdf/pdfium/pdfium_engine.h
@@ -246,7 +246,7 @@
   void FinishLoadingDocument();
 
   // Loads information about the pages in the document and performs layout.
-  void LoadPageInfo(bool reload);
+  void LoadPageInfo();
 
   // Loads information about the pages in the document, calculating and
   // returning the individual page sizes.
@@ -256,7 +256,7 @@
   //
   // TODO(kmoon): LoadPageSizes() is a bit misnomer, but LoadPageInfo() is
   // taken right now...
-  std::vector<pp::Size> LoadPageSizes(bool reload);
+  std::vector<pp::Size> LoadPageSizes();
 
   void LoadBody();
 
@@ -574,6 +574,7 @@
   PDFiumFormFiller form_filler_;
 
   std::unique_ptr<PDFiumDocument> document_;
+  bool document_loaded_ = false;
 
   // The page(s) of the document.
   std::vector<std::unique_ptr<PDFiumPage>> pages_;
diff --git a/pdf/pdfium/pdfium_engine_exports_unittest.cc b/pdf/pdfium/pdfium_engine_exports_unittest.cc
index f1c99b3..6cb86713 100644
--- a/pdf/pdfium/pdfium_engine_exports_unittest.cc
+++ b/pdf/pdfium/pdfium_engine_exports_unittest.cc
@@ -22,7 +22,6 @@
   if (!loaded) {
     loaded = true;
     gin::V8Initializer::LoadV8Snapshot();
-    gin::V8Initializer::LoadV8Natives();
   }
 #endif
 }
diff --git a/ppapi/c/private/ppb_pdf.h b/ppapi/c/private/ppb_pdf.h
index 4a36698..8fbf8d9 100644
--- a/ppapi/c/private/ppb_pdf.h
+++ b/ppapi/c/private/ppb_pdf.h
@@ -183,11 +183,9 @@
   // Sets the link currently under the cursor.
   void (*SetLinkUnderCursor)(PP_Instance instance, const char* url);
 
-  // Gets pointers to both the mmap'd V8 snapshot files and their sizes.
-  // This is needed when loading V8's initial snapshot from external files.
+  // Gets pointers to the mmap'd V8 snapshot file and its size.
+  // This is needed when loading V8's initial snapshot from an external file.
   void (*GetV8ExternalSnapshotData)(PP_Instance instance,
-                                    const char** natives_data_out,
-                                    int* natives_size_out,
                                     const char** snapshot_data_out,
                                     int* snapshot_size_out);
 
diff --git a/ppapi/cpp/private/pdf.cc b/ppapi/cpp/private/pdf.cc
index ea13142..a4fd1a1 100644
--- a/ppapi/cpp/private/pdf.cc
+++ b/ppapi/cpp/private/pdf.cc
@@ -184,19 +184,14 @@
 
 // static
 void PDF::GetV8ExternalSnapshotData(const InstanceHandle& instance,
-                                    const char** natives_data_out,
-                                    int* natives_size_out,
                                     const char** snapshot_data_out,
                                     int* snapshot_size_out) {
   if (has_interface<PPB_PDF>()) {
-    get_interface<PPB_PDF>()->GetV8ExternalSnapshotData(instance.pp_instance(),
-        natives_data_out, natives_size_out, snapshot_data_out,
-        snapshot_size_out);
+    get_interface<PPB_PDF>()->GetV8ExternalSnapshotData(
+        instance.pp_instance(), snapshot_data_out, snapshot_size_out);
     return;
   }
-  *natives_data_out = NULL;
   *snapshot_data_out = NULL;
-  *natives_size_out = 0;
   *snapshot_size_out = 0;
 }
 
diff --git a/ppapi/cpp/private/pdf.h b/ppapi/cpp/private/pdf.h
index 9ae801f..a93d27d 100644
--- a/ppapi/cpp/private/pdf.h
+++ b/ppapi/cpp/private/pdf.h
@@ -87,8 +87,6 @@
   static void SetLinkUnderCursor(const InstanceHandle& instance,
                                  const char* url);
   static void GetV8ExternalSnapshotData(const InstanceHandle& instance,
-                                        const char** natives_data_out,
-                                        int* natives_size_out,
                                         const char** snapshot_data_out,
                                         int* snapshot_size_out);
   static void SetAccessibilityViewportInfo(
diff --git a/ppapi/proxy/pdf_resource.cc b/ppapi/proxy/pdf_resource.cc
index 5c82da8..f25f124 100644
--- a/ppapi/proxy/pdf_resource.cc
+++ b/ppapi/proxy/pdf_resource.cc
@@ -196,12 +196,10 @@
   Post(RENDERER, PpapiHostMsg_PDF_SetLinkUnderCursor(url));
 }
 
-void PDFResource::GetV8ExternalSnapshotData(const char** natives_data_out,
-                                            int* natives_size_out,
-                                            const char** snapshot_data_out,
+void PDFResource::GetV8ExternalSnapshotData(const char** snapshot_data_out,
                                             int* snapshot_size_out) {
-  gin::V8Initializer::GetV8ExternalSnapshotData(
-      natives_data_out, natives_size_out, snapshot_data_out, snapshot_size_out);
+  gin::V8Initializer::GetV8ExternalSnapshotData(snapshot_data_out,
+                                                snapshot_size_out);
 }
 
 void PDFResource::SetAccessibilityDocInfo(
diff --git a/ppapi/proxy/pdf_resource.h b/ppapi/proxy/pdf_resource.h
index b037510..124872c3 100644
--- a/ppapi/proxy/pdf_resource.h
+++ b/ppapi/proxy/pdf_resource.h
@@ -54,9 +54,7 @@
   PP_Bool IsFeatureEnabled(PP_PDFFeature feature) override;
   void SetSelectedText(const char* selected_text) override;
   void SetLinkUnderCursor(const char* url) override;
-  void GetV8ExternalSnapshotData(const char** natives_data_out,
-                                 int* natives_size_out,
-                                 const char** snapshot_data_out,
+  void GetV8ExternalSnapshotData(const char** snapshot_data_out,
                                  int* snapshot_size_out) override;
   void SetAccessibilityViewportInfo(
       const PP_PrivateAccessibilityViewportInfo* viewport_info) override;
diff --git a/ppapi/tests/test_pdf.cc b/ppapi/tests/test_pdf.cc
index ea79ab7..644cf26 100644
--- a/ppapi/tests/test_pdf.cc
+++ b/ppapi/tests/test_pdf.cc
@@ -22,21 +22,14 @@
 }
 
 std::string TestPDF::TestGetV8ExternalSnapshotData() {
-  const char* natives_data;
   const char* snapshot_data;
-  int natives_size;
   int snapshot_size;
 
-  pp::PDF::GetV8ExternalSnapshotData(instance_, &natives_data, &natives_size,
-      &snapshot_data, &snapshot_size);
+  pp::PDF::GetV8ExternalSnapshotData(instance_, &snapshot_data, &snapshot_size);
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
-  ASSERT_NE(natives_data, (char*) (NULL));
-  ASSERT_NE(natives_size, 0);
   ASSERT_NE(snapshot_data, (char*) (NULL));
   ASSERT_NE(snapshot_size, 0);
 #else
-  ASSERT_EQ(natives_data, (char*) (NULL));
-  ASSERT_EQ(natives_size, 0);
   ASSERT_EQ(snapshot_data, (char*) (NULL));
   ASSERT_EQ(snapshot_size, 0);
 #endif
diff --git a/ppapi/thunk/ppb_pdf_api.h b/ppapi/thunk/ppb_pdf_api.h
index c3a01cc..2a3f6ce2 100644
--- a/ppapi/thunk/ppb_pdf_api.h
+++ b/ppapi/thunk/ppb_pdf_api.h
@@ -32,9 +32,7 @@
   virtual void Print() = 0;
   virtual void SetSelectedText(const char* selected_text) = 0;
   virtual void SetLinkUnderCursor(const char* url) = 0;
-  virtual void GetV8ExternalSnapshotData(const char** natives_data_out,
-                                         int* natives_size_out,
-                                         const char** snapshot_data_out,
+  virtual void GetV8ExternalSnapshotData(const char** snapshot_data_out,
                                          int* snapshot_size_out) = 0;
   virtual void SetAccessibilityViewportInfo(
       const PP_PrivateAccessibilityViewportInfo* viewport_info) = 0;
diff --git a/ppapi/thunk/ppb_pdf_thunk.cc b/ppapi/thunk/ppb_pdf_thunk.cc
index 1f5c714..efb08e48 100644
--- a/ppapi/thunk/ppb_pdf_thunk.cc
+++ b/ppapi/thunk/ppb_pdf_thunk.cc
@@ -142,15 +142,13 @@
 }
 
 void GetV8ExternalSnapshotData(PP_Instance instance,
-                               const char** natives_data_out,
-                               int* natives_size_out,
                                const char** snapshot_data_out,
                                int* snapshot_size_out) {
   EnterInstanceAPI<PPB_PDF_API> enter(instance);
   if (enter.failed())
     return;
-  enter.functions()->GetV8ExternalSnapshotData(natives_data_out,
-      natives_size_out, snapshot_data_out, snapshot_size_out);
+  enter.functions()->GetV8ExternalSnapshotData(snapshot_data_out,
+                                               snapshot_size_out);
 }
 
 void SetAccessibilityViewportInfo(
diff --git a/services/data_decoder/image_decoder_impl_unittest.cc b/services/data_decoder/image_decoder_impl_unittest.cc
index 3e1a919..16fff4f 100644
--- a/services/data_decoder/image_decoder_impl_unittest.cc
+++ b/services/data_decoder/image_decoder_impl_unittest.cc
@@ -81,7 +81,6 @@
   BlinkInitializer() {
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
     gin::V8Initializer::LoadV8Snapshot(kSnapshotType);
-    gin::V8Initializer::LoadV8Natives();
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 
     service_manager::BinderRegistry empty_registry;
diff --git a/services/device/nfc/android/java/src/org/chromium/device/nfc/NdefMessageUtils.java b/services/device/nfc/android/java/src/org/chromium/device/nfc/NdefMessageUtils.java
index 56a1e0a..0e129e7 100644
--- a/services/device/nfc/android/java/src/org/chromium/device/nfc/NdefMessageUtils.java
+++ b/services/device/nfc/android/java/src/org/chromium/device/nfc/NdefMessageUtils.java
@@ -139,23 +139,31 @@
      */
     private static NdefRecord toNdefRecord(android.nfc.NdefRecord ndefRecord)
             throws UnsupportedEncodingException {
+        NdefRecord record = null;
         switch (ndefRecord.getTnf()) {
             case android.nfc.NdefRecord.TNF_EMPTY:
-                return createEmptyRecord();
+                record = createEmptyRecord();
+                break;
             case android.nfc.NdefRecord.TNF_MIME_MEDIA:
-                return createMIMERecord(
+                record = createMIMERecord(
                         new String(ndefRecord.getType(), "UTF-8"), ndefRecord.getPayload());
+                break;
             case android.nfc.NdefRecord.TNF_ABSOLUTE_URI:
-                return createURLRecord(ndefRecord.toUri());
+                record = createURLRecord(ndefRecord.toUri());
+                break;
             case android.nfc.NdefRecord.TNF_WELL_KNOWN:
-                return createWellKnownRecord(ndefRecord);
+                record = createWellKnownRecord(ndefRecord);
+                break;
             case android.nfc.NdefRecord.TNF_UNKNOWN:
-                return createUnKnownRecord(ndefRecord.getPayload());
+                record = createUnKnownRecord(ndefRecord.getPayload());
+                break;
             case android.nfc.NdefRecord.TNF_EXTERNAL_TYPE:
-                return createExternalTypeRecord(
+                record = createExternalTypeRecord(
                         new String(ndefRecord.getType(), "UTF-8"), ndefRecord.getPayload());
+                break;
         }
-        return null;
+        record.id = new String(ndefRecord.getId(), "UTF-8");
+        return record;
     }
 
     /**
diff --git a/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcImpl.java b/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcImpl.java
index 860a9da..8e12ae93 100644
--- a/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcImpl.java
+++ b/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcImpl.java
@@ -29,6 +29,7 @@
 import org.chromium.device.mojom.NdefMessage;
 import org.chromium.device.mojom.NdefPushOptions;
 import org.chromium.device.mojom.NdefPushTarget;
+import org.chromium.device.mojom.NdefRecord;
 import org.chromium.device.mojom.NdefScanOptions;
 import org.chromium.device.mojom.Nfc;
 import org.chromium.device.mojom.NfcClient;
@@ -550,14 +551,21 @@
             mTagHandler.connect();
             message = mTagHandler.read();
             if (message == null) {
-                Log.w(TAG, "Cannot read data from NFC tag. Tag is empty.");
+                // Tag is formatted to support NDEF but does not contain a message yet.
+                // Let's create one with no records so that watchers can be notified.
+                NdefMessage webNdefMessage = new NdefMessage();
+                webNdefMessage.data = new NdefRecord[0];
+                notifyMatchingWatchers(webNdefMessage);
                 return;
             }
             if (message.getByteArrayLength() > NdefMessage.MAX_SIZE) {
                 Log.w(TAG, "Cannot read data from NFC tag. NdefMessage exceeds allowed size.");
                 return;
             }
-            notifyMatchingWatchers(message);
+            NdefMessage webNdefMessage = NdefMessageUtils.toNdefMessage(message);
+            notifyMatchingWatchers(webNdefMessage);
+        } catch (UnsupportedEncodingException e) {
+            Log.w(TAG, "Cannot read data from NFC tag. Cannot convert to NdefMessage.");
         } catch (TagLostException e) {
             Log.w(TAG, "Cannot read data from NFC tag. Tag is lost.");
         } catch (FormatException | IllegalStateException | IOException e) {
@@ -569,26 +577,21 @@
      * Iterates through active watchers and if any of those match NdefScanOptions criteria,
      * delivers NdefMessage to the client.
      */
-    private void notifyMatchingWatchers(android.nfc.NdefMessage message) {
-        try {
-            NdefMessage ndefMessage = NdefMessageUtils.toNdefMessage(message);
-            List<Integer> watchIds = new ArrayList<Integer>();
-            for (int i = 0; i < mWatchers.size(); i++) {
-                NdefScanOptions options = mWatchers.valueAt(i);
-                if (matchesWatchOptions(ndefMessage, options)) {
-                    watchIds.add(mWatchers.keyAt(i));
-                }
+    private void notifyMatchingWatchers(NdefMessage message) {
+        List<Integer> watchIds = new ArrayList<Integer>();
+        for (int i = 0; i < mWatchers.size(); i++) {
+            NdefScanOptions options = mWatchers.valueAt(i);
+            if (matchesWatchOptions(message, options)) {
+                watchIds.add(mWatchers.keyAt(i));
             }
+        }
 
-            if (watchIds.size() != 0) {
-                int[] ids = new int[watchIds.size()];
-                for (int i = 0; i < watchIds.size(); ++i) {
-                    ids[i] = watchIds.get(i).intValue();
-                }
-                mClient.onWatch(ids, mTagHandler.serialNumber(), ndefMessage);
+        if (watchIds.size() != 0) {
+            int[] ids = new int[watchIds.size()];
+            for (int i = 0; i < watchIds.size(); ++i) {
+                ids[i] = watchIds.get(i).intValue();
             }
-        } catch (UnsupportedEncodingException e) {
-            Log.w(TAG, "Cannot convert NdefMessage to NdefMessage.");
+            mClient.onWatch(ids, mTagHandler.serialNumber(), message);
         }
     }
 
diff --git a/services/device/nfc/android/junit/src/org/chromium/device/nfc/NFCTest.java b/services/device/nfc/android/junit/src/org/chromium/device/nfc/NFCTest.java
index 949d650..b7e2a5cc 100644
--- a/services/device/nfc/android/junit/src/org/chromium/device/nfc/NFCTest.java
+++ b/services/device/nfc/android/junit/src/org/chromium/device/nfc/NFCTest.java
@@ -89,6 +89,7 @@
     // Constants used for the test.
     private static final String DUMMY_EXTERNAL_RECORD_DOMAIN = "abc.com";
     private static final String DUMMY_EXTERNAL_RECORD_TYPE = "xyz";
+    private static final String DUMMY_RECORD_ID = "https://www.example.com/ids/1";
     private static final String TEST_TEXT = "test";
     private static final String TEST_URL = "https://google.com";
     private static final String TEST_JSON = "{\"key1\":\"value1\",\"key2\":2}";
@@ -221,6 +222,7 @@
         assertEquals(1, emptyMojoNdefMessage.data.length);
         assertEquals(NdefMessageUtils.RECORD_TYPE_EMPTY, emptyMojoNdefMessage.data[0].recordType);
         assertEquals(true, emptyMojoNdefMessage.data[0].mediaType.isEmpty());
+        assertEquals(true, emptyMojoNdefMessage.data[0].id.isEmpty());
         assertEquals(0, emptyMojoNdefMessage.data[0].data.length);
 
         // Test URL record conversion.
@@ -231,6 +233,7 @@
         assertEquals(1, urlMojoNdefMessage.data.length);
         assertEquals(NdefMessageUtils.RECORD_TYPE_URL, urlMojoNdefMessage.data[0].recordType);
         assertEquals(TEXT_MIME, urlMojoNdefMessage.data[0].mediaType);
+        assertEquals(true, urlMojoNdefMessage.data[0].id.isEmpty());
         assertEquals(TEST_URL, new String(urlMojoNdefMessage.data[0].data));
 
         // Test TEXT record conversion.
@@ -241,6 +244,7 @@
         assertEquals(1, textMojoNdefMessage.data.length);
         assertEquals(NdefMessageUtils.RECORD_TYPE_TEXT, textMojoNdefMessage.data[0].recordType);
         assertEquals(TEXT_MIME, textMojoNdefMessage.data[0].mediaType);
+        assertEquals(true, textMojoNdefMessage.data[0].id.isEmpty());
         assertEquals(TEST_TEXT, new String(textMojoNdefMessage.data[0].data));
 
         // Test MIME record conversion.
@@ -251,7 +255,8 @@
         assertNull(mimeMojoNdefMessage.url);
         assertEquals(1, mimeMojoNdefMessage.data.length);
         assertEquals(NdefMessageUtils.RECORD_TYPE_OPAQUE, mimeMojoNdefMessage.data[0].recordType);
-        assertEquals(TEXT_MIME, textMojoNdefMessage.data[0].mediaType);
+        assertEquals(TEXT_MIME, mimeMojoNdefMessage.data[0].mediaType);
+        assertEquals(true, mimeMojoNdefMessage.data[0].id.isEmpty());
         assertEquals(TEST_TEXT, new String(textMojoNdefMessage.data[0].data));
 
         // Test JSON record conversion.
@@ -263,11 +268,13 @@
         assertEquals(1, jsonMojoNdefMessage.data.length);
         assertEquals(NdefMessageUtils.RECORD_TYPE_JSON, jsonMojoNdefMessage.data[0].recordType);
         assertEquals(JSON_MIME, jsonMojoNdefMessage.data[0].mediaType);
+        assertEquals(true, jsonMojoNdefMessage.data[0].id.isEmpty());
         assertEquals(TEST_JSON, new String(jsonMojoNdefMessage.data[0].data));
 
         // Test Unknown record conversion.
         android.nfc.NdefMessage unknownNdefMessage = new android.nfc.NdefMessage(
-                new android.nfc.NdefRecord(android.nfc.NdefRecord.TNF_UNKNOWN, null, null,
+                new android.nfc.NdefRecord(android.nfc.NdefRecord.TNF_UNKNOWN, null,
+                        ApiCompatibilityUtils.getBytesUtf8(DUMMY_RECORD_ID),
                         ApiCompatibilityUtils.getBytesUtf8(TEST_TEXT)));
         NdefMessage unknownMojoNdefMessage = NdefMessageUtils.toNdefMessage(unknownNdefMessage);
         assertNull(unknownMojoNdefMessage.url);
@@ -275,6 +282,7 @@
         assertEquals(
                 NdefMessageUtils.RECORD_TYPE_OPAQUE, unknownMojoNdefMessage.data[0].recordType);
         assertEquals(OCTET_STREAM_MIME, unknownMojoNdefMessage.data[0].mediaType);
+        assertEquals(DUMMY_RECORD_ID, unknownMojoNdefMessage.data[0].id);
         assertEquals(TEST_TEXT, new String(unknownMojoNdefMessage.data[0].data));
 
         // Test external record conversion.
@@ -287,6 +295,7 @@
         assertEquals(DUMMY_EXTERNAL_RECORD_DOMAIN + ':' + DUMMY_EXTERNAL_RECORD_TYPE,
                 extMojoNdefMessage.data[0].recordType);
         assertEquals(OCTET_STREAM_MIME, extMojoNdefMessage.data[0].mediaType);
+        assertEquals(true, extMojoNdefMessage.data[0].id.isEmpty());
         assertEquals(TEST_TEXT, new String(extMojoNdefMessage.data[0].data));
 
         // Test NdefMessage with an additional WebNFC author record.
@@ -536,6 +545,32 @@
     }
 
     /**
+     * Test that Nfc.watch() notifies client when tag is not formatted.
+     */
+    @Test
+    @Feature({"NFCTest"})
+    public void testWatchNotFormattedTag() throws IOException, FormatException {
+        TestNfcImpl nfc = new TestNfcImpl(mContext, mDelegate);
+        mDelegate.invokeCallback();
+        nfc.setClient(mNfcClient);
+        int watchId = mNextWatchId++;
+        WatchResponse mockWatchCallback = mock(WatchResponse.class);
+        nfc.watch(createNdefScanOptions(), watchId, mockWatchCallback);
+        verify(mockWatchCallback).call(mErrorCaptor.capture());
+        assertNull(mErrorCaptor.getValue());
+
+        // Returning null means tag is not formatted.
+        doReturn(null).when(mNfcTagHandler).read();
+        nfc.processPendingOperationsForTesting(mNfcTagHandler);
+
+        // Check that client was notified and correct watch id was provided.
+        verify(mNfcClient, times(1))
+                .onWatch(mOnWatchCallbackCaptor.capture(), nullable(String.class),
+                        any(NdefMessage.class));
+        assertEquals(watchId, mOnWatchCallbackCaptor.getValue()[0]);
+    }
+
+    /**
      * Test that Nfc.watch() matching function works correctly.
      */
     @Test
diff --git a/services/device/public/mojom/nfc.mojom b/services/device/public/mojom/nfc.mojom
index fc9ed5d4..c2a33ed 100644
--- a/services/device/public/mojom/nfc.mojom
+++ b/services/device/public/mojom/nfc.mojom
@@ -34,6 +34,7 @@
   NDEFErrorType error_type;
 };
 
+// https://w3c.github.io/web-nfc/#dom-ndefrecord
 struct NDEFRecord {
   // The type of NDEFRecord.
   string? record_type;
@@ -41,6 +42,9 @@
   // Represents the IANA media type of the NDEFRecord data field.
   string? media_type;
 
+  // The id of NDEFRecord. https://w3c.github.io/web-nfc/#dom-ndefrecord-id
+  string? id;
+
   // Payload of the NDEFRecord.
   array<uint8> data;
 };
@@ -111,7 +115,7 @@
   CancelAllWatches () => (NDEFError? error);
 
   // Suspends all pending NFC operations. Could be used when web page
-  // visibility or focus is lost.
+  // visibility is lost.
   SuspendNFCOperations();
 
   // Resumes all suspended NFC operations.
diff --git a/services/video_capture/device_factory_media_to_mojo_adapter.cc b/services/video_capture/device_factory_media_to_mojo_adapter.cc
index 70ad2c5..04d4632 100644
--- a/services/video_capture/device_factory_media_to_mojo_adapter.cc
+++ b/services/video_capture/device_factory_media_to_mojo_adapter.cc
@@ -13,7 +13,7 @@
 #include "base/strings/stringprintf.h"
 #include "media/capture/video/fake_video_capture_device.h"
 #include "media/capture/video/video_capture_device_info.h"
-#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "services/video_capture/device_media_to_mojo_adapter.h"
 #include "services/video_capture/public/mojom/producer.mojom.h"
 #include "services/video_capture/public/uma/video_capture_service_event.h"
@@ -157,7 +157,7 @@
 }
 
 void DeviceFactoryMediaToMojoAdapter::RegisterVirtualDevicesChangedObserver(
-    mojom::DevicesChangedObserverPtr observer,
+    mojo::PendingRemote<mojom::DevicesChangedObserver> observer,
     bool raise_event_if_virtual_devices_already_present) {
   NOTIMPLEMENTED();
 }
diff --git a/services/video_capture/device_factory_media_to_mojo_adapter.h b/services/video_capture/device_factory_media_to_mojo_adapter.h
index daa1d9b2..a514d47 100644
--- a/services/video_capture/device_factory_media_to_mojo_adapter.h
+++ b/services/video_capture/device_factory_media_to_mojo_adapter.h
@@ -56,8 +56,9 @@
       mojo::PendingReceiver<mojom::TextureVirtualDevice>
           virtual_device_receiver) override;
   void RegisterVirtualDevicesChangedObserver(
-      mojom::DevicesChangedObserverPtr observer,
+      mojo::PendingRemote<mojom::DevicesChangedObserver> observer,
       bool raise_event_if_virtual_devices_already_present) override;
+
  private:
   struct ActiveDeviceEntry {
     ActiveDeviceEntry();
diff --git a/services/video_capture/public/cpp/mock_device_factory.h b/services/video_capture/public/cpp/mock_device_factory.h
index e871852..767f69c 100644
--- a/services/video_capture/public/cpp/mock_device_factory.h
+++ b/services/video_capture/public/cpp/mock_device_factory.h
@@ -34,7 +34,8 @@
       mojo::PendingReceiver<video_capture::mojom::TextureVirtualDevice>
           virtual_device_receiver) override;
   void RegisterVirtualDevicesChangedObserver(
-      video_capture::mojom::DevicesChangedObserverPtr observer,
+      mojo::PendingRemote<video_capture::mojom::DevicesChangedObserver>
+          observer,
       bool raise_event_if_virtual_devices_already_present) override {
     NOTIMPLEMENTED();
   }
diff --git a/services/video_capture/public/cpp/mock_video_source_provider.h b/services/video_capture/public/cpp/mock_video_source_provider.h
index 730c4939..fe547dcf 100644
--- a/services/video_capture/public/cpp/mock_video_source_provider.h
+++ b/services/video_capture/public/cpp/mock_video_source_provider.h
@@ -38,7 +38,8 @@
       mojo::PendingReceiver<video_capture::mojom::TextureVirtualDevice>
           virtual_device_receiver) override;
   void RegisterVirtualDevicesChangedObserver(
-      video_capture::mojom::DevicesChangedObserverPtr observer,
+      mojo::PendingRemote<video_capture::mojom::DevicesChangedObserver>
+          observer,
       bool raise_event_if_virtual_devices_already_present) override {
     NOTIMPLEMENTED();
   }
diff --git a/services/video_capture/public/mojom/device_factory.mojom b/services/video_capture/public/mojom/device_factory.mojom
index af5c2e46..0e98e33a 100644
--- a/services/video_capture/public/mojom/device_factory.mojom
+++ b/services/video_capture/public/mojom/device_factory.mojom
@@ -70,6 +70,6 @@
   // monitored outside the video capture service, and therefore the service
   // does not offer such monitoring.
   RegisterVirtualDevicesChangedObserver(
-      DevicesChangedObserver observer,
+      pending_remote<DevicesChangedObserver> observer,
       bool raise_event_if_virtual_devices_already_present);
 };
diff --git a/services/video_capture/public/mojom/video_source_provider.mojom b/services/video_capture/public/mojom/video_source_provider.mojom
index 4f57ae7..7b4528f 100644
--- a/services/video_capture/public/mojom/video_source_provider.mojom
+++ b/services/video_capture/public/mojom/video_source_provider.mojom
@@ -48,7 +48,7 @@
   // monitored outside the video capture service, and therefore the service
   // does not offer such monitoring.
   RegisterVirtualDevicesChangedObserver(
-      DevicesChangedObserver observer,
+      pending_remote<DevicesChangedObserver> observer,
       bool raise_event_if_virtual_devices_already_present);
 
   // Closes the connection and allows clients to wait until the disconnect has
diff --git a/services/video_capture/test/video_capture_service_unittest.cc b/services/video_capture/test/video_capture_service_unittest.cc
index 91c4160..4bf38fd 100644
--- a/services/video_capture/test/video_capture_service_unittest.cc
+++ b/services/video_capture/test/video_capture_service_unittest.cc
@@ -5,7 +5,8 @@
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/test/mock_callback.h"
-#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver.h"
 #include "services/video_capture/public/cpp/mock_producer.h"
 #include "services/video_capture/public/mojom/constants.mojom.h"
 #include "services/video_capture/public/mojom/device.mojom.h"
@@ -78,10 +79,10 @@
 
 TEST_F(VideoCaptureServiceTest,
        AddingAndRemovingVirtualDevicesRaisesDevicesChangedEvent) {
-  mojom::DevicesChangedObserverPtr observer;
+  mojo::PendingRemote<mojom::DevicesChangedObserver> observer;
   MockDevicesChangedObserver mock_observer;
-  mojo::Binding<mojom::DevicesChangedObserver> observer_binding(
-      &mock_observer, mojo::MakeRequest(&observer));
+  mojo::Receiver<mojom::DevicesChangedObserver> observer_receiver(
+      &mock_observer, observer.InitWithNewPipeAndPassReceiver());
   factory_->RegisterVirtualDevicesChangedObserver(
       std::move(observer),
       false /*raise_event_if_virtual_devices_already_present*/);
@@ -125,16 +126,16 @@
 // crash or bad state.
 TEST_F(VideoCaptureServiceTest,
        AddAndRemoveVirtualDeviceAfterObserverHasDisconnected) {
-  mojom::DevicesChangedObserverPtr observer;
+  mojo::PendingRemote<mojom::DevicesChangedObserver> observer;
   MockDevicesChangedObserver mock_observer;
-  mojo::Binding<mojom::DevicesChangedObserver> observer_binding(
-      &mock_observer, mojo::MakeRequest(&observer));
+  mojo::Receiver<mojom::DevicesChangedObserver> observer_receiver(
+      &mock_observer, observer.InitWithNewPipeAndPassReceiver());
   factory_->RegisterVirtualDevicesChangedObserver(
       std::move(observer),
       false /*raise_event_if_virtual_devices_already_present*/);
 
   // Disconnect observer
-  observer_binding.Close();
+  observer_receiver.reset();
 
   auto device_context = AddTextureVirtualDevice("TestDevice");
   device_context = nullptr;
diff --git a/services/video_capture/video_source_provider_impl.cc b/services/video_capture/video_source_provider_impl.cc
index 469c8ba..0ced6701 100644
--- a/services/video_capture/video_source_provider_impl.cc
+++ b/services/video_capture/video_source_provider_impl.cc
@@ -72,7 +72,7 @@
 }
 
 void VideoSourceProviderImpl::RegisterVirtualDevicesChangedObserver(
-    mojom::DevicesChangedObserverPtr observer,
+    mojo::PendingRemote<mojom::DevicesChangedObserver> observer,
     bool raise_event_if_virtual_devices_already_present) {
   device_factory_->RegisterVirtualDevicesChangedObserver(
       std::move(observer), raise_event_if_virtual_devices_already_present);
diff --git a/services/video_capture/video_source_provider_impl.h b/services/video_capture/video_source_provider_impl.h
index 2da0a4cf..91e0c3e 100644
--- a/services/video_capture/video_source_provider_impl.h
+++ b/services/video_capture/video_source_provider_impl.h
@@ -41,7 +41,7 @@
       mojo::PendingReceiver<mojom::TextureVirtualDevice>
           virtual_device_receiver) override;
   void RegisterVirtualDevicesChangedObserver(
-      mojom::DevicesChangedObserverPtr observer,
+      mojo::PendingRemote<mojom::DevicesChangedObserver> observer,
       bool raise_event_if_virtual_devices_already_present) override;
   void Close(CloseCallback callback) override;
 
diff --git a/services/video_capture/virtual_device_enabled_device_factory.cc b/services/video_capture/virtual_device_enabled_device_factory.cc
index 28b7677..00bbe13 100644
--- a/services/video_capture/virtual_device_enabled_device_factory.cc
+++ b/services/video_capture/virtual_device_enabled_device_factory.cc
@@ -7,6 +7,9 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "media/capture/video/video_capture_device_info.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/video_capture/device_factory.h"
 #include "services/video_capture/shared_memory_virtual_device_mojo_adapter.h"
 #include "services/video_capture/texture_virtual_device_mojo_adapter.h"
@@ -18,44 +21,45 @@
   VirtualDeviceEntry(
       const media::VideoCaptureDeviceInfo& device_info,
       std::unique_ptr<SharedMemoryVirtualDeviceMojoAdapter> device,
-      std::unique_ptr<mojo::Binding<mojom::SharedMemoryVirtualDevice>>
-          producer_binding)
+      std::unique_ptr<mojo::Receiver<mojom::SharedMemoryVirtualDevice>>
+          producer_receiver)
       : device_info_(device_info),
         device_type_(DeviceType::kSharedMemory),
         shared_memory_device_(std::move(device)),
-        shared_memory_producer_binding_(std::move(producer_binding)) {}
+        shared_memory_producer_receiver_(std::move(producer_receiver)) {}
 
-  VirtualDeviceEntry(const media::VideoCaptureDeviceInfo& device_info,
-                     std::unique_ptr<TextureVirtualDeviceMojoAdapter> device,
-                     std::unique_ptr<mojo::Binding<mojom::TextureVirtualDevice>>
-                         producer_binding)
+  VirtualDeviceEntry(
+      const media::VideoCaptureDeviceInfo& device_info,
+      std::unique_ptr<TextureVirtualDeviceMojoAdapter> device,
+      std::unique_ptr<mojo::Receiver<mojom::TextureVirtualDevice>>
+          producer_receiver)
       : device_info_(device_info),
         device_type_(DeviceType::kTexture),
         texture_device_(std::move(device)),
-        texture_producer_binding_(std::move(producer_binding)) {}
+        texture_producer_receiver_(std::move(producer_receiver)) {}
 
   VirtualDeviceEntry(VirtualDeviceEntry&& other) = default;
   VirtualDeviceEntry& operator=(VirtualDeviceEntry&& other) = default;
 
-  bool HasConsumerBinding() { return consumer_binding_ != nullptr; }
+  bool HasConsumerBinding() { return consumer_receiver_ != nullptr; }
 
   void EstablishConsumerBinding(mojom::DeviceRequest device_request,
                                 base::OnceClosure connection_error_handler) {
     switch (device_type_) {
       case DeviceType::kSharedMemory:
-        consumer_binding_ = std::make_unique<mojo::Binding<mojom::Device>>(
+        consumer_receiver_ = std::make_unique<mojo::Receiver<mojom::Device>>(
             shared_memory_device_.get(), std::move(device_request));
         break;
       case DeviceType::kTexture:
-        consumer_binding_ = std::make_unique<mojo::Binding<mojom::Device>>(
+        consumer_receiver_ = std::make_unique<mojo::Receiver<mojom::Device>>(
             texture_device_.get(), std::move(device_request));
         break;
     }
-    consumer_binding_->set_connection_error_handler(
+    consumer_receiver_->set_disconnect_handler(
         std::move(connection_error_handler));
   }
 
-  void ResetConsumerBinding() { consumer_binding_.reset(); }
+  void ResetConsumerBinding() { consumer_receiver_.reset(); }
 
   void StopDevice() {
     if (shared_memory_device_)
@@ -74,15 +78,15 @@
 
   // Only valid for |device_type_ == kSharedMemory|
   std::unique_ptr<SharedMemoryVirtualDeviceMojoAdapter> shared_memory_device_;
-  std::unique_ptr<mojo::Binding<mojom::SharedMemoryVirtualDevice>>
-      shared_memory_producer_binding_;
+  std::unique_ptr<mojo::Receiver<mojom::SharedMemoryVirtualDevice>>
+      shared_memory_producer_receiver_;
 
   // Only valid for |device_type_ == kTexture|
   std::unique_ptr<TextureVirtualDeviceMojoAdapter> texture_device_;
-  std::unique_ptr<mojo::Binding<mojom::TextureVirtualDevice>>
-      texture_producer_binding_;
+  std::unique_ptr<mojo::Receiver<mojom::TextureVirtualDevice>>
+      texture_producer_receiver_;
 
-  std::unique_ptr<mojo::Binding<mojom::Device>> consumer_binding_;
+  std::unique_ptr<mojo::Receiver<mojom::Device>> consumer_receiver_;
 };
 
 VirtualDeviceEnabledDeviceFactory::VirtualDeviceEnabledDeviceFactory(
@@ -147,15 +151,15 @@
   auto device = std::make_unique<SharedMemoryVirtualDeviceMojoAdapter>(
       std::move(producer),
       send_buffer_handles_to_producer_as_raw_file_descriptors);
-  auto producer_binding =
-      std::make_unique<mojo::Binding<mojom::SharedMemoryVirtualDevice>>(
+  auto producer_receiver =
+      std::make_unique<mojo::Receiver<mojom::SharedMemoryVirtualDevice>>(
           device.get(), std::move(virtual_device_receiver));
-  producer_binding->set_connection_error_handler(
+  producer_receiver->set_disconnect_handler(
       base::BindOnce(&VirtualDeviceEnabledDeviceFactory::
                          OnVirtualDeviceProducerConnectionErrorOrClose,
                      base::Unretained(this), device_id));
   VirtualDeviceEntry device_entry(device_info, std::move(device),
-                                  std::move(producer_binding));
+                                  std::move(producer_receiver));
   virtual_devices_by_id_.insert(
       std::make_pair(device_id, std::move(device_entry)));
   EmitDevicesChangedEvent();
@@ -174,24 +178,26 @@
   }
 
   auto device = std::make_unique<TextureVirtualDeviceMojoAdapter>();
-  auto producer_binding =
-      std::make_unique<mojo::Binding<mojom::TextureVirtualDevice>>(
+  auto producer_receiver =
+      std::make_unique<mojo::Receiver<mojom::TextureVirtualDevice>>(
           device.get(), std::move(virtual_device_receiver));
-  producer_binding->set_connection_error_handler(
+  producer_receiver->set_disconnect_handler(
       base::BindOnce(&VirtualDeviceEnabledDeviceFactory::
                          OnVirtualDeviceProducerConnectionErrorOrClose,
                      base::Unretained(this), device_id));
   VirtualDeviceEntry device_entry(device_info, std::move(device),
-                                  std::move(producer_binding));
+                                  std::move(producer_receiver));
   virtual_devices_by_id_.insert(
       std::make_pair(device_id, std::move(device_entry)));
   EmitDevicesChangedEvent();
 }
 
 void VirtualDeviceEnabledDeviceFactory::RegisterVirtualDevicesChangedObserver(
-    mojom::DevicesChangedObserverPtr observer,
+    mojo::PendingRemote<mojom::DevicesChangedObserver> observer_pending_remote,
     bool raise_event_if_virtual_devices_already_present) {
-  observer.set_connection_error_handler(base::BindOnce(
+  mojo::Remote<mojom::DevicesChangedObserver> observer(
+      std::move(observer_pending_remote));
+  observer.set_disconnect_handler(base::BindOnce(
       &VirtualDeviceEnabledDeviceFactory::OnDevicesChangedObserverDisconnected,
       weak_factory_.GetWeakPtr(), observer.get()));
   if (!virtual_devices_by_id_.empty() &&
@@ -234,16 +240,13 @@
 
 void VirtualDeviceEnabledDeviceFactory::OnDevicesChangedObserverDisconnected(
     mojom::DevicesChangedObserverPtr::Proxy* observer) {
-  auto iter = std::find_if(
-      devices_changed_observers_.begin(), devices_changed_observers_.end(),
-      [observer](const mojom::DevicesChangedObserverPtr& entry) {
-        return entry.get() == observer;
-      });
-  if (iter == devices_changed_observers_.end()) {
-    DCHECK(false);
-    return;
+  for (auto iter = devices_changed_observers_.begin();
+       iter != devices_changed_observers_.end(); ++iter) {
+    if (iter->get() == observer) {
+      devices_changed_observers_.erase(iter);
+      break;
+    }
   }
-  devices_changed_observers_.erase(iter);
 }
 
 }  // namespace video_capture
diff --git a/services/video_capture/virtual_device_enabled_device_factory.h b/services/video_capture/virtual_device_enabled_device_factory.h
index 737c3a4..34d9c16 100644
--- a/services/video_capture/virtual_device_enabled_device_factory.h
+++ b/services/video_capture/virtual_device_enabled_device_factory.h
@@ -8,9 +8,9 @@
 #include <map>
 #include <utility>
 
-#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/remote.h"
 #include "services/video_capture/device_factory.h"
 #include "services/video_capture/public/mojom/device.mojom.h"
 #include "services/video_capture/public/mojom/devices_changed_observer.mojom.h"
@@ -41,8 +41,9 @@
       mojo::PendingReceiver<mojom::TextureVirtualDevice>
           virtual_device_receiver) override;
   void RegisterVirtualDevicesChangedObserver(
-      mojom::DevicesChangedObserverPtr observer,
+      mojo::PendingRemote<mojom::DevicesChangedObserver> observer,
       bool raise_event_if_virtual_devices_already_present) override;
+
  private:
   class VirtualDeviceEntry;
 
@@ -60,7 +61,8 @@
 
   std::map<std::string, VirtualDeviceEntry> virtual_devices_by_id_;
   const std::unique_ptr<DeviceFactory> device_factory_;
-  std::vector<mojom::DevicesChangedObserverPtr> devices_changed_observers_;
+  std::vector<mojo::Remote<mojom::DevicesChangedObserver>>
+      devices_changed_observers_;
 
   base::WeakPtrFactory<VirtualDeviceEnabledDeviceFactory> weak_factory_{this};
   DISALLOW_COPY_AND_ASSIGN(VirtualDeviceEnabledDeviceFactory);
diff --git a/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom b/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom
index 79ae8d1..2217587 100644
--- a/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom
+++ b/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom
@@ -122,7 +122,7 @@
   AddVideoDetectorObserver(VideoDetectorObserver observer);
 
   // Creates a FrameSinkVideoCapturer instance.
-  CreateVideoCapturer(FrameSinkVideoCapturer& request);
+  CreateVideoCapturer(pending_receiver<FrameSinkVideoCapturer> receiver);
 
   // Marks the given SurfaceIds for destruction.
   EvictSurfaces(array<SurfaceId> surface_ids);
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 9b116b5a..d9d26c4 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -6501,24 +6501,6 @@
             ]
         }
     ],
-    "UsePdfCompositorServiceForPrint": [
-        {
-            "platforms": [
-                "chromeos",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "UsePdfCompositorServiceForPrint",
-                    "enable_features": [
-                        "UsePdfCompositorServiceForPrint"
-                    ]
-                }
-            ]
-        }
-    ],
     "UseSkiaRenderer": [
         {
             "platforms": [
diff --git a/third_party/blink/common/http/structured_header.cc b/third_party/blink/common/http/structured_header.cc
index b814c3c..6cf1ffd 100644
--- a/third_party/blink/common/http/structured_header.cc
+++ b/third_party/blink/common/http/structured_header.cc
@@ -54,12 +54,12 @@
   base::Optional<ListOfLists> ReadListOfLists() {
     ListOfLists result;
     while (true) {
-      std::vector<std::string> inner_list;
+      std::vector<Item> inner_list;
       while (true) {
-        base::Optional<std::string> item = ReadItem();
+        base::Optional<Item> item(ReadItem());
         if (!item)
           return base::nullopt;
-        inner_list.push_back(*item);
+        inner_list.push_back(std::move(*item));
         SkipWhitespaces();
         if (!ConsumeChar(';'))
           break;
@@ -76,12 +76,9 @@
 
   // Parses an Item ([SH] 4.2.7).
   // Currently only limited types (non-negative integers, strings, tokens and
-  // byte sequences) are supported, and all types are returned as a string
-  // regardless of the item type. E.g. both 123 (number) and "123" (string) are
-  // returned as "123".
-  // TODO(1011101): Add support for other types, and return a value with type
-  // info.
-  base::Optional<std::string> ReadItem() {
+  // byte sequences) are supported.
+  // TODO(1011101): Add support for other types.
+  base::Optional<Item> ReadItem() {
     if (input_.empty()) {
       DVLOG(1) << "ReadItem: unexpected EOF";
       return base::nullopt;
@@ -118,7 +115,7 @@
  private:
   // Parses a Parameterised Identifier ([SH] 4.2.6).
   base::Optional<ParameterisedIdentifier> ReadParameterisedIdentifier() {
-    base::Optional<std::string> primary_identifier = ReadToken();
+    base::Optional<Item> primary_identifier = ReadToken();
     if (!primary_identifier)
       return base::nullopt;
 
@@ -132,12 +129,12 @@
       if (!name)
         return base::nullopt;
 
-      std::string value;
+      Item value;
       if (ConsumeChar('=')) {
         auto item = ReadItem();
         if (!item)
           return base::nullopt;
-        value = *item;
+        value = std::move(*item);
       }
       if (!parameters.emplace(*name, value).second) {
         DVLOG(1) << "ReadParameterisedIdentifier: duplicated parameter: "
@@ -146,7 +143,8 @@
       }
       SkipWhitespaces();
     }
-    return ParameterisedIdentifier(*primary_identifier, std::move(parameters));
+    return ParameterisedIdentifier(std::move(*primary_identifier),
+                                   std::move(parameters));
   }
 
   // Parses a Key ([SH] 4.2.2).
@@ -164,7 +162,7 @@
   }
 
   // Parses a Token ([SH] 4.2.10).
-  base::Optional<std::string> ReadToken() {
+  base::Optional<Item> ReadToken() {
     if (input_.empty() || !base::IsAsciiAlpha(input_.front())) {
       LogParseError("ReadToken", "ALPHA");
       return base::nullopt;
@@ -174,12 +172,12 @@
       len = input_.size();
     std::string token(input_.substr(0, len));
     input_.remove_prefix(len);
-    return token;
+    return Item(std::move(token), Item::kTokenType);
   }
 
   // Parses a Number ([SH] 4.2.8).
   // Currently only supports non-negative integers.
-  base::Optional<std::string> ReadNumber() {
+  base::Optional<Item> ReadNumber() {
     size_t i = 0;
     for (; i < input_.size(); ++i) {
       if (!base::IsAsciiDigit(input_[i]))
@@ -192,15 +190,16 @@
     std::string output_number_string(input_.substr(0, i));
     input_.remove_prefix(i);
 
-    // Check if it fits in a 64-bit signed integer.
+    // Convert to a 64-bit signed integer, and return if the conversion is
+    // successful.
     int64_t n;
     if (!base::StringToInt64(output_number_string, &n))
       return base::nullopt;
-    return output_number_string;
+    return Item(n);
   }
 
   // Parses a String ([SH] 4.2.9).
-  base::Optional<std::string> ReadString() {
+  base::Optional<Item> ReadString() {
     std::string s;
     if (!ConsumeChar('"')) {
       LogParseError("ReadString", "'\"'");
@@ -239,7 +238,7 @@
   }
 
   // Parses a Byte Sequence ([SH] 4.2.11).
-  base::Optional<std::string> ReadByteSequence() {
+  base::Optional<Item> ReadByteSequence() {
     if (!ConsumeChar('*')) {
       LogParseError("ReadByteSequence", "'*'");
       return base::nullopt;
@@ -260,7 +259,7 @@
     }
     input_.remove_prefix(len);
     ConsumeChar('*');
-    return binary;
+    return Item(std::move(binary), Item::kByteSequenceType);
   }
 
   void SkipWhitespaces() {
@@ -287,18 +286,45 @@
 
 }  // namespace
 
+Item::Item() {}
+Item::Item(const std::string& value, Item::ItemType type)
+    : type_(type), string_value_(value) {}
+Item::Item(std::string&& value, Item::ItemType type)
+    : type_(type), string_value_(std::move(value)) {
+  DCHECK(type_ == kStringType || type_ == kTokenType ||
+         type_ == kByteSequenceType);
+}
+Item::Item(int64_t value) : type_(kIntegerType), integer_value_(value) {}
+
+bool operator==(const Item& lhs, const Item& rhs) {
+  if (lhs.type_ != rhs.type_)
+    return false;
+  switch (lhs.type_) {
+    case Item::kNullType:
+      return true;
+    case Item::kStringType:
+    case Item::kTokenType:
+    case Item::kByteSequenceType:
+      return lhs.string_value_ == rhs.string_value_;
+    case Item::kIntegerType:
+      return lhs.integer_value_ == rhs.integer_value_;
+    default:
+      NOTREACHED();
+      return false;
+  }
+}
+
 ParameterisedIdentifier::ParameterisedIdentifier(
     const ParameterisedIdentifier&) = default;
 ParameterisedIdentifier& ParameterisedIdentifier::operator=(
     const ParameterisedIdentifier&) = default;
-ParameterisedIdentifier::ParameterisedIdentifier(const std::string& id,
-                                                 const Parameters& ps)
-    : identifier(id), params(ps) {}
+ParameterisedIdentifier::ParameterisedIdentifier(Item id, const Parameters& ps)
+    : identifier(std::move(id)), params(ps) {}
 ParameterisedIdentifier::~ParameterisedIdentifier() = default;
 
-base::Optional<std::string> ParseItem(const base::StringPiece& str) {
+base::Optional<Item> ParseItem(const base::StringPiece& str) {
   StructuredHeaderParser parser(str);
-  base::Optional<std::string> item = parser.ReadItem();
+  base::Optional<Item> item = parser.ReadItem();
   if (item && parser.FinishParsing())
     return item;
   return base::nullopt;
diff --git a/third_party/blink/common/http/structured_header_unittest.cc b/third_party/blink/common/http/structured_header_unittest.cc
index d175f721..4e9848e 100644
--- a/third_party/blink/common/http/structured_header_unittest.cc
+++ b/third_party/blink/common/http/structured_header_unittest.cc
@@ -17,57 +17,63 @@
   struct TestCase {
     const char* name;
     const char* raw;
-    const char* expected;  // nullptr if parse error is expected
+    const base::Optional<Item> expected;  // nullopt if parse error is expected
   } cases[] = {
       // Item
-      {"basic token - item", "a_b-c.d3:f%00/*", "a_b-c.d3:f%00/*"},
-      {"token with capitals - item", "fooBar", "fooBar"},
-      {"token starting with capitals - item", "FooBar", "FooBar"},
-      {"bad token - item", "abc$%!", nullptr},
-      {"leading whitespace", " foo", "foo"},
-      {"trailing whitespace", "foo ", "foo"},
+      {"basic token - item", "a_b-c.d3:f%00/*",
+       Item("a_b-c.d3:f%00/*", Item::kTokenType)},
+      {"token with capitals - item", "fooBar",
+       Item("fooBar", Item::kTokenType)},
+      {"token starting with capitals - item", "FooBar",
+       Item("FooBar", Item::kTokenType)},
+      {"bad token - item", "abc$%!", base::nullopt},
+      {"leading whitespace", " foo", Item("foo", Item::kTokenType)},
+      {"trailing whitespace", "foo ", Item("foo", Item::kTokenType)},
       // Number
-      {"basic integer", "42", "42"},
-      {"zero integer", "0", "0"},
-      {"comma", "2,3", nullptr},
-      {"long integer", "9223372036854775807", "9223372036854775807"},
-      {"too long integer", "9223372036854775808", nullptr},
+      {"basic integer", "42", Item(42)},
+      {"zero integer", "0", Item(0)},
+      {"comma", "2,3", base::nullopt},
+      {"long integer", "9223372036854775807", Item(9223372036854775807L)},
+      {"too long integer", "9223372036854775808", base::nullopt},
       // Byte Sequence
-      {"basic binary", "*aGVsbG8=*", "hello"},
-      {"empty binary", "**", ""},
-      {"bad paddding", "*aGVsbG8*", "hello"},
-      {"bad end delimiter", "*aGVsbG8=", nullptr},
-      {"extra whitespace", "*aGVsb G8=*", nullptr},
-      {"extra chars", "*aGVsbG!8=*", nullptr},
-      {"suffix chars", "*aGVsbG8=!*", nullptr},
-      {"non-zero pad bits", "*iZ==*", "\x89"},
-      {"non-ASCII binary", "*/+Ah*", "\xFF\xE0!"},
-      {"base64url binary", "*_-Ah*", nullptr},
+      {"basic binary", "*aGVsbG8=*", Item("hello", Item::kByteSequenceType)},
+      {"empty binary", "**", Item("", Item::kByteSequenceType)},
+      {"bad paddding", "*aGVsbG8*", Item("hello", Item::kByteSequenceType)},
+      {"bad end delimiter", "*aGVsbG8=", base::nullopt},
+      {"extra whitespace", "*aGVsb G8=*", base::nullopt},
+      {"extra chars", "*aGVsbG!8=*", base::nullopt},
+      {"suffix chars", "*aGVsbG8=!*", base::nullopt},
+      {"non-zero pad bits", "*iZ==*", Item("\x89", Item::kByteSequenceType)},
+      {"non-ASCII binary", "*/+Ah*",
+       Item("\xFF\xE0!", Item::kByteSequenceType)},
+      {"base64url binary", "*_-Ah*", base::nullopt},
       // String
-      {"basic string", "\"foo\"", "foo"},
-      {"empty string", "\"\"", ""},
+      {"basic string", "\"foo\"", Item("foo")},
+      {"empty string", "\"\"", Item("")},
       {"long string",
        "\"foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo "
        "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo "
        "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo "
        "foo foo foo foo foo foo foo foo foo foo foo foo foo foo \"",
-       "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo "
-       "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo "
-       "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo "
-       "foo foo foo foo foo foo foo foo foo foo foo foo foo foo "},
-      {"whitespace string", "\"   \"", "   "},
-      {"non-ascii string", "\"f\xC3\xBC\xC3\xBC\"", nullptr},
-      {"tab in string", "\"\t\"", nullptr},
-      {"newline in string", "\" \n \"", nullptr},
-      {"single quoted string", "'foo'", nullptr},
-      {"unbalanced string", "\"foo", nullptr},
-      {"string quoting", "\"foo \\\"bar\\\" \\\\ baz\"", "foo \"bar\" \\ baz"},
-      {"bad string quoting", "\"foo \\,\"", nullptr},
-      {"ending string quote", "\"foo \\\"", nullptr},
-      {"abruptly ending string quote", "\"foo \\", nullptr},
+       Item("foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo "
+            "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo "
+            "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo "
+            "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo "
+            "foo ")},
+      {"whitespace string", "\"   \"", Item("   ")},
+      {"non-ascii string", "\"f\xC3\xBC\xC3\xBC\"", base::nullopt},
+      {"tab in string", "\"\t\"", base::nullopt},
+      {"newline in string", "\" \n \"", base::nullopt},
+      {"single quoted string", "'foo'", base::nullopt},
+      {"unbalanced string", "\"foo", base::nullopt},
+      {"string quoting", "\"foo \\\"bar\\\" \\\\ baz\"",
+       Item("foo \"bar\" \\ baz")},
+      {"bad string quoting", "\"foo \\,\"", base::nullopt},
+      {"ending string quote", "\"foo \\\"", base::nullopt},
+      {"abruptly ending string quote", "\"foo \\", base::nullopt},
   };
   for (const auto& c : cases) {
-    base::Optional<std::string> result = ParseItem(c.raw);
+    base::Optional<Item> result = ParseItem(c.raw);
     if (c.expected) {
       EXPECT_TRUE(result.has_value()) << c.name;
       EXPECT_EQ(*result, c.expected) << c.name;
@@ -83,17 +89,19 @@
     const char* raw;
     ListOfLists expected;  // empty if parse error is expected
   } cases[] = {
-      {"basic list of lists", "1;2, 42;43", {{"1", "2"}, {"42", "43"}}},
+      {"basic list of lists",
+       "1;2, 42;43",
+       {{Item(1), Item(2)}, {Item(42), Item(43)}}},
       {"empty list of lists", "", {}},
-      {"single item list of lists", "42", {{"42"}}},
-      {"no whitespace list of lists", "1,42", {{"1"}, {"42"}}},
+      {"single item list of lists", "42", {{Item(42)}}},
+      {"no whitespace list of lists", "1,42", {{Item(1)}, {Item(42)}}},
       {"no inner whitespace list of lists",
        "1;2, 42;43",
-       {{"1", "2"}, {"42", "43"}}},
-      {"extra whitespace list of lists", "1 , 42", {{"1"}, {"42"}}},
+       {{Item(1), Item(2)}, {Item(42), Item(43)}}},
+      {"extra whitespace list of lists", "1 , 42", {{Item(1)}, {Item(42)}}},
       {"extra inner whitespace list of lists",
        "1 ; 2,42 ; 43",
-       {{"1", "2"}, {"42", "43"}}},
+       {{Item(1), Item(2)}, {Item(42), Item(43)}}},
       {"trailing comma list of lists", "1;2, 42,", {}},
       {"trailing semicolon list of lists", "1;2, 42;43;", {}},
       {"leading comma list of lists", ",1;2, 42", {}},
@@ -126,21 +134,26 @@
       {"basic param-list",
        "abc_123;a=1;b=2; cdef_456, ghi;q=\"9\";r=\"w\"",
        {
-           {"abc_123", {{"a", "1"}, {"b", "2"}, {"cdef_456", ""}}},
-           {"ghi", {{"q", "9"}, {"r", "w"}}},
+           {Item("abc_123", Item::kTokenType),
+            {{"a", Item(1)}, {"b", Item(2)}, {"cdef_456", {}}}},
+           {Item("ghi", Item::kTokenType),
+            {{"q", Item("9")}, {"r", Item("w")}}},
        }},
       {"empty param-list", "", {}},
       {"single item param-list",
        "text/html;q=1",
-       {{"text/html", {{"q", "1"}}}}},
+       {{Item("text/html", Item::kTokenType), {{"q", Item(1)}}}}},
+      {"empty param-list", "", {}},
       {"no whitespace param-list",
        "text/html,text/plain;q=1",
-       {{"text/html", {}}, {"text/plain", {{"q", "1"}}}}},
+       {{Item("text/html", Item::kTokenType), {}},
+        {Item("text/plain", Item::kTokenType), {{"q", Item(1)}}}}},
       {"whitespace before = param-list", "text/html, text/plain;q =1", {}},
       {"whitespace after = param-list", "text/html, text/plain;q= 1", {}},
       {"extra whitespace param-list",
        "text/html  ,  text/plain ;  q=1",
-       {{"text/html", {}}, {"text/plain", {{"q", "1"}}}}},
+       {{Item("text/html", Item::kTokenType), {}},
+        {Item("text/plain", Item::kTokenType), {{"q", Item(1)}}}}},
       {"duplicate key", "abc;a=1;b=2;a=1", {}},
       {"numeric key", "abc;a=1;1b=2;c=1", {}},
       {"uppercase key", "abc;a=1;B=2;c=1", {}},
diff --git a/third_party/blink/common/web_package/signed_exchange_request_matcher.cc b/third_party/blink/common/web_package/signed_exchange_request_matcher.cc
index d7641a0..194e063c 100644
--- a/third_party/blink/common/web_package/signed_exchange_request_matcher.cc
+++ b/third_party/blink/common/web_package/signed_exchange_request_matcher.cc
@@ -261,23 +261,96 @@
   return nullptr;
 }
 
-// https://httpwg.org/http-extensions/draft-ietf-httpbis-variants.html#variant-key
-base::Optional<http_structured_header::ListOfLists> ParseVariantKey(
-    const base::StringPiece& str,
-    size_t num_variant_axes) {
+// https://tools.ietf.org/id/draft-ietf-httpbis-variants-04.html#variants
+base::Optional<std::vector<std::pair<std::string, std::vector<std::string>>>>
+ParseVariants(const base::StringPiece& str) {
+  // Compatibility note: Draft 4 of Variants
+  // (https://tools.ietf.org/id/draft-ietf-httpbis-variants-04.html#variants)
+  // uses a custom format for the Variants-04 header, which this method attempts
+  // to parse as a Structured Headers list-of-lists. This means that quoted
+  // string values as well as unquoted tokens will be accepted by this parser,
+  // which is strictly more lenient than the actual draft spec. Draft 5
+  // (https://tools.ietf.org/id/draft-ietf-httpbis-variants-05.html#variants,
+  // which we don't actually support yet) uses a Structured-Headers-Draft-9
+  // list-of-lists syntax for the Variants-05 header, and explicitly allows both
+  // strings and tokens.
+  // TODO(iclelland): As of October 2019, the latest editor's draft of Variants
+  // (https://httpwg.org/http-extensions/draft-ietf-httpbis-variants.html#variants)
+  // specifies a Structured-Headers-Draft-13 dictionary for the Variants header.
+  // Once the specs are updated, also parse the new Variants dictionary header
+  // as well. The same data structure should be returned.
   base::Optional<http_structured_header::ListOfLists> parsed =
       http_structured_header::ParseListOfLists(str);
   if (!parsed)
-    return parsed;
-  // Each inner-list MUST have the same number of list-members as there are
-  // variant-axes in the representation's Variants header field. If not, the
-  // client MUST treat the representation as having no Variant-Key header field.
+    return base::nullopt;
+  std::vector<std::pair<std::string, std::vector<std::string>>> variants;
+  // Each inner-list in the Variants header field value is parsed into a
+  // variant-axis.  The first list-member of the inner-list is interpreted as
+  // the field-name, and the remaining list-members are the available-values.
   // [spec text]
   for (const auto& inner_list : *parsed) {
+    auto it = inner_list.begin();
+    // Any list-member that is a token is interpreted as a string containing the
+    // same characters.
+    // [spec text]
+    if (!it->is_string() && !it->is_token())
+      return base::nullopt;
+    std::string field_name = it->string();
+    std::vector<std::string> available_values;
+    available_values.reserve(inner_list.size() - 1);
+    for (++it; it != inner_list.end(); ++it) {
+      // Any list-member that is a token is interpreted as a string containing
+      // the same characters.
+      // [spec text]
+      if (!it->is_string() && !it->is_token())
+        return base::nullopt;
+      available_values.push_back(it->string());
+    }
+    variants.push_back(std::make_pair(field_name, available_values));
+  }
+  return variants;
+}
+
+// https://tools.ietf.org/id/draft-ietf-httpbis-variants-04.html#variant-key
+base::Optional<std::vector<std::vector<std::string>>> ParseVariantKey(
+    const base::StringPiece& str,
+    size_t num_variant_axes) {
+  // Compatibility note: Draft 4 of Variants
+  // (https://tools.ietf.org/id/draft-ietf-httpbis-variants-04.html#variant-key)
+  // uses a custom format for the Variant-Key-04 header, which this method
+  // attempts to parse as a Structured Headers list-of-lists. This means that
+  // quoted string values as well as unquoted tokens will be accepted by this
+  // parser, which is strictly more lenient than the actual draft spec. Draft 5
+  // (https://tools.ietf.org/id/draft-ietf-httpbis-variants-05.html#variant-key,
+  // which we don't actually support yet) uses a Structured-Headers-Draft-9
+  // list-of-lists syntax for the Variant-Key-05 header, and explicitly allows
+  // both strings and tokens.
+  // TODO(iclelland): Once the specs are updated, also parse the new
+  // Variants-Key header as well. The same data structure should be returned.
+  base::Optional<http_structured_header::ListOfLists> parsed =
+      http_structured_header::ParseListOfLists(str);
+  if (!parsed)
+    return base::nullopt;
+  std::vector<std::vector<std::string>> variant_keys;
+  variant_keys.reserve(parsed->size());
+  // Each inner-list MUST have the same number of list-members as there are
+  // variant-axes in the representation's Variants header field. Additionally,
+  // every element of each inner-list must be a string. If not, the client MUST
+  // treat the representation as having no Variant-Key header field.
+  // [spec text]
+  for (const auto& inner_list : *parsed) {
+    std::vector<std::string> list_members;
+    list_members.reserve(inner_list.size());
     if (inner_list.size() != num_variant_axes)
       return base::nullopt;
+    for (const http_structured_header::Item& item : inner_list) {
+      if (!item.is_string() && !item.is_token())
+        return base::nullopt;
+      list_members.push_back(item.string());
+    }
+    variant_keys.push_back(list_members);
   }
-  return parsed;
+  return variant_keys;
 }
 
 // Returns the index of matching entry in Possible Keys [1] which is the cross
@@ -342,7 +415,8 @@
 // [1] https://httpwg.org/http-extensions/draft-ietf-httpbis-variants.html#cache
 std::vector<std::vector<std::string>>
 SignedExchangeRequestMatcher::CacheBehavior(
-    const http_structured_header::ListOfLists& variants,
+    const std::vector<std::pair<std::string, std::vector<std::string>>>&
+        variants,
     const net::HttpRequestHeaders& request_headers) {
   // Step 1. If stored-responses is empty, return an empty list. [spec text]
   // The size of stored-responses is always 1.
@@ -366,13 +440,11 @@
   // |variants| is the parsed "Variants" header field value.
 
   // Step 4.2. For each variant-axis in variants-header: [spec text]
-  for (const std::vector<std::string>& variant_axis : variants) {
-    DCHECK(!variant_axis.empty());
-
+  for (const auto& variant_axis : variants) {
     // Step 4.2.1. If variant-axis' field-name corresponds to the request header
     // field identified by a content negotiation mechanism that the
     // implementation supports: [spec text]
-    std::string field_name = base::ToLowerASCII(variant_axis[0]);
+    std::string field_name = base::ToLowerASCII(variant_axis.first);
     std::unique_ptr<ContentNegotiationAlgorithm> negotiation_algorithm =
         GetContentNegotiationAlgorithm(field_name);
     if (negotiation_algorithm) {
@@ -387,8 +459,8 @@
       // Step 4.2.1.2. Let sorted-values be the result of running the algorithm
       // defined by the content negotiation mechanism with request-value and
       // variant-axis' available-values. [spec text]
-      std::vector<std::string> sorted_values = negotiation_algorithm->run(
-          base::make_span(variant_axis).subspan(1), request_value);
+      std::vector<std::string> sorted_values =
+          negotiation_algorithm->run(variant_axis.second, request_value);
 
       // Step 4.2.1.3. Append sorted-values to sorted-variants. [spec text]
       sorted_variants.push_back(std::move(sorted_values));
@@ -438,8 +510,7 @@
   // Step 4. If getting `Variants` from storedExchange's response's header list
   // returns a value that fails to parse according to the instructions for the
   // Variants Header Field, return "mismatch". [spec text]
-  auto parsed_variants =
-      http_structured_header::ParseListOfLists(variants_found->second);
+  auto parsed_variants = ParseVariants(variants_found->second);
   if (!parsed_variants)
     return false;
 
@@ -495,7 +566,7 @@
     const net::HttpRequestHeaders& request_headers,
     const std::string& variants,
     const std::vector<std::string>& variant_keys_list) {
-  auto parsed_variants = http_structured_header::ParseListOfLists(variants);
+  auto parsed_variants = ParseVariants(variants);
   if (!parsed_variants)
     return variant_keys_list.end();
 
diff --git a/third_party/blink/common/web_package/signed_exchange_request_matcher_unittest.cc b/third_party/blink/common/web_package/signed_exchange_request_matcher_unittest.cc
index 475c630c..bac11cb 100644
--- a/third_party/blink/common/web_package/signed_exchange_request_matcher_unittest.cc
+++ b/third_party/blink/common/web_package/signed_exchange_request_matcher_unittest.cc
@@ -17,110 +17,117 @@
   const struct TestCase {
     const char* name;
     std::map<std::string, std::string> req_headers;
-    http_structured_header::ListOfLists variants;
+    std::vector<std::pair<std::string, std::vector<std::string>>> variants;
     std::vector<std::vector<std::string>> expected;
   } cases[] = {
       // Accept
       {"vanilla content-type",
        {{"accept", "text/html"}},
-       {{"Accept", "text/html"}},
+       {{"Accept", {"text/html"}}},
        {{"text/html"}}},
       {"client supports two content-types",
        {{"accept", "text/html, image/jpeg"}},
-       {{"Accept", "text/html"}},
+       {{"Accept", {"text/html"}}},
        {{"text/html"}}},
       {"format miss",
        {{"accept", "image/jpeg"}},
-       {{"Accept", "text/html"}},
+       {{"Accept", {"text/html"}}},
        {{"text/html"}}},
-      {"no format preference", {}, {{"Accept", "text/html"}}, {{"text/html"}}},
-      {"no available format", {{"accept", "text/html"}}, {{"Accept"}}, {{}}},
+      {"no format preference",
+       {},
+       {{"Accept", {"text/html"}}},
+       {{"text/html"}}},
+      {"no available format",
+       {{"accept", "text/html"}},
+       {{"Accept", {}}},
+       {{}}},
       {"accept all types",
        {{"accept", "*/*"}},
-       {{"Accept", "text/html", "image/jpeg"}},
+       {{"Accept", {"text/html", "image/jpeg"}}},
        {{"text/html", "image/jpeg"}}},
       {"accept all subtypes",
        {{"accept", "image/*"}},
-       {{"Accept", "text/html", "image/jpeg"}},
+       {{"Accept", {"text/html", "image/jpeg"}}},
        {{"image/jpeg"}}},
       {"type params match",
        {{"accept", "text/html;param=bar"}},
-       {{"Accept", "text/html;param=foo", "text/html;param=bar"}},
+       {{"Accept", {"text/html;param=foo", "text/html;param=bar"}}},
        {{"text/html;param=bar"}}},
       {"type with q value",
        {{"accept", "text/html;q=0.8;param=foo"}},
-       {{"Accept", "image/jpeg", "text/html;param=foo"}},
+       {{"Accept", {"image/jpeg", "text/html;param=foo"}}},
        {{"text/html;param=foo"}}},
       {"type with zero q value",
        {{"accept", "text/html;q=0.0, image/jpeg"}},
-       {{"Accept", "text/html", "image/jpeg"}},
+       {{"Accept", {"text/html", "image/jpeg"}}},
        {{"image/jpeg"}}},
       {"type with invalid q value",
        {{"accept", "text/html;q=999, image/jpeg"}},
-       {{"Accept", "text/html", "image/jpeg"}},
+       {{"Accept", {"text/html", "image/jpeg"}}},
        {{"text/html", "image/jpeg"}}},
       // Accept-Encoding
       {"vanilla encoding",
        {{"accept-encoding", "gzip"}},
-       {{"Accept-Encoding", "gzip"}},
+       {{"Accept-Encoding", {"gzip"}}},
        {{"gzip", "identity"}}},
       {"client supports two encodings",
        {{"accept-encoding", "gzip, br"}},
-       {{"Accept-Encoding", "gzip"}},
+       {{"Accept-Encoding", {"gzip"}}},
        {{"gzip", "identity"}}},
       {"two stored, two preferences",
        {{"accept-encoding", "gzip, br"}},
-       {{"Accept-Encoding", "gzip", "br"}},
+       {{"Accept-Encoding", {"gzip", "br"}}},
        {{"gzip", "br", "identity"}}},
       {"no encoding preference",
        {},
-       {{"Accept-Encoding", "gzip"}},
+       {{"Accept-Encoding", {"gzip"}}},
        {{"identity"}}},
       // Accept-Language
       {"vanilla language",
        {{"accept-language", "en"}},
-       {{"Accept-Language", "en"}},
+       {{"Accept-Language", {"en"}}},
        {{"en"}}},
       {"multiple languages",
        {{"accept-language", "en, JA"}},
-       {{"Accept-Language", "en", "fr", "ja"}},
+       {{"Accept-Language", {"en", "fr", "ja"}}},
        {{"en", "ja"}}},
       {"no language preference",
        {},
-       {{"Accept-Language", "en", "ja"}},
+       {{"Accept-Language", {"en", "ja"}}},
        {{"en"}}},
       {"no available language",
        {{"accept-language", "en"}},
-       {{"Accept-Language"}},
+       {{"Accept-Language", {}}},
        {{}}},
       {"accept all languages",
        {{"accept-language", "*"}},
-       {{"Accept-Language", "en", "ja"}},
+       {{"Accept-Language", {"en", "ja"}}},
        {{"en", "ja"}}},
       {"language subtag",
        {{"accept-language", "en"}},
-       {{"Accept-Language", "en-US", "enq"}},
+       {{"Accept-Language", {"en-US", "enq"}}},
        {{"en-US"}}},
       {"language with q values",
        {{"accept-language", "ja, en;q=0.8"}},
-       {{"Accept-Language", "fr", "en", "ja"}},
+       {{"Accept-Language", {"fr", "en", "ja"}}},
        {{"ja", "en"}}},
       {"language with zero q value",
        {{"accept-language", "ja, en;q=0"}},
-       {{"Accept-Language", "fr", "en"}},
+       {{"Accept-Language", {"fr", "en"}}},
        {{"fr"}}},
       // Multiple axis
       {"format and language matches",
        {{"accept", "text/html"}, {"accept-language", "en"}},
-       {{"Accept", "text/html"}, {"Accept-Language", "en", "fr"}},
+       {{"Accept", {"text/html"}}, {"Accept-Language", {"en", "fr"}}},
        {{"text/html"}, {"en"}}},
       {"accept anything",
        {{"accept", "*/*"}, {"accept-language", "*"}},
-       {{"Accept", "text/html", "image/jpeg"}, {"Accept-Language", "en", "fr"}},
+       {{"Accept", {"text/html", "image/jpeg"}},
+        {"Accept-Language", {"en", "fr"}}},
        {{"text/html", "image/jpeg"}, {"en", "fr"}}},
       {"unknown field name",
        {{"accept-language", "en"}, {"unknown", "foo"}},
-       {{"Accept-Language", "en"}, {"Unknown", "foo"}},
+       {{"Accept-Language", {"en"}}, {"Unknown", {"foo"}}},
        {{"en"}}},
   };
   for (const auto& c : cases) {
diff --git a/third_party/blink/public/common/http/structured_header.h b/third_party/blink/public/common/http/structured_header.h
index 7e8fb9d..73055ec 100644
--- a/third_party/blink/public/common/http/structured_header.h
+++ b/third_party/blink/public/common/http/structured_header.h
@@ -5,6 +5,7 @@
 #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_HTTP_STRUCTURED_HEADER_H_
 #define THIRD_PARTY_BLINK_PUBLIC_COMMON_HTTP_STRUCTURED_HEADER_H_
 
+#include <algorithm>
 #include <map>
 #include <string>
 #include <vector>
@@ -36,48 +37,86 @@
 // present in Structured Header values, and will cause the entire header to fail
 // to parse.)
 //
-// Note that all values of Item type are currently returned as strings. The
-// string, token and byte sequence examples above would all be returned by the
-// parser as the string "abc". It is not currently possible to determine which
-// type of Item was parsed from a given header.
-// TODO(1011101): Return values with type information attached.
-//
-// TODO(1011101): The current parser implementation is of draft #9
-// (https://tools.ietf.org/html/draft-ietf-httpbis-header-structure-09) from
-// December 2018; this should be brought up to date with the latest changes.
+// Currently only limited types (non-negative integers, strings, tokens and
+// byte sequences) are supported.
+// TODO(1011101): Add support for other types.
+
+class BLINK_COMMON_EXPORT Item {
+ public:
+  enum ItemType {
+    kNullType,
+    kIntegerType,
+    kStringType,
+    kTokenType,
+    kByteSequenceType
+  };
+  Item();
+  Item(int64_t value);
+
+  // Constructors for string-like items: Strings, Tokens and Byte Sequences.
+  Item(const std::string& value, Item::ItemType type = kStringType);
+  Item(std::string&& value, Item::ItemType type = kStringType);
+
+  BLINK_COMMON_EXPORT friend bool operator==(const Item& lhs, const Item& rhs);
+  inline friend bool operator!=(const Item& lhs, const Item& rhs) {
+    return !(lhs == rhs);
+  }
+
+  bool is_null() const { return type_ == kNullType; }
+  bool is_integer() const { return type_ == kIntegerType; }
+  bool is_string() const { return type_ == kStringType; }
+  bool is_token() const { return type_ == kTokenType; }
+  bool is_byte_sequence() const { return type_ == kByteSequenceType; }
+
+  int64_t integer() const {
+    DCHECK_EQ(type_, kIntegerType);
+    return integer_value_;
+  }
+  // TODO(iclelland): Split up accessors for String, Token and Byte Sequence.
+  const std::string& string() const {
+    DCHECK(type_ == kStringType || type_ == kTokenType ||
+           type_ == kByteSequenceType);
+    return string_value_;
+  }
+
+ private:
+  ItemType type_ = kNullType;
+  // TODO(iclelland): Make this class more memory-efficient, replacing the
+  // values here with a union or std::variant (when available).
+  int64_t integer_value_ = 0;
+  std::string string_value_;
+};
 
 struct BLINK_COMMON_EXPORT ParameterisedIdentifier {
-  using Parameters = std::map<std::string, std::string>;
+  using Parameters = std::map<std::string, Item>;
 
-  std::string identifier;
+  Item identifier;
   Parameters params;
 
   ParameterisedIdentifier(const ParameterisedIdentifier&);
   ParameterisedIdentifier& operator=(const ParameterisedIdentifier&);
-  ParameterisedIdentifier(const std::string&, const Parameters&);
+  ParameterisedIdentifier(Item, const Parameters&);
   ~ParameterisedIdentifier();
 };
 
 using ParameterisedList = std::vector<ParameterisedIdentifier>;
-using ListOfLists = std::vector<std::vector<std::string>>;
+using ListOfLists = std::vector<std::vector<Item>>;
 
-// Returns the string representation of the header value, if it can be parsed as
-// an Item, or nullopt if it cannot. Note that the returned string is not
-// guaranteed to have any encoding, as it may have been a Byte Sequence.
-BLINK_COMMON_EXPORT base::Optional<std::string> ParseItem(
+// Returns the result of parsing the header value as an Item, if it can be
+// parsed as one, or nullopt if it cannot.
+BLINK_COMMON_EXPORT base::Optional<Item> ParseItem(
     const base::StringPiece& str);
 
 // Returns the result of parsing the header value as a Parameterised List, if it
-// can be parsed as one, or nullopt if it cannot. Note that list items, as well
-// as parameter values, will be returned as strings, and that those strings are
-// not guaranteed to have any encoding, as they may have been Byte Sequences.
+// can be parsed as one, or nullopt if it cannot. Note that parameter keys will
+// be returned as strings, which are guaranteed to be ASCII-encoded. List items,
+// as well as parameter values, will be returned as Items.
 BLINK_COMMON_EXPORT base::Optional<ParameterisedList> ParseParameterisedList(
     const base::StringPiece& str);
 
 // Returns the result of parsing the header value as a List of Lists, if it can
-// be parsed as one, or nullopt if it cannot. Note that inner list items will be
-// be returned as strings, and that those strings are not guaranteed to have any
-// encoding, as they may have been Byte Sequences.
+// be parsed as one, or nullopt if it cannot. Inner list items will be returned
+// as Items.
 BLINK_COMMON_EXPORT base::Optional<ListOfLists> ParseListOfLists(
     const base::StringPiece& str);
 
diff --git a/third_party/blink/public/common/web_package/signed_exchange_request_matcher.h b/third_party/blink/public/common/web_package/signed_exchange_request_matcher.h
index c6da00f..d1562ff 100644
--- a/third_party/blink/public/common/web_package/signed_exchange_request_matcher.h
+++ b/third_party/blink/public/common/web_package/signed_exchange_request_matcher.h
@@ -47,7 +47,8 @@
   static bool MatchRequest(const net::HttpRequestHeaders& request_headers,
                            const HeaderMap& response_headers);
   static std::vector<std::vector<std::string>> CacheBehavior(
-      const http_structured_header::ListOfLists& variants,
+      const std::vector<std::pair<std::string, std::vector<std::string>>>&
+          variants,
       const net::HttpRequestHeaders& request_headers);
 
   static std::vector<std::string>::const_iterator FindBestMatchingVariantKey(
diff --git a/third_party/blink/public/mojom/frame/frame.mojom b/third_party/blink/public/mojom/frame/frame.mojom
index 9ec7ea9..74ccfa6 100644
--- a/third_party/blink/public/mojom/frame/frame.mojom
+++ b/third_party/blink/public/mojom/frame/frame.mojom
@@ -75,3 +75,19 @@
   // can provide additional context to the cause of the intervention.
   SendInterventionReport(string id, string message);
 };
+
+// Implemented in Blink, this interface defines frame-specific methods that will
+// be invoked from the browser process (e.g. content::RenderFrameProxyHost).
+//
+// Note that this is different than content/common/frame.mojom in that the
+// methods defined here are handled directly in Blink without passing through
+// content. In the future this interface will likely host more methods as the
+// Onion Soup project advances, which can potentially lead to the removal of
+// content/common/frame.mojom if enough code is moved to Blink.
+interface RemoteFrame {
+  // Sent to a frame proxy when its real frame is preparing to enter fullscreen
+  // in another process.  Actually entering fullscreen will be done separately as
+  // part of ViewMsg_Resize, once the browser process has resized the tab for
+  // fullscreen.
+  WillEnterFullscreen();
+};
\ No newline at end of file
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom
index 2e04063..189db1f2 100644
--- a/third_party/blink/public/mojom/web_feature/web_feature.mojom
+++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -2443,6 +2443,8 @@
   kNonOriginCleanImageBitmapTransfer = 3059,
   kCompressionStreamConstructor = 3060,
   kDecompressionStreamConstructor = 3061,
+  kV8RTCRtpReceiver_PlayoutDelayHint_AttributeGetter = 3062,
+  kV8RTCRtpReceiver_PlayoutDelayHint_AttributeSetter = 3063,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/web/web_remote_frame.h b/third_party/blink/public/web/web_remote_frame.h
index 910bba2..8a6113e 100644
--- a/third_party/blink/public/web/web_remote_frame.h
+++ b/third_party/blink/public/web/web_remote_frame.h
@@ -40,16 +40,20 @@
   // Factory methods for creating a WebRemoteFrame. The WebRemoteFrameClient
   // argument must be non-null for all creation methods.
   BLINK_EXPORT static WebRemoteFrame* Create(WebTreeScopeType,
-                                             WebRemoteFrameClient*);
+                                             WebRemoteFrameClient*,
+                                             InterfaceRegistry*);
 
-  BLINK_EXPORT static WebRemoteFrame*
-  CreateMainFrame(WebView*, WebRemoteFrameClient*, WebFrame* opener = nullptr);
+  BLINK_EXPORT static WebRemoteFrame* CreateMainFrame(WebView*,
+                                                      WebRemoteFrameClient*,
+                                                      InterfaceRegistry*,
+                                                      WebFrame* opener);
 
   // Also performs core initialization to associate the created remote frame
   // with the provided <portal> element.
   BLINK_EXPORT static WebRemoteFrame* CreateForPortal(
       WebTreeScopeType,
       WebRemoteFrameClient*,
+      InterfaceRegistry*,
       const WebElement& portal_element);
 
   // Specialized factory methods to allow the embedder to replicate the frame
@@ -75,6 +79,7 @@
                                             const FramePolicy&,
                                             FrameOwnerElementType,
                                             WebRemoteFrameClient*,
+                                            blink::InterfaceRegistry*,
                                             WebFrame* opener) = 0;
 
   // Layer for the in-process compositor.
@@ -129,13 +134,6 @@
   // Returns true if this frame should be ignored during hittesting.
   virtual bool IsIgnoredForHitTest() const = 0;
 
-  // This is called in OOPIF scenarios when an element contained in this
-  // frame is about to enter fullscreen.  This frame's owner
-  // corresponds to the HTMLFrameOwnerElement to be fullscreened. Calling
-  // this prepares FullscreenController to enter fullscreen for that frame
-  // owner.
-  virtual void WillEnterFullscreen() = 0;
-
   // Update the user activation state in appropriate part of this frame's
   // "local" frame tree (ancestors-only vs all-nodes).
   virtual void UpdateUserActivationState(UserActivationUpdateType) = 0;
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc
index f4e1d24..0edbc6b 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.cc
@@ -259,15 +259,13 @@
 }
 
 SerializedScriptValue::SerializedScriptValue()
-    : has_registered_external_allocation_(false),
-      transferables_need_external_allocation_registration_(false) {}
+    : has_registered_external_allocation_(false) {}
 
 SerializedScriptValue::SerializedScriptValue(DataBufferPtr data,
                                              size_t data_size)
     : data_buffer_(std::move(data)),
       data_buffer_size_(data_size),
-      has_registered_external_allocation_(false),
-      transferables_need_external_allocation_registration_(false) {}
+      has_registered_external_allocation_(false) {}
 
 void SerializedScriptValue::SetImageBitmapContentsArray(
     ImageBitmapContentsArray contents) {
@@ -751,16 +749,6 @@
         -static_cast<int64_t>(DataLengthInBytes()));
     has_registered_external_allocation_ = false;
   }
-
-  // TODO: if other transferables start accounting for their external
-  // allocations with V8, extend this with corresponding cases.
-  if (!transferables_need_external_allocation_registration_) {
-    for (auto& buffer : array_buffer_contents_array_)
-      buffer.UnregisterExternalAllocationWithCurrentContext();
-    for (auto& buffer : shared_array_buffers_contents_)
-      buffer.UnregisterExternalAllocationWithCurrentContext();
-    transferables_need_external_allocation_registration_ = true;
-  }
 }
 
 void SerializedScriptValue::RegisterMemoryAllocatedWithCurrentScriptContext() {
@@ -771,15 +759,6 @@
   int64_t diff = static_cast<int64_t>(DataLengthInBytes());
   DCHECK_GE(diff, 0);
   v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(diff);
-
-  // Only (re)register allocation cost for transferables if this
-  // SerializedScriptValue has explicitly unregistered them before.
-  if (transferables_need_external_allocation_registration_) {
-    for (auto& buffer : array_buffer_contents_array_)
-      buffer.RegisterExternalAllocationWithCurrentContext();
-    for (auto& buffer : shared_array_buffers_contents_)
-      buffer.RegisterExternalAllocationWithCurrentContext();
-  }
 }
 
 // This ensures that the version number published in
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h
index 52d1f2a..dfeb886 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h
@@ -333,7 +333,6 @@
   SharedArrayBufferContentsArray shared_array_buffers_contents_;
 
   bool has_registered_external_allocation_;
-  bool transferables_need_external_allocation_registration_;
 #if DCHECK_IS_ON()
   bool was_unpacked_ = false;
 #endif
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
index 3b1ced1..878536c 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
@@ -652,27 +652,9 @@
 
 }  // namespace
 
-static void AdjustAmountOfExternalAllocatedMemory(int64_t diff) {
-#if DCHECK_IS_ON()
-  static int64_t process_total = 0;
-  DEFINE_THREAD_SAFE_STATIC_LOCAL(Mutex, mutex, ());
-  {
-    MutexLocker locker(mutex);
-
-    process_total += diff;
-    DCHECK_GE(process_total, 0)
-        << "total amount = " << process_total << ", diff = " << diff;
-  }
-#endif
-
-  v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(diff);
-}
-
 void V8Initializer::InitializeMainThread(const intptr_t* reference_table) {
   DCHECK(IsMainThread());
 
-  WTF::ArrayBufferContents::Initialize(AdjustAmountOfExternalAllocatedMemory);
-
   DEFINE_STATIC_LOCAL(ArrayBufferAllocator, array_buffer_allocator, ());
   gin::IsolateHolder::Initialize(gin::IsolateHolder::kNonStrictMode,
                                  &array_buffer_allocator, reference_table);
diff --git a/third_party/blink/renderer/core/animation/animation_timeline.h b/third_party/blink/renderer/core/animation/animation_timeline.h
index 792d74d..747f3b4 100644
--- a/third_party/blink/renderer/core/animation/animation_timeline.h
+++ b/third_party/blink/renderer/core/animation/animation_timeline.h
@@ -37,6 +37,15 @@
   virtual bool IsDocumentTimeline() const { return false; }
   virtual bool IsScrollTimeline() const { return false; }
   virtual bool IsActive() const = 0;
+  // Returns the initial start time for animations that are linked to this
+  // timeline. This method gets invoked when initializing the start time of an
+  // animation on this timeline for the first time. It exists because the
+  // initial start time for scroll-linked and time-linked animations are
+  // different.
+  //
+  // Changing scroll-linked animation start_time initialization is under
+  // consideration here: https://github.com/w3c/csswg-drafts/issues/2075.
+  virtual base::Optional<base::TimeDelta> InitialStartTimeForAnimations() = 0;
   virtual Document* GetDocument() = 0;
   virtual void AnimationAttached(Animation*) = 0;
   virtual void AnimationDetached(Animation*) = 0;
diff --git a/third_party/blink/renderer/core/animation/document_timeline.cc b/third_party/blink/renderer/core/animation/document_timeline.cc
index 40615bd..f17d60c 100644
--- a/third_party/blink/renderer/core/animation/document_timeline.cc
+++ b/third_party/blink/renderer/core/animation/document_timeline.cc
@@ -114,6 +114,17 @@
   return document_->GetPage();
 }
 
+// Document-linked animations are initialized with start time of the document
+// timeline current time.
+base::Optional<base::TimeDelta>
+DocumentTimeline::InitialStartTimeForAnimations() {
+  base::Optional<double> current_time_ms = CurrentTime();
+  if (current_time_ms.has_value()) {
+    return base::TimeDelta::FromMillisecondsD(current_time_ms.value());
+  }
+  return base::nullopt;
+}
+
 void DocumentTimeline::AnimationAttached(Animation* animation) {
   DCHECK_EQ(&animation->GetDocument()->Timeline(), this);
   DCHECK(!animations_.Contains(animation));
diff --git a/third_party/blink/renderer/core/animation/document_timeline.h b/third_party/blink/renderer/core/animation/document_timeline.h
index 4774bd7..bb9778c 100644
--- a/third_party/blink/renderer/core/animation/document_timeline.h
+++ b/third_party/blink/renderer/core/animation/document_timeline.h
@@ -94,6 +94,7 @@
   void AnimationDetached(Animation*) override {}
 
   bool IsActive() const override;
+  base::Optional<base::TimeDelta> InitialStartTimeForAnimations() override;
   bool HasPendingUpdates() const {
     return !animations_needing_update_.IsEmpty();
   }
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline.cc b/third_party/blink/renderer/core/animation/scroll_timeline.cc
index 90be56d..d225bcf 100644
--- a/third_party/blink/renderer/core/animation/scroll_timeline.cc
+++ b/third_party/blink/renderer/core/animation/scroll_timeline.cc
@@ -136,6 +136,12 @@
   return layout_box && layout_box->HasOverflowClip();
 }
 
+// Scroll-linked animations are initialized with the start time of zero.
+base::Optional<base::TimeDelta>
+ScrollTimeline::InitialStartTimeForAnimations() {
+  return base::TimeDelta();
+}
+
 double ScrollTimeline::currentTime(bool& is_null) {
   is_null = true;
 
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline.h b/third_party/blink/renderer/core/animation/scroll_timeline.h
index dec86d7..31eaab0b 100644
--- a/third_party/blink/renderer/core/animation/scroll_timeline.h
+++ b/third_party/blink/renderer/core/animation/scroll_timeline.h
@@ -56,6 +56,7 @@
   // have a CSS layout box, or if its layout box is not a scroll container.
   // https://github.com/WICG/scroll-animations/issues/31
   bool IsActive() const override;
+  base::Optional<base::TimeDelta> InitialStartTimeForAnimations() override;
 
   // IDL API implementation.
   Element* scrollSource();
diff --git a/third_party/blink/renderer/core/css/parser/css_parser.cc b/third_party/blink/renderer/core/css/parser/css_parser.cc
index 57553b8..4c51407e 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser.cc
@@ -23,8 +23,6 @@
 
 namespace blink {
 
-using namespace cssvalue;
-
 bool CSSParser::ParseDeclarationList(const CSSParserContext* context,
                                      MutableCSSPropertyValueSet* property_set,
                                      const String& declaration) {
@@ -245,7 +243,7 @@
         StrictCSSParserContext(SecureContextMode::kInsecureContext));
   }
 
-  auto* color_value = DynamicTo<CSSColorValue>(value);
+  auto* color_value = DynamicTo<cssvalue::CSSColorValue>(value);
   if (!color_value)
     return false;
 
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
index 63a966880..63e87ccb4 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
@@ -24,8 +24,6 @@
 
 namespace blink {
 
-using namespace cssvalue;
-
 static inline bool IsSimpleLengthPropertyID(CSSPropertyID property_id,
                                             bool& accepts_negative_numbers) {
   switch (property_id) {
@@ -532,7 +530,7 @@
                                           string.length(), quirks_mode);
   if (!parse_result)
     return nullptr;
-  return CSSColorValue::Create(color);
+  return cssvalue::CSSColorValue::Create(color);
 }
 
 bool CSSParserFastPaths::IsValidKeywordPropertyAndValue(
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths_test.cc b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths_test.cc
index b6b1f268..5d01a442 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths_test.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths_test.cc
@@ -11,8 +11,6 @@
 
 namespace blink {
 
-using namespace cssvalue;
-
 TEST(CSSParserFastPathsTest, ParseKeyword) {
   CSSValue* value = CSSParserFastPaths::MaybeParseValue(
       CSSPropertyID::kFloat, "left", kHTMLStandardMode);
@@ -116,7 +114,7 @@
                                                    kHTMLStandardMode);
   EXPECT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
-  EXPECT_EQ(Color::kBlack, To<CSSColorValue>(*value).Value());
+  EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColorValue>(*value).Value());
 }
 
 TEST(CSSParserFastPathsTest, ParseColorWithNewSyntax) {
@@ -124,27 +122,27 @@
       CSSParserFastPaths::ParseColor("rgba(0 0 0)", kHTMLStandardMode);
   EXPECT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
-  EXPECT_EQ(Color::kBlack, To<CSSColorValue>(*value).Value());
+  EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColorValue>(*value).Value());
 
   value = CSSParserFastPaths::ParseColor("rgba(0 0 0 / 1)", kHTMLStandardMode);
   EXPECT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
-  EXPECT_EQ(Color::kBlack, To<CSSColorValue>(*value).Value());
+  EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColorValue>(*value).Value());
 
   value = CSSParserFastPaths::ParseColor("rgba(0, 0, 0, 1)", kHTMLStandardMode);
   EXPECT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
-  EXPECT_EQ(Color::kBlack, To<CSSColorValue>(*value).Value());
+  EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColorValue>(*value).Value());
 
   value = CSSParserFastPaths::ParseColor("RGBA(0 0 0 / 1)", kHTMLStandardMode);
   EXPECT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
-  EXPECT_EQ(Color::kBlack, To<CSSColorValue>(*value).Value());
+  EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColorValue>(*value).Value());
 
   value = CSSParserFastPaths::ParseColor("RGB(0 0 0 / 1)", kHTMLStandardMode);
   EXPECT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
-  EXPECT_EQ(Color::kBlack, To<CSSColorValue>(*value).Value());
+  EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColorValue>(*value).Value());
 
   value = CSSParserFastPaths::ParseColor("rgba(0 0 0 0)", kHTMLStandardMode);
   EXPECT_EQ(nullptr, value);
@@ -165,25 +163,25 @@
                                                    kHTMLStandardMode);
   EXPECT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
-  EXPECT_EQ(Color::kBlack, To<CSSColorValue>(*value).Value());
+  EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColorValue>(*value).Value());
 
   value =
       CSSParserFastPaths::ParseColor("rgb(0.0, 0.0, 0.0)", kHTMLStandardMode);
   EXPECT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
-  EXPECT_EQ(Color::kBlack, To<CSSColorValue>(*value).Value());
+  EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColorValue>(*value).Value());
 
   value =
       CSSParserFastPaths::ParseColor("rgb(0.0 , 0.0,0.0)", kHTMLStandardMode);
   EXPECT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
-  EXPECT_EQ(Color::kBlack, To<CSSColorValue>(*value).Value());
+  EXPECT_EQ(Color::kBlack, To<cssvalue::CSSColorValue>(*value).Value());
 
   value = CSSParserFastPaths::ParseColor("rgb(254.5, 254.5, 254.5)",
                                          kHTMLStandardMode);
   EXPECT_NE(nullptr, value);
   EXPECT_TRUE(value->IsColorValue());
-  EXPECT_EQ(Color::kWhite, To<CSSColorValue>(*value).Value());
+  EXPECT_EQ(Color::kWhite, To<cssvalue::CSSColorValue>(*value).Value());
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_proto_fuzzer.cc b/third_party/blink/renderer/core/css/parser/css_parser_proto_fuzzer.cc
index 1541241..a02056e 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_proto_fuzzer.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_proto_fuzzer.cc
@@ -17,12 +17,11 @@
 
 protobuf_mutator::protobuf::LogSilencer log_silencer;
 
-using namespace css_proto_converter;
+using css_proto_converter::Input;
 
 DEFINE_BINARY_PROTO_FUZZER(const Input& input) {
-  static Converter converter = Converter();
-  static blink::BlinkFuzzerTestSupport test_support =
-      blink::BlinkFuzzerTestSupport();
+  static css_proto_converter::Converter converter;
+  static blink::BlinkFuzzerTestSupport test_support;
 
   static std::unordered_map<Input::CSSParserMode, blink::CSSParserMode>
       parser_mode_map = {
@@ -41,25 +40,19 @@
   blink::CSSParserMode mode = parser_mode_map[input.css_parser_mode()];
   blink::SecureContextMode secure_context_mode =
       secure_context_mode_map[input.secure_context_mode()];
-  blink::CSSParserContext::SelectorProfile selector_profile;
-  if (input.is_live_profile())
-    selector_profile = blink::CSSParserContext::kLiveProfile;
-  else
-    selector_profile = blink::CSSParserContext::kSnapshotProfile;
-  blink::CSSDeferPropertyParsing defer_property_parsing;
-  if (input.defer_property_parsing())
-    defer_property_parsing = blink::CSSDeferPropertyParsing::kYes;
-  else
-    defer_property_parsing = blink::CSSDeferPropertyParsing::kNo;
+  const blink::CSSParserContext::SelectorProfile selector_profile =
+      input.is_live_profile() ? blink::CSSParserContext::kLiveProfile
+                              : blink::CSSParserContext::kSnapshotProfile;
   auto* context = blink::MakeGarbageCollected<blink::CSSParserContext>(
       mode, secure_context_mode, selector_profile);
 
   auto* style_sheet =
       blink::MakeGarbageCollected<blink::StyleSheetContents>(context);
-
   WTF::String style_sheet_string(
       converter.Convert(input.style_sheet()).c_str());
-
+  const blink::CSSDeferPropertyParsing defer_property_parsing =
+      input.defer_property_parsing() ? blink::CSSDeferPropertyParsing::kYes
+                                     : blink::CSSDeferPropertyParsing::kNo;
   blink::CSSParser::ParseSheet(context, style_sheet, style_sheet_string,
                                defer_property_parsing);
 }
diff --git a/third_party/blink/renderer/core/css/parser/css_property_parser.cc b/third_party/blink/renderer/core/css/parser/css_property_parser.cc
index db6b889..1f6e911c 100644
--- a/third_party/blink/renderer/core/css/parser/css_property_parser.cc
+++ b/third_party/blink/renderer/core/css/parser/css_property_parser.cc
@@ -23,7 +23,9 @@
 
 namespace blink {
 
-using namespace css_property_parser_helpers;
+using css_property_parser_helpers::ConsumeIdent;
+using css_property_parser_helpers::IsImplicitProperty;
+using css_property_parser_helpers::ParseLonghand;
 
 class CSSIdentifierValue;
 
@@ -156,8 +158,8 @@
     if (is_shorthand) {
       const cssvalue::CSSPendingSubstitutionValue& pending_value =
           *cssvalue::CSSPendingSubstitutionValue::Create(property_id, variable);
-      AddExpandedPropertyForValue(property_id, pending_value, important,
-                                  *parsed_properties_);
+      css_property_parser_helpers::AddExpandedPropertyForValue(
+          property_id, pending_value, important, *parsed_properties_);
     } else {
       AddProperty(property_id, CSSPropertyID::kInvalid, *variable, important,
                   IsImplicitProperty::kNotImplicit, *parsed_properties_);
@@ -266,8 +268,8 @@
     AddProperty(property, CSSPropertyID::kInvalid, *value, important,
                 IsImplicitProperty::kNotImplicit, *parsed_properties_);
   } else {
-    AddExpandedPropertyForValue(property, *value, important,
-                                *parsed_properties_);
+    css_property_parser_helpers::AddExpandedPropertyForValue(
+        property, *value, important, *parsed_properties_);
   }
   range_ = range_copy;
   return true;
@@ -285,17 +287,19 @@
     case CSSPropertyID::kMaxHeight:
       if (id == CSSValueID::kAuto || id == CSSValueID::kInternalExtendToZoom)
         return ConsumeIdent(range);
-      return ConsumeLengthOrPercent(range, css_parser_mode,
-                                    kValueRangeNonNegative);
+      return css_property_parser_helpers::ConsumeLengthOrPercent(
+          range, css_parser_mode, kValueRangeNonNegative);
     case CSSPropertyID::kMinZoom:
     case CSSPropertyID::kMaxZoom:
     case CSSPropertyID::kZoom: {
       if (id == CSSValueID::kAuto)
         return ConsumeIdent(range);
-      CSSValue* parsed_value = ConsumeNumber(range, kValueRangeNonNegative);
+      CSSValue* parsed_value = css_property_parser_helpers::ConsumeNumber(
+          range, kValueRangeNonNegative);
       if (parsed_value)
         return parsed_value;
-      return ConsumePercent(range, kValueRangeNonNegative);
+      return css_property_parser_helpers::ConsumePercent(
+          range, kValueRangeNonNegative);
     }
     case CSSPropertyID::kUserZoom:
       return ConsumeIdent<CSSValueID::kZoom, CSSValueID::kFixed>(range);
diff --git a/third_party/blink/renderer/core/css/parser/css_property_parser_helpers.cc b/third_party/blink/renderer/core/css/parser/css_property_parser_helpers.cc
index 68ed121..6ed98f9 100644
--- a/third_party/blink/renderer/core/css/parser/css_property_parser_helpers.cc
+++ b/third_party/blink/renderer/core/css/parser/css_property_parser_helpers.cc
@@ -36,8 +36,6 @@
 
 namespace blink {
 
-using namespace cssvalue;
-
 namespace css_property_parser_helpers {
 
 namespace {
@@ -702,13 +700,14 @@
   return url;
 }
 
-CSSURIValue* ConsumeUrl(CSSParserTokenRange& range,
-                        const CSSParserContext* context) {
+cssvalue::CSSURIValue* ConsumeUrl(CSSParserTokenRange& range,
+                                  const CSSParserContext* context) {
   StringView url = ConsumeUrlAsStringView(range, context);
   if (url.IsNull())
     return nullptr;
   String url_string = url.ToString();
-  return CSSURIValue::Create(url_string, context->CompleteURL(url_string));
+  return cssvalue::CSSURIValue::Create(url_string,
+                                       context->CompleteURL(url_string));
 }
 
 static int ClampRGBComponent(const CSSPrimitiveValue& value) {
@@ -912,7 +911,7 @@
       !ParseColorFunction(range, color)) {
     return ParseLightDarkColor(range, css_parser_mode);
   }
-  return CSSColorValue::Create(color);
+  return cssvalue::CSSColorValue::Create(color);
 }
 
 CSSValue* ConsumeLineWidth(CSSParserTokenRange& range,
@@ -1234,9 +1233,10 @@
   return ConsumeColor(args, css_parser_mode);
 }
 
-static bool ConsumeDeprecatedGradientColorStop(CSSParserTokenRange& range,
-                                               CSSGradientColorStop& stop,
-                                               CSSParserMode css_parser_mode) {
+static bool ConsumeDeprecatedGradientColorStop(
+    CSSParserTokenRange& range,
+    cssvalue::CSSGradientColorStop& stop,
+    CSSParserMode css_parser_mode) {
   CSSValueID id = range.Peek().FunctionId();
   if (id != CSSValueID::kFrom && id != CSSValueID::kTo &&
       id != CSSValueID::kColorStop)
@@ -1309,15 +1309,17 @@
       return nullptr;
   }
 
-  CSSGradientValue* result =
+  cssvalue::CSSGradientValue* result =
       (id == CSSValueID::kRadial)
-          ? CSSRadialGradientValue::Create(
+          ? cssvalue::CSSRadialGradientValue::Create(
                 first_x, first_y, first_radius, second_x, second_y,
-                second_radius, kNonRepeating, kCSSDeprecatedRadialGradient)
-          : MakeGarbageCollected<CSSLinearGradientValue>(
-                first_x, first_y, second_x, second_y, nullptr, kNonRepeating,
-                kCSSDeprecatedLinearGradient);
-  CSSGradientColorStop stop;
+                second_radius, cssvalue::kNonRepeating,
+                cssvalue::kCSSDeprecatedRadialGradient)
+          : MakeGarbageCollected<cssvalue::CSSLinearGradientValue>(
+                first_x, first_y, second_x, second_y, nullptr,
+                cssvalue::kNonRepeating,
+                cssvalue::kCSSDeprecatedLinearGradient);
+  cssvalue::CSSGradientColorStop stop;
   while (ConsumeCommaIncludingWhitespace(args)) {
     if (!ConsumeDeprecatedGradientColorStop(args, stop, css_parser_mode))
       return nullptr;
@@ -1356,16 +1358,17 @@
 
 static bool ConsumeGradientColorStops(CSSParserTokenRange& range,
                                       const CSSParserContext& context,
-                                      CSSGradientValue* gradient,
+                                      cssvalue::CSSGradientValue* gradient,
                                       PositionFunctor consume_position_func) {
-  bool supports_color_hints = gradient->GradientType() == kCSSLinearGradient ||
-                              gradient->GradientType() == kCSSRadialGradient ||
-                              gradient->GradientType() == kCSSConicGradient;
+  bool supports_color_hints =
+      gradient->GradientType() == cssvalue::kCSSLinearGradient ||
+      gradient->GradientType() == cssvalue::kCSSRadialGradient ||
+      gradient->GradientType() == cssvalue::kCSSConicGradient;
 
   // The first color stop cannot be a color hint.
   bool previous_stop_was_color_hint = true;
   do {
-    CSSGradientColorStop stop;
+    cssvalue::CSSGradientColorStop stop;
     stop.color_ = ConsumeColor(range, context.Mode());
     // Two hints in a row are not allowed.
     if (!stop.color_ && (!supports_color_hints || previous_stop_was_color_hint))
@@ -1398,7 +1401,7 @@
 static CSSValue* ConsumeDeprecatedRadialGradient(
     CSSParserTokenRange& args,
     const CSSParserContext& context,
-    CSSGradientRepeat repeating) {
+    cssvalue::CSSGradientRepeat repeating) {
   CSSValue* center_x = nullptr;
   CSSValue* center_y = nullptr;
   ConsumeOneOrTwoValuedPosition(args, context.Mode(), UnitlessQuirk::kForbid,
@@ -1432,9 +1435,9 @@
     ConsumeCommaIncludingWhitespace(args);
   }
 
-  CSSGradientValue* result = CSSRadialGradientValue::Create(
+  cssvalue::CSSGradientValue* result = cssvalue::CSSRadialGradientValue::Create(
       center_x, center_y, shape, size_keyword, horizontal_size, vertical_size,
-      repeating, kCSSPrefixedRadialGradient);
+      repeating, cssvalue::kCSSPrefixedRadialGradient);
   return ConsumeGradientColorStops(args, context, result,
                                    ConsumeGradientLengthOrPercent)
              ? result
@@ -1443,7 +1446,7 @@
 
 static CSSValue* ConsumeRadialGradient(CSSParserTokenRange& args,
                                        const CSSParserContext& context,
-                                       CSSGradientRepeat repeating) {
+                                       cssvalue::CSSGradientRepeat repeating) {
   const CSSIdentifierValue* shape = nullptr;
   const CSSIdentifierValue* size_keyword = nullptr;
   const CSSPrimitiveValue* horizontal_size = nullptr;
@@ -1523,31 +1526,32 @@
     return nullptr;
   }
 
-  CSSGradientValue* result = CSSRadialGradientValue::Create(
+  cssvalue::CSSGradientValue* result = cssvalue::CSSRadialGradientValue::Create(
       center_x, center_y, shape, size_keyword, horizontal_size, vertical_size,
-      repeating, kCSSRadialGradient);
+      repeating, cssvalue::kCSSRadialGradient);
   return ConsumeGradientColorStops(args, context, result,
                                    ConsumeGradientLengthOrPercent)
              ? result
              : nullptr;
 }
 
-static CSSValue* ConsumeLinearGradient(CSSParserTokenRange& args,
-                                       const CSSParserContext& context,
-                                       CSSGradientRepeat repeating,
-                                       CSSGradientType gradient_type) {
+static CSSValue* ConsumeLinearGradient(
+    CSSParserTokenRange& args,
+    const CSSParserContext& context,
+    cssvalue::CSSGradientRepeat repeating,
+    cssvalue::CSSGradientType gradient_type) {
   bool expect_comma = true;
   const CSSPrimitiveValue* angle =
       ConsumeAngle(args, &context, WebFeature::kUnitlessZeroAngleGradient);
   const CSSIdentifierValue* end_x = nullptr;
   const CSSIdentifierValue* end_y = nullptr;
   if (!angle) {
-    if (gradient_type == kCSSPrefixedLinearGradient ||
+    if (gradient_type == cssvalue::kCSSPrefixedLinearGradient ||
         ConsumeIdent<CSSValueID::kTo>(args)) {
       end_x = ConsumeIdent<CSSValueID::kLeft, CSSValueID::kRight>(args);
       end_y = ConsumeIdent<CSSValueID::kBottom, CSSValueID::kTop>(args);
       if (!end_x && !end_y) {
-        if (gradient_type == kCSSLinearGradient)
+        if (gradient_type == cssvalue::kCSSLinearGradient)
           return nullptr;
         end_y = CSSIdentifierValue::Create(CSSValueID::kTop);
         expect_comma = false;
@@ -1562,8 +1566,9 @@
   if (expect_comma && !ConsumeCommaIncludingWhitespace(args))
     return nullptr;
 
-  CSSGradientValue* result = MakeGarbageCollected<CSSLinearGradientValue>(
-      end_x, end_y, nullptr, nullptr, angle, repeating, gradient_type);
+  cssvalue::CSSGradientValue* result =
+      MakeGarbageCollected<cssvalue::CSSLinearGradientValue>(
+          end_x, end_y, nullptr, nullptr, angle, repeating, gradient_type);
   return ConsumeGradientColorStops(args, context, result,
                                    ConsumeGradientLengthOrPercent)
              ? result
@@ -1572,7 +1577,7 @@
 
 static CSSValue* ConsumeConicGradient(CSSParserTokenRange& args,
                                       const CSSParserContext& context,
-                                      CSSGradientRepeat repeating) {
+                                      cssvalue::CSSGradientRepeat repeating) {
   const CSSPrimitiveValue* from_angle = nullptr;
   if (ConsumeIdent<CSSValueID::kFrom>(args)) {
     if (!(from_angle = ConsumeAngle(args, &context,
@@ -1594,8 +1599,8 @@
     return nullptr;
   }
 
-  CSSGradientValue* result =
-      CSSConicGradientValue::Create(center_x, center_y, from_angle, repeating);
+  cssvalue::CSSGradientValue* result = cssvalue::CSSConicGradientValue::Create(
+      center_x, center_y, from_angle, repeating);
   return ConsumeGradientColorStops(args, context, result,
                                    ConsumeGradientAngleOrPercent)
              ? result
@@ -1614,7 +1619,7 @@
   if (axis_id == CSSValueID::kX || axis_id == CSSValueID::kY ||
       axis_id == CSSValueID::kZ) {
     ConsumeIdent(range);
-    return MakeGarbageCollected<CSSAxisValue>(axis_id);
+    return MakeGarbageCollected<cssvalue::CSSAxisValue>(axis_id);
   }
 
   CSSValue* x_dimension =
@@ -1628,7 +1633,7 @@
   double x = To<CSSPrimitiveValue>(x_dimension)->GetDoubleValue();
   double y = To<CSSPrimitiveValue>(y_dimension)->GetDoubleValue();
   double z = To<CSSPrimitiveValue>(z_dimension)->GetDoubleValue();
-  return MakeGarbageCollected<CSSAxisValue>(x, y, z);
+  return MakeGarbageCollected<cssvalue::CSSAxisValue>(x, y, z);
 }
 
 static CSSValue* ConsumeCrossFade(CSSParserTokenRange& args,
@@ -1653,8 +1658,8 @@
 
   if (!percentage)
     return nullptr;
-  return MakeGarbageCollected<CSSCrossfadeValue>(from_image_value,
-                                                 to_image_value, percentage);
+  return MakeGarbageCollected<cssvalue::CSSCrossfadeValue>(
+      from_image_value, to_image_value, percentage);
 }
 
 static CSSValue* ConsumePaint(CSSParserTokenRange& args,
@@ -1705,36 +1710,38 @@
   CSSParserTokenRange args = ConsumeFunction(range_copy);
   CSSValue* result = nullptr;
   if (id == CSSValueID::kRadialGradient) {
-    result = ConsumeRadialGradient(args, *context, kNonRepeating);
+    result = ConsumeRadialGradient(args, *context, cssvalue::kNonRepeating);
   } else if (id == CSSValueID::kRepeatingRadialGradient) {
-    result = ConsumeRadialGradient(args, *context, kRepeating);
+    result = ConsumeRadialGradient(args, *context, cssvalue::kRepeating);
   } else if (id == CSSValueID::kWebkitLinearGradient) {
     context->Count(WebFeature::kDeprecatedWebKitLinearGradient);
-    result = ConsumeLinearGradient(args, *context, kNonRepeating,
-                                   kCSSPrefixedLinearGradient);
+    result = ConsumeLinearGradient(args, *context, cssvalue::kNonRepeating,
+                                   cssvalue::kCSSPrefixedLinearGradient);
   } else if (id == CSSValueID::kWebkitRepeatingLinearGradient) {
     context->Count(WebFeature::kDeprecatedWebKitRepeatingLinearGradient);
-    result = ConsumeLinearGradient(args, *context, kRepeating,
-                                   kCSSPrefixedLinearGradient);
+    result = ConsumeLinearGradient(args, *context, cssvalue::kRepeating,
+                                   cssvalue::kCSSPrefixedLinearGradient);
   } else if (id == CSSValueID::kRepeatingLinearGradient) {
-    result =
-        ConsumeLinearGradient(args, *context, kRepeating, kCSSLinearGradient);
+    result = ConsumeLinearGradient(args, *context, cssvalue::kRepeating,
+                                   cssvalue::kCSSLinearGradient);
   } else if (id == CSSValueID::kLinearGradient) {
-    result = ConsumeLinearGradient(args, *context, kNonRepeating,
-                                   kCSSLinearGradient);
+    result = ConsumeLinearGradient(args, *context, cssvalue::kNonRepeating,
+                                   cssvalue::kCSSLinearGradient);
   } else if (id == CSSValueID::kWebkitGradient) {
     context->Count(WebFeature::kDeprecatedWebKitGradient);
     result = ConsumeDeprecatedGradient(args, context->Mode());
   } else if (id == CSSValueID::kWebkitRadialGradient) {
     context->Count(WebFeature::kDeprecatedWebKitRadialGradient);
-    result = ConsumeDeprecatedRadialGradient(args, *context, kNonRepeating);
+    result = ConsumeDeprecatedRadialGradient(args, *context,
+                                             cssvalue::kNonRepeating);
   } else if (id == CSSValueID::kWebkitRepeatingRadialGradient) {
     context->Count(WebFeature::kDeprecatedWebKitRepeatingRadialGradient);
-    result = ConsumeDeprecatedRadialGradient(args, *context, kRepeating);
+    result =
+        ConsumeDeprecatedRadialGradient(args, *context, cssvalue::kRepeating);
   } else if (id == CSSValueID::kConicGradient) {
-    result = ConsumeConicGradient(args, *context, kNonRepeating);
+    result = ConsumeConicGradient(args, *context, cssvalue::kNonRepeating);
   } else if (id == CSSValueID::kRepeatingConicGradient) {
-    result = ConsumeConicGradient(args, *context, kRepeating);
+    result = ConsumeConicGradient(args, *context, cssvalue::kRepeating);
   } else if (id == CSSValueID::kWebkitCrossFade) {
     result = ConsumeCrossFade(args, context);
   } else if (id == CSSValueID::kPaint) {
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
index ca3b3f1..6a62f2c 100644
--- a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
+++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
@@ -48,8 +48,6 @@
 
 namespace blink {
 
-using namespace cssvalue;
-
 // TODO(rjwright): make this const
 CSSValue* ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
     const Length& length,
@@ -114,7 +112,7 @@
     const StyleColor& color) {
   // This function does NOT look at visited information, so that computed style
   // doesn't expose that.
-  return CSSColorValue::Create(color.Resolve(style.GetColor()).Rgb());
+  return cssvalue::CSSColorValue::Create(color.Resolve(style.GetColor()).Rgb());
 }
 
 const blink::Color ComputedStyleUtils::BorderSideColor(
@@ -305,8 +303,8 @@
   return list;
 }
 
-CSSBorderImageSliceValue* ComputedStyleUtils::ValueForNinePieceImageSlice(
-    const NinePieceImage& image) {
+cssvalue::CSSBorderImageSliceValue*
+ComputedStyleUtils::ValueForNinePieceImageSlice(const NinePieceImage& image) {
   // Create the slices.
   CSSPrimitiveValue* top = nullptr;
   CSSPrimitiveValue* right = nullptr;
@@ -371,7 +369,7 @@
     }
   }
 
-  return MakeGarbageCollected<CSSBorderImageSliceValue>(
+  return MakeGarbageCollected<cssvalue::CSSBorderImageSliceValue>(
       MakeGarbageCollected<CSSQuadValue>(top, right, bottom, left,
                                          CSSQuadValue::kSerializeAsQuad),
       image.Fill());
@@ -467,7 +465,8 @@
   }
 
   // Create the image slice.
-  CSSBorderImageSliceValue* image_slices = ValueForNinePieceImageSlice(image);
+  cssvalue::CSSBorderImageSliceValue* image_slices =
+      ValueForNinePieceImageSlice(image);
 
   // Create the border area slices.
   CSSValue* border_slices =
@@ -516,7 +515,7 @@
       break;
   }
 
-  return MakeGarbageCollected<CSSReflectValue>(
+  return MakeGarbageCollected<cssvalue::CSSReflectValue>(
       direction, offset,
       ValueForNinePieceImage(reflection->Mask(), style, allow_visited_style));
 }
@@ -801,7 +800,7 @@
   CSSValueList* oblique_values = CSSValueList::CreateSpaceSeparated();
   oblique_values->Append(*CSSNumericLiteralValue::Create(
       angle, CSSPrimitiveValue::UnitType::kDegrees));
-  return MakeGarbageCollected<CSSFontStyleRangeValue>(
+  return MakeGarbageCollected<cssvalue::CSSFontStyleRangeValue>(
       *CSSIdentifierValue::Create(CSSValueID::kOblique), *oblique_values);
 }
 
@@ -1142,12 +1141,14 @@
     return ordered_named_grid_lines_.IsEmpty() &&
            ordered_named_auto_repeat_grid_lines_.IsEmpty();
   }
-  virtual void CollectLineNamesForIndex(CSSGridLineNamesValue&,
+  virtual void CollectLineNamesForIndex(cssvalue::CSSGridLineNamesValue&,
                                         size_t index) const;
 
  protected:
   enum NamedLinesType { kNamedLines, kAutoRepeatNamedLines };
-  void AppendLines(CSSGridLineNamesValue&, size_t index, NamedLinesType) const;
+  void AppendLines(cssvalue::CSSGridLineNamesValue&,
+                   size_t index,
+                   NamedLinesType) const;
 
   const OrderedNamedGridLines& ordered_named_grid_lines_;
   const OrderedNamedGridLines& ordered_named_auto_repeat_grid_lines_;
@@ -1160,7 +1161,7 @@
   OrderedNamedLinesCollectorInsideRepeat(const ComputedStyle& style,
                                          bool is_row_axis)
       : OrderedNamedLinesCollector(style, is_row_axis) {}
-  void CollectLineNamesForIndex(CSSGridLineNamesValue&,
+  void CollectLineNamesForIndex(cssvalue::CSSGridLineNamesValue&,
                                 size_t index) const override;
 };
 
@@ -1178,7 +1179,7 @@
         auto_repeat_track_list_length_(
             is_row_axis ? style.GridAutoRepeatColumns().size()
                         : style.GridAutoRepeatRows().size()) {}
-  void CollectLineNamesForIndex(CSSGridLineNamesValue&,
+  void CollectLineNamesForIndex(cssvalue::CSSGridLineNamesValue&,
                                 size_t index) const override;
 
  private:
@@ -1189,7 +1190,7 @@
 
 // RJW
 void OrderedNamedLinesCollector::AppendLines(
-    CSSGridLineNamesValue& line_names_value,
+    cssvalue::CSSGridLineNamesValue& line_names_value,
     size_t index,
     NamedLinesType type) const {
   auto iter = type == kNamedLines
@@ -1208,14 +1209,14 @@
 }
 
 void OrderedNamedLinesCollector::CollectLineNamesForIndex(
-    CSSGridLineNamesValue& line_names_value,
+    cssvalue::CSSGridLineNamesValue& line_names_value,
     size_t i) const {
   DCHECK(!IsEmpty());
   AppendLines(line_names_value, i, kNamedLines);
 }
 
 void OrderedNamedLinesCollectorInsideRepeat::CollectLineNamesForIndex(
-    CSSGridLineNamesValue& line_names_value,
+    cssvalue::CSSGridLineNamesValue& line_names_value,
     size_t i) const {
   DCHECK(!IsEmpty());
   AppendLines(line_names_value, i, kAutoRepeatNamedLines);
@@ -1223,7 +1224,7 @@
 
 // RJW
 void OrderedNamedLinesCollectorInGridLayout::CollectLineNamesForIndex(
-    CSSGridLineNamesValue& line_names_value,
+    cssvalue::CSSGridLineNamesValue& line_names_value,
     size_t i) const {
   DCHECK(!IsEmpty());
   if (ordered_named_auto_repeat_grid_lines_.IsEmpty() || i < insertion_point_) {
@@ -1268,7 +1269,7 @@
   if (collector.IsEmpty())
     return;
 
-  auto* line_names = MakeGarbageCollected<CSSGridLineNamesValue>();
+  auto* line_names = MakeGarbageCollected<cssvalue::CSSGridLineNamesValue>();
   collector.CollectLineNamesForIndex(*line_names, i);
   if (line_names->length())
     list.Append(*line_names);
@@ -1375,9 +1376,10 @@
   AutoRepeatType auto_repeat_type = is_row_axis
                                         ? style.GridAutoRepeatColumnsType()
                                         : style.GridAutoRepeatRowsType();
-  CSSValueList* repeated_values = MakeGarbageCollected<CSSGridAutoRepeatValue>(
-      auto_repeat_type == AutoRepeatType::kAutoFill ? CSSValueID::kAutoFill
-                                                    : CSSValueID::kAutoFit);
+  CSSValueList* repeated_values =
+      MakeGarbageCollected<cssvalue::CSSGridAutoRepeatValue>(
+          auto_repeat_type == AutoRepeatType::kAutoFill ? CSSValueID::kAutoFill
+                                                        : CSSValueID::kAutoFit);
   OrderedNamedLinesCollectorInsideRepeat repeat_collector(style, is_row_axis);
   PopulateGridTrackList(repeated_values, repeat_collector,
                         auto_repeat_track_sizes, getTrackSize);
@@ -1642,7 +1644,7 @@
         }
         return CSSIdentifierValue::Create(value_id);
       }
-      return MakeGarbageCollected<CSSCubicBezierTimingFunctionValue>(
+      return MakeGarbageCollected<cssvalue::CSSCubicBezierTimingFunctionValue>(
           bezier_timing_function->X1(), bezier_timing_function->Y1(),
           bezier_timing_function->X2(), bezier_timing_function->Y2());
     }
@@ -1656,7 +1658,7 @@
 
       // Canonical form of step timing function is step(n, type) or step(n) even
       // if initially parsed as step-start or step-end.
-      return CSSStepsTimingFunctionValue::Create(steps, position);
+      return cssvalue::CSSStepsTimingFunctionValue::Create(steps, position);
     }
 
     default:
@@ -2039,27 +2041,27 @@
     const Color& current_color) {
   if (paint.type >= SVG_PAINTTYPE_URI_NONE) {
     CSSValueList* values = CSSValueList::CreateSpaceSeparated();
-    values->Append(*CSSURIValue::Create(paint.GetUrl()));
+    values->Append(*cssvalue::CSSURIValue::Create(paint.GetUrl()));
     if (paint.type == SVG_PAINTTYPE_URI_NONE)
       values->Append(*CSSIdentifierValue::Create(CSSValueID::kNone));
     else if (paint.type == SVG_PAINTTYPE_URI_CURRENTCOLOR)
-      values->Append(*CSSColorValue::Create(current_color.Rgb()));
+      values->Append(*cssvalue::CSSColorValue::Create(current_color.Rgb()));
     else if (paint.type == SVG_PAINTTYPE_URI_RGBCOLOR)
-      values->Append(*CSSColorValue::Create(paint.GetColor().Rgb()));
+      values->Append(*cssvalue::CSSColorValue::Create(paint.GetColor().Rgb()));
     return values;
   }
   if (paint.type == SVG_PAINTTYPE_NONE)
     return CSSIdentifierValue::Create(CSSValueID::kNone);
   if (paint.type == SVG_PAINTTYPE_CURRENTCOLOR)
-    return CSSColorValue::Create(current_color.Rgb());
+    return cssvalue::CSSColorValue::Create(current_color.Rgb());
 
-  return CSSColorValue::Create(paint.GetColor().Rgb());
+  return cssvalue::CSSColorValue::Create(paint.GetColor().Rgb());
 }
 
 CSSValue* ComputedStyleUtils::ValueForSVGResource(
     const StyleSVGResource* resource) {
   if (resource)
-    return CSSURIValue::Create(resource->Url());
+    return cssvalue::CSSURIValue::Create(resource->Url());
   return CSSIdentifierValue::Create(CSSValueID::kNone);
 }
 
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.h b/third_party/blink/renderer/core/css/properties/computed_style_utils.h
index 6ac44dc..eeeaaae 100644
--- a/third_party/blink/renderer/core/css/properties/computed_style_utils.h
+++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.h
@@ -17,8 +17,6 @@
 
 namespace blink {
 
-using namespace cssvalue;
-
 class CSSNumericLiteralValue;
 class CSSStyleValue;
 class CSSValue;
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
index b90e0e3..575532f 100644
--- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
+++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -56,7 +56,8 @@
 
 namespace blink {
 
-using namespace cssvalue;
+using cssvalue::CSSFontFeatureValue;
+using cssvalue::CSSGridLineNamesValue;
 
 namespace css_parsing_utils {
 namespace {
@@ -175,7 +176,8 @@
   }
 
   range = range_copy;
-  return CSSStepsTimingFunctionValue::Create(steps->GetIntValue(), position);
+  return cssvalue::CSSStepsTimingFunctionValue::Create(steps->GetIntValue(),
+                                                       position);
 }
 
 CSSValue* ConsumeCubicBezier(CSSParserTokenRange& range) {
@@ -195,8 +197,8 @@
       css_property_parser_helpers::ConsumeCommaIncludingWhitespace(args) &&
       css_property_parser_helpers::ConsumeNumberRaw(args, y2) && args.AtEnd()) {
     range = range_copy;
-    return MakeGarbageCollected<CSSCubicBezierTimingFunctionValue>(x1, y1, x2,
-                                                                   y2);
+    return MakeGarbageCollected<cssvalue::CSSCubicBezierTimingFunctionValue>(
+        x1, y1, x2, y2);
   }
 
   return nullptr;
@@ -228,12 +230,12 @@
       args, css_parser_mode, kValueRangeNonNegative);
 }
 
-CSSBasicShapeCircleValue* ConsumeBasicShapeCircle(
+cssvalue::CSSBasicShapeCircleValue* ConsumeBasicShapeCircle(
     CSSParserTokenRange& args,
     const CSSParserContext& context) {
   // spec: https://drafts.csswg.org/css-shapes/#supported-basic-shapes
   // circle( [<shape-radius>]? [at <position>]? )
-  auto* shape = MakeGarbageCollected<CSSBasicShapeCircleValue>();
+  auto* shape = MakeGarbageCollected<cssvalue::CSSBasicShapeCircleValue>();
   if (CSSValue* radius = ConsumeShapeRadius(args, context.Mode()))
     shape->SetRadius(radius);
   if (css_property_parser_helpers::ConsumeIdent<CSSValueID::kAt>(args)) {
@@ -249,12 +251,12 @@
   return shape;
 }
 
-CSSBasicShapeEllipseValue* ConsumeBasicShapeEllipse(
+cssvalue::CSSBasicShapeEllipseValue* ConsumeBasicShapeEllipse(
     CSSParserTokenRange& args,
     const CSSParserContext& context) {
   // spec: https://drafts.csswg.org/css-shapes/#supported-basic-shapes
   // ellipse( [<shape-radius>{2}]? [at <position>]? )
-  auto* shape = MakeGarbageCollected<CSSBasicShapeEllipseValue>();
+  auto* shape = MakeGarbageCollected<cssvalue::CSSBasicShapeEllipseValue>();
   WebFeature feature = WebFeature::kBasicShapeEllipseNoRadius;
   if (CSSValue* radius_x = ConsumeShapeRadius(args, context.Mode())) {
     CSSValue* radius_y = ConsumeShapeRadius(args, context.Mode());
@@ -279,10 +281,10 @@
   return shape;
 }
 
-CSSBasicShapePolygonValue* ConsumeBasicShapePolygon(
+cssvalue::CSSBasicShapePolygonValue* ConsumeBasicShapePolygon(
     CSSParserTokenRange& args,
     const CSSParserContext& context) {
-  auto* shape = MakeGarbageCollected<CSSBasicShapePolygonValue>();
+  auto* shape = MakeGarbageCollected<cssvalue::CSSBasicShapePolygonValue>();
   if (css_property_parser_helpers::IdentMatches<CSSValueID::kEvenodd,
                                                 CSSValueID::kNonzero>(
           args.Peek().Id())) {
@@ -310,10 +312,10 @@
   return shape;
 }
 
-CSSBasicShapeInsetValue* ConsumeBasicShapeInset(
+cssvalue::CSSBasicShapeInsetValue* ConsumeBasicShapeInset(
     CSSParserTokenRange& args,
     const CSSParserContext& context) {
-  auto* shape = MakeGarbageCollected<CSSBasicShapeInsetValue>();
+  auto* shape = MakeGarbageCollected<cssvalue::CSSBasicShapeInsetValue>();
   CSSPrimitiveValue* top = css_property_parser_helpers::ConsumeLengthOrPercent(
       args, context.Mode(), kValueRangeAll);
   if (!top)
@@ -492,7 +494,7 @@
   DCHECK(is_position_keyword);
   CSSValueID id = range.Peek().Id();
   if (css_property_parser_helpers::IdentMatches<CSSValueID::kNormal>(id)) {
-    return MakeGarbageCollected<CSSContentDistributionValue>(
+    return MakeGarbageCollected<cssvalue::CSSContentDistributionValue>(
         CSSValueID::kInvalid, range.ConsumeIncludingWhitespace().Id(),
         CSSValueID::kInvalid);
   }
@@ -501,13 +503,13 @@
     CSSValue* baseline = ConsumeBaselineKeyword(range);
     if (!baseline)
       return nullptr;
-    return MakeGarbageCollected<CSSContentDistributionValue>(
+    return MakeGarbageCollected<cssvalue::CSSContentDistributionValue>(
         CSSValueID::kInvalid, GetBaselineKeyword(*baseline),
         CSSValueID::kInvalid);
   }
 
   if (IsContentDistributionKeyword(id)) {
-    return MakeGarbageCollected<CSSContentDistributionValue>(
+    return MakeGarbageCollected<cssvalue::CSSContentDistributionValue>(
         range.ConsumeIncludingWhitespace().Id(), CSSValueID::kInvalid,
         CSSValueID::kInvalid);
   }
@@ -516,7 +518,7 @@
                             ? range.ConsumeIncludingWhitespace().Id()
                             : CSSValueID::kInvalid;
   if (is_position_keyword(range.Peek().Id())) {
-    return MakeGarbageCollected<CSSContentDistributionValue>(
+    return MakeGarbageCollected<cssvalue::CSSContentDistributionValue>(
         CSSValueID::kInvalid, range.ConsumeIncludingWhitespace().Id(),
         overflow);
   }
@@ -1091,7 +1093,7 @@
   css_property_parser_helpers::Complete4Sides(slices);
   if (default_fill == DefaultFill::kFill)
     fill = true;
-  return MakeGarbageCollected<CSSBorderImageSliceValue>(
+  return MakeGarbageCollected<cssvalue::CSSBorderImageSliceValue>(
       MakeGarbageCollected<CSSQuadValue>(slices[0], slices[1], slices[2],
                                          slices[3],
                                          CSSQuadValue::kSerializeAsQuad),
@@ -1432,8 +1434,8 @@
   if (parser_mode != kCSSFontFaceRuleMode || range.AtEnd()) {
     CSSValueList* value_list = CSSValueList::CreateSpaceSeparated();
     value_list->Append(*start_angle);
-    return MakeGarbageCollected<CSSFontStyleRangeValue>(*oblique_identifier,
-                                                        *value_list);
+    return MakeGarbageCollected<cssvalue::CSSFontStyleRangeValue>(
+        *oblique_identifier, *value_list);
   }
 
   CSSPrimitiveValue* end_angle = css_property_parser_helpers::ConsumeAngle(
@@ -1444,8 +1446,8 @@
   CSSValueList* range_list = CombineToRangeListOrNull(start_angle, end_angle);
   if (!range_list)
     return nullptr;
-  return MakeGarbageCollected<CSSFontStyleRangeValue>(*oblique_identifier,
-                                                      *range_list);
+  return MakeGarbageCollected<cssvalue::CSSFontStyleRangeValue>(
+      *oblique_identifier, *range_list);
 }
 
 CSSIdentifierValue* ConsumeFontStretchKeywordOnly(CSSParserTokenRange& range) {
@@ -1758,7 +1760,7 @@
       CSSValueID::kAutoFill, CSSValueID::kAutoFit>(args.Peek().Id());
   CSSValueList* repeated_values;
   if (is_auto_repeat) {
-    repeated_values = MakeGarbageCollected<CSSGridAutoRepeatValue>(
+    repeated_values = MakeGarbageCollected<cssvalue::CSSGridAutoRepeatValue>(
         args.ConsumeIncludingWhitespace().Id());
   } else {
     // TODO(rob.buis): a consumeIntegerRaw would be more efficient here.
@@ -1801,7 +1803,7 @@
     // while staying below the max grid size.
     repetitions = std::min(repetitions, kGridMaxTracks / number_of_tracks);
     auto* integer_repeated_values =
-        MakeGarbageCollected<CSSGridIntegerRepeatValue>(repetitions);
+        MakeGarbageCollected<cssvalue::CSSGridIntegerRepeatValue>(repetitions);
     for (size_t i = 0; i < repeated_values->length(); ++i)
       integer_repeated_values->Append(repeated_values->Item(i));
     list.Append(*integer_repeated_values);
@@ -1869,7 +1871,7 @@
   }
 
   template_rows = template_rows_value_list;
-  template_areas = MakeGarbageCollected<CSSGridTemplateAreasValue>(
+  template_areas = MakeGarbageCollected<cssvalue::CSSGridTemplateAreasValue>(
       grid_area_map, row_count, column_count);
   return true;
 }
@@ -2217,7 +2219,7 @@
   range = function_range;
   if (byte_stream->IsEmpty())
     return CSSIdentifierValue::Create(CSSValueID::kNone);
-  return MakeGarbageCollected<CSSPathValue>(std::move(byte_stream));
+  return MakeGarbageCollected<cssvalue::CSSPathValue>(std::move(byte_stream));
 }
 
 CSSValue* ConsumeRay(CSSParserTokenRange& range,
@@ -2256,7 +2258,7 @@
   if (!angle || !size)
     return nullptr;
   range = function_range;
-  return MakeGarbageCollected<CSSRayValue>(*angle, *size, contain);
+  return MakeGarbageCollected<cssvalue::CSSRayValue>(*angle, *size, contain);
 }
 
 CSSValue* ConsumeMaxWidthOrHeight(
@@ -2649,7 +2651,8 @@
                            const CSSParserContext& context) {
   if (range.Peek().Id() == CSSValueID::kNone)
     return css_property_parser_helpers::ConsumeIdent(range);
-  CSSURIValue* url = css_property_parser_helpers::ConsumeUrl(range, &context);
+  cssvalue::CSSURIValue* url =
+      css_property_parser_helpers::ConsumeUrl(range, &context);
   if (url) {
     CSSValue* parsed_value = nullptr;
     if (range.Peek().Id() == CSSValueID::kNone) {
diff --git a/third_party/blink/renderer/core/css/properties/css_property_ref_test.cc b/third_party/blink/renderer/core/css/properties/css_property_ref_test.cc
index 45fea2c..fdbf6335 100644
--- a/third_party/blink/renderer/core/css/properties/css_property_ref_test.cc
+++ b/third_party/blink/renderer/core/css/properties/css_property_ref_test.cc
@@ -10,8 +10,6 @@
 
 namespace blink {
 
-using namespace css_test_helpers;
-
 namespace {
 
 class CSSPropertyRefTest : public PageTestBase {};
@@ -25,7 +23,8 @@
 }
 
 TEST_F(CSSPropertyRefTest, LookupRegistered) {
-  RegisterProperty(GetDocument(), "--x", "<length>", "42px", false);
+  css_test_helpers::RegisterProperty(GetDocument(), "--x", "<length>", "42px",
+                                     false);
   CSSPropertyRef ref("--x", GetDocument());
   EXPECT_TRUE(ref.IsValid());
   EXPECT_EQ(CSSPropertyID::kVariable, ref.GetProperty().PropertyID());
@@ -86,7 +85,8 @@
 }
 
 TEST_F(CSSPropertyRefTest, FromCSSPropertyNameCustom) {
-  RegisterProperty(GetDocument(), "--x", "<length>", "42px", false);
+  css_test_helpers::RegisterProperty(GetDocument(), "--x", "<length>", "42px",
+                                     false);
   CSSPropertyRef ref(CSSPropertyName("--x"), GetDocument());
   EXPECT_EQ(CSSPropertyID::kVariable, ref.GetProperty().PropertyID());
 }
diff --git a/third_party/blink/renderer/core/css/properties/longhands/custom_property_test.cc b/third_party/blink/renderer/core/css/properties/longhands/custom_property_test.cc
index 7c8868f..c8f3a61d 100644
--- a/third_party/blink/renderer/core/css/properties/longhands/custom_property_test.cc
+++ b/third_party/blink/renderer/core/css/properties/longhands/custom_property_test.cc
@@ -16,7 +16,7 @@
 
 namespace blink {
 
-using namespace css_test_helpers;
+using css_test_helpers::RegisterProperty;
 using VariableMode = CSSParserLocalContext::VariableMode;
 
 namespace {
diff --git a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
index 68a69752..f3fc08b 100644
--- a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
+++ b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
@@ -845,8 +845,8 @@
 
 const CSSValue* BorderImageSlice::InitialValue() const {
   DEFINE_STATIC_LOCAL(
-      const Persistent<CSSBorderImageSliceValue>, value,
-      (MakeGarbageCollected<CSSBorderImageSliceValue>(
+      const Persistent<cssvalue::CSSBorderImageSliceValue>, value,
+      (MakeGarbageCollected<cssvalue::CSSBorderImageSliceValue>(
           CSSQuadValue::Create(
               CSSNumericLiteralValue::Create(
                   100, CSSPrimitiveValue::UnitType::kPercentage),
@@ -5051,8 +5051,9 @@
   CSSValueList* list = CSSValueList::CreateSpaceSeparated();
   if (style.Rotate()->X() != 0 || style.Rotate()->Y() != 0 ||
       style.Rotate()->Z() != 1) {
-    const CSSAxisValue* axis = MakeGarbageCollected<CSSAxisValue>(
-        style.Rotate()->X(), style.Rotate()->Y(), style.Rotate()->Z());
+    const cssvalue::CSSAxisValue* axis =
+        MakeGarbageCollected<cssvalue::CSSAxisValue>(
+            style.Rotate()->X(), style.Rotate()->Y(), style.Rotate()->Z());
     list->Append(*axis);
   }
   list->Append(*CSSNumericLiteralValue::Create(
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc
index 4e24209..d92a71d7 100644
--- a/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc
+++ b/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc
@@ -2482,8 +2482,9 @@
   const CSSValue* justify_content_value = nullptr;
   if (range.AtEnd()) {
     if (is_baseline) {
-      justify_content_value = MakeGarbageCollected<CSSContentDistributionValue>(
-          CSSValueID::kInvalid, CSSValueID::kStart, CSSValueID::kInvalid);
+      justify_content_value =
+          MakeGarbageCollected<cssvalue::CSSContentDistributionValue>(
+              CSSValueID::kInvalid, CSSValueID::kStart, CSSValueID::kInvalid);
     } else {
       range = range_copy;
     }
diff --git a/third_party/blink/renderer/core/css/resolver/css_variable_data_test.cc b/third_party/blink/renderer/core/css/resolver/css_variable_data_test.cc
index dd1f932a..20f168b 100644
--- a/third_party/blink/renderer/core/css/resolver/css_variable_data_test.cc
+++ b/third_party/blink/renderer/core/css/resolver/css_variable_data_test.cc
@@ -9,7 +9,7 @@
 
 namespace blink {
 
-using namespace css_test_helpers;
+using css_test_helpers::CreateVariableData;
 
 TEST(CSSVariableDataTest, FontUnitsDetected) {
   EXPECT_FALSE(CreateVariableData("100px")->HasFontUnits());
diff --git a/third_party/blink/renderer/core/css/resolver/element_style_resources.cc b/third_party/blink/renderer/core/css/resolver/element_style_resources.cc
index 8325036..2c89c02 100644
--- a/third_party/blink/renderer/core/css/resolver/element_style_resources.cc
+++ b/third_party/blink/renderer/core/css/resolver/element_style_resources.cc
@@ -52,8 +52,6 @@
 
 namespace blink {
 
-using namespace cssvalue;
-
 ElementStyleResources::ElementStyleResources(Element& element,
                                              float device_scale_factor,
                                              PseudoElement* pseudo_element)
@@ -108,7 +106,7 @@
 
 SVGResource* ElementStyleResources::GetSVGResourceFromValue(
     TreeScope& tree_scope,
-    const CSSURIValue& value,
+    const cssvalue::CSSURIValue& value,
     AllowExternal allow_external) const {
   if (value.IsLocal(element_->GetDocument())) {
     SVGTreeScopeResources& tree_scope_resources =
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
index 28479db..00f71f0 100644
--- a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
@@ -65,8 +65,6 @@
 
 namespace blink {
 
-using namespace cssvalue;
-
 namespace {
 
 static GridLength ConvertGridTrackBreadth(const StyleResolverState& state,
@@ -97,7 +95,7 @@
     return ComputedStyleInitialValues::InitialBoxReflect();
   }
 
-  const auto& reflect_value = To<CSSReflectValue>(value);
+  const auto& reflect_value = To<cssvalue::CSSReflectValue>(value);
   scoped_refptr<StyleReflection> reflection = StyleReflection::Create();
   reflection->SetDirection(
       reflect_value.Direction()->ConvertTo<CSSReflectionDirection>());
@@ -125,7 +123,7 @@
 scoped_refptr<StyleSVGResource> StyleBuilderConverter::ConvertElementReference(
     StyleResolverState& state,
     const CSSValue& value) {
-  const auto* url_value = DynamicTo<CSSURIValue>(value);
+  const auto* url_value = DynamicTo<cssvalue::CSSURIValue>(value);
   if (!url_value)
     return nullptr;
   SVGResource* resource =
@@ -149,7 +147,7 @@
     const CSSValue& value) {
   if (value.IsBasicShapeValue())
     return ShapeClipPathOperation::Create(BasicShapeForValue(state, value));
-  if (const auto* url_value = DynamicTo<CSSURIValue>(value)) {
+  if (const auto* url_value = DynamicTo<cssvalue::CSSURIValue>(value)) {
     SVGResource* resource =
         state.GetElementStyleResources().GetSVGResourceFromValue(
             state.GetTreeScope(), *url_value);
@@ -274,7 +272,7 @@
   scoped_refptr<FontFeatureSettings> settings = FontFeatureSettings::Create();
   int len = list.length();
   for (int i = 0; i < len; ++i) {
-    const auto& feature = To<CSSFontFeatureValue>(list.Item(i));
+    const auto& feature = To<cssvalue::CSSFontFeatureValue>(list.Item(i));
     settings->Append(FontFeature(feature.Tag(), feature.Value()));
   }
   return settings;
@@ -292,7 +290,7 @@
       FontVariationSettings::Create();
   int len = list.length();
   for (int i = 0; i < len; ++i) {
-    const auto& feature = To<CSSFontVariationValue>(list.Item(i));
+    const auto& feature = To<cssvalue::CSSFontVariationValue>(list.Item(i));
     settings->Append(FontVariationAxis(feature.Tag(), feature.Value()));
   }
   return settings;
@@ -441,7 +439,7 @@
         return NormalSlopeValue();
     }
   } else if (const auto* style_range_value =
-                 DynamicTo<CSSFontStyleRangeValue>(value)) {
+                 DynamicTo<cssvalue::CSSFontStyleRangeValue>(value)) {
     const CSSValueList* values = style_range_value->GetObliqueValues();
     CHECK_LT(values->length(), 2u);
     if (values->length()) {
@@ -707,8 +705,8 @@
     const CSSValue& value) {
   StyleContentAlignmentData alignment_data =
       ComputedStyleInitialValues::InitialContentAlignment();
-  const CSSContentDistributionValue& content_value =
-      To<CSSContentDistributionValue>(value);
+  const cssvalue::CSSContentDistributionValue& content_value =
+      To<cssvalue::CSSContentDistributionValue>(value);
   if (IsValidCSSValueID(content_value.Distribution())) {
     alignment_data.SetDistribution(
         CSSIdentifierValue::Create(content_value.Distribution())
@@ -898,7 +896,7 @@
 
   for (auto curr_value : To<CSSValueList>(value)) {
     if (auto* grid_auto_repeat_value =
-            DynamicTo<CSSGridAutoRepeatValue>(curr_value.Get())) {
+            DynamicTo<cssvalue::CSSGridAutoRepeatValue>(curr_value.Get())) {
       DCHECK(auto_repeat_track_sizes.IsEmpty());
       size_t auto_repeat_index = 0;
       CSSValueID auto_repeat_id = grid_auto_repeat_value->AutoRepeatID();
@@ -923,7 +921,7 @@
     }
 
     if (auto* repeated_values =
-            DynamicTo<CSSGridIntegerRepeatValue>(curr_value.Get())) {
+            DynamicTo<cssvalue::CSSGridIntegerRepeatValue>(curr_value.Get())) {
       size_t repetitions = repeated_values->Repetitions();
       for (size_t i = 0; i < repetitions; ++i) {
         for (auto curr_value : *repeated_values)
@@ -1304,7 +1302,8 @@
       // For OffScreen canvas, we default to black and only parse non
       // Document dependent CSS colors.
       color = StyleColor(Color::kBlack);
-      if (auto* color_value = DynamicTo<CSSColorValue>(shadow.color.Get())) {
+      if (auto* color_value =
+              DynamicTo<cssvalue::CSSColorValue>(shadow.color.Get())) {
         color = color_value->Value();
       } else {
         CSSValueID value_id =
@@ -1634,7 +1633,8 @@
   double z = 1;
   if (list.length() == 2) {
     // axis angle
-    const CSSAxisValue& axis = To<CSSAxisValue>(list.Item(0));
+    const cssvalue::CSSAxisValue& axis =
+        To<cssvalue::CSSAxisValue>(list.Item(0));
     x = axis.X();
     y = axis.Y();
     z = axis.Z();
@@ -1691,7 +1691,7 @@
 scoped_refptr<StylePath> StyleBuilderConverter::ConvertPathOrNone(
     StyleResolverState& state,
     const CSSValue& value) {
-  if (auto* path_value = DynamicTo<CSSPathValue>(value))
+  if (auto* path_value = DynamicTo<cssvalue::CSSPathValue>(value))
     return path_value->GetStylePath();
   DCHECK_EQ(To<CSSIdentifierValue>(value).GetValueID(), CSSValueID::kNone);
   return nullptr;
@@ -1794,11 +1794,11 @@
           state ? state->Style()->UsedColorScheme() : WebColorScheme::kLight;
       Color color = document.GetTextLinkColors().ColorFromCSSValue(
           value, Color(), scheme, false);
-      return *CSSColorValue::Create(color.Rgb());
+      return *cssvalue::CSSColorValue::Create(color.Rgb());
     }
   }
 
-  if (const auto* uri_value = DynamicTo<CSSURIValue>(value))
+  if (const auto* uri_value = DynamicTo<cssvalue::CSSURIValue>(value))
     return *uri_value->ValueWithURLMadeAbsolute(KURL(base_url), charset);
 
   return value;
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade.cc b/third_party/blink/renderer/core/css/resolver/style_cascade.cc
index e3810cc..3b0f06d 100644
--- a/third_party/blink/renderer/core/css/resolver/style_cascade.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_cascade.cc
@@ -33,8 +33,6 @@
 
 namespace blink {
 
-using namespace cssvalue;
-
 namespace {
 
 class NullAnimator : public StyleCascade::Animator {
@@ -197,7 +195,8 @@
 
   const CSSValue* value = cascaded.GetValue();
 
-  if (const auto* v = DynamicTo<CSSPendingInterpolationValue>(value)) {
+  if (const auto* v =
+          DynamicTo<cssvalue::CSSPendingInterpolationValue>(value)) {
     resolver.animator_.Apply(property, *v, resolver);
     return;
   }
@@ -280,7 +279,7 @@
     return ResolveCustomProperty(property, *v, resolver);
   if (const auto* v = DynamicTo<CSSVariableReferenceValue>(value))
     return ResolveVariableReference(property, *v, resolver);
-  if (const auto* v = DynamicTo<CSSPendingSubstitutionValue>(value))
+  if (const auto* v = DynamicTo<cssvalue::CSSPendingSubstitutionValue>(value))
     return ResolvePendingSubstitution(property, *v, resolver);
   return &value;
 }
@@ -314,7 +313,7 @@
       if (!custom_property->IsRegistered())
         return CSSInvalidVariableValue::Create();
     }
-    return CSSUnsetValue::Create();
+    return cssvalue::CSSUnsetValue::Create();
   }
 
   if (data == decl.Value())
@@ -344,12 +343,12 @@
       return parsed;
   }
 
-  return CSSUnsetValue::Create();
+  return cssvalue::CSSUnsetValue::Create();
 }
 
 const CSSValue* StyleCascade::ResolvePendingSubstitution(
     const CSSProperty& property,
-    const CSSPendingSubstitutionValue& value,
+    const cssvalue::CSSPendingSubstitutionValue& value,
     Resolver& resolver) {
   DCHECK(!resolver.IsLocked(property));
   AutoLock lock(property, resolver);
@@ -363,7 +362,7 @@
   TokenSequence sequence;
 
   if (!ResolveTokensInto(shorthand_data->Tokens(), resolver, sequence))
-    return CSSUnsetValue::Create();
+    return cssvalue::CSSUnsetValue::Create();
 
   HeapVector<CSSPropertyValue, 256> parsed_properties;
   const bool important = false;
@@ -372,7 +371,7 @@
           shorthand_property_id, important, sequence.TokenRange(),
           shorthand_value->ParserContext(), parsed_properties,
           StyleRule::RuleType::kStyle)) {
-    return CSSUnsetValue::Create();
+    return cssvalue::CSSUnsetValue::Create();
   }
 
   // For -internal-visited-properties with CSSPendingSubstitutionValues,
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc b/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc
index e44b8a66..d72f04ff 100644
--- a/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_cascade_test.cc
@@ -41,8 +41,8 @@
 
 namespace blink {
 
-using namespace css_test_helpers;
-using namespace cssvalue;
+using css_test_helpers::RegisterProperty;
+using cssvalue::CSSPendingInterpolationValue;
 using Origin = StyleCascade::Origin;
 using Priority = StyleCascade::Priority;
 using UnitType = CSSPrimitiveValue::UnitType;
@@ -157,7 +157,7 @@
     const CSSValue* value = GetCSSValue(name);
     // Per spec, CSSPendingSubstitutionValue serializes as an empty string,
     // but for testing purposes it's nice to see the actual value.
-    if (const auto* v = DynamicTo<CSSPendingSubstitutionValue>(value))
+    if (const auto* v = DynamicTo<cssvalue::CSSPendingSubstitutionValue>(value))
       return v->ShorthandValue()->CssText();
     if (DynamicTo<CSSPendingInterpolationValue>(value))
       return "<interpolation>";
@@ -1511,7 +1511,7 @@
 class RecordingAnimator : public StyleCascade::Animator {
  public:
   void Apply(const CSSProperty& property,
-             const cssvalue::CSSPendingInterpolationValue&,
+             const CSSPendingInterpolationValue&,
              StyleCascade::Resolver& resolver) override {
     record.push_back(property.GetCSSPropertyName());
   }
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
index 0eaf3ce..4b03ec9 100644
--- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -127,8 +127,6 @@
 
 }  // namespace
 
-using namespace html_names;
-
 static CSSPropertyValueSet* LeftToRightDeclaration() {
   DEFINE_STATIC_LOCAL(
       Persistent<MutableCSSPropertyValueSet>, left_to_right_decl,
diff --git a/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc b/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc
index fb9ebfd..0266034d 100644
--- a/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc
@@ -27,8 +27,6 @@
 #include "third_party/blink/renderer/core/frame/remote_frame_owner.h"
 #include "third_party/blink/renderer/core/frame/settings.h"
 #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
-#include "third_party/blink/renderer/core/fullscreen/fullscreen.h"
-#include "third_party/blink/renderer/core/fullscreen/fullscreen_options.h"
 #include "third_party/blink/renderer/core/html/html_frame_owner_element.h"
 #include "third_party/blink/renderer/core/html/portal/html_portal_element.h"
 #include "third_party/blink/renderer/core/html_names.h"
@@ -58,36 +56,45 @@
 }  // namespace
 
 WebRemoteFrame* WebRemoteFrame::Create(WebTreeScopeType scope,
-                                       WebRemoteFrameClient* client) {
-  return WebRemoteFrameImpl::Create(scope, client);
+                                       WebRemoteFrameClient* client,
+                                       InterfaceRegistry* interface_registry) {
+  return WebRemoteFrameImpl::Create(scope, client, interface_registry);
 }
 
-WebRemoteFrame* WebRemoteFrame::CreateMainFrame(WebView* web_view,
-                                                WebRemoteFrameClient* client,
-                                                WebFrame* opener) {
-  return WebRemoteFrameImpl::CreateMainFrame(web_view, client, opener);
+WebRemoteFrame* WebRemoteFrame::CreateMainFrame(
+    WebView* web_view,
+    WebRemoteFrameClient* client,
+    InterfaceRegistry* interface_registry,
+    WebFrame* opener) {
+  return WebRemoteFrameImpl::CreateMainFrame(web_view, client,
+                                             interface_registry, opener);
 }
 
 WebRemoteFrame* WebRemoteFrame::CreateForPortal(
     WebTreeScopeType scope,
     WebRemoteFrameClient* client,
+    InterfaceRegistry* interface_registry,
     const WebElement& portal_element) {
-  return WebRemoteFrameImpl::CreateForPortal(scope, client, portal_element);
+  return WebRemoteFrameImpl::CreateForPortal(scope, client, interface_registry,
+                                             portal_element);
 }
 
-WebRemoteFrameImpl* WebRemoteFrameImpl::Create(WebTreeScopeType scope,
-                                               WebRemoteFrameClient* client) {
-  WebRemoteFrameImpl* frame =
-      MakeGarbageCollected<WebRemoteFrameImpl>(scope, client);
+WebRemoteFrameImpl* WebRemoteFrameImpl::Create(
+    WebTreeScopeType scope,
+    WebRemoteFrameClient* client,
+    InterfaceRegistry* interface_registry) {
+  WebRemoteFrameImpl* frame = MakeGarbageCollected<WebRemoteFrameImpl>(
+      scope, client, interface_registry);
   return frame;
 }
 
 WebRemoteFrameImpl* WebRemoteFrameImpl::CreateMainFrame(
     WebView* web_view,
     WebRemoteFrameClient* client,
+    InterfaceRegistry* interface_registry,
     WebFrame* opener) {
   WebRemoteFrameImpl* frame = MakeGarbageCollected<WebRemoteFrameImpl>(
-      WebTreeScopeType::kDocument, client);
+      WebTreeScopeType::kDocument, client, interface_registry);
   frame->SetOpener(opener);
   Page& page = *static_cast<WebViewImpl*>(web_view)->GetPage();
   // It would be nice to DCHECK that the main frame is not set yet here.
@@ -107,9 +114,10 @@
 WebRemoteFrameImpl* WebRemoteFrameImpl::CreateForPortal(
     WebTreeScopeType scope,
     WebRemoteFrameClient* client,
+    InterfaceRegistry* interface_registry,
     const WebElement& portal_element) {
-  WebRemoteFrameImpl* frame =
-      MakeGarbageCollected<WebRemoteFrameImpl>(scope, client);
+  WebRemoteFrameImpl* frame = MakeGarbageCollected<WebRemoteFrameImpl>(
+      scope, client, interface_registry);
 
   Element* element = portal_element;
   DCHECK(element->HasTagName(html_names::kPortalTag));
@@ -198,7 +206,8 @@
     const AtomicString& name,
     WindowAgentFactory* window_agent_factory) {
   SetCoreFrame(MakeGarbageCollected<RemoteFrame>(frame_client_.Get(), page,
-                                                 owner, window_agent_factory));
+                                                 owner, window_agent_factory,
+                                                 interface_registry_));
   GetFrame()->CreateView();
   frame_->Tree().SetName(name);
 }
@@ -209,8 +218,10 @@
     const FramePolicy& frame_policy,
     FrameOwnerElementType frame_owner_element_type,
     WebRemoteFrameClient* client,
+    blink::InterfaceRegistry* interface_registry,
     WebFrame* opener) {
-  WebRemoteFrameImpl* child = WebRemoteFrameImpl::Create(scope, client);
+  WebRemoteFrameImpl* child =
+      WebRemoteFrameImpl::Create(scope, client, interface_registry);
   child->SetOpener(opener);
   AppendChild(child);
   auto* owner = MakeGarbageCollected<RemoteFrameOwner>(
@@ -374,28 +385,6 @@
   return GetFrame()->IsIgnoredForHitTest();
 }
 
-void WebRemoteFrameImpl::WillEnterFullscreen() {
-  // This should only ever be called when the FrameOwner is local.
-  HTMLFrameOwnerElement* owner_element =
-      To<HTMLFrameOwnerElement>(GetFrame()->Owner());
-
-  // Call |requestFullscreen()| on |ownerElement| to make it the pending
-  // fullscreen element in anticipation of the coming |didEnterFullscreen()|
-  // call.
-  //
-  // PrefixedForCrossProcessDescendant is necessary because:
-  //  - The fullscreen element ready check and other checks should be bypassed.
-  //  - |ownerElement| will need :-webkit-full-screen-ancestor style in addition
-  //    to :fullscreen.
-  //
-  // TODO(alexmos): currently, this assumes prefixed requests, but in the
-  // future, this should plumb in information about which request type
-  // (prefixed or unprefixed) to use for firing fullscreen events.
-  Fullscreen::RequestFullscreen(
-      *owner_element, FullscreenOptions::Create(),
-      Fullscreen::RequestType::kPrefixedForCrossProcessDescendant);
-}
-
 void WebRemoteFrameImpl::UpdateUserActivationState(
     UserActivationUpdateType update_type) {
   switch (update_type) {
@@ -518,10 +507,12 @@
 }
 
 WebRemoteFrameImpl::WebRemoteFrameImpl(WebTreeScopeType scope,
-                                       WebRemoteFrameClient* client)
+                                       WebRemoteFrameClient* client,
+                                       InterfaceRegistry* interface_registry)
     : WebRemoteFrame(scope),
       client_(client),
       frame_client_(MakeGarbageCollected<RemoteFrameClientImpl>(this)),
+      interface_registry_(interface_registry),
       self_keep_alive_(PERSISTENT_FROM_HERE, this) {
   DCHECK(client);
 }
diff --git a/third_party/blink/renderer/core/exported/web_remote_frame_impl.h b/third_party/blink/renderer/core/exported/web_remote_frame_impl.h
index c908607..57aac158 100644
--- a/third_party/blink/renderer/core/exported/web_remote_frame_impl.h
+++ b/third_party/blink/renderer/core/exported/web_remote_frame_impl.h
@@ -31,15 +31,21 @@
     : public GarbageCollected<WebRemoteFrameImpl>,
       public WebRemoteFrame {
  public:
-  static WebRemoteFrameImpl* Create(WebTreeScopeType, WebRemoteFrameClient*);
+  static WebRemoteFrameImpl* Create(WebTreeScopeType,
+                                    WebRemoteFrameClient*,
+                                    InterfaceRegistry*);
   static WebRemoteFrameImpl* CreateMainFrame(WebView*,
                                              WebRemoteFrameClient*,
-                                             WebFrame* opener = nullptr);
+                                             InterfaceRegistry*,
+                                             WebFrame* opener);
   static WebRemoteFrameImpl* CreateForPortal(WebTreeScopeType,
                                              WebRemoteFrameClient*,
+                                             InterfaceRegistry*,
                                              const WebElement& portal_element);
 
-  WebRemoteFrameImpl(WebTreeScopeType, WebRemoteFrameClient*);
+  WebRemoteFrameImpl(WebTreeScopeType,
+                     WebRemoteFrameClient*,
+                     InterfaceRegistry*);
   ~WebRemoteFrameImpl() override;
 
   // WebFrame methods:
@@ -63,6 +69,7 @@
                                     const FramePolicy&,
                                     FrameOwnerElementType,
                                     WebRemoteFrameClient*,
+                                    blink::InterfaceRegistry*,
                                     WebFrame* opener) override;
   void SetCcLayer(cc::Layer*,
                   bool prevent_contents_opaque_changes,
@@ -88,7 +95,6 @@
   void DidStartLoading() override;
   void DidStopLoading() override;
   bool IsIgnoredForHitTest() const override;
-  void WillEnterFullscreen() override;
   void UpdateUserActivationState(UserActivationUpdateType) override;
   void TransferUserActivationFrom(blink::WebRemoteFrame* source_frame) override;
   void ScrollRectToVisible(const WebRect&,
@@ -133,6 +139,8 @@
 
   ParsedFeaturePolicy feature_policy_header_;
 
+  InterfaceRegistry* const interface_registry_;
+
   // Oilpan: WebRemoteFrameImpl must remain alive until close() is called.
   // Accomplish that by keeping a self-referential Persistent<>. It is
   // cleared upon close().
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.cc b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
index 47eb0f69..f219cad5 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -39,6 +39,7 @@
 #include "cc/trees/layer_tree_settings.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "third_party/blink/public/common/frame/frame_policy.h"
+#include "third_party/blink/public/platform/interface_registry.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_data.h"
 #include "third_party/blink/public/platform/web_string.h"
@@ -270,7 +271,8 @@
   std::unique_ptr<TestWebRemoteFrameClient> owned_client;
   client = CreateDefaultClientIfNeeded(client, owned_client);
   auto* frame = MakeGarbageCollected<WebRemoteFrameImpl>(
-      WebTreeScopeType::kDocument, client);
+      WebTreeScopeType::kDocument, client,
+      InterfaceRegistry::GetEmptyInterfaceRegistry());
   client->Bind(frame, std::move(owned_client));
   return frame;
 }
@@ -315,7 +317,8 @@
   client = CreateDefaultClientIfNeeded(client, owned_client);
   auto* frame = ToWebRemoteFrameImpl(parent.CreateRemoteChild(
       WebTreeScopeType::kDocument, name, FramePolicy(),
-      FrameOwnerElementType::kIframe, client, nullptr));
+      FrameOwnerElementType::kIframe, client,
+      InterfaceRegistry::GetEmptyInterfaceRegistry(), nullptr));
   client->Bind(frame, std::move(owned_client));
   if (!security_origin)
     security_origin = SecurityOrigin::CreateUniqueOpaque();
@@ -422,7 +425,8 @@
   web_remote_frame_client = CreateDefaultClientIfNeeded(
       web_remote_frame_client, owned_web_remote_frame_client);
   WebRemoteFrameImpl* frame = WebRemoteFrameImpl::CreateMainFrame(
-      web_view_, web_remote_frame_client, nullptr);
+      web_view_, web_remote_frame_client,
+      InterfaceRegistry::GetEmptyInterfaceRegistry(), nullptr);
   web_remote_frame_client->Bind(frame,
                                 std::move(owned_web_remote_frame_client));
   if (!security_origin)
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h
index ae0bc40b..5b27a01 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.h
+++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -904,8 +904,6 @@
   bool frame_timing_requests_dirty_;
 
   // Exists only on root frame.
-  // TODO(bokan): crbug.com/484188. We should specialize LocalFrameView for the
-  // main frame.
   Member<RootFrameViewport> viewport_scrollable_area_;
 
   // Non-top-level frames a throttled until they are ready to run lifecycle
diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc
index c8f00ab..ae3913b 100644
--- a/third_party/blink/renderer/core/frame/remote_frame.cc
+++ b/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/core/frame/remote_frame.h"
 
 #include "cc/layers/surface_layer.h"
+#include "third_party/blink/public/platform/interface_registry.h"
 #include "third_party/blink/renderer/bindings/core/v8/window_proxy.h"
 #include "third_party/blink/renderer/bindings/core/v8/window_proxy_manager.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -12,6 +13,8 @@
 #include "third_party/blink/renderer/core/frame/remote_dom_window.h"
 #include "third_party/blink/renderer/core/frame/remote_frame_client.h"
 #include "third_party/blink/renderer/core/frame/remote_frame_view.h"
+#include "third_party/blink/renderer/core/fullscreen/fullscreen.h"
+#include "third_party/blink/renderer/core/fullscreen/fullscreen_options.h"
 #include "third_party/blink/renderer/core/html/html_frame_owner_element.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
 #include "third_party/blink/renderer/core/layout/layout_embedded_content.h"
@@ -36,7 +39,8 @@
 RemoteFrame::RemoteFrame(RemoteFrameClient* client,
                          Page& page,
                          FrameOwner* owner,
-                         WindowAgentFactory* inheriting_agent_factory)
+                         WindowAgentFactory* inheriting_agent_factory,
+                         InterfaceRegistry* interface_registry)
     : Frame(client,
             page,
             owner,
@@ -44,6 +48,10 @@
             inheriting_agent_factory),
       security_context_(MakeGarbageCollected<RemoteSecurityContext>()) {
   dom_window_ = MakeGarbageCollected<RemoteDOMWindow>(*this);
+
+  interface_registry->AddAssociatedInterface(WTF::BindRepeating(
+      &RemoteFrame::BindToReceiver, WrapWeakPersistent(this)));
+
   UpdateInertIfPossible();
   UpdateInheritedEffectiveTouchActionIfPossible();
   UpdateVisibleToHitTesting();
@@ -223,6 +231,27 @@
       IsIgnoredForHitTest());
 }
 
+void RemoteFrame::WillEnterFullscreen() {
+  // This should only ever be called when the FrameOwner is local.
+  HTMLFrameOwnerElement* owner_element = To<HTMLFrameOwnerElement>(Owner());
+
+  // Call |requestFullscreen()| on |ownerElement| to make it the pending
+  // fullscreen element in anticipation of the coming |didEnterFullscreen()|
+  // call.
+  //
+  // PrefixedForCrossProcessDescendant is necessary because:
+  //  - The fullscreen element ready check and other checks should be bypassed.
+  //  - |ownerElement| will need :-webkit-full-screen-ancestor style in addition
+  //    to :fullscreen.
+  //
+  // TODO(alexmos): currently, this assumes prefixed requests, but in the
+  // future, this should plumb in information about which request type
+  // (prefixed or unprefixed) to use for firing fullscreen events.
+  Fullscreen::RequestFullscreen(
+      *owner_element, FullscreenOptions::Create(),
+      Fullscreen::RequestType::kPrefixedForCrossProcessDescendant);
+}
+
 bool RemoteFrame::IsIgnoredForHitTest() const {
   HTMLFrameOwnerElement* owner = DeprecatedLocalOwner();
   if (!owner || !owner->GetLayoutObject())
@@ -268,4 +297,11 @@
     child->Detach(FrameDetachType::kRemove);
 }
 
+void RemoteFrame::BindToReceiver(
+    blink::RemoteFrame* frame,
+    mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> receiver) {
+  DCHECK(frame);
+  frame->receiver_.Bind(std::move(receiver));
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/remote_frame.h b/third_party/blink/renderer/core/frame/remote_frame.h
index 300b422..2a3c3fd 100644
--- a/third_party/blink/renderer/core/frame/remote_frame.h
+++ b/third_party/blink/renderer/core/frame/remote_frame.h
@@ -5,6 +5,8 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_REMOTE_FRAME_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_REMOTE_FRAME_H_
 
+#include "mojo/public/cpp/bindings/associated_receiver.h"
+#include "third_party/blink/public/mojom/frame/frame.mojom-blink.h"
 #include "third_party/blink/public/platform/web_focus_type.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/execution_context/remote_security_context.h"
@@ -18,18 +20,21 @@
 
 namespace blink {
 
+class InterfaceRegistry;
 class LocalFrame;
 class RemoteFrameClient;
 struct FrameLoadRequest;
 
-class CORE_EXPORT RemoteFrame final : public Frame {
+class CORE_EXPORT RemoteFrame final : public Frame,
+                                      public mojom::blink::RemoteFrame {
  public:
   // For a description of |inheriting_agent_factory| go see the comment on the
   // Frame constructor.
   RemoteFrame(RemoteFrameClient*,
               Page&,
               FrameOwner*,
-              WindowAgentFactory* inheriting_agent_factory);
+              WindowAgentFactory* inheriting_agent_factory,
+              InterfaceRegistry*);
   ~RemoteFrame() override;
 
   // Frame overrides:
@@ -68,6 +73,9 @@
 
   void DidChangeVisibleToHitTesting() override;
 
+  // blink::mojom::LocalFrame overrides:
+  void WillEnterFullscreen() override;
+
  private:
   // Frame protected overrides:
   void DetachImpl(FrameDetachType) override;
@@ -79,11 +87,17 @@
 
   void DetachChildren();
 
+  static void BindToReceiver(
+      blink::RemoteFrame* frame,
+      mojo::PendingAssociatedReceiver<mojom::blink::RemoteFrame> receiver);
+
   Member<RemoteFrameView> view_;
   Member<RemoteSecurityContext> security_context_;
   cc::Layer* cc_layer_ = nullptr;
   bool prevent_contents_opaque_changes_ = false;
   bool is_surface_layer_ = false;
+
+  mojo::AssociatedReceiver<mojom::blink::RemoteFrame> receiver_{this};
 };
 
 inline RemoteFrameView* RemoteFrame::View() const {
diff --git a/third_party/blink/renderer/core/html/forms/base_button_input_type.cc b/third_party/blink/renderer/core/html/forms/base_button_input_type.cc
index 07b6187..c452555 100644
--- a/third_party/blink/renderer/core/html/forms/base_button_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/base_button_input_type.cc
@@ -41,8 +41,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 BaseButtonInputType::BaseButtonInputType(HTMLInputElement& element)
     : InputType(element), KeyboardClickableInputTypeView(element) {}
 
@@ -89,7 +87,8 @@
                                    bool,
                                    TextFieldEventBehavior,
                                    TextControlSetValueSelection) {
-  GetElement().setAttribute(kValueAttr, AtomicString(sanitized_value));
+  GetElement().setAttribute(html_names::kValueAttr,
+                            AtomicString(sanitized_value));
 }
 
 bool BaseButtonInputType::MatchesDefaultPseudoClass() {
diff --git a/third_party/blink/renderer/core/html/forms/base_checkable_input_type.cc b/third_party/blink/renderer/core/html/forms/base_checkable_input_type.cc
index 7cbe885..93da5c3 100644
--- a/third_party/blink/renderer/core/html/forms/base_checkable_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/base_checkable_input_type.cc
@@ -42,8 +42,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 void BaseCheckableInputType::Trace(Visitor* visitor) {
   InputTypeView::Trace(visitor);
   InputType::Trace(visitor);
@@ -97,7 +95,7 @@
 }
 
 bool BaseCheckableInputType::MatchesDefaultPseudoClass() {
-  return GetElement().FastHasAttribute(kCheckedAttr);
+  return GetElement().FastHasAttribute(html_names::kCheckedAttr);
 }
 
 InputType::ValueMode BaseCheckableInputType::GetValueMode() const {
@@ -108,7 +106,8 @@
                                       bool,
                                       TextFieldEventBehavior,
                                       TextControlSetValueSelection) {
-  GetElement().setAttribute(kValueAttr, AtomicString(sanitized_value));
+  GetElement().setAttribute(html_names::kValueAttr,
+                            AtomicString(sanitized_value));
 }
 
 void BaseCheckableInputType::ReadingChecked() const {
diff --git a/third_party/blink/renderer/core/html/forms/base_text_input_type.cc b/third_party/blink/renderer/core/html/forms/base_text_input_type.cc
index d8fef7f..8fdc4798 100644
--- a/third_party/blink/renderer/core/html/forms/base_text_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/base_text_input_type.cc
@@ -31,8 +31,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 BaseTextInputType::BaseTextInputType(HTMLInputElement& element)
     : TextFieldInputType(element) {}
 
@@ -79,7 +77,8 @@
 }
 
 bool BaseTextInputType::PatternMismatch(const String& value) const {
-  const AtomicString& raw_pattern = GetElement().FastGetAttribute(kPatternAttr);
+  const AtomicString& raw_pattern =
+      GetElement().FastGetAttribute(html_names::kPatternAttr);
   // Empty values can't be mismatched
   if (raw_pattern.IsNull() || value.IsEmpty())
     return false;
diff --git a/third_party/blink/renderer/core/html/forms/clear_button_element.cc b/third_party/blink/renderer/core/html/forms/clear_button_element.cc
index b70daab4..ee72109 100644
--- a/third_party/blink/renderer/core/html/forms/clear_button_element.cc
+++ b/third_party/blink/renderer/core/html/forms/clear_button_element.cc
@@ -33,13 +33,11 @@
 
 namespace blink {
 
-using namespace html_names;
-
 ClearButtonElement::ClearButtonElement(Document& document,
                                        ClearButtonOwner& clear_button_owner)
     : HTMLDivElement(document), clear_button_owner_(&clear_button_owner) {
   SetShadowPseudoId(AtomicString("-webkit-clear-button"));
-  setAttribute(kIdAttr, shadow_element_names::ClearButton());
+  setAttribute(html_names::kIdAttr, shadow_element_names::ClearButton());
 }
 
 void ClearButtonElement::DetachLayoutTree(bool performing_reattach) {
diff --git a/third_party/blink/renderer/core/html/forms/color_input_type.cc b/third_party/blink/renderer/core/html/forms/color_input_type.cc
index 9b488c5..60a03ab 100644
--- a/third_party/blink/renderer/core/html/forms/color_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/color_input_type.cc
@@ -55,8 +55,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 // Upper limit of number of datalist suggestions shown.
 static const unsigned kMaxSuggestions = 1000;
 // Upper limit for the length of the labels for datalist suggestions.
@@ -244,7 +242,7 @@
 }
 
 bool ColorInputType::ShouldShowSuggestions() const {
-  return GetElement().FastHasAttribute(kListAttr);
+  return GetElement().FastHasAttribute(html_names::kListAttr);
 }
 
 Vector<mojom::blink::ColorSuggestionPtr> ColorInputType::Suggestions() const {
diff --git a/third_party/blink/renderer/core/html/forms/date_input_type.cc b/third_party/blink/renderer/core/html/forms/date_input_type.cc
index 90a411f..4eb86fe 100644
--- a/third_party/blink/renderer/core/html/forms/date_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/date_input_type.cc
@@ -42,8 +42,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 static const int kDateDefaultStep = 1;
 static const int kDateDefaultStepBase = 0;
 static const int kDateStepScaleFactor = 86400000;
@@ -109,11 +107,13 @@
     const DateComponents& date) const {
   layout_parameters.date_time_format = layout_parameters.locale.DateFormat();
   layout_parameters.fallback_date_time_format = "yyyy-MM-dd";
-  if (!ParseToDateComponents(GetElement().FastGetAttribute(kMinAttr),
-                             &layout_parameters.minimum))
+  if (!ParseToDateComponents(
+          GetElement().FastGetAttribute(html_names::kMinAttr),
+          &layout_parameters.minimum))
     layout_parameters.minimum = DateComponents();
-  if (!ParseToDateComponents(GetElement().FastGetAttribute(kMaxAttr),
-                             &layout_parameters.maximum))
+  if (!ParseToDateComponents(
+          GetElement().FastGetAttribute(html_names::kMaxAttr),
+          &layout_parameters.maximum))
     layout_parameters.maximum = DateComponents();
   layout_parameters.placeholder_for_day =
       GetLocale().QueryString(IDS_FORM_PLACEHOLDER_FOR_DAY_OF_MONTH_FIELD);
diff --git a/third_party/blink/renderer/core/html/forms/date_time_edit_element.cc b/third_party/blink/renderer/core/html/forms/date_time_edit_element.cc
index 64ef112..3e0d42d 100644
--- a/third_party/blink/renderer/core/html/forms/date_time_edit_element.cc
+++ b/third_party/blink/renderer/core/html/forms/date_time_edit_element.cc
@@ -45,8 +45,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 class DateTimeEditBuilder : private DateTimeFormat::TokenHandler {
  public:
   // The argument objects must be alive until this object dies.
@@ -537,7 +535,7 @@
     : HTMLDivElement(document), edit_control_owner_(&edit_control_owner) {
   SetHasCustomStyleCallbacks();
   SetShadowPseudoId(AtomicString("-webkit-datetime-edit"));
-  setAttribute(kIdAttr, shadow_element_names::DateTimeEdit());
+  setAttribute(html_names::kIdAttr, shadow_element_names::DateTimeEdit());
 }
 
 DateTimeEditElement::~DateTimeEditElement() = default;
diff --git a/third_party/blink/renderer/core/html/forms/date_time_field_element.cc b/third_party/blink/renderer/core/html/forms/date_time_field_element.cc
index 73036e4b..e60c717 100644
--- a/third_party/blink/renderer/core/html/forms/date_time_field_element.cc
+++ b/third_party/blink/renderer/core/html/forms/date_time_field_element.cc
@@ -37,8 +37,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 DateTimeFieldElement::FieldOwner::~FieldOwner() = default;
 
 DateTimeFieldElement::DateTimeFieldElement(Document& document,
@@ -155,12 +153,12 @@
                                       int ax_minimum,
                                       int ax_maximum) {
   // On accessibility, DateTimeFieldElement acts like spin button.
-  setAttribute(kRoleAttr, AtomicString("spinbutton"));
-  setAttribute(kAriaPlaceholderAttr, AtomicString(Placeholder()));
-  setAttribute(kAriaValueminAttr, AtomicString::Number(ax_minimum));
-  setAttribute(kAriaValuemaxAttr, AtomicString::Number(ax_maximum));
+  setAttribute(html_names::kRoleAttr, AtomicString("spinbutton"));
+  setAttribute(html_names::kAriaPlaceholderAttr, AtomicString(Placeholder()));
+  setAttribute(html_names::kAriaValueminAttr, AtomicString::Number(ax_minimum));
+  setAttribute(html_names::kAriaValuemaxAttr, AtomicString::Number(ax_maximum));
 
-  setAttribute(kAriaLabelAttr, AtomicString(ax_help_text));
+  setAttribute(html_names::kAriaLabelAttr, AtomicString(ax_help_text));
   SetShadowPseudoId(pseudo);
   AppendChild(Text::Create(GetDocument(), VisibleValue()));
 }
@@ -178,7 +176,7 @@
 }
 
 bool DateTimeFieldElement::IsDisabled() const {
-  return FastHasAttribute(kDisabledAttr);
+  return FastHasAttribute(html_names::kDisabledAttr);
 }
 
 Locale& DateTimeFieldElement::LocaleForOwner() const {
@@ -196,7 +194,7 @@
 
 void DateTimeFieldElement::SetDisabled() {
   // Set HTML attribute disabled to change apperance.
-  SetBooleanAttribute(kDisabledAttr, true);
+  SetBooleanAttribute(html_names::kDisabledAttr, true);
   SetNeedsStyleRecalc(kSubtreeStyleChange,
                       StyleChangeReasonForTracing::CreateWithExtraData(
                           style_change_reason::kPseudoClass,
@@ -217,12 +215,13 @@
 
   text_node->ReplaceWholeText(new_visible_value);
   if (HasValue()) {
-    setAttribute(kAriaValuenowAttr,
+    setAttribute(html_names::kAriaValuenowAttr,
                  AtomicString::Number(ValueForARIAValueNow()));
-    setAttribute(kAriaValuetextAttr, AtomicString(new_visible_value));
+    setAttribute(html_names::kAriaValuetextAttr,
+                 AtomicString(new_visible_value));
   } else {
-    removeAttribute(kAriaValuenowAttr);
-    removeAttribute(kAriaValuetextAttr);
+    removeAttribute(html_names::kAriaValuenowAttr);
+    removeAttribute(html_names::kAriaValuetextAttr);
   }
 
   if (event_behavior == kDispatchEvent && field_owner_)
diff --git a/third_party/blink/renderer/core/html/forms/date_time_local_input_type.cc b/third_party/blink/renderer/core/html/forms/date_time_local_input_type.cc
index bb6b7b29..f052fb7 100644
--- a/third_party/blink/renderer/core/html/forms/date_time_local_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/date_time_local_input_type.cc
@@ -43,8 +43,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 static const int kDateTimeLocalDefaultStep = 60;
 static const int kDateTimeLocalDefaultStepBase = 0;
 static const int kDateTimeLocalStepScaleFactor = 1000;
@@ -166,11 +164,13 @@
         layout_parameters.locale.DateTimeFormatWithoutSeconds();
     layout_parameters.fallback_date_time_format = "yyyy-MM-dd'T'HH:mm";
   }
-  if (!ParseToDateComponents(GetElement().FastGetAttribute(kMinAttr),
-                             &layout_parameters.minimum))
+  if (!ParseToDateComponents(
+          GetElement().FastGetAttribute(html_names::kMinAttr),
+          &layout_parameters.minimum))
     layout_parameters.minimum = DateComponents();
-  if (!ParseToDateComponents(GetElement().FastGetAttribute(kMaxAttr),
-                             &layout_parameters.maximum))
+  if (!ParseToDateComponents(
+          GetElement().FastGetAttribute(html_names::kMaxAttr),
+          &layout_parameters.maximum))
     layout_parameters.maximum = DateComponents();
   layout_parameters.placeholder_for_day =
       GetLocale().QueryString(IDS_FORM_PLACEHOLDER_FOR_DAY_OF_MONTH_FIELD);
diff --git a/third_party/blink/renderer/core/html/forms/file_input_type.cc b/third_party/blink/renderer/core/html/forms/file_input_type.cc
index e34249b..682a3d88 100644
--- a/third_party/blink/renderer/core/html/forms/file_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/file_input_type.cc
@@ -52,7 +52,6 @@
 namespace blink {
 
 using mojom::blink::FileChooserParams;
-using namespace html_names;
 
 namespace {
 
@@ -169,10 +168,11 @@
 
   if (ChromeClient* chrome_client = GetChromeClient()) {
     FileChooserParams params;
-    bool is_directory = input.FastHasAttribute(kWebkitdirectoryAttr);
+    bool is_directory =
+        input.FastHasAttribute(html_names::kWebkitdirectoryAttr);
     if (is_directory)
       params.mode = FileChooserParams::Mode::kUploadFolder;
-    else if (input.FastHasAttribute(kMultipleAttr))
+    else if (input.FastHasAttribute(html_names::kMultipleAttr))
       params.mode = FileChooserParams::Mode::kOpenMultiple;
     else
       params.mode = FileChooserParams::Mode::kOpen;
@@ -181,7 +181,7 @@
     params.accept_types = CollectAcceptTypes(input);
     params.selected_files = file_list_->PathsForUserVisibleFiles();
     params.use_media_capture = RuntimeEnabledFeatures::MediaCaptureEnabled() &&
-                               input.FastHasAttribute(kCaptureAttr);
+                               input.FastHasAttribute(html_names::kCaptureAttr);
     params.requestor = document.Url();
 
     UseCounter::Count(
@@ -312,7 +312,7 @@
       GetElement().GetDocument(), CreateElementFlags());
   button->setType(input_type_names::kButton);
   button->setAttribute(
-      kValueAttr,
+      html_names::kValueAttr,
       AtomicString(GetLocale().QueryString(
           GetElement().Multiple() ? IDS_FORM_MULTIPLE_FILES_BUTTON_LABEL
                                   : IDS_FORM_FILE_BUTTON_LABEL)));
@@ -326,7 +326,7 @@
         IsA<Element>(GetElement().UserAgentShadowRoot()->firstChild()));
   if (Element* button =
           To<Element>(GetElement().UserAgentShadowRoot()->firstChild()))
-    button->SetBooleanAttribute(kDisabledAttr,
+    button->SetBooleanAttribute(html_names::kDisabledAttr,
                                 GetElement().IsDisabledFormControl());
 }
 
@@ -337,7 +337,7 @@
   if (Element* button =
           To<Element>(GetElement().UserAgentShadowRoot()->firstChild())) {
     button->setAttribute(
-        kValueAttr,
+        html_names::kValueAttr,
         AtomicString(GetLocale().QueryString(
             GetElement().Multiple() ? IDS_FORM_MULTIPLE_FILES_BUTTON_LABEL
                                     : IDS_FORM_FILE_BUTTON_LABEL)));
@@ -417,7 +417,7 @@
     return;
 
   HTMLInputElement& input = GetElement();
-  if (input.FastHasAttribute(kWebkitdirectoryAttr)) {
+  if (input.FastHasAttribute(html_names::kWebkitdirectoryAttr)) {
     SetFilesFromDirectory(paths[0]);
     return;
   }
@@ -426,7 +426,7 @@
   for (const auto& path : paths)
     files.push_back(CreateFileChooserFileInfoNative(path));
 
-  if (input.FastHasAttribute(kMultipleAttr)) {
+  if (input.FastHasAttribute(html_names::kMultipleAttr)) {
     FilesChosen(std::move(files), base::FilePath());
   } else {
     FileChooserFileInfoList first_file_only;
@@ -441,7 +441,7 @@
   if (paths.IsEmpty())
     return false;
 
-  if (!GetElement().FastHasAttribute(kWebkitdirectoryAttr)) {
+  if (!GetElement().FastHasAttribute(html_names::kWebkitdirectoryAttr)) {
     dropped_file_system_id_ = drag_data->DroppedFileSystemId();
   }
   SetFilesFromPaths(paths);
@@ -476,7 +476,7 @@
 }
 
 void FileInputType::HandleKeypressEvent(KeyboardEvent& event) {
-  if (GetElement().FastHasAttribute(kWebkitdirectoryAttr)) {
+  if (GetElement().FastHasAttribute(html_names::kWebkitdirectoryAttr)) {
     // Override to invoke the action on Enter key up (not press) to avoid
     // repeats committing the file chooser.
     if (event.key() == "Enter") {
@@ -488,7 +488,7 @@
 }
 
 void FileInputType::HandleKeyupEvent(KeyboardEvent& event) {
-  if (GetElement().FastHasAttribute(kWebkitdirectoryAttr)) {
+  if (GetElement().FastHasAttribute(html_names::kWebkitdirectoryAttr)) {
     // Override to invoke the action on Enter key up (not press) to avoid
     // repeats committing the file chooser.
     if (event.key() == "Enter") {
diff --git a/third_party/blink/renderer/core/html/forms/form_controller.cc b/third_party/blink/renderer/core/html/forms/form_controller.cc
index 3108ead..cc13fcc 100644
--- a/third_party/blink/renderer/core/html/forms/form_controller.cc
+++ b/third_party/blink/renderer/core/html/forms/form_controller.cc
@@ -40,8 +40,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 namespace {
 
 // TODO(crbug.com/1008708): Remove this flag when we're sure the new behavior
@@ -52,8 +50,9 @@
   // Assume controls with form attribute have no owners because we restore
   // state during parsing and form owners of such controls might be
   // indeterminate.
-  return control.ToHTMLElement().FastHasAttribute(kFormAttr) ? nullptr
-                                                             : control.Form();
+  return control.ToHTMLElement().FastHasAttribute(html_names::kFormAttr)
+             ? nullptr
+             : control.Form();
 }
 
 const AtomicString& ControlType(const ListedElement& control) {
@@ -382,7 +381,7 @@
 }
 
 String FormSignature(const HTMLFormElement& form) {
-  KURL action_url = form.GetURLAttribute(kActionAttr);
+  KURL action_url = form.GetURLAttribute(html_names::kActionAttr);
   // Remove the query part because it might contain volatile parameters such
   // as a session key.
   if (!action_url.IsEmpty())
diff --git a/third_party/blink/renderer/core/html/forms/hidden_input_type.cc b/third_party/blink/renderer/core/html/forms/hidden_input_type.cc
index 8006ff1..ce51f88 100644
--- a/third_party/blink/renderer/core/html/forms/hidden_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/hidden_input_type.cc
@@ -42,8 +42,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 void HiddenInputType::CountUsage() {
   UseCounter::Count(GetElement().GetDocument(), WebFeature::kInputTypeHidden);
 }
@@ -89,7 +87,8 @@
                                bool,
                                TextFieldEventBehavior,
                                TextControlSetValueSelection) {
-  GetElement().setAttribute(kValueAttr, AtomicString(sanitized_value));
+  GetElement().setAttribute(html_names::kValueAttr,
+                            AtomicString(sanitized_value));
 }
 
 void HiddenInputType::AppendToFormData(FormData& form_data) const {
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.cc b/third_party/blink/renderer/core/html/forms/html_button_element.cc
index e4c3beb..0235d96 100644
--- a/third_party/blink/renderer/core/html/forms/html_button_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_button_element.cc
@@ -36,15 +36,13 @@
 
 namespace blink {
 
-using namespace html_names;
-
 HTMLButtonElement::HTMLButtonElement(Document& document)
-    : HTMLFormControlElement(kButtonTag, document),
+    : HTMLFormControlElement(html_names::kButtonTag, document),
       type_(SUBMIT),
       is_activated_submit_(false) {}
 
 void HTMLButtonElement::setType(const AtomicString& type) {
-  setAttribute(kTypeAttr, type);
+  setAttribute(html_names::kTypeAttr, type);
 }
 
 LayoutObject* HTMLButtonElement::CreateLayoutObject(const ComputedStyle&,
@@ -74,7 +72,7 @@
 
 bool HTMLButtonElement::IsPresentationAttribute(
     const QualifiedName& name) const {
-  if (name == kAlignAttr) {
+  if (name == html_names::kAlignAttr) {
     // Don't map 'align' attribute.  This matches what Firefox and IE do, but
     // not Opera.  See http://bugs.webkit.org/show_bug.cgi?id=12071
     return false;
@@ -85,7 +83,7 @@
 
 void HTMLButtonElement::ParseAttribute(
     const AttributeModificationParams& params) {
-  if (params.name == kTypeAttr) {
+  if (params.name == html_names::kTypeAttr) {
     if (DeprecatedEqualIgnoringCase(params.new_value, "reset"))
       type_ = RESET;
     else if (DeprecatedEqualIgnoringCase(params.new_value, "button"))
@@ -96,7 +94,7 @@
     if (formOwner() && isConnected())
       formOwner()->InvalidateDefaultButtonStyle();
   } else {
-    if (params.name == kFormactionAttr)
+    if (params.name == html_names::kFormactionAttr)
       LogUpdateAttributeIfIsolatedWorldAndInDocument("button", params);
     HTMLFormControlElement::ParseAttribute(params);
   }
@@ -188,12 +186,12 @@
 }
 
 bool HTMLButtonElement::IsURLAttribute(const Attribute& attribute) const {
-  return attribute.GetName() == kFormactionAttr ||
+  return attribute.GetName() == html_names::kFormactionAttr ||
          HTMLFormControlElement::IsURLAttribute(attribute);
 }
 
 const AtomicString& HTMLButtonElement::Value() const {
-  return getAttribute(kValueAttr);
+  return getAttribute(html_names::kValueAttr);
 }
 
 bool HTMLButtonElement::RecalcWillValidate() const {
@@ -215,8 +213,9 @@
     ContainerNode& insertion_point) {
   InsertionNotificationRequest request =
       HTMLFormControlElement::InsertedInto(insertion_point);
-  LogAddElementIfIsolatedWorldAndInDocument("button", kTypeAttr,
-                                            kFormmethodAttr, kFormactionAttr);
+  LogAddElementIfIsolatedWorldAndInDocument("button", html_names::kTypeAttr,
+                                            html_names::kFormmethodAttr,
+                                            html_names::kFormactionAttr);
   return request;
 }
 
diff --git a/third_party/blink/renderer/core/html/forms/html_field_set_element.cc b/third_party/blink/renderer/core/html/forms/html_field_set_element.cc
index 2dca9969f..218699b 100644
--- a/third_party/blink/renderer/core/html/forms/html_field_set_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_field_set_element.cc
@@ -38,10 +38,8 @@
 
 namespace blink {
 
-using namespace html_names;
-
 HTMLFieldSetElement::HTMLFieldSetElement(Document& document)
-    : HTMLFormControlElement(kFieldsetTag, document) {}
+    : HTMLFormControlElement(html_names::kFieldsetTag, document) {}
 
 bool HTMLFieldSetElement::MatchesValidityPseudoClasses() const {
   return true;
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
index a0b23f3b..a6c58e3 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
@@ -41,8 +41,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 HTMLFormControlElement::HTMLFormControlElement(const QualifiedName& tag_name,
                                                Document& document)
     : HTMLElement(tag_name, document),
@@ -61,7 +59,7 @@
 }
 
 String HTMLFormControlElement::formAction() const {
-  const AtomicString& action = FastGetAttribute(kFormactionAttr);
+  const AtomicString& action = FastGetAttribute(html_names::kFormactionAttr);
   if (action.IsEmpty()) {
     return GetDocument().Url();
   }
@@ -69,22 +67,24 @@
 }
 
 void HTMLFormControlElement::setFormAction(const AtomicString& value) {
-  setAttribute(kFormactionAttr, value);
+  setAttribute(html_names::kFormactionAttr, value);
 }
 
 String HTMLFormControlElement::formEnctype() const {
-  const AtomicString& form_enctype_attr = FastGetAttribute(kFormenctypeAttr);
+  const AtomicString& form_enctype_attr =
+      FastGetAttribute(html_names::kFormenctypeAttr);
   if (form_enctype_attr.IsNull())
     return g_empty_string;
   return FormSubmission::Attributes::ParseEncodingType(form_enctype_attr);
 }
 
 void HTMLFormControlElement::setFormEnctype(const AtomicString& value) {
-  setAttribute(kFormenctypeAttr, value);
+  setAttribute(html_names::kFormenctypeAttr, value);
 }
 
 String HTMLFormControlElement::formMethod() const {
-  const AtomicString& form_method_attr = FastGetAttribute(kFormmethodAttr);
+  const AtomicString& form_method_attr =
+      FastGetAttribute(html_names::kFormmethodAttr);
   if (form_method_attr.IsNull())
     return g_empty_string;
   return FormSubmission::Attributes::MethodString(
@@ -92,11 +92,11 @@
 }
 
 void HTMLFormControlElement::setFormMethod(const AtomicString& value) {
-  setAttribute(kFormmethodAttr, value);
+  setAttribute(html_names::kFormmethodAttr, value);
 }
 
 bool HTMLFormControlElement::FormNoValidate() const {
-  return FastHasAttribute(kFormnovalidateAttr);
+  return FastHasAttribute(html_names::kFormnovalidateAttr);
 }
 
 void HTMLFormControlElement::Reset() {
@@ -107,7 +107,7 @@
 void HTMLFormControlElement::AttributeChanged(
     const AttributeModificationParams& params) {
   HTMLElement::AttributeChanged(params);
-  if (params.name == kDisabledAttr &&
+  if (params.name == html_names::kDisabledAttr &&
       params.old_value.IsNull() != params.new_value.IsNull()) {
     DisabledAttributeChanged();
     if (params.reason == AttributeModificationReason::kDirectly &&
@@ -119,10 +119,10 @@
 void HTMLFormControlElement::ParseAttribute(
     const AttributeModificationParams& params) {
   const QualifiedName& name = params.name;
-  if (name == kFormAttr) {
+  if (name == html_names::kFormAttr) {
     FormAttributeChanged();
     UseCounter::Count(GetDocument(), WebFeature::kFormAttribute);
-  } else if (name == kReadonlyAttr) {
+  } else if (name == html_names::kReadonlyAttr) {
     if (params.old_value.IsNull() != params.new_value.IsNull()) {
       UpdateWillValidateCache();
       PseudoStateChanged(CSSSelector::kPseudoReadOnly);
@@ -130,11 +130,11 @@
       if (LayoutObject* o = GetLayoutObject())
         o->InvalidateIfControlStateChanged(kReadOnlyControlState);
     }
-  } else if (name == kRequiredAttr) {
+  } else if (name == html_names::kRequiredAttr) {
     if (params.old_value.IsNull() != params.new_value.IsNull())
       RequiredAttributeChanged();
     UseCounter::Count(GetDocument(), WebFeature::kRequiredAttribute);
-  } else if (name == kAutofocusAttr) {
+  } else if (name == html_names::kAutofocusAttr) {
     HTMLElement::ParseAttribute(params);
     UseCounter::Count(GetDocument(), WebFeature::kAutoFocusAttribute);
   } else {
@@ -190,7 +190,7 @@
 }
 
 const AtomicString& HTMLFormControlElement::autocapitalize() const {
-  if (!FastGetAttribute(kAutocapitalizeAttr).IsEmpty())
+  if (!FastGetAttribute(html_names::kAutocapitalizeAttr).IsEmpty())
     return HTMLElement::autocapitalize();
 
   // If the form control itself does not have the autocapitalize attribute set,
@@ -266,11 +266,11 @@
 }
 
 bool HTMLFormControlElement::IsRequired() const {
-  return FastHasAttribute(kRequiredAttr);
+  return FastHasAttribute(html_names::kRequiredAttr);
 }
 
 String HTMLFormControlElement::ResultForDialogSubmit() {
-  return FastGetAttribute(kValueAttr);
+  return FastGetAttribute(html_names::kValueAttr);
 }
 
 void HTMLFormControlElement::DidRecalcStyle(const StyleRecalcChange change) {
diff --git a/third_party/blink/renderer/core/html/forms/html_form_controls_collection.cc b/third_party/blink/renderer/core/html/forms/html_form_controls_collection.cc
index 39908f4..a7dbe1a 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_controls_collection.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_controls_collection.cc
@@ -33,8 +33,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 // Since the collections are to be "live", we have to do the
 // calculation every time if anything has changed.
 
@@ -107,7 +105,8 @@
 static HTMLElement* FirstNamedItem(const ListedElement::List& elements_array,
                                    const QualifiedName& attr_name,
                                    const String& name) {
-  DCHECK(attr_name == kIdAttr || attr_name == kNameAttr);
+  DCHECK(attr_name == html_names::kIdAttr ||
+         attr_name == html_names::kNameAttr);
 
   for (const auto& listed_element : elements_array) {
     HTMLElement& element = listed_element->ToHTMLElement();
@@ -125,9 +124,10 @@
   // attribute. If a match is not found, the method then searches for an
   // object with a matching name attribute, but only on those elements
   // that are allowed a name attribute.
-  if (HTMLElement* item = FirstNamedItem(ListedElements(), kIdAttr, name))
+  if (HTMLElement* item =
+          FirstNamedItem(ListedElements(), html_names::kIdAttr, name))
     return item;
-  return FirstNamedItem(ListedElements(), kNameAttr, name);
+  return FirstNamedItem(ListedElements(), html_names::kNameAttr, name);
 }
 
 void HTMLFormControlsCollection::UpdateIdNameCache() const {
diff --git a/third_party/blink/renderer/core/html/forms/html_form_element.cc b/third_party/blink/renderer/core/html/forms/html_form_element.cc
index 98908f03..e8af5a0 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_element.cc
@@ -69,10 +69,8 @@
 
 namespace blink {
 
-using namespace html_names;
-
 HTMLFormElement::HTMLFormElement(Document& document)
-    : HTMLElement(kFormTag, document),
+    : HTMLElement(html_names::kFormTag, document),
       listed_elements_are_dirty_(false),
       image_elements_are_dirty_(false),
       has_elements_associated_by_parser_(false),
@@ -112,7 +110,8 @@
 Node::InsertionNotificationRequest HTMLFormElement::InsertedInto(
     ContainerNode& insertion_point) {
   HTMLElement::InsertedInto(insertion_point);
-  LogAddElementIfIsolatedWorldAndInDocument("form", kMethodAttr, kActionAttr);
+  LogAddElementIfIsolatedWorldAndInDocument("form", html_names::kMethodAttr,
+                                            html_names::kActionAttr);
   if (insertion_point.isConnected())
     GetDocument().DidAssociateFormControl(this);
   return kInsertionDone;
@@ -532,7 +531,7 @@
                                              submission->Action())) {
     UseCounter::Count(GetDocument(), WebFeature::kMixedContentFormsSubmitted);
   }
-  if (FastHasAttribute(kDisabledAttr)) {
+  if (FastHasAttribute(html_names::kDisabledAttr)) {
     UseCounter::Count(GetDocument(),
                       WebFeature::kFormDisabledAttributePresentAndSubmit);
   }
@@ -570,7 +569,7 @@
 void HTMLFormElement::ParseAttribute(
     const AttributeModificationParams& params) {
   const QualifiedName& name = params.name;
-  if (name == kActionAttr) {
+  if (name == html_names::kActionAttr) {
     attributes_.ParseAction(params.new_value);
     LogUpdateAttributeIfIsolatedWorldAndInDocument("form", params);
 
@@ -586,15 +585,15 @@
                                                action_url)) {
       UseCounter::Count(GetDocument(), WebFeature::kMixedContentFormPresent);
     }
-  } else if (name == kTargetAttr) {
+  } else if (name == html_names::kTargetAttr) {
     attributes_.SetTarget(params.new_value);
-  } else if (name == kMethodAttr) {
+  } else if (name == html_names::kMethodAttr) {
     attributes_.UpdateMethodType(params.new_value);
-  } else if (name == kEnctypeAttr) {
+  } else if (name == html_names::kEnctypeAttr) {
     attributes_.UpdateEncodingType(params.new_value);
-  } else if (name == kAcceptCharsetAttr) {
+  } else if (name == html_names::kAcceptCharsetAttr) {
     attributes_.SetAcceptCharset(params.new_value);
-  } else if (name == kDisabledAttr) {
+  } else if (name == html_names::kDisabledAttr) {
     UseCounter::Count(GetDocument(), WebFeature::kFormDisabledAttributePresent);
   } else {
     HTMLElement::ParseAttribute(params);
@@ -604,7 +603,7 @@
 void HTMLFormElement::Associate(ListedElement& e) {
   listed_elements_are_dirty_ = true;
   listed_elements_.clear();
-  if (e.ToHTMLElement().FastHasAttribute(kFormAttr))
+  if (e.ToHTMLElement().FastHasAttribute(html_names::kFormAttr))
     has_elements_associated_by_form_attribute_ = true;
 }
 
@@ -620,12 +619,13 @@
 }
 
 bool HTMLFormElement::IsURLAttribute(const Attribute& attribute) const {
-  return attribute.GetName() == kActionAttr ||
+  return attribute.GetName() == html_names::kActionAttr ||
          HTMLElement::IsURLAttribute(attribute);
 }
 
 bool HTMLFormElement::HasLegalLinkAttribute(const QualifiedName& name) const {
-  return name == kActionAttr || HTMLElement::HasLegalLinkAttribute(name);
+  return name == html_names::kActionAttr ||
+         HTMLElement::HasLegalLinkAttribute(name);
 }
 
 void HTMLFormElement::Associate(HTMLImageElement& e) {
@@ -705,7 +705,7 @@
 }
 
 bool HTMLFormElement::NoValidate() const {
-  return FastHasAttribute(kNovalidateAttr);
+  return FastHasAttribute(html_names::kNovalidateAttr);
 }
 
 String HTMLFormElement::action() const {
@@ -717,11 +717,11 @@
 }
 
 void HTMLFormElement::setAction(const AtomicString& value) {
-  setAttribute(kActionAttr, value);
+  setAttribute(html_names::kActionAttr, value);
 }
 
 void HTMLFormElement::setEnctype(const AtomicString& value) {
-  setAttribute(kEnctypeAttr, value);
+  setAttribute(html_names::kEnctypeAttr, value);
 }
 
 String HTMLFormElement::method() const {
@@ -729,7 +729,7 @@
 }
 
 void HTMLFormElement::setMethod(const AtomicString& value) {
-  setAttribute(kMethodAttr, value);
+  setAttribute(html_names::kMethodAttr, value);
 }
 
 HTMLFormControlElement* HTMLFormElement::FindDefaultButton() const {
@@ -839,8 +839,8 @@
 }
 
 bool HTMLFormElement::ShouldAutocomplete() const {
-  return !DeprecatedEqualIgnoringCase(FastGetAttribute(kAutocompleteAttr),
-                                      "off");
+  return !DeprecatedEqualIgnoringCase(
+      FastGetAttribute(html_names::kAutocompleteAttr), "off");
 }
 
 void HTMLFormElement::FinishParsingChildren() {
diff --git a/third_party/blink/renderer/core/html/forms/html_input_element.cc b/third_party/blink/renderer/core/html/forms/html_input_element.cc
index 95b60ca1..13e9a35 100644
--- a/third_party/blink/renderer/core/html/forms/html_input_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_input_element.cc
@@ -83,7 +83,6 @@
 namespace blink {
 
 using ValueMode = InputType::ValueMode;
-using namespace html_names;
 
 class ListAttributeTargetObserver : public IdTargetObserver {
  public:
@@ -100,7 +99,7 @@
 
 HTMLInputElement::HTMLInputElement(Document& document,
                                    const CreateElementFlags flags)
-    : TextControlElement(kInputTag, document),
+    : TextControlElement(html_names::kInputTag, document),
       size_(kDefaultSize),
       has_dirty_value_(false),
       is_checked_(false),
@@ -355,7 +354,7 @@
 }
 
 void HTMLInputElement::setType(const AtomicString& type) {
-  setAttribute(kTypeAttr, type);
+  setAttribute(html_names::kTypeAttr, type);
 }
 
 void HTMLInputElement::InitializeTypeInParsing() {
@@ -364,10 +363,10 @@
   DCHECK(!input_type_view_);
 
   const AtomicString& new_type_name =
-      InputType::NormalizeTypeName(FastGetAttribute(kTypeAttr));
+      InputType::NormalizeTypeName(FastGetAttribute(html_names::kTypeAttr));
   input_type_ = InputType::Create(*this, new_type_name);
   input_type_view_ = input_type_->CreateView();
-  String default_value = FastGetAttribute(kValueAttr);
+  String default_value = FastGetAttribute(html_names::kValueAttr);
   if (input_type_->GetValueMode() == ValueMode::kValue)
     non_attribute_value_ = SanitizeValue(default_value);
   has_been_password_field_ |= new_type_name == input_type_names::kPassword;
@@ -390,7 +389,7 @@
   DCHECK(input_type_view_);
 
   const AtomicString& new_type_name =
-      InputType::NormalizeTypeName(FastGetAttribute(kTypeAttr));
+      InputType::NormalizeTypeName(FastGetAttribute(html_names::kTypeAttr));
   if (input_type_->FormControlType() == new_type_name)
     return;
 
@@ -470,7 +469,7 @@
       (new_value_mode == ValueMode::kDefault ||
        new_value_mode == ValueMode::kDefaultOn)) {
     if (HasDirtyValue())
-      setAttribute(kValueAttr, AtomicString(non_attribute_value_));
+      setAttribute(html_names::kValueAttr, AtomicString(non_attribute_value_));
     non_attribute_value_ = String();
     has_dirty_value_ = false;
   }
@@ -482,7 +481,7 @@
   // set the control's dirty value flag to false.
   else if (old_value_mode != ValueMode::kValue &&
            new_value_mode == ValueMode::kValue) {
-    AtomicString value_string = FastGetAttribute(kValueAttr);
+    AtomicString value_string = FastGetAttribute(html_names::kValueAttr);
     input_type_->WarnIfValueIsInvalid(value_string);
     non_attribute_value_ = SanitizeValue(value_string);
     has_dirty_value_ = false;
@@ -499,7 +498,7 @@
   } else {
     // ValueMode wasn't changed, or kDefault <-> kDefaultOn.
     if (!HasDirtyValue()) {
-      String default_value = FastGetAttribute(kValueAttr);
+      String default_value = FastGetAttribute(html_names::kValueAttr);
       if (!default_value.IsNull())
         input_type_->WarnIfValueIsInvalid(default_value);
     }
@@ -522,19 +521,19 @@
       input_type_->ShouldRespectHeightAndWidthAttributes()) {
     DCHECK(GetElementData());
     AttributeCollection attributes = AttributesWithoutUpdate();
-    if (const Attribute* height = attributes.Find(kHeightAttr)) {
+    if (const Attribute* height = attributes.Find(html_names::kHeightAttr)) {
       TextControlElement::AttributeChanged(AttributeModificationParams(
-          kHeightAttr, height->Value(), height->Value(),
+          html_names::kHeightAttr, height->Value(), height->Value(),
           AttributeModificationReason::kDirectly));
     }
-    if (const Attribute* width = attributes.Find(kWidthAttr)) {
+    if (const Attribute* width = attributes.Find(html_names::kWidthAttr)) {
       TextControlElement::AttributeChanged(AttributeModificationParams(
-          kWidthAttr, width->Value(), width->Value(),
+          html_names::kWidthAttr, width->Value(), width->Value(),
           AttributeModificationReason::kDirectly));
     }
-    if (const Attribute* align = attributes.Find(kAlignAttr)) {
+    if (const Attribute* align = attributes.Find(html_names::kAlignAttr)) {
       TextControlElement::AttributeChanged(AttributeModificationParams(
-          kAlignAttr, align->Value(), align->Value(),
+          html_names::kAlignAttr, align->Value(), align->Value(),
           AttributeModificationReason::kDirectly));
     }
   }
@@ -705,9 +704,10 @@
 bool HTMLInputElement::IsPresentationAttribute(
     const QualifiedName& name) const {
   // FIXME: Remove type check.
-  if (name == kVspaceAttr || name == kHspaceAttr || name == kAlignAttr ||
-      name == kWidthAttr || name == kHeightAttr ||
-      (name == kBorderAttr && type() == input_type_names::kImage))
+  if (name == html_names::kVspaceAttr || name == html_names::kHspaceAttr ||
+      name == html_names::kAlignAttr || name == html_names::kWidthAttr ||
+      name == html_names::kHeightAttr ||
+      (name == html_names::kBorderAttr && type() == input_type_names::kImage))
     return true;
   return TextControlElement::IsPresentationAttribute(name);
 }
@@ -716,22 +716,22 @@
     const QualifiedName& name,
     const AtomicString& value,
     MutableCSSPropertyValueSet* style) {
-  if (name == kVspaceAttr) {
+  if (name == html_names::kVspaceAttr) {
     AddHTMLLengthToStyle(style, CSSPropertyID::kMarginTop, value);
     AddHTMLLengthToStyle(style, CSSPropertyID::kMarginBottom, value);
-  } else if (name == kHspaceAttr) {
+  } else if (name == html_names::kHspaceAttr) {
     AddHTMLLengthToStyle(style, CSSPropertyID::kMarginLeft, value);
     AddHTMLLengthToStyle(style, CSSPropertyID::kMarginRight, value);
-  } else if (name == kAlignAttr) {
+  } else if (name == html_names::kAlignAttr) {
     if (input_type_->ShouldRespectAlignAttribute())
       ApplyAlignmentAttributeToStyle(value, style);
-  } else if (name == kWidthAttr) {
+  } else if (name == html_names::kWidthAttr) {
     if (input_type_->ShouldRespectHeightAndWidthAttributes())
       AddHTMLLengthToStyle(style, CSSPropertyID::kWidth, value);
-  } else if (name == kHeightAttr) {
+  } else if (name == html_names::kHeightAttr) {
     if (input_type_->ShouldRespectHeightAndWidthAttributes())
       AddHTMLLengthToStyle(style, CSSPropertyID::kHeight, value);
-  } else if (name == kBorderAttr &&
+  } else if (name == html_names::kBorderAttr &&
              type() == input_type_names::kImage) {  // FIXME: Remove type check.
     ApplyBorderAttributeToStyle(value, style);
   } else {
@@ -747,12 +747,12 @@
   const QualifiedName& name = params.name;
   const AtomicString& value = params.new_value;
 
-  if (name == kNameAttr) {
+  if (name == html_names::kNameAttr) {
     RemoveFromRadioButtonGroup();
     name_ = value;
     AddToRadioButtonGroup();
     TextControlElement::ParseAttribute(params);
-  } else if (name == kAutocompleteAttr) {
+  } else if (name == html_names::kAutocompleteAttr) {
     if (DeprecatedEqualIgnoringCase(value, "off")) {
       autocomplete_ = kOff;
     } else {
@@ -761,9 +761,9 @@
       else
         autocomplete_ = kOn;
     }
-  } else if (name == kTypeAttr) {
+  } else if (name == html_names::kTypeAttr) {
     UpdateType();
-  } else if (name == kValueAttr) {
+  } else if (name == html_names::kValueAttr) {
     // We only need to setChanged if the form is looking at the default value
     // right now.
     if (!HasDirtyValue()) {
@@ -772,14 +772,14 @@
       UpdatePlaceholderVisibility();
       SetNeedsStyleRecalc(
           kSubtreeStyleChange,
-          StyleChangeReasonForTracing::FromAttribute(kValueAttr));
+          StyleChangeReasonForTracing::FromAttribute(html_names::kValueAttr));
     }
     needs_to_update_view_value_ = true;
     SetNeedsValidityCheck();
     input_type_->WarnIfValueIsInvalidAndElementIsVisible(value);
     input_type_->InRangeChanged();
     input_type_view_->ValueAttributeChanged();
-  } else if (name == kCheckedAttr) {
+  } else if (name == html_names::kCheckedAttr) {
     // Another radio button in the same group might be checked by state
     // restore. We shouldn't call setChecked() even if this has the checked
     // attribute. So, delay the setChecked() call until
@@ -791,11 +791,11 @@
       dirty_checkedness_ = false;
     }
     PseudoStateChanged(CSSSelector::kPseudoDefault);
-  } else if (name == kMaxlengthAttr) {
+  } else if (name == html_names::kMaxlengthAttr) {
     SetNeedsValidityCheck();
-  } else if (name == kMinlengthAttr) {
+  } else if (name == html_names::kMinlengthAttr) {
     SetNeedsValidityCheck();
-  } else if (name == kSizeAttr) {
+  } else if (name == html_names::kSizeAttr) {
     unsigned size = 0;
     if (value.IsEmpty() || !ParseHTMLNonNegativeInteger(value, size) ||
         size == 0 || size > 0x7fffffffu)
@@ -808,56 +808,57 @@
                 layout_invalidation_reason::kAttributeChanged);
       }
     }
-  } else if (name == kAltAttr) {
+  } else if (name == html_names::kAltAttr) {
     input_type_view_->AltAttributeChanged();
-  } else if (name == kSrcAttr) {
+  } else if (name == html_names::kSrcAttr) {
     input_type_view_->SrcAttributeChanged();
-  } else if (name == kUsemapAttr || name == kAccesskeyAttr) {
+  } else if (name == html_names::kUsemapAttr ||
+             name == html_names::kAccesskeyAttr) {
     // FIXME: ignore for the moment
-  } else if (name == kOnsearchAttr) {
+  } else if (name == html_names::kOnsearchAttr) {
     // Search field and slider attributes all just cause updateFromElement to be
     // called through style recalcing.
     SetAttributeEventListener(event_type_names::kSearch,
                               CreateAttributeEventListener(this, name, value));
-  } else if (name == kIncrementalAttr) {
+  } else if (name == html_names::kIncrementalAttr) {
     UseCounter::Count(GetDocument(), WebFeature::kIncrementalAttribute);
-  } else if (name == kMinAttr) {
+  } else if (name == html_names::kMinAttr) {
     input_type_view_->MinOrMaxAttributeChanged();
     input_type_->SanitizeValueInResponseToMinOrMaxAttributeChange();
     input_type_->InRangeChanged();
     SetNeedsValidityCheck();
     UseCounter::Count(GetDocument(), WebFeature::kMinAttribute);
-  } else if (name == kMaxAttr) {
+  } else if (name == html_names::kMaxAttr) {
     input_type_view_->MinOrMaxAttributeChanged();
     input_type_->SanitizeValueInResponseToMinOrMaxAttributeChange();
     input_type_->InRangeChanged();
     SetNeedsValidityCheck();
     UseCounter::Count(GetDocument(), WebFeature::kMaxAttribute);
-  } else if (name == kMultipleAttr) {
+  } else if (name == html_names::kMultipleAttr) {
     input_type_view_->MultipleAttributeChanged();
     SetNeedsValidityCheck();
-  } else if (name == kStepAttr) {
+  } else if (name == html_names::kStepAttr) {
     input_type_view_->StepAttributeChanged();
     SetNeedsValidityCheck();
     UseCounter::Count(GetDocument(), WebFeature::kStepAttribute);
-  } else if (name == kPatternAttr) {
+  } else if (name == html_names::kPatternAttr) {
     SetNeedsValidityCheck();
     UseCounter::Count(GetDocument(), WebFeature::kPatternAttribute);
-  } else if (name == kReadonlyAttr) {
+  } else if (name == html_names::kReadonlyAttr) {
     TextControlElement::ParseAttribute(params);
     input_type_view_->ReadonlyAttributeChanged();
-  } else if (name == kListAttr) {
+  } else if (name == html_names::kListAttr) {
     has_non_empty_list_ = !value.IsEmpty();
     if (has_non_empty_list_) {
       ResetListAttributeTargetObserver();
       ListAttributeTargetChanged();
     }
     UseCounter::Count(GetDocument(), WebFeature::kListAttribute);
-  } else if (name == kWebkitdirectoryAttr) {
+  } else if (name == html_names::kWebkitdirectoryAttr) {
     TextControlElement::ParseAttribute(params);
     UseCounter::Count(GetDocument(), WebFeature::kPrefixedDirectoryAttribute);
   } else {
-    if (name == kFormactionAttr)
+    if (name == html_names::kFormactionAttr)
       LogUpdateAttributeIfIsolatedWorldAndInDocument("input", params);
     TextControlElement::ParseAttribute(params);
   }
@@ -874,7 +875,7 @@
   DCHECK(input_type_view_);
   TextControlElement::FinishParsingChildren();
   if (!state_restored_) {
-    bool checked = hasAttribute(kCheckedAttr);
+    bool checked = hasAttribute(html_names::kCheckedAttr);
     if (checked)
       setChecked(checked);
     dirty_checkedness_ = false;
@@ -908,12 +909,12 @@
   // http://www.w3.org/TR/1998/REC-html40-19980424/appendix/notes.html#altgen
   // also heavily discussed by Hixie on bugzilla
   // note this is intentionally different to HTMLImageElement::altText()
-  String alt = FastGetAttribute(kAltAttr);
+  String alt = FastGetAttribute(html_names::kAltAttr);
   // fall back to title attribute
   if (alt.IsNull())
-    alt = FastGetAttribute(kTitleAttr);
+    alt = FastGetAttribute(html_names::kTitleAttr);
   if (alt.IsNull())
-    alt = FastGetAttribute(kValueAttr);
+    alt = FastGetAttribute(html_names::kValueAttr);
   if (alt.IsNull())
     alt = GetLocale().QueryString(IDS_FORM_INPUT_ALT);
   return alt;
@@ -949,7 +950,7 @@
     SetNeedsValidityCheck();
   }
 
-  setChecked(hasAttribute(kCheckedAttr));
+  setChecked(hasAttribute(html_names::kCheckedAttr));
   dirty_checkedness_ = false;
 }
 
@@ -1059,9 +1060,9 @@
     case ValueMode::kFilename:
       return input_type_->ValueInFilenameValueMode();
     case ValueMode::kDefault:
-      return FastGetAttribute(kValueAttr);
+      return FastGetAttribute(html_names::kValueAttr);
     case ValueMode::kDefaultOn: {
-      AtomicString value_string = FastGetAttribute(kValueAttr);
+      AtomicString value_string = FastGetAttribute(html_names::kValueAttr);
       return value_string.IsNull() ? "on" : value_string;
     }
     case ValueMode::kValue:
@@ -1411,8 +1412,8 @@
 }
 
 bool HTMLInputElement::IsURLAttribute(const Attribute& attribute) const {
-  return attribute.GetName() == kSrcAttr ||
-         attribute.GetName() == kFormactionAttr ||
+  return attribute.GetName() == html_names::kSrcAttr ||
+         attribute.GetName() == html_names::kFormactionAttr ||
          TextControlElement::IsURLAttribute(attribute);
 }
 
@@ -1426,7 +1427,7 @@
 }
 
 const AtomicString& HTMLInputElement::DefaultValue() const {
-  return FastGetAttribute(kValueAttr);
+  return FastGetAttribute(html_names::kValueAttr);
 }
 
 static inline bool IsRFC2616TokenCharacter(UChar ch) {
@@ -1474,20 +1475,21 @@
 }
 
 Vector<String> HTMLInputElement::AcceptMIMETypes() const {
-  return ParseAcceptAttribute(FastGetAttribute(kAcceptAttr), IsValidMIMEType);
+  return ParseAcceptAttribute(FastGetAttribute(html_names::kAcceptAttr),
+                              IsValidMIMEType);
 }
 
 Vector<String> HTMLInputElement::AcceptFileExtensions() const {
-  return ParseAcceptAttribute(FastGetAttribute(kAcceptAttr),
+  return ParseAcceptAttribute(FastGetAttribute(html_names::kAcceptAttr),
                               IsValidFileExtension);
 }
 
 const AtomicString& HTMLInputElement::Alt() const {
-  return FastGetAttribute(kAltAttr);
+  return FastGetAttribute(html_names::kAltAttr);
 }
 
 bool HTMLInputElement::Multiple() const {
-  return FastHasAttribute(kMultipleAttr);
+  return FastHasAttribute(html_names::kMultipleAttr);
 }
 
 void HTMLInputElement::setSize(unsigned size, ExceptionState& exception_state) {
@@ -1496,13 +1498,13 @@
         DOMExceptionCode::kIndexSizeError,
         "The value provided is 0, which is an invalid size.");
   } else {
-    SetUnsignedIntegralAttribute(kSizeAttr, size ? size : kDefaultSize,
-                                 kDefaultSize);
+    SetUnsignedIntegralAttribute(html_names::kSizeAttr,
+                                 size ? size : kDefaultSize, kDefaultSize);
   }
 }
 
 KURL HTMLInputElement::Src() const {
-  return GetDocument().CompleteURL(FastGetAttribute(kSrcAttr));
+  return GetDocument().CompleteURL(FastGetAttribute(html_names::kSrcAttr));
 }
 
 FileList* HTMLInputElement::files() const {
@@ -1590,8 +1592,8 @@
   if (insertion_point.isConnected() && !Form())
     AddToRadioButtonGroup();
   ResetListAttributeTargetObserver();
-  LogAddElementIfIsolatedWorldAndInDocument("input", kTypeAttr,
-                                            kFormactionAttr);
+  LogAddElementIfIsolatedWorldAndInDocument("input", html_names::kTypeAttr,
+                                            html_names::kFormactionAttr);
   return kInsertionShouldCallDidNotifySubtreeInsertions;
 }
 
@@ -1654,7 +1656,7 @@
     return nullptr;
 
   return ToHTMLDataListElementOrNull(
-      GetTreeScope().getElementById(FastGetAttribute(kListAttr)));
+      GetTreeScope().getElementById(FastGetAttribute(html_names::kListAttr)));
 }
 
 bool HTMLInputElement::HasValidDataListOptions() const {
@@ -1712,7 +1714,7 @@
 }
 
 void HTMLInputElement::ResetListAttributeTargetObserver() {
-  const AtomicString& value = FastGetAttribute(kListAttr);
+  const AtomicString& value = FastGetAttribute(html_names::kListAttr);
   if (!value.IsNull() && isConnected()) {
     SetListAttributeTargetObserver(
         MakeGarbageCollected<ListAttributeTargetObserver>(value, this));
@@ -1826,11 +1828,11 @@
 }
 
 void HTMLInputElement::setHeight(unsigned height) {
-  SetUnsignedIntegralAttribute(kHeightAttr, height);
+  SetUnsignedIntegralAttribute(html_names::kHeightAttr, height);
 }
 
 void HTMLInputElement::setWidth(unsigned width) {
-  SetUnsignedIntegralAttribute(kWidthAttr, width);
+  SetUnsignedIntegralAttribute(html_names::kWidthAttr, width);
 }
 
 ListAttributeTargetObserver::ListAttributeTargetObserver(
diff --git a/third_party/blink/renderer/core/html/forms/html_label_element.cc b/third_party/blink/renderer/core/html/forms/html_label_element.cc
index b0b8633..ef577b5 100644
--- a/third_party/blink/renderer/core/html/forms/html_label_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_label_element.cc
@@ -43,14 +43,12 @@
 
 namespace blink {
 
-using namespace html_names;
-
 HTMLLabelElement::HTMLLabelElement(Document& document)
-    : HTMLElement(kLabelTag, document), processing_click_(false) {}
+    : HTMLElement(html_names::kLabelTag, document), processing_click_(false) {}
 
 HTMLElement* HTMLLabelElement::control() const {
   // https://html.spec.whatwg.org/C/#labeled-control
-  const AtomicString& control_id = getAttribute(kForAttr);
+  const AtomicString& control_id = getAttribute(html_names::kForAttr);
   if (control_id.IsNull()) {
     // "If the for attribute is not specified, but the label element has a
     // labelable element descendant, then the first such descendant in tree
diff --git a/third_party/blink/renderer/core/html/forms/html_legend_element.cc b/third_party/blink/renderer/core/html/forms/html_legend_element.cc
index e6c49b8..2bd9da3 100644
--- a/third_party/blink/renderer/core/html/forms/html_legend_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_legend_element.cc
@@ -30,10 +30,8 @@
 
 namespace blink {
 
-using namespace html_names;
-
 HTMLLegendElement::HTMLLegendElement(Document& document)
-    : HTMLElement(kLegendTag, document) {}
+    : HTMLElement(html_names::kLegendTag, document) {}
 
 HTMLFormElement* HTMLLegendElement::form() const {
   // According to the specification, If the legend has a fieldset element as
diff --git a/third_party/blink/renderer/core/html/forms/html_opt_group_element.cc b/third_party/blink/renderer/core/html/forms/html_opt_group_element.cc
index c7659e3..dccdeebc 100644
--- a/third_party/blink/renderer/core/html/forms/html_opt_group_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_opt_group_element.cc
@@ -39,10 +39,8 @@
 
 namespace blink {
 
-using namespace html_names;
-
 HTMLOptGroupElement::HTMLOptGroupElement(Document& document)
-    : HTMLElement(kOptgroupTag, document) {
+    : HTMLElement(html_names::kOptgroupTag, document) {
   EnsureUserAgentShadowRoot();
 }
 
@@ -55,21 +53,22 @@
 
 // static
 bool HTMLOptGroupElement::CanAssignToOptGroupSlot(const Node& node) {
-  return node.HasTagName(kOptionTag) || node.HasTagName(kHrTag);
+  return node.HasTagName(html_names::kOptionTag) ||
+         node.HasTagName(html_names::kHrTag);
 }
 
 bool HTMLOptGroupElement::IsDisabledFormControl() const {
-  return FastHasAttribute(kDisabledAttr);
+  return FastHasAttribute(html_names::kDisabledAttr);
 }
 
 void HTMLOptGroupElement::ParseAttribute(
     const AttributeModificationParams& params) {
   HTMLElement::ParseAttribute(params);
 
-  if (params.name == kDisabledAttr) {
+  if (params.name == html_names::kDisabledAttr) {
     PseudoStateChanged(CSSSelector::kPseudoDisabled);
     PseudoStateChanged(CSSSelector::kPseudoEnabled);
-  } else if (params.name == kLabelAttr) {
+  } else if (params.name == html_names::kLabelAttr) {
     UpdateGroupLabel();
   }
 }
@@ -104,7 +103,7 @@
 }
 
 String HTMLOptGroupElement::GroupLabelText() const {
-  String item_text = getAttribute(kLabelAttr);
+  String item_text = getAttribute(html_names::kLabelAttr);
 
   // In WinIE, leading and trailing whitespace is ignored in options and
   // optgroups. We match this behavior.
@@ -137,8 +136,8 @@
   DEFINE_STATIC_LOCAL(AtomicString, label_padding, ("0 2px 1px 2px"));
   DEFINE_STATIC_LOCAL(AtomicString, label_min_height, ("1.2em"));
   auto* label = MakeGarbageCollected<HTMLDivElement>(GetDocument());
-  label->setAttribute(kRoleAttr, AtomicString("group"));
-  label->setAttribute(kAriaLabelAttr, AtomicString());
+  label->setAttribute(html_names::kRoleAttr, AtomicString("group"));
+  label->setAttribute(html_names::kAriaLabelAttr, AtomicString());
   label->SetInlineStyleProperty(CSSPropertyID::kPadding, label_padding);
   label->SetInlineStyleProperty(CSSPropertyID::kMinHeight, label_min_height);
   label->SetIdAttribute(shadow_element_names::OptGroupLabel());
@@ -152,7 +151,7 @@
   const String& label_text = GroupLabelText();
   HTMLDivElement& label = OptGroupLabelElement();
   label.setTextContent(label_text);
-  label.setAttribute(kAriaLabelAttr, AtomicString(label_text));
+  label.setAttribute(html_names::kAriaLabelAttr, AtomicString(label_text));
 }
 
 HTMLDivElement& HTMLOptGroupElement::OptGroupLabelElement() const {
diff --git a/third_party/blink/renderer/core/html/forms/html_option_element.cc b/third_party/blink/renderer/core/html/forms/html_option_element.cc
index 275f0f5..ff974b9e 100644
--- a/third_party/blink/renderer/core/html/forms/html_option_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_option_element.cc
@@ -44,10 +44,8 @@
 
 namespace blink {
 
-using namespace html_names;
-
 HTMLOptionElement::HTMLOptionElement(Document& document)
-    : HTMLElement(kOptionTag, document), is_selected_(false) {
+    : HTMLElement(html_names::kOptionTag, document), is_selected_(false) {
   EnsureUserAgentShadowRoot();
 }
 
@@ -77,7 +75,7 @@
   if (!value.IsNull())
     element->setValue(value);
   if (default_selected)
-    element->setAttribute(kSelectedAttr, g_empty_atom);
+    element->setAttribute(html_names::kSelectedAttr, g_empty_atom);
   element->SetSelected(selected);
 
   return element;
@@ -91,7 +89,7 @@
 }
 
 bool HTMLOptionElement::MatchesDefaultPseudoClass() const {
-  return FastHasAttribute(kSelectedAttr);
+  return FastHasAttribute(html_names::kSelectedAttr);
 }
 
 bool HTMLOptionElement::MatchesEnabledPseudoClass() const {
@@ -104,7 +102,7 @@
 
   // WinIE does not use the label attribute, so as a quirk, we ignore it.
   if (!document.InQuirksMode())
-    text = FastGetAttribute(kLabelAttr);
+    text = FastGetAttribute(html_names::kLabelAttr);
 
   // FIXME: The following treats an element with the label attribute set to
   // the empty string the same as an element with no label attribute at all.
@@ -169,21 +167,21 @@
 void HTMLOptionElement::ParseAttribute(
     const AttributeModificationParams& params) {
   const QualifiedName& name = params.name;
-  if (name == kValueAttr) {
+  if (name == html_names::kValueAttr) {
     if (HTMLDataListElement* data_list = OwnerDataListElement())
       data_list->OptionElementChildrenChanged();
-  } else if (name == kDisabledAttr) {
+  } else if (name == html_names::kDisabledAttr) {
     if (params.old_value.IsNull() != params.new_value.IsNull()) {
       PseudoStateChanged(CSSSelector::kPseudoDisabled);
       PseudoStateChanged(CSSSelector::kPseudoEnabled);
       if (LayoutObject* o = GetLayoutObject())
         o->InvalidateIfControlStateChanged(kEnabledControlState);
     }
-  } else if (name == kSelectedAttr) {
+  } else if (name == html_names::kSelectedAttr) {
     if (params.old_value.IsNull() != params.new_value.IsNull() && !is_dirty_)
       SetSelected(!params.new_value.IsNull());
     PseudoStateChanged(CSSSelector::kPseudoDefault);
-  } else if (name == kLabelAttr) {
+  } else if (name == html_names::kLabelAttr) {
     UpdateLabel();
   } else {
     HTMLElement::ParseAttribute(params);
@@ -191,7 +189,7 @@
 }
 
 String HTMLOptionElement::value() const {
-  const AtomicString& value = FastGetAttribute(kValueAttr);
+  const AtomicString& value = FastGetAttribute(html_names::kValueAttr);
   if (!value.IsNull())
     return value;
   return CollectOptionInnerText()
@@ -200,7 +198,7 @@
 }
 
 void HTMLOptionElement::setValue(const AtomicString& value) {
-  setAttribute(kValueAttr, value);
+  setAttribute(html_names::kValueAttr, value);
 }
 
 bool HTMLOptionElement::Selected() const {
@@ -288,7 +286,7 @@
 }
 
 String HTMLOptionElement::label() const {
-  const AtomicString& label = FastGetAttribute(kLabelAttr);
+  const AtomicString& label = FastGetAttribute(html_names::kLabelAttr);
   if (!label.IsNull())
     return label;
   return CollectOptionInnerText()
@@ -297,7 +295,7 @@
 }
 
 void HTMLOptionElement::setLabel(const AtomicString& label) {
-  setAttribute(kLabelAttr, label);
+  setAttribute(html_names::kLabelAttr, label);
 }
 
 String HTMLOptionElement::TextIndentedToRespectGroupLabel() const {
@@ -308,7 +306,7 @@
 }
 
 bool HTMLOptionElement::OwnElementDisabled() const {
-  return FastHasAttribute(kDisabledAttr);
+  return FastHasAttribute(html_names::kDisabledAttr);
 }
 
 bool HTMLOptionElement::IsDisabledFormControl() const {
diff --git a/third_party/blink/renderer/core/html/forms/html_select_element.cc b/third_party/blink/renderer/core/html/forms/html_select_element.cc
index 9cef32c..7fa40b6 100644
--- a/third_party/blink/renderer/core/html/forms/html_select_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_select_element.cc
@@ -81,15 +81,13 @@
 
 namespace blink {
 
-using namespace html_names;
-
 // Upper limit of list_items_. According to the HTML standard, options larger
 // than this limit doesn't work well because |selectedIndex| IDL attribute is
 // signed.
 static const unsigned kMaxListItems = INT_MAX;
 
 HTMLSelectElement::HTMLSelectElement(Document& document)
-    : HTMLFormControlElementWithState(kSelectTag, document),
+    : HTMLFormControlElementWithState(html_names::kSelectTag, document),
       type_ahead_(this),
       size_(0),
       last_on_change_option_(nullptr),
@@ -110,8 +108,9 @@
   // Even if options/optgroups are not rendered as children of LayoutMenuList,
   // we still need to add them to the flat tree through slotting since we need
   // their ComputedStyle for popup rendering.
-  return node.HasTagName(kOptionTag) || node.HasTagName(kOptgroupTag) ||
-         node.HasTagName(kHrTag);
+  return node.HasTagName(html_names::kOptionTag) ||
+         node.HasTagName(html_names::kOptgroupTag) ||
+         node.HasTagName(html_names::kHrTag);
 }
 
 const AtomicString& HTMLSelectElement::FormControlType() const {
@@ -296,7 +295,7 @@
 
 bool HTMLSelectElement::IsPresentationAttribute(
     const QualifiedName& name) const {
-  if (name == kAlignAttr) {
+  if (name == html_names::kAlignAttr) {
     // Don't map 'align' attribute. This matches what Firefox, Opera and IE do.
     // See http://bugs.webkit.org/show_bug.cgi?id=12072
     return false;
@@ -307,7 +306,7 @@
 
 void HTMLSelectElement::ParseAttribute(
     const AttributeModificationParams& params) {
-  if (params.name == kSizeAttr) {
+  if (params.name == html_names::kSizeAttr) {
     unsigned old_size = size_;
     if (!ParseHTMLNonNegativeInteger(params.new_value, size_))
       size_ = 0;
@@ -318,9 +317,9 @@
       if (!UsesMenuList())
         SaveListboxActiveSelection();
     }
-  } else if (params.name == kMultipleAttr) {
+  } else if (params.name == html_names::kMultipleAttr) {
     ParseMultipleAttribute(params.new_value);
-  } else if (params.name == kAccesskeyAttr) {
+  } else if (params.name == html_names::kAccesskeyAttr) {
     // FIXME: ignore for the moment.
     //
   } else {
@@ -1259,7 +1258,8 @@
 
 void HTMLSelectElement::ResetImpl() {
   for (auto* const option : GetOptionList()) {
-    option->SetSelectedState(option->FastHasAttribute(kSelectedAttr));
+    option->SetSelectedState(
+        option->FastHasAttribute(html_names::kSelectedAttr));
     option->SetDirty(false);
   }
   ResetToDefaultSelection();
diff --git a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
index f3f9134..a2ee781 100644
--- a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
@@ -56,8 +56,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 static const unsigned kDefaultRows = 2;
 static const unsigned kDefaultCols = 20;
 
@@ -72,7 +70,7 @@
 }
 
 HTMLTextAreaElement::HTMLTextAreaElement(Document& document)
-    : TextControlElement(kTextareaTag, document),
+    : TextControlElement(html_names::kTextareaTag, document),
       rows_(kDefaultRows),
       cols_(kDefaultCols),
       wrap_(kSoftWrap),
@@ -110,13 +108,13 @@
 
 bool HTMLTextAreaElement::IsPresentationAttribute(
     const QualifiedName& name) const {
-  if (name == kAlignAttr) {
+  if (name == html_names::kAlignAttr) {
     // Don't map 'align' attribute.  This matches what Firefox, Opera and IE do.
     // See http://bugs.webkit.org/show_bug.cgi?id=7075
     return false;
   }
 
-  if (name == kWrapAttr)
+  if (name == html_names::kWrapAttr)
     return true;
   return TextControlElement::IsPresentationAttribute(name);
 }
@@ -125,7 +123,7 @@
     const QualifiedName& name,
     const AtomicString& value,
     MutableCSSPropertyValueSet* style) {
-  if (name == kWrapAttr) {
+  if (name == html_names::kWrapAttr) {
     if (ShouldWrapText()) {
       AddPropertyToPresentationAttributeStyle(style, CSSPropertyID::kWhiteSpace,
                                               CSSValueID::kPreWrap);
@@ -147,7 +145,7 @@
     const AttributeModificationParams& params) {
   const QualifiedName& name = params.name;
   const AtomicString& value = params.new_value;
-  if (name == kRowsAttr) {
+  if (name == html_names::kRowsAttr) {
     unsigned rows = 0;
     if (value.IsEmpty() || !ParseHTMLNonNegativeInteger(value, rows) ||
         rows <= 0 || rows > 0x7fffffffu)
@@ -160,7 +158,7 @@
                 layout_invalidation_reason::kAttributeChanged);
       }
     }
-  } else if (name == kColsAttr) {
+  } else if (name == html_names::kColsAttr) {
     unsigned cols = 0;
     if (value.IsEmpty() || !ParseHTMLNonNegativeInteger(value, cols) ||
         cols <= 0 || cols > 0x7fffffffu)
@@ -173,7 +171,7 @@
                 layout_invalidation_reason::kAttributeChanged);
       }
     }
-  } else if (name == kWrapAttr) {
+  } else if (name == html_names::kWrapAttr) {
     // The virtual/physical values were a Netscape extension of HTML 3.0, now
     // deprecated.  The soft/hard /off values are a recommendation for HTML 4
     // extension by IE and NS 4.
@@ -194,12 +192,12 @@
                 layout_invalidation_reason::kAttributeChanged);
       }
     }
-  } else if (name == kAccesskeyAttr) {
+  } else if (name == html_names::kAccesskeyAttr) {
     // ignore for the moment
-  } else if (name == kMaxlengthAttr) {
+  } else if (name == html_names::kMaxlengthAttr) {
     UseCounter::Count(GetDocument(), WebFeature::kTextAreaMaxLength);
     SetNeedsValidityCheck();
-  } else if (name == kMinlengthAttr) {
+  } else if (name == html_names::kMinlengthAttr) {
     UseCounter::Count(GetDocument(), WebFeature::kTextAreaMinLength);
     SetNeedsValidityCheck();
   } else {
@@ -222,7 +220,8 @@
       (wrap_ == kHardWrap) ? ValueWithHardLineBreaks() : value();
   form_data.AppendFromElement(GetName(), text);
 
-  const AtomicString& dirname_attr_value = FastGetAttribute(kDirnameAttr);
+  const AtomicString& dirname_attr_value =
+      FastGetAttribute(html_names::kDirnameAttr);
   if (!dirname_attr_value.IsNull())
     form_data.AppendFromElement(dirname_attr_value, DirectionForFormData());
 }
@@ -563,13 +562,13 @@
 }
 
 void HTMLTextAreaElement::setCols(unsigned cols) {
-  SetUnsignedIntegralAttribute(kColsAttr, cols ? cols : kDefaultCols,
-                               kDefaultCols);
+  SetUnsignedIntegralAttribute(html_names::kColsAttr,
+                               cols ? cols : kDefaultCols, kDefaultCols);
 }
 
 void HTMLTextAreaElement::setRows(unsigned rows) {
-  SetUnsignedIntegralAttribute(kRowsAttr, rows ? rows : kDefaultRows,
-                               kDefaultRows);
+  SetUnsignedIntegralAttribute(html_names::kRowsAttr,
+                               rows ? rows : kDefaultRows, kDefaultRows);
 }
 
 bool HTMLTextAreaElement::MatchesReadOnlyPseudoClass() const {
@@ -596,7 +595,8 @@
     auto* new_element = MakeGarbageCollected<HTMLDivElement>(GetDocument());
     placeholder = new_element;
     placeholder->SetShadowPseudoId(AtomicString("-webkit-input-placeholder"));
-    placeholder->setAttribute(kIdAttr, shadow_element_names::Placeholder());
+    placeholder->setAttribute(html_names::kIdAttr,
+                              shadow_element_names::Placeholder());
     placeholder->SetInlineStyleProperty(
         CSSPropertyID::kDisplay,
         IsPlaceholderVisible() ? CSSValueID::kBlock : CSSValueID::kNone, true);
@@ -606,8 +606,9 @@
 }
 
 String HTMLTextAreaElement::GetPlaceholderValue() const {
-  return !SuggestedValue().IsEmpty() ? SuggestedValue()
-                                     : FastGetAttribute(kPlaceholderAttr);
+  return !SuggestedValue().IsEmpty()
+             ? SuggestedValue()
+             : FastGetAttribute(html_names::kPlaceholderAttr);
 }
 
 bool HTMLTextAreaElement::IsInteractiveContent() const {
diff --git a/third_party/blink/renderer/core/html/forms/image_input_type.cc b/third_party/blink/renderer/core/html/forms/image_input_type.cc
index 02847cc..53857f63 100644
--- a/third_party/blink/renderer/core/html/forms/image_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/image_input_type.cc
@@ -43,8 +43,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 ImageInputType::ImageInputType(HTMLInputElement& element)
     : BaseButtonInputType(element), use_fallback_content_(false) {}
 
@@ -177,8 +175,8 @@
   if (!GetElement().GetLayoutObject()) {
     // Check the attribute first for an explicit pixel value.
     unsigned height;
-    if (ParseHTMLNonNegativeInteger(GetElement().FastGetAttribute(kHeightAttr),
-                                    height))
+    if (ParseHTMLNonNegativeInteger(
+            GetElement().FastGetAttribute(html_names::kHeightAttr), height))
       return height;
 
     // If the image is available, use its height.
@@ -202,8 +200,8 @@
   if (!GetElement().GetLayoutObject()) {
     // Check the attribute first for an explicit pixel value.
     unsigned width;
-    if (ParseHTMLNonNegativeInteger(GetElement().FastGetAttribute(kWidthAttr),
-                                    width))
+    if (ParseHTMLNonNegativeInteger(
+            GetElement().FastGetAttribute(html_names::kWidthAttr), width))
       return width;
 
     // If the image is available, use its width.
@@ -224,11 +222,12 @@
 }
 
 bool ImageInputType::HasLegalLinkAttribute(const QualifiedName& name) const {
-  return name == kSrcAttr || BaseButtonInputType::HasLegalLinkAttribute(name);
+  return name == html_names::kSrcAttr ||
+         BaseButtonInputType::HasLegalLinkAttribute(name);
 }
 
 const QualifiedName& ImageInputType::SubResourceAttributeName() const {
-  return kSrcAttr;
+  return html_names::kSrcAttr;
 }
 
 void ImageInputType::EnsureFallbackContent() {
diff --git a/third_party/blink/renderer/core/html/forms/input_type.cc b/third_party/blink/renderer/core/html/forms/input_type.cc
index da8c7ae..cbcedd28 100644
--- a/third_party/blink/renderer/core/html/forms/input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/input_type.cc
@@ -76,8 +76,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 using InputTypeFactoryFunction = InputType* (*)(HTMLInputElement&);
 using InputTypeFactoryMap = HashMap<AtomicString, InputTypeFactoryFunction>;
 
@@ -221,7 +219,7 @@
 }
 
 String InputType::ResultForDialogSubmit() const {
-  return GetElement().FastGetAttribute(kValueAttr);
+  return GetElement().FastGetAttribute(html_names::kValueAttr);
 }
 
 double InputType::ValueAsDate() const {
@@ -421,7 +419,7 @@
     //   is present, when informing the user that the pattern is not matched
     return std::make_pair(
         GetLocale().QueryString(IDS_FORM_VALIDATION_PATTERN_MISMATCH),
-        GetElement().FastGetAttribute(kTitleAttr).GetString());
+        GetElement().FastGetAttribute(html_names::kTitleAttr).GetString());
   }
 
   if (GetElement().TooLong()) {
@@ -764,7 +762,8 @@
   Decimal step = step_range.Step();
   EventQueueScope scope;
   Decimal new_value = current;
-  const AtomicString& step_string = GetElement().FastGetAttribute(kStepAttr);
+  const AtomicString& step_string =
+      GetElement().FastGetAttribute(html_names::kStepAttr);
   if (!DeprecatedEqualIgnoringCase(step_string, "any") &&
       step_range.StepMismatch(current)) {
     // Snap-to-step / clamping steps
@@ -932,11 +931,11 @@
 }
 
 Decimal InputType::FindStepBase(const Decimal& default_value) const {
-  Decimal step_base =
-      ParseToNumber(GetElement().FastGetAttribute(kMinAttr), Decimal::Nan());
+  Decimal step_base = ParseToNumber(
+      GetElement().FastGetAttribute(html_names::kMinAttr), Decimal::Nan());
   if (!step_base.IsFinite()) {
-    step_base =
-        ParseToNumber(GetElement().FastGetAttribute(kValueAttr), default_value);
+    step_base = ParseToNumber(
+        GetElement().FastGetAttribute(html_names::kValueAttr), default_value);
   }
   return step_base;
 }
@@ -949,19 +948,21 @@
     const StepRange::StepDescription& step_description) const {
   bool has_range_limitations = false;
   const Decimal step_base = FindStepBase(step_base_default);
-  Decimal minimum = ParseToNumberOrNaN(GetElement().FastGetAttribute(kMinAttr));
+  Decimal minimum =
+      ParseToNumberOrNaN(GetElement().FastGetAttribute(html_names::kMinAttr));
   if (minimum.IsFinite())
     has_range_limitations = true;
   else
     minimum = minimum_default;
-  Decimal maximum = ParseToNumberOrNaN(GetElement().FastGetAttribute(kMaxAttr));
+  Decimal maximum =
+      ParseToNumberOrNaN(GetElement().FastGetAttribute(html_names::kMaxAttr));
   if (maximum.IsFinite())
     has_range_limitations = true;
   else
     maximum = maximum_default;
-  const Decimal step =
-      StepRange::ParseStep(any_step_handling, step_description,
-                           GetElement().FastGetAttribute(kStepAttr));
+  const Decimal step = StepRange::ParseStep(
+      any_step_handling, step_description,
+      GetElement().FastGetAttribute(html_names::kStepAttr));
   return StepRange(step_base, minimum, maximum, has_range_limitations, step,
                    step_description);
 }
diff --git a/third_party/blink/renderer/core/html/forms/listed_element.cc b/third_party/blink/renderer/core/html/forms/listed_element.cc
index 0a6de8d..8e2fa31 100644
--- a/third_party/blink/renderer/core/html/forms/listed_element.cc
+++ b/third_party/blink/renderer/core/html/forms/listed_element.cc
@@ -50,8 +50,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 class FormAttributeTargetObserver : public IdTargetObserver {
  public:
   FormAttributeTargetObserver(const AtomicString& id, ListedElement*);
@@ -89,7 +87,7 @@
 }
 
 void ListedElement::DidMoveToNewDocument(Document& old_document) {
-  if (ToHTMLElement().FastHasAttribute(kFormAttr))
+  if (ToHTMLElement().FastHasAttribute(html_names::kFormAttr))
     SetFormAttributeTargetObserver(nullptr);
 }
 
@@ -107,7 +105,7 @@
 
   HTMLElement& element = ToHTMLElement();
   if (insertion_point.isConnected()) {
-    if (element.FastHasAttribute(kFormAttr))
+    if (element.FastHasAttribute(html_names::kFormAttr))
       ResetFormAttributeTargetObserver();
   }
 
@@ -135,7 +133,8 @@
   UpdateWillValidateCache();
 
   HTMLElement& element = ToHTMLElement();
-  if (insertion_point.isConnected() && element.FastHasAttribute(kFormAttr)) {
+  if (insertion_point.isConnected() &&
+      element.FastHasAttribute(html_names::kFormAttr)) {
     SetFormAttributeTargetObserver(nullptr);
     ResetFormOwner();
   } else {
@@ -246,7 +245,7 @@
 void ListedElement::ResetFormOwner() {
   form_was_set_by_parser_ = false;
   HTMLElement& element = ToHTMLElement();
-  const AtomicString& form_id(element.FastGetAttribute(kFormAttr));
+  const AtomicString& form_id(element.FastGetAttribute(html_names::kFormAttr));
   HTMLFormElement* nearest_form = element.FindFormAncestor();
   // 1. If the element's form owner is not null, and either the element is not
   // reassociateable or its form content attribute is not present, and the
@@ -642,7 +641,7 @@
 
 void ListedElement::ResetFormAttributeTargetObserver() {
   HTMLElement& element = ToHTMLElement();
-  const AtomicString& form_id(element.FastGetAttribute(kFormAttr));
+  const AtomicString& form_id(element.FastGetAttribute(html_names::kFormAttr));
   if (!form_id.IsNull() && element.isConnected()) {
     SetFormAttributeTargetObserver(
         MakeGarbageCollected<FormAttributeTargetObserver>(form_id, this));
diff --git a/third_party/blink/renderer/core/html/forms/month_input_type.cc b/third_party/blink/renderer/core/html/forms/month_input_type.cc
index ed4895b..699f0ad 100644
--- a/third_party/blink/renderer/core/html/forms/month_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/month_input_type.cc
@@ -43,8 +43,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 static const int kMonthDefaultStep = 1;
 static const int kMonthDefaultStepBase = 0;
 static const int kMonthStepScaleFactor = 1;
@@ -145,11 +143,13 @@
     const DateComponents& date) const {
   layout_parameters.date_time_format = layout_parameters.locale.MonthFormat();
   layout_parameters.fallback_date_time_format = "yyyy-MM";
-  if (!ParseToDateComponents(GetElement().FastGetAttribute(kMinAttr),
-                             &layout_parameters.minimum))
+  if (!ParseToDateComponents(
+          GetElement().FastGetAttribute(html_names::kMinAttr),
+          &layout_parameters.minimum))
     layout_parameters.minimum = DateComponents();
-  if (!ParseToDateComponents(GetElement().FastGetAttribute(kMaxAttr),
-                             &layout_parameters.maximum))
+  if (!ParseToDateComponents(
+          GetElement().FastGetAttribute(html_names::kMaxAttr),
+          &layout_parameters.maximum))
     layout_parameters.maximum = DateComponents();
   layout_parameters.placeholder_for_month = "--";
   layout_parameters.placeholder_for_year = "----";
diff --git a/third_party/blink/renderer/core/html/forms/number_input_type.cc b/third_party/blink/renderer/core/html/forms/number_input_type.cc
index 2cd3759..996addc 100644
--- a/third_party/blink/renderer/core/html/forms/number_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/number_input_type.cc
@@ -49,8 +49,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 static const int kNumberDefaultStep = 1;
 static const int kNumberDefaultStepBase = 0;
 static const int kNumberStepScaleFactor = 1;
@@ -153,17 +151,18 @@
                                                   int& preferred_size) const {
   preferred_size = default_size;
 
-  const String step_string = GetElement().FastGetAttribute(kStepAttr);
+  const String step_string =
+      GetElement().FastGetAttribute(html_names::kStepAttr);
   if (DeprecatedEqualIgnoringCase(step_string, "any"))
     return false;
 
-  const Decimal minimum =
-      ParseToDecimalForNumberType(GetElement().FastGetAttribute(kMinAttr));
+  const Decimal minimum = ParseToDecimalForNumberType(
+      GetElement().FastGetAttribute(html_names::kMinAttr));
   if (!minimum.IsFinite())
     return false;
 
-  const Decimal maximum =
-      ParseToDecimalForNumberType(GetElement().FastGetAttribute(kMaxAttr));
+  const Decimal maximum = ParseToDecimalForNumberType(
+      GetElement().FastGetAttribute(html_names::kMaxAttr));
   if (!maximum.IsFinite())
     return false;
 
diff --git a/third_party/blink/renderer/core/html/forms/picker_indicator_element.cc b/third_party/blink/renderer/core/html/forms/picker_indicator_element.cc
index 73f882c0..544b8a6b 100644
--- a/third_party/blink/renderer/core/html/forms/picker_indicator_element.cc
+++ b/third_party/blink/renderer/core/html/forms/picker_indicator_element.cc
@@ -43,15 +43,13 @@
 
 namespace blink {
 
-using namespace html_names;
-
 PickerIndicatorElement::PickerIndicatorElement(
     Document& document,
     PickerIndicatorOwner& picker_indicator_owner)
     : HTMLDivElement(document),
       picker_indicator_owner_(&picker_indicator_owner) {
   SetShadowPseudoId(AtomicString("-webkit-calendar-picker-indicator"));
-  setAttribute(kIdAttr, shadow_element_names::PickerIndicator());
+  setAttribute(html_names::kIdAttr, shadow_element_names::PickerIndicator());
 }
 
 PickerIndicatorElement::~PickerIndicatorElement() {
@@ -165,11 +163,11 @@
   // FIXME: We should have a way to disable accessibility in web tests.
   if (WebTestSupport::IsRunningWebTest())
     return;
-  setAttribute(kTabindexAttr, "0");
-  setAttribute(kAriaHaspopupAttr, "menu");
-  setAttribute(kRoleAttr, "button");
+  setAttribute(html_names::kTabindexAttr, "0");
+  setAttribute(html_names::kAriaHaspopupAttr, "menu");
+  setAttribute(html_names::kRoleAttr, "button");
   setAttribute(
-      kAriaLabelAttr,
+      html_names::kAriaLabelAttr,
       AtomicString(GetLocale().QueryString(IDS_AX_CALENDAR_SHOW_DATE_PICKER)));
 }
 
diff --git a/third_party/blink/renderer/core/html/forms/range_input_type.cc b/third_party/blink/renderer/core/html/forms/range_input_type.cc
index 05c46a7..fe1eb05d 100644
--- a/third_party/blink/renderer/core/html/forms/range_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/range_input_type.cc
@@ -60,8 +60,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 static const int kRangeDefaultMinimum = 0;
 static const int kRangeDefaultMaximum = 100;
 static const int kRangeDefaultStep = 1;
@@ -131,16 +129,17 @@
       (kRangeDefaultStep, kRangeDefaultStepBase, kRangeStepScaleFactor));
 
   const Decimal step_base = FindStepBase(kRangeDefaultStepBase);
-  const Decimal minimum = ParseToNumber(GetElement().FastGetAttribute(kMinAttr),
-                                        kRangeDefaultMinimum);
-  const Decimal maximum =
-      EnsureMaximum(ParseToNumber(GetElement().FastGetAttribute(kMaxAttr),
-                                  kRangeDefaultMaximum),
-                    minimum);
+  const Decimal minimum =
+      ParseToNumber(GetElement().FastGetAttribute(html_names::kMinAttr),
+                    kRangeDefaultMinimum);
+  const Decimal maximum = EnsureMaximum(
+      ParseToNumber(GetElement().FastGetAttribute(html_names::kMaxAttr),
+                    kRangeDefaultMaximum),
+      minimum);
 
-  const Decimal step =
-      StepRange::ParseStep(any_step_handling, step_description,
-                           GetElement().FastGetAttribute(kStepAttr));
+  const Decimal step = StepRange::ParseStep(
+      any_step_handling, step_description,
+      GetElement().FastGetAttribute(html_names::kStepAttr));
   // Range type always has range limitations because it has default
   // minimum/maximum.
   // https://html.spec.whatwg.org/C/#range-state-(type=range):concept-input-min-default
@@ -185,10 +184,11 @@
 
   // FIXME: We can't use stepUp() for the step value "any". So, we increase
   // or decrease the value by 1/100 of the value range. Is it reasonable?
-  const Decimal step = DeprecatedEqualIgnoringCase(
-                           GetElement().FastGetAttribute(kStepAttr), "any")
-                           ? (step_range.Maximum() - step_range.Minimum()) / 100
-                           : step_range.Step();
+  const Decimal step =
+      DeprecatedEqualIgnoringCase(
+          GetElement().FastGetAttribute(html_names::kStepAttr), "any")
+          ? (step_range.Maximum() - step_range.Minimum()) / 100
+          : step_range.Step();
   const Decimal big_step =
       std::max((step_range.Maximum() - step_range.Minimum()) / 10, step);
 
@@ -246,7 +246,7 @@
   Document& document = GetElement().GetDocument();
   auto* track = MakeGarbageCollected<HTMLDivElement>(document);
   track->SetShadowPseudoId(AtomicString("-webkit-slider-runnable-track"));
-  track->setAttribute(kIdAttr, shadow_element_names::SliderTrack());
+  track->setAttribute(html_names::kIdAttr, shadow_element_names::SliderTrack());
   track->AppendChild(MakeGarbageCollected<SliderThumbElement>(document));
   auto* container = MakeGarbageCollected<SliderContainerElement>(document);
   container->AppendChild(track);
diff --git a/third_party/blink/renderer/core/html/forms/resources/time_picker.css b/third_party/blink/renderer/core/html/forms/resources/time_picker.css
index 0d3d91c..5e27f93 100644
--- a/third_party/blink/renderer/core/html/forms/resources/time_picker.css
+++ b/third_party/blink/renderer/core/html/forms/resources/time_picker.css
@@ -9,16 +9,17 @@
 
 .time-picker {
   background: #FFFFFF;
+  border: 1px solid transparent;
   display: flex;
   flex-direction: column;
-  height: 273px;
+  height: 298px;
 }
 
 .time-columns {
   display: flex;
   flex-direction: row;
-  height: 82%;
-  margin: 2px;
+  height: 252px;
+  margin: 1px;
 }
 
 .time-column {
@@ -39,10 +40,13 @@
 }
 
 .time-cell {
+  border: 1px solid transparent;
   color: #101010;
   font-size: 14px;
   height: 32px;
   line-height: 32px;
+  margin: 1px;
+  scroll-margin: 1px;
   scroll-snap-align: start;
   text-align: center;
   width: 48px;
@@ -61,6 +65,7 @@
 
 .time-column:focus .time-cell.selected {
   outline: auto 1px -webkit-focus-ring-color;
+  outline-offset: 0px;
 }
 
 .submission-controls {
@@ -69,7 +74,7 @@
   bottom: 0px;
   display: flex;
   flex-direction: row;
-  height: 15%;
+  height: 41px;
   position: absolute;
   width: 100%;
 }
@@ -81,7 +86,7 @@
 
 .submission-button {
   background-color: #FFFFFF;
-  border: 0;
+  border: 1px solid white;
   height: 32px;
   margin: 4px;
   padding: 8px;
@@ -92,3 +97,46 @@
   background-color: #E5E5E5;
   border-radius: 2px;
 }
+
+@media (forced-colors: active) {
+  .time-cell {
+    background-color: Window;
+    color: WindowText;
+    forced-color-adjust: none;
+  }
+
+  .time-cell:hover {
+    background-color: Window;
+    border-color: Highlight;
+  }
+
+  .time-cell.selected {
+    background-color: Highlight;
+    color: Window;
+  }
+
+  .time-column:focus .time-cell.selected {
+    border: 2px solid WindowText;
+    margin: 0px;
+    outline: none;
+  }
+
+  .submission-button {
+    background-color: Window;
+    border-color: transparent;
+    forced-color-adjust: none;
+  }
+
+  .submission-button:hover {
+    background-color: Window;
+    border-color: Highlight;
+  }
+
+  .submission-button:focus {
+    outline-color: WindowText;
+  }
+
+  .submission-button path {
+    fill: WindowText;
+  }
+}
diff --git a/third_party/blink/renderer/core/html/forms/resources/time_picker.js b/third_party/blink/renderer/core/html/forms/resources/time_picker.js
index bec6a53..3a24bbe 100644
--- a/third_party/blink/renderer/core/html/forms/resources/time_picker.js
+++ b/third_party/blink/renderer/core/html/forms/resources/time_picker.js
@@ -252,8 +252,9 @@
   }
 }
 TimePicker.ClassName = 'time-picker';
-TimePicker.Height = 273;
-TimePicker.ColumnWidth = 54;
+TimePicker.Height = 300;
+TimePicker.ColumnWidth = 56;
+TimePicker.BorderWidth = 1;
 window.customElements.define('time-picker', TimePicker);
 
 /**
@@ -266,7 +267,7 @@
 
     this.className = TimeColumns.ClassName;
     this.hourColumn_ = new TimeColumn(TimeColumnType.HOUR, timePicker);
-    this.width_ = 0;
+    this.width_ = TimePicker.BorderWidth * 2 + TimeColumns.Margin * 2;
     this.minuteColumn_ = new TimeColumn(TimeColumnType.MINUTE, timePicker);
     if (timePicker.hasAMPM) {
       this.ampmColumn_ = new TimeColumn(TimeColumnType.AMPM, timePicker);
@@ -321,6 +322,7 @@
   };
 }
 TimeColumns.ClassName = 'time-columns';
+TimeColumns.Margin = 1;
 window.customElements.define('time-columns', TimeColumns);
 
 /**
diff --git a/third_party/blink/renderer/core/html/forms/search_input_type.cc b/third_party/blink/renderer/core/html/forms/search_input_type.cc
index 3236fa9..2330449 100644
--- a/third_party/blink/renderer/core/html/forms/search_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/search_input_type.cc
@@ -45,8 +45,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 SearchInputType::SearchInputType(HTMLInputElement& element)
     : BaseTextInputType(element),
       search_event_timer_(
@@ -129,7 +127,7 @@
 }
 
 bool SearchInputType::SearchEventsShouldBeDispatched() const {
-  return GetElement().hasAttribute(kIncrementalAttr);
+  return GetElement().hasAttribute(html_names::kIncrementalAttr);
 }
 
 void SearchInputType::DidSetValueByUserEdit() {
diff --git a/third_party/blink/renderer/core/html/forms/slider_thumb_element.cc b/third_party/blink/renderer/core/html/forms/slider_thumb_element.cc
index 7cc2e656..05acb51 100644
--- a/third_party/blink/renderer/core/html/forms/slider_thumb_element.cc
+++ b/third_party/blink/renderer/core/html/forms/slider_thumb_element.cc
@@ -50,8 +50,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 inline static bool HasVerticalAppearance(HTMLInputElement* input) {
   return input->ComputedStyleRef().EffectiveAppearance() == kSliderVerticalPart;
 }
@@ -59,7 +57,7 @@
 SliderThumbElement::SliderThumbElement(Document& document)
     : HTMLDivElement(document), in_drag_mode_(false) {
   SetHasCustomStyleCallbacks();
-  setAttribute(kIdAttr, shadow_element_names::SliderThumb());
+  setAttribute(html_names::kIdAttr, shadow_element_names::SliderThumb());
 }
 
 void SliderThumbElement::SetPositionFromValue() {
diff --git a/third_party/blink/renderer/core/html/forms/spin_button_element.cc b/third_party/blink/renderer/core/html/forms/spin_button_element.cc
index c64aee9..7dbfef3 100644
--- a/third_party/blink/renderer/core/html/forms/spin_button_element.cc
+++ b/third_party/blink/renderer/core/html/forms/spin_button_element.cc
@@ -42,8 +42,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 SpinButtonElement::SpinButtonElement(Document& document,
                                      SpinButtonOwner& spin_button_owner)
     : HTMLDivElement(document),
@@ -55,7 +53,7 @@
                        this,
                        &SpinButtonElement::RepeatingTimerFired) {
   SetShadowPseudoId(AtomicString("-webkit-inner-spin-button"));
-  setAttribute(kIdAttr, shadow_element_names::SpinButton());
+  setAttribute(html_names::kIdAttr, shadow_element_names::SpinButton());
 }
 
 void SpinButtonElement::DetachLayoutTree(bool performing_reattach) {
diff --git a/third_party/blink/renderer/core/html/forms/text_control_element.cc b/third_party/blink/renderer/core/html/forms/text_control_element.cc
index 7cbc1b7c..418baf6f 100644
--- a/third_party/blink/renderer/core/html/forms/text_control_element.cc
+++ b/third_party/blink/renderer/core/html/forms/text_control_element.cc
@@ -63,8 +63,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 TextControlElement::TextControlElement(const QualifiedName& tag_name,
                                        Document& doc)
     : HTMLFormControlElementWithState(tag_name, doc),
@@ -138,7 +136,8 @@
 String TextControlElement::StrippedPlaceholder() const {
   // According to the HTML5 specification, we need to remove CR and LF from
   // the attribute value.
-  const AtomicString& attribute_value = FastGetAttribute(kPlaceholderAttr);
+  const AtomicString& attribute_value =
+      FastGetAttribute(html_names::kPlaceholderAttr);
   if (!attribute_value.Contains(kNewlineCharacter) &&
       !attribute_value.Contains(kCarriageReturnCharacter))
     return attribute_value;
@@ -160,7 +159,8 @@
 }
 
 bool TextControlElement::IsPlaceholderEmpty() const {
-  const AtomicString& attribute_value = FastGetAttribute(kPlaceholderAttr);
+  const AtomicString& attribute_value =
+      FastGetAttribute(html_names::kPlaceholderAttr);
   return attribute_value.GetString().Find(IsNotLineBreak) == kNotFound;
 }
 
@@ -360,7 +360,7 @@
   unsigned remaining_characters_to_move_forward = index;
   Node* last_br_or_text = inner_editor;
   for (Node& node : NodeTraversal::DescendantsOf(*inner_editor)) {
-    if (node.HasTagName(kBrTag)) {
+    if (node.HasTagName(html_names::kBrTag)) {
       if (remaining_characters_to_move_forward == 0)
         return Position::BeforeNode(node);
       --remaining_characters_to_move_forward;
@@ -409,7 +409,8 @@
       else
         index += length;
       // Disregard the last auto added placeholder BrTag.
-    } else if (node->HasTagName(kBrTag) && node != inner_editor->lastChild()) {
+    } else if (node->HasTagName(html_names::kBrTag) &&
+               node != inner_editor->lastChild()) {
       ++index;
     }
   }
@@ -681,14 +682,14 @@
 
 int TextControlElement::maxLength() const {
   int value;
-  if (!ParseHTMLInteger(FastGetAttribute(kMaxlengthAttr), value))
+  if (!ParseHTMLInteger(FastGetAttribute(html_names::kMaxlengthAttr), value))
     return -1;
   return value >= 0 ? value : -1;
 }
 
 int TextControlElement::minLength() const {
   int value;
-  if (!ParseHTMLInteger(FastGetAttribute(kMinlengthAttr), value))
+  if (!ParseHTMLInteger(FastGetAttribute(html_names::kMinlengthAttr), value))
     return -1;
   return value >= 0 ? value : -1;
 }
@@ -707,7 +708,7 @@
         ExceptionMessages::IndexExceedsMinimumBound("maxLength", new_value,
                                                     min));
   } else {
-    SetIntegralAttribute(kMaxlengthAttr, new_value);
+    SetIntegralAttribute(html_names::kMaxlengthAttr, new_value);
   }
 }
 
@@ -725,7 +726,7 @@
         ExceptionMessages::IndexExceedsMaximumBound("minLength", new_value,
                                                     max));
   } else {
-    SetIntegralAttribute(kMinlengthAttr, new_value);
+    SetIntegralAttribute(html_names::kMinlengthAttr, new_value);
   }
 }
 
@@ -762,11 +763,12 @@
 
 void TextControlElement::ParseAttribute(
     const AttributeModificationParams& params) {
-  if (params.name == kPlaceholderAttr) {
+  if (params.name == html_names::kPlaceholderAttr) {
     UpdatePlaceholderText();
     UpdatePlaceholderVisibility();
     UseCounter::Count(GetDocument(), WebFeature::kPlaceholderAttribute);
-  } else if (params.name == kReadonlyAttr || params.name == kDisabledAttr) {
+  } else if (params.name == html_names::kReadonlyAttr ||
+             params.name == html_names::kDisabledAttr) {
     DisabledOrReadonlyAttributeChanged(params.name);
     HTMLFormControlElementWithState::ParseAttribute(params);
   } else {
@@ -966,7 +968,7 @@
   for (const HTMLElement* element = this; element;
        element = Traversal<HTMLElement>::FirstAncestor(*element)) {
     const AtomicString& dir_attribute_value =
-        element->FastGetAttribute(kDirAttr);
+        element->FastGetAttribute(html_names::kDirAttr);
     if (dir_attribute_value.IsNull())
       continue;
 
diff --git a/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc b/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc
index a1c7cbd..6b29802 100644
--- a/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc
+++ b/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc
@@ -39,11 +39,9 @@
 
 namespace blink {
 
-using namespace html_names;
-
 TextControlInnerContainer::TextControlInnerContainer(Document& document)
     : HTMLDivElement(document) {
-  setAttribute(kIdAttr, shadow_element_names::TextFieldContainer());
+  setAttribute(html_names::kIdAttr, shadow_element_names::TextFieldContainer());
 }
 
 LayoutObject* TextControlInnerContainer::CreateLayoutObject(
@@ -57,7 +55,7 @@
 EditingViewPortElement::EditingViewPortElement(Document& document)
     : HTMLDivElement(document) {
   SetHasCustomStyleCallbacks();
-  setAttribute(kIdAttr, shadow_element_names::EditingViewPort());
+  setAttribute(html_names::kIdAttr, shadow_element_names::EditingViewPort());
 }
 
 scoped_refptr<ComputedStyle>
@@ -201,7 +199,7 @@
     Document& document)
     : HTMLDivElement(document) {
   SetShadowPseudoId(AtomicString("-webkit-search-cancel-button"));
-  setAttribute(kIdAttr, shadow_element_names::SearchClearButton());
+  setAttribute(html_names::kIdAttr, shadow_element_names::SearchClearButton());
 }
 
 void SearchFieldCancelButtonElement::DefaultEventHandler(Event& event) {
@@ -239,7 +237,8 @@
 PasswordRevealButtonElement::PasswordRevealButtonElement(Document& document)
     : HTMLDivElement(document) {
   SetShadowPseudoId(AtomicString("-internal-reveal"));
-  setAttribute(kIdAttr, shadow_element_names::PasswordRevealButton());
+  setAttribute(html_names::kIdAttr,
+               shadow_element_names::PasswordRevealButton());
 }
 
 void PasswordRevealButtonElement::DefaultEventHandler(Event& event) {
diff --git a/third_party/blink/renderer/core/html/forms/text_field_input_type.cc b/third_party/blink/renderer/core/html/forms/text_field_input_type.cc
index cd398da..9db815f 100644
--- a/third_party/blink/renderer/core/html/forms/text_field_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/text_field_input_type.cc
@@ -56,8 +56,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 class DataListIndicatorElement final : public HTMLDivElement {
  private:
   inline HTMLInputElement* HostInput() const {
@@ -98,7 +96,7 @@
  public:
   DataListIndicatorElement(Document& document) : HTMLDivElement(document) {
     SetShadowPseudoId(AtomicString("-webkit-calendar-picker-indicator"));
-    setAttribute(kIdAttr, shadow_element_names::PickerIndicator());
+    setAttribute(html_names::kIdAttr, shadow_element_names::PickerIndicator());
   }
 };
 
@@ -490,7 +488,8 @@
                                             ? CSSValueID::kBlock
                                             : CSSValueID::kNone,
                                         true);
-    placeholder->setAttribute(kIdAttr, shadow_element_names::Placeholder());
+    placeholder->setAttribute(html_names::kIdAttr,
+                              shadow_element_names::Placeholder());
     Element* container = ContainerElement();
     Node* previous = container ? container : GetElement().InnerEditorElement();
     previous->parentNode()->InsertBefore(placeholder, previous);
@@ -502,7 +501,7 @@
 void TextFieldInputType::AppendToFormData(FormData& form_data) const {
   InputType::AppendToFormData(form_data);
   const AtomicString& dirname_attr_value =
-      GetElement().FastGetAttribute(kDirnameAttr);
+      GetElement().FastGetAttribute(html_names::kDirnameAttr);
   if (!dirname_attr_value.IsNull()) {
     form_data.AppendFromElement(dirname_attr_value,
                                 GetElement().DirectionForFormData());
diff --git a/third_party/blink/renderer/core/html/forms/text_input_type.cc b/third_party/blink/renderer/core/html/forms/text_input_type.cc
index fcf9069..b9d42ce 100644
--- a/third_party/blink/renderer/core/html/forms/text_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/text_input_type.cc
@@ -36,13 +36,12 @@
 
 namespace blink {
 
-using namespace html_names;
-
 void TextInputType::CountUsage() {
   CountUsageIfVisible(WebFeature::kInputTypeText);
-  if (GetElement().FastHasAttribute(kMaxlengthAttr))
+  if (GetElement().FastHasAttribute(html_names::kMaxlengthAttr))
     CountUsageIfVisible(WebFeature::kInputTypeTextMaxLength);
-  const AtomicString& type = GetElement().FastGetAttribute(kTypeAttr);
+  const AtomicString& type =
+      GetElement().FastGetAttribute(html_names::kTypeAttr);
   if (DeprecatedEqualIgnoringCase(type, input_type_names::kDatetime))
     CountUsageIfVisible(WebFeature::kInputTypeDateTimeFallback);
   else if (DeprecatedEqualIgnoringCase(type, input_type_names::kWeek))
diff --git a/third_party/blink/renderer/core/html/forms/time_input_type.cc b/third_party/blink/renderer/core/html/forms/time_input_type.cc
index 1a4286e..bbf3ccf 100644
--- a/third_party/blink/renderer/core/html/forms/time_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/time_input_type.cc
@@ -45,8 +45,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 static const int kTimeDefaultStep = 60;
 static const int kTimeDefaultStepBase = 0;
 static const int kTimeStepScaleFactor = 1000;
@@ -154,11 +152,13 @@
         layout_parameters.locale.ShortTimeFormat();
     layout_parameters.fallback_date_time_format = "HH:mm";
   }
-  if (!ParseToDateComponents(GetElement().FastGetAttribute(kMinAttr),
-                             &layout_parameters.minimum))
+  if (!ParseToDateComponents(
+          GetElement().FastGetAttribute(html_names::kMinAttr),
+          &layout_parameters.minimum))
     layout_parameters.minimum = DateComponents();
-  if (!ParseToDateComponents(GetElement().FastGetAttribute(kMaxAttr),
-                             &layout_parameters.maximum))
+  if (!ParseToDateComponents(
+          GetElement().FastGetAttribute(html_names::kMaxAttr),
+          &layout_parameters.maximum))
     layout_parameters.maximum = DateComponents();
 }
 
diff --git a/third_party/blink/renderer/core/html/forms/week_input_type.cc b/third_party/blink/renderer/core/html/forms/week_input_type.cc
index c6567554..3c53ffb9 100644
--- a/third_party/blink/renderer/core/html/forms/week_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/week_input_type.cc
@@ -41,8 +41,6 @@
 
 namespace blink {
 
-using namespace html_names;
-
 static const int kWeekDefaultStepBase =
     -259200000;  // The first day of 1970-W01.
 static const int kWeekDefaultStep = 1;
@@ -105,11 +103,13 @@
     const DateComponents&) const {
   layout_parameters.date_time_format = GetLocale().WeekFormatInLDML();
   layout_parameters.fallback_date_time_format = "yyyy-'W'ww";
-  if (!ParseToDateComponents(GetElement().FastGetAttribute(kMinAttr),
-                             &layout_parameters.minimum))
+  if (!ParseToDateComponents(
+          GetElement().FastGetAttribute(html_names::kMinAttr),
+          &layout_parameters.minimum))
     layout_parameters.minimum = DateComponents();
-  if (!ParseToDateComponents(GetElement().FastGetAttribute(kMaxAttr),
-                             &layout_parameters.maximum))
+  if (!ParseToDateComponents(
+          GetElement().FastGetAttribute(html_names::kMaxAttr),
+          &layout_parameters.maximum))
     layout_parameters.maximum = DateComponents();
   layout_parameters.placeholder_for_year = "----";
 }
diff --git a/third_party/blink/renderer/core/html/resources/images/time_icon.svg b/third_party/blink/renderer/core/html/resources/images/time_icon.svg
index 464453a..eedd2f1b 100644
--- a/third_party/blink/renderer/core/html/resources/images/time_icon.svg
+++ b/third_party/blink/renderer/core/html/resources/images/time_icon.svg
@@ -1,3 +1,3 @@
 <svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path d="M7 14C6.35417 14 5.73177 13.9167 5.13281 13.75C4.53906 13.5833 3.98177 13.349 3.46094 13.0469C2.94531 12.7396 2.47396 12.375 2.04688 11.9531C1.625 11.526 1.26042 11.0547 0.953125 10.5391C0.651042 10.0182 0.416667 9.46094 0.25 8.86719C0.0833333 8.26823 0 7.64583 0 7C0 6.35417 0.0833333 5.73438 0.25 5.14062C0.416667 4.54167 0.651042 3.98438 0.953125 3.46875C1.26042 2.94792 1.625 2.47656 2.04688 2.05469C2.47396 1.6276 2.94531 1.26302 3.46094 0.960938C3.98177 0.653646 4.53906 0.416667 5.13281 0.25C5.73177 0.0833333 6.35417 0 7 0C7.64583 0 8.26562 0.0833333 8.85938 0.25C9.45833 0.416667 10.0156 0.653646 10.5312 0.960938C11.0521 1.26302 11.5234 1.6276 11.9453 2.05469C12.3724 2.47656 12.737 2.94792 13.0391 3.46875C13.3464 3.98438 13.5833 4.54167 13.75 5.14062C13.9167 5.73438 14 6.35417 14 7C14 7.64583 13.9167 8.26823 13.75 8.86719C13.5833 9.46094 13.3464 10.0182 13.0391 10.5391C12.737 11.0547 12.3724 11.526 11.9453 11.9531C11.5234 12.375 11.0521 12.7396 10.5312 13.0469C10.0156 13.349 9.45833 13.5833 8.85938 13.75C8.26562 13.9167 7.64583 14 7 14ZM7 1C6.17188 1 5.39323 1.15885 4.66406 1.47656C3.9401 1.78906 3.30469 2.21875 2.75781 2.76562C2.21615 3.30729 1.78646 3.94271 1.46875 4.67188C1.15625 5.39583 1 6.17188 1 7C1 7.82812 1.15625 8.60677 1.46875 9.33594C1.78646 10.0599 2.21615 10.6953 2.75781 11.2422C3.30469 11.7839 3.9401 12.2135 4.66406 12.5312C5.39323 12.8438 6.17188 13 7 13C7.82812 13 8.60417 12.8438 9.32812 12.5312C10.0573 12.2135 10.6927 11.7839 11.2344 11.2422C11.7812 10.6953 12.2109 10.0599 12.5234 9.33594C12.8411 8.60677 13 7.82812 13 7C13 6.17188 12.8411 5.39583 12.5234 4.67188C12.2109 3.94271 11.7812 3.30729 11.2344 2.76562C10.6927 2.21875 10.0573 1.78906 9.32812 1.47656C8.60417 1.15885 7.82812 1 7 1ZM7 7V3H6V8H10V7H7Z" fill="#101010"/>
+<path d="M7 14C6.35417 14 5.73177 13.9167 5.13281 13.75C4.53906 13.5833 3.98177 13.349 3.46094 13.0469C2.94531 12.7396 2.47396 12.375 2.04688 11.9531C1.625 11.526 1.26042 11.0547 0.953125 10.5391C0.651042 10.0182 0.416667 9.46094 0.25 8.86719C0.0833333 8.26823 0 7.64583 0 7C0 6.35417 0.0833333 5.73438 0.25 5.14062C0.416667 4.54167 0.651042 3.98438 0.953125 3.46875C1.26042 2.94792 1.625 2.47656 2.04688 2.05469C2.47396 1.6276 2.94531 1.26302 3.46094 0.960938C3.98177 0.653646 4.53906 0.416667 5.13281 0.25C5.73177 0.0833333 6.35417 0 7 0C7.64583 0 8.26562 0.0833333 8.85938 0.25C9.45833 0.416667 10.0156 0.653646 10.5312 0.960938C11.0521 1.26302 11.5234 1.6276 11.9453 2.05469C12.3724 2.47656 12.737 2.94792 13.0391 3.46875C13.3464 3.98438 13.5833 4.54167 13.75 5.14062C13.9167 5.73438 14 6.35417 14 7C14 7.64583 13.9167 8.26823 13.75 8.86719C13.5833 9.46094 13.3464 10.0182 13.0391 10.5391C12.737 11.0547 12.3724 11.526 11.9453 11.9531C11.5234 12.375 11.0521 12.7396 10.5312 13.0469C10.0156 13.349 9.45833 13.5833 8.85938 13.75C8.26562 13.9167 7.64583 14 7 14ZM7 1C6.17188 1 5.39323 1.15885 4.66406 1.47656C3.9401 1.78906 3.30469 2.21875 2.75781 2.76562C2.21615 3.30729 1.78646 3.94271 1.46875 4.67188C1.15625 5.39583 1 6.17188 1 7C1 7.82812 1.15625 8.60677 1.46875 9.33594C1.78646 10.0599 2.21615 10.6953 2.75781 11.2422C3.30469 11.7839 3.9401 12.2135 4.66406 12.5312C5.39323 12.8438 6.17188 13 7 13C7.82812 13 8.60417 12.8438 9.32812 12.5312C10.0573 12.2135 10.6927 11.7839 11.2344 11.2422C11.7812 10.6953 12.2109 10.0599 12.5234 9.33594C12.8411 8.60677 13 7.82812 13 7C13 6.17188 12.8411 5.39583 12.5234 4.67188C12.2109 3.94271 11.7812 3.30729 11.2344 2.76562C10.6927 2.21875 10.0573 1.78906 9.32812 1.47656C8.60417 1.15885 7.82812 1 7 1ZM7 7V3H6V8H10V7H7Z" fill="WindowText"/>
 </svg>
diff --git a/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc b/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc
index ef2d61f7..b052acc1 100644
--- a/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc
@@ -69,11 +69,6 @@
   growth_limit_cap_ = growth_limit_cap;
 }
 
-void GridTrack::SetSizeDistributionWeight(double size_distribution_weight) {
-  DCHECK_GE(size_distribution_weight, 0);
-  size_distribution_weight_ = size_distribution_weight;
-}
-
 bool GridTrack::IsGrowthLimitBiggerThanBaseSize() const {
   return GrowthLimitIsInfinite() || growth_limit_ >= base_size_;
 }
@@ -526,8 +521,7 @@
 void GridTrackSizingAlgorithmStrategy::DistributeSpaceToTracks(
     Vector<GridTrack*>& tracks,
     LayoutUnit& available_logical_space) const {
-  algorithm_.DistributeSpaceToTracks<kNotCrossingIntrinsicFlexibleTracks,
-                                     kMaximizeTracks>(tracks, nullptr,
+  algorithm_.DistributeSpaceToTracks<kMaximizeTracks>(tracks, nullptr,
                                                       available_logical_space);
 }
 
@@ -968,10 +962,8 @@
     const GridTrackSize& track_size,
     LayoutUnit base_size) const {
   const GridLength& grid_length = track_size.MaxTrackBreadth();
-  if (grid_length.IsFlex()) {
-    return track_size.MinTrackBreadth().IsContentSized() ? LayoutUnit(kInfinity)
-                                                         : base_size;
-  }
+  if (grid_length.IsFlex())
+    return base_size;
 
   const Length& track_length = grid_length.length();
   if (track_length.IsSpecified()) {
@@ -1008,11 +1000,8 @@
 
     if (track_size.IsContentSized())
       content_sized_tracks_index_.push_back(i);
-    if (track_size.MaxTrackBreadth().IsFlex()) {
+    if (track_size.MaxTrackBreadth().IsFlex())
       flexible_sized_tracks_index_.push_back(i);
-      if (track_size.MinTrackBreadth().IsContentSized())
-        track.SetSizeDistributionWeight(track_size.MaxTrackBreadth().Flex());
-    }
     if (track_size.HasAutoMaxTrackBreadth() && !track_size.IsFitContent())
       auto_sized_tracks_for_stretch_index_.push_back(i);
 
@@ -1058,12 +1047,12 @@
   }
 }
 
-bool GridTrackSizingAlgorithm::SpanningItemCrossesIntrinsicFlexibleSizedTracks(
+bool GridTrackSizingAlgorithm::SpanningItemCrossesFlexibleSizedTracks(
     const GridSpan& span) const {
   for (const auto& track_position : span) {
     const GridTrackSize& track_size =
         GetGridTrackSize(direction_, track_position);
-    if (track_size.HasIntrinsicMinTrackBreadth() &&
+    if (track_size.MinTrackBreadth().IsFlex() ||
         track_size.MaxTrackBreadth().IsFlex())
       return true;
   }
@@ -1125,13 +1114,9 @@
   return track.BaseSize();
 }
 
-static bool ShouldProcessTrackForTrackSizeComputationVariantAndPhase(
-    TrackSizeComputationVariant variant,
+static bool ShouldProcessTrackForTrackSizeComputationPhase(
     TrackSizeComputationPhase phase,
     const GridTrackSize& track_size) {
-  if (variant == kCrossingIntrinsicFlexibleTracks &&
-      !track_size.MaxTrackBreadth().IsFlex())
-    return false;
   switch (phase) {
     case kResolveIntrinsicMinimums:
       return track_size.HasIntrinsicMinTrackBreadth();
@@ -1260,12 +1245,6 @@
       track2_has_infinite_growth_potential_without_cap)
     return track2_has_infinite_growth_potential_without_cap;
 
-  // We don't have to take weights into account when comparing growth potentials
-  // because they must be 0 at this point. Flexible tracks with a greater
-  // weight have already been handled due to their infinite growth limit.
-  DCHECK_EQ(track1->SizeDistributionWeight(), 0);
-  DCHECK_EQ(track2->SizeDistributionWeight(), 0);
-
   LayoutUnit track1_limit =
       track1->GrowthLimitCap().value_or(track1->GrowthLimit());
   LayoutUnit track2_limit =
@@ -1288,21 +1267,7 @@
   growth_share = std::min(growth_share, distance_to_cap);
 }
 
-static Vector<double> FractionsOfRemainingSpace(
-    const Vector<GridTrack*>& tracks) {
-  size_t tracks_size = tracks.size();
-  Vector<double> fractions_of_remaining_space(tracks_size);
-  double weight_sum = 0;
-  for (size_t i = tracks_size; i-- > 0;) {
-    double weight = tracks[i]->SizeDistributionWeight();
-    weight_sum += weight;
-    fractions_of_remaining_space[i] =
-        weight_sum > 0 ? weight / weight_sum : 1.0 / (tracks_size - i);
-  }
-  return fractions_of_remaining_space;
-}
-
-template <TrackSizeComputationVariant variant, TrackSizeComputationPhase phase>
+template <TrackSizeComputationPhase phase>
 void GridTrackSizingAlgorithm::DistributeSpaceToTracks(
     Vector<GridTrack*>& tracks,
     Vector<GridTrack*>* grow_beyond_growth_limits_tracks,
@@ -1315,23 +1280,13 @@
   }
 
   if (available_logical_space > 0) {
-    // No need to sort when distributing intrinsic contributions among flexible
-    // tracks, because all of them have an infinite growth potential.
-    if (variant == kNotCrossingIntrinsicFlexibleTracks)
-      std::sort(tracks.begin(), tracks.end(), SortByGridTrackGrowthPotential);
+    std::sort(tracks.begin(), tracks.end(), SortByGridTrackGrowthPotential);
 
-    auto fractions_of_remaining_space = FractionsOfRemainingSpace(tracks);
     size_t tracks_size = tracks.size();
     for (size_t i = 0; i < tracks_size; ++i) {
       GridTrack& track = *tracks[i];
-#if DCHECK_IS_ON()
-      if (variant == kCrossingIntrinsicFlexibleTracks)
-        DCHECK(track.GrowthLimitIsInfinite());
-      else
-        DCHECK_EQ(track.SizeDistributionWeight(), 0);
-#endif
-      LayoutUnit available_logical_space_share(available_logical_space *
-                                               fractions_of_remaining_space[i]);
+      LayoutUnit available_logical_space_share =
+          available_logical_space / (tracks_size - i);
       const LayoutUnit& track_breadth =
           TrackSizeForTrackSizeComputationPhase(phase, track, kForbidInfinity);
       LayoutUnit growth_share =
@@ -1349,9 +1304,6 @@
   }
 
   if (available_logical_space > 0 && grow_beyond_growth_limits_tracks) {
-    // We never grow flex tracks beyond growth limits, since they are infinite.
-    DCHECK_NE(variant, kCrossingIntrinsicFlexibleTracks);
-
     // We need to sort them because there might be tracks with growth limit caps
     // (like the ones with fit-content()) which cannot indefinitely grow over
     // the limits.
@@ -1361,15 +1313,12 @@
                 SortByGridTrackGrowthPotential);
     }
 
-    auto fractions_of_remaining_space =
-        FractionsOfRemainingSpace(*grow_beyond_growth_limits_tracks);
     size_t tracks_growing_above_max_breadth_size =
         grow_beyond_growth_limits_tracks->size();
     for (size_t i = 0; i < tracks_growing_above_max_breadth_size; ++i) {
       GridTrack* track = grow_beyond_growth_limits_tracks->at(i);
-      LayoutUnit growth_share(available_logical_space *
-                              fractions_of_remaining_space[i]);
-
+      LayoutUnit growth_share =
+          available_logical_space / (tracks_growing_above_max_breadth_size - i);
       ClampGrowthShareIfNeeded(phase, *track, growth_share);
       DCHECK_GE(growth_share, 0) << "We must never shrink any grid track or "
                                     "else we can't guarantee we abide by our "
@@ -1387,7 +1336,7 @@
   }
 }
 
-template <TrackSizeComputationVariant variant, TrackSizeComputationPhase phase>
+template <TrackSizeComputationPhase phase>
 void GridTrackSizingAlgorithm::IncreaseSizesToAccommodateSpanningItems(
     const GridItemsSpanGroupRange& grid_items_with_span) {
   Vector<GridTrack>& all_tracks = Tracks(direction_);
@@ -1402,9 +1351,8 @@
   for (auto* it = grid_items_with_span.range_start;
        it != grid_items_with_span.range_end; ++it) {
     GridItemWithSpan& grid_item_with_span = *it;
+    DCHECK_GT(grid_item_with_span.GetGridSpan().IntegerSpan(), 1u);
     const GridSpan& item_span = grid_item_with_span.GetGridSpan();
-    DCHECK(variant == kCrossingIntrinsicFlexibleTracks ||
-           item_span.IntegerSpan() > 1u);
 
     grow_beyond_growth_limits_tracks.Shrink(0);
     filtered_tracks.Shrink(0);
@@ -1414,8 +1362,7 @@
       GridTrack& track = Tracks(direction_)[track_position];
       spanning_tracks_size +=
           TrackSizeForTrackSizeComputationPhase(phase, track, kForbidInfinity);
-      if (!ShouldProcessTrackForTrackSizeComputationVariantAndPhase(
-              variant, phase, track_size))
+      if (!ShouldProcessTrackForTrackSizeComputationPhase(phase, track_size))
         continue;
 
       filtered_tracks.push_back(&track);
@@ -1440,7 +1387,7 @@
         grow_beyond_growth_limits_tracks.IsEmpty()
             ? filtered_tracks
             : grow_beyond_growth_limits_tracks;
-    DistributeSpaceToTracks<variant, phase>(
+    DistributeSpaceToTracks<phase>(
         filtered_tracks, &tracks_to_grow_beyond_growth_limits, extra_space);
   }
 
@@ -1451,25 +1398,8 @@
   }
 }
 
-template <TrackSizeComputationVariant variant>
-void GridTrackSizingAlgorithm::IncreaseSizesToAccommodateSpanningItems(
-    const GridItemsSpanGroupRange& grid_items_with_span) {
-  IncreaseSizesToAccommodateSpanningItems<variant, kResolveIntrinsicMinimums>(
-      grid_items_with_span);
-  IncreaseSizesToAccommodateSpanningItems<variant,
-                                          kResolveContentBasedMinimums>(
-      grid_items_with_span);
-  IncreaseSizesToAccommodateSpanningItems<variant, kResolveMaxContentMinimums>(
-      grid_items_with_span);
-  IncreaseSizesToAccommodateSpanningItems<variant, kResolveIntrinsicMaximums>(
-      grid_items_with_span);
-  IncreaseSizesToAccommodateSpanningItems<variant, kResolveMaxContentMaximums>(
-      grid_items_with_span);
-}
-
 void GridTrackSizingAlgorithm::ResolveIntrinsicTrackSizes() {
   Vector<GridItemWithSpan> items_sorted_by_increasing_span;
-  Vector<GridItemWithSpan> items_crossing_flexible_tracks;
   if (grid_.HasGridItems()) {
     HashSet<LayoutBox*> items_set;
     for (const auto& track_index : content_sized_tracks_index_) {
@@ -1478,12 +1408,9 @@
       while (auto* grid_item = iterator->NextGridItem()) {
         if (items_set.insert(grid_item).is_new_entry) {
           const GridSpan& span = grid_.GridItemSpan(*grid_item, direction_);
-          if (SpanningItemCrossesIntrinsicFlexibleSizedTracks(span)) {
-            items_crossing_flexible_tracks.push_back(
-                GridItemWithSpan(*grid_item, span));
-          } else if (span.IntegerSpan() == 1) {
+          if (span.IntegerSpan() == 1) {
             SizeTrackToFitNonSpanningItem(span, *grid_item, track);
-          } else {
+          } else if (!SpanningItemCrossesFlexibleSizedTracks(span)) {
             items_sorted_by_increasing_span.push_back(
                 GridItemWithSpan(*grid_item, span));
           }
@@ -1499,23 +1426,24 @@
   while (it != end) {
     GridItemsSpanGroupRange span_group_range = {it,
                                                 std::upper_bound(it, end, *it)};
-    IncreaseSizesToAccommodateSpanningItems<
-        kNotCrossingIntrinsicFlexibleTracks>(span_group_range);
+    IncreaseSizesToAccommodateSpanningItems<kResolveIntrinsicMinimums>(
+        span_group_range);
+    IncreaseSizesToAccommodateSpanningItems<kResolveContentBasedMinimums>(
+        span_group_range);
+    IncreaseSizesToAccommodateSpanningItems<kResolveMaxContentMinimums>(
+        span_group_range);
+    IncreaseSizesToAccommodateSpanningItems<kResolveIntrinsicMaximums>(
+        span_group_range);
+    IncreaseSizesToAccommodateSpanningItems<kResolveMaxContentMaximums>(
+        span_group_range);
     it = span_group_range.range_end;
   }
 
-  IncreaseSizesToAccommodateSpanningItems<kCrossingIntrinsicFlexibleTracks>(
-      {items_crossing_flexible_tracks.begin(),
-       items_crossing_flexible_tracks.end()});
-
-  Vector<GridTrack>& track_list = Tracks(direction_);
   for (const auto& track_index : content_sized_tracks_index_) {
-    GridTrack& track = track_list[track_index];
+    GridTrack& track = Tracks(direction_)[track_index];
     if (track.GrowthLimit() == kInfinity)
       track.SetGrowthLimit(track.BaseSize());
   }
-  for (const auto& track_index : flexible_sized_tracks_index_)
-    track_list[track_index].SetSizeDistributionWeight(0);
 }
 
 void GridTrackSizingAlgorithm::ComputeGridContainerIntrinsicSizes() {
@@ -1523,12 +1451,8 @@
 
   Vector<GridTrack>& all_tracks = Tracks(direction_);
   for (auto& track : all_tracks) {
-#if DCHECK_IS_ON()
-    if (!strategy_->IsComputingSizeContainment()) {
-      DCHECK(!track.InfiniteGrowthPotential());
-      DCHECK_EQ(track.SizeDistributionWeight(), 0);
-    }
-#endif
+    DCHECK(strategy_->IsComputingSizeContainment() ||
+           !track.InfiniteGrowthPotential());
     min_content_size_ += track.BaseSize();
     max_content_size_ +=
         track.GrowthLimitIsInfinite() ? track.BaseSize() : track.GrowthLimit();
diff --git a/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.h b/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.h
index 2fb7574..6107043 100644
--- a/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.h
+++ b/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.h
@@ -24,11 +24,6 @@
 class GridTrackSizingAlgorithmStrategy;
 class LayoutGrid;
 
-enum TrackSizeComputationVariant {
-  kNotCrossingIntrinsicFlexibleTracks,
-  kCrossingIntrinsicFlexibleTracks,
-};
-
 enum TrackSizeComputationPhase {
   kResolveIntrinsicMinimums,
   kResolveContentBasedMinimums,
@@ -71,14 +66,6 @@
   }
   void SetGrowthLimitCap(base::Optional<LayoutUnit>);
 
-  // For flexible tracks, intrinsic contributions are distributed according to
-  // the ratios of the flex fractions. At that point we will only have some
-  // GridTracks, but we won't know their index, so we won't be able to call
-  // GetGridTrackSize in order to obtain their flex fraction. Therefore we cache
-  // them instead of computing on demand.
-  double SizeDistributionWeight() const { return size_distribution_weight_; }
-  void SetSizeDistributionWeight(double);
-
  private:
   bool IsGrowthLimitBiggerThanBaseSize() const;
   void EnsureGrowthLimitIsBiggerThanBaseSize();
@@ -89,7 +76,6 @@
   LayoutUnit size_during_distribution_;
   base::Optional<LayoutUnit> growth_limit_cap_;
   bool infinitely_growable_;
-  double size_distribution_weight_{0};
 };
 
 class GridTrackSizingAlgorithm final {
@@ -164,19 +150,14 @@
   void SizeTrackToFitNonSpanningItem(const GridSpan&,
                                      LayoutBox& grid_item,
                                      GridTrack&);
-  bool SpanningItemCrossesIntrinsicFlexibleSizedTracks(const GridSpan&) const;
+  bool SpanningItemCrossesFlexibleSizedTracks(const GridSpan&) const;
   typedef struct GridItemsSpanGroupRange GridItemsSpanGroupRange;
-  template <TrackSizeComputationVariant variant,
-            TrackSizeComputationPhase phase>
-  void IncreaseSizesToAccommodateSpanningItems(
-      const GridItemsSpanGroupRange& grid_items_with_span);
-  template <TrackSizeComputationVariant variant>
+  template <TrackSizeComputationPhase phase>
   void IncreaseSizesToAccommodateSpanningItems(
       const GridItemsSpanGroupRange& grid_items_with_span);
   LayoutUnit ItemSizeForTrackSizeComputationPhase(TrackSizeComputationPhase,
                                                   LayoutBox&) const;
-  template <TrackSizeComputationVariant variant,
-            TrackSizeComputationPhase phase>
+  template <TrackSizeComputationPhase phase>
   void DistributeSpaceToTracks(
       Vector<GridTrack*>& tracks,
       Vector<GridTrack*>* grow_beyond_growth_limits_tracks,
diff --git a/third_party/blink/renderer/core/mojo/mojo_handle.cc b/third_party/blink/renderer/core/mojo/mojo_handle.cc
index a2491fc..6d92158 100644
--- a/third_party/blink/renderer/core/mojo/mojo_handle.cc
+++ b/third_party/blink/renderer/core/mojo/mojo_handle.cc
@@ -242,15 +242,13 @@
       MojoMapBuffer(handle_.get().value(), offset, num_bytes, nullptr, &data);
   result_dict->setResult(result);
   if (result == MOJO_RESULT_OK) {
-    WTF::ArrayBufferContents::DataHandle data_handle(
+    WTF::ArrayBufferContents contents(
         data, num_bytes,
         [](void* buffer, size_t length, void* alloc_data) {
           MojoResult result = MojoUnmapBuffer(buffer);
           DCHECK_EQ(result, MOJO_RESULT_OK);
         },
-        nullptr);
-    WTF::ArrayBufferContents contents(std::move(data_handle),
-                                      WTF::ArrayBufferContents::kNotShared);
+        WTF::ArrayBufferContents::kNotShared);
     result_dict->setBuffer(DOMArrayBuffer::Create(contents));
   }
   return result_dict;
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h
index 61d5c0c..39cf096 100644
--- a/third_party/blink/renderer/core/style/computed_style.h
+++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -2502,6 +2502,8 @@
       return false;
     if (Display() == EDisplay::kNone)
       return false;
+    if (IsEnsuredInDisplayNone())
+      return false;
     if (Display() != EDisplay::kContents)
       return true;
     // For display: contents elements, we still need to generate ::before and
diff --git a/third_party/blink/renderer/core/svg/svg_animation_element.cc b/third_party/blink/renderer/core/svg/svg_animation_element.cc
index 491d868..2d02497 100644
--- a/third_party/blink/renderer/core/svg/svg_animation_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_animation_element.cc
@@ -522,19 +522,27 @@
   if (values_.IsEmpty())
     return false;
   CalcMode calc_mode = GetCalcMode();
+  // For 'values' animations, there should be exactly as many 'keyTimes' as
+  // 'values'.
   if (calc_mode != kCalcModePaced &&
-      FastHasAttribute(svg_names::kKeyTimesAttr) &&
       !FastHasAttribute(svg_names::kKeyPointsAttr) &&
+      FastHasAttribute(svg_names::kKeyTimesAttr) &&
       values_.size() != KeyTimes().size())
     return false;
+  // If 'keyTimes' is specified its last value should be 1 (and the first 0)
+  // unless 'calcMode' is 'discrete'.
   if (calc_mode != kCalcModeDiscrete && !KeyTimes().IsEmpty() &&
       KeyTimes().back() != 1)
     return false;
+  // If 'calcMode' is 'spline', there should be one less spline than there are
+  // 'keyPoints' or 'values'.
   if (calc_mode == kCalcModeSpline) {
     if ((key_splines_.IsEmpty() || key_splines_.size() != values_.size() - 1) &&
         key_splines_.size() != key_points_.size() - 1)
       return false;
   }
+  // If 'keyPoints' is specified it should have the same amount of points as
+  // 'keyTimes', and at least two points.
   if (FastHasAttribute(svg_names::kKeyPointsAttr) &&
       (KeyTimes().size() < 2 || KeyTimes().size() != key_points_.size()))
     return false;
@@ -554,12 +562,16 @@
     return false;
 
   // These validations are appropriate for all animation modes.
+  // If 'keyPoints' is specified it should have the same amount of points as
+  // 'keyTimes'.
   if (FastHasAttribute(svg_names::kKeyPointsAttr) &&
       KeyTimes().size() != key_points_.size())
     return false;
 
   CalcMode calc_mode = GetCalcMode();
   if (calc_mode == kCalcModeSpline) {
+    // If 'calcMode' is 'spline', there should be one less spline than there
+    // are 'keyTimes' or 'keyPoints' - or 'values' if it is used.
     if (key_splines_.IsEmpty() ||
         (FastHasAttribute(svg_names::kKeyPointsAttr) &&
          key_splines_.size() != key_points_.size() - 1) ||
@@ -570,13 +582,17 @@
       return false;
   }
 
-  if ((animation_mode == kFromToAnimation ||
-       animation_mode == kFromByAnimation || animation_mode == kToAnimation ||
-       animation_mode == kByAnimation) &&
-      (FastHasAttribute(svg_names::kKeyTimesAttr) &&
-       FastHasAttribute(svg_names::kKeyPointsAttr) &&
-       (KeyTimes().size() < 2 || KeyTimes().size() != key_points_.size())))
-    return false;
+  if (animation_mode == kFromToAnimation ||
+      animation_mode == kFromByAnimation || animation_mode == kToAnimation ||
+      animation_mode == kByAnimation) {
+    if (FastHasAttribute(svg_names::kKeyTimesAttr)) {
+      // If 'keyPoints' is specified it should have the same amount of points
+      // as 'keyTimes', and at least two points.
+      if (FastHasAttribute(svg_names::kKeyPointsAttr) &&
+          (KeyTimes().size() < 2 || KeyTimes().size() != key_points_.size()))
+        return false;
+    }
+  }
   const String& from = FromValue();
   const String& to = ToValue();
   const String& by = ByValue();
@@ -595,10 +611,14 @@
   if (animation_mode == kValuesAnimation)
     return CalculateValuesAnimation();
   if (animation_mode == kPathAnimation) {
-    return calc_mode == kCalcModePaced ||
-           !(FastHasAttribute(svg_names::kKeyPointsAttr) &&
-             (KeyTimes().size() < 2 ||
-              KeyTimes().size() != key_points_.size()));
+    if (calc_mode == kCalcModePaced)
+      return true;
+    // If 'keyPoints' is specified it should have the same amount of points as
+    // 'keyTimes', and at least two points.
+    if (FastHasAttribute(svg_names::kKeyPointsAttr) &&
+        (KeyTimes().size() < 2 || KeyTimes().size() != key_points_.size()))
+      return false;
+    return true;
   }
   return false;
 }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index 5395fdee..6be853a 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -1561,6 +1561,9 @@
   bool hidden_and_ignored_but_included_in_tree =
       IsHiddenForTextAlternativeCalculation() &&
       AccessibilityIsIgnoredButIncludedInTree();
+  // Initialize |name_from|, as TextAlternative() might never set it in some
+  // cases.
+  name_from = ax::mojom::NameFrom::kNone;
   String text = TextAlternative(false, hidden_and_ignored_but_included_in_tree,
                                 visited, name_from, &related_objects, nullptr);
 
diff --git a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
index 909f84af..fccc715 100644
--- a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
+++ b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
@@ -724,6 +724,8 @@
   Document* document = inspected_frames_->Root()->GetDocument();
   if (!document)
     return Response::Error("No document.");
+  if (document->View()->NeedsLayout() || document->NeedsLayoutTreeUpdate())
+    document->UpdateStyleAndLayout();
   *nodes = std::make_unique<protocol::Array<protocol::Accessibility::AXNode>>();
   AXContext ax_context(*document);
   AXObjectCacheImpl& cache = ToAXObjectCacheImpl(ax_context.GetAXObjectCache());
diff --git a/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc b/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc
index bac3f884..5eab48f 100644
--- a/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc
+++ b/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc
@@ -161,12 +161,9 @@
     base::TimeDelta current_time,
     double playback_rate,
     AnimationTimeline& timeline) {
-  bool is_null;
-  double time_ms = timeline.currentTime(is_null);
-  DCHECK(!is_null);
-
-  auto timeline_time = base::TimeDelta::FromMillisecondsD(time_ms);
-  return timeline_time - (current_time / playback_rate);
+  base::Optional<double> timeline_current_time_ms = timeline.CurrentTime();
+  return base::TimeDelta::FromMillisecondsD(timeline_current_time_ms.value()) -
+         (current_time / playback_rate);
 }
 }  // namespace
 
@@ -711,8 +708,7 @@
 // zero (i.e., scroll origin) and the current time corresponding to the current
 // scroll position adjusted by the playback rate.
 //
-// Changing scroll-linked animation start_time initialization is under
-// consideration here: https://github.com/w3c/csswg-drafts/issues/2075.
+// More information at AnimationTimeline::InitialStartTimeForAnimations
 //
 // TODO(https://crbug.com/986925): The playback rate should be taken into
 // consideration when calculating the initial current time.
@@ -722,16 +718,17 @@
       !IsTimelineActive())
     return base::nullopt;
 
-  if (timeline_->IsScrollTimeline()) {
-    bool is_null;
-    double timeline_time_ms = timeline_->currentTime(is_null);
-    if (is_null)
-      return base::nullopt;
+  base::Optional<base::TimeDelta> starting_time =
+      timeline_->InitialStartTimeForAnimations();
+  base::Optional<double> current_time = timeline_->CurrentTime();
 
-    return base::TimeDelta::FromMillisecondsD(timeline_time_ms) *
-           playback_rate_;
+  if (!starting_time || !current_time) {
+    return base::nullopt;
   }
-  return base::TimeDelta();
+
+  return (base::TimeDelta::FromMillisecondsD(current_time.value()) -
+          starting_time.value()) *
+         playback_rate_;
 }
 
 void WorkletAnimation::UpdateCurrentTimeIfNeeded() {
diff --git a/third_party/blink/renderer/modules/nfc/ndef_record.cc b/third_party/blink/renderer/modules/nfc/ndef_record.cc
index eb8e936e..a42a58af 100644
--- a/third_party/blink/renderer/modules/nfc/ndef_record.cc
+++ b/third_party/blink/renderer/modules/nfc/ndef_record.cc
@@ -7,6 +7,7 @@
 #include "services/device/public/mojom/nfc.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_array_buffer.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
+#include "third_party/blink/renderer/core/typed_arrays/dom_data_view.h"
 #include "third_party/blink/renderer/modules/nfc/ndef_record_init.h"
 #include "third_party/blink/renderer/modules/nfc/nfc_utils.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
@@ -257,23 +258,24 @@
                        WTF::Vector<uint8_t> data)
     : record_type_(record_type),
       media_type_(media_type),
-      data_(std::move(data)) {}
+      payload_data_(std::move(data)) {}
 
 NDEFRecord::NDEFRecord(const String& text)
     : record_type_("text"),
       media_type_("text/plain;charset=UTF-8"),
-      data_(GetUTF8DataFromString(text)) {}
+      payload_data_(GetUTF8DataFromString(text)) {}
 
 NDEFRecord::NDEFRecord(DOMArrayBuffer* array_buffer)
     : record_type_("opaque"), media_type_("application/octet-stream") {
-  data_.Append(static_cast<uint8_t*>(array_buffer->Data()),
-               array_buffer->ByteLength());
+  payload_data_.Append(static_cast<uint8_t*>(array_buffer->Data()),
+                       array_buffer->ByteLength());
 }
 
 NDEFRecord::NDEFRecord(const device::mojom::blink::NDEFRecord& record)
     : record_type_(record.record_type),
       media_type_(record.media_type),
-      data_(record.data) {}
+      id_(record.id),
+      payload_data_(record.data) {}
 
 const String& NDEFRecord::recordType() const {
   return record_type_;
@@ -283,6 +285,16 @@
   return media_type_;
 }
 
+const String& NDEFRecord::id() const {
+  return id_;
+}
+
+DOMDataView* NDEFRecord::data() const {
+  DOMArrayBuffer* dom_buffer =
+      DOMArrayBuffer::Create(payload_data_.data(), payload_data_.size());
+  return DOMDataView::Create(dom_buffer, 0, payload_data_.size());
+}
+
 String NDEFRecord::text() const {
   if (record_type_ == "empty")
     return String();
@@ -290,7 +302,8 @@
   // TODO(https://crbug.com/520391): Support utf-16 decoding for 'TEXT' record
   // as described at
   // http://w3c.github.io/web-nfc/#dfn-convert-ndefrecord-payloaddata-bytes.
-  return String::FromUTF8WithLatin1Fallback(data_.data(), data_.size());
+  return String::FromUTF8WithLatin1Fallback(payload_data_.data(),
+                                            payload_data_.size());
 }
 
 DOMArrayBuffer* NDEFRecord::arrayBuffer() const {
@@ -301,7 +314,7 @@
   DCHECK(record_type_ == "json" || record_type_ == "opaque" ||
          !ValidateCustomRecordType(record_type_).IsNull());
 
-  return DOMArrayBuffer::Create(data_.data(), data_.size());
+  return DOMArrayBuffer::Create(payload_data_.data(), payload_data_.size());
 }
 
 ScriptValue NDEFRecord::json(ScriptState* script_state,
@@ -314,17 +327,18 @@
          !ValidateCustomRecordType(record_type_).IsNull());
 
   ScriptState::Scope scope(script_state);
-  v8::Local<v8::Value> json_object = FromJSONString(
-      script_state->GetIsolate(), script_state->GetContext(),
-      String::FromUTF8WithLatin1Fallback(data_.data(), data_.size()),
-      exception_state);
+  v8::Local<v8::Value> json_object =
+      FromJSONString(script_state->GetIsolate(), script_state->GetContext(),
+                     String::FromUTF8WithLatin1Fallback(payload_data_.data(),
+                                                        payload_data_.size()),
+                     exception_state);
   if (exception_state.HadException())
     return ScriptValue::CreateNull(script_state->GetIsolate());
   return ScriptValue(script_state->GetIsolate(), json_object);
 }
 
-const WTF::Vector<uint8_t>& NDEFRecord::data() const {
-  return data_;
+const WTF::Vector<uint8_t>& NDEFRecord::payloadData() const {
+  return payload_data_;
 }
 
 void NDEFRecord::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/modules/nfc/ndef_record.h b/third_party/blink/renderer/modules/nfc/ndef_record.h
index a77a382..868bbfa 100644
--- a/third_party/blink/renderer/modules/nfc/ndef_record.h
+++ b/third_party/blink/renderer/modules/nfc/ndef_record.h
@@ -16,6 +16,7 @@
 namespace blink {
 
 class DOMArrayBuffer;
+class DOMDataView;
 class ExceptionState;
 class NDEFRecordInit;
 class ScriptState;
@@ -37,20 +38,23 @@
 
   const String& recordType() const;
   const String& mediaType() const;
+  const String& id() const;
+  DOMDataView* data() const;
   String text() const;
   DOMArrayBuffer* arrayBuffer() const;
   ScriptValue json(ScriptState*, ExceptionState&) const;
 
-  const WTF::Vector<uint8_t>& data() const;
+  const WTF::Vector<uint8_t>& payloadData() const;
 
   void Trace(blink::Visitor*) override;
 
  private:
   String record_type_;
   String media_type_;
+  String id_;
   // Holds the NDEFRecord.[[PayloadData]] bytes defined at
   // https://w3c.github.io/web-nfc/#the-ndefrecord-interface.
-  WTF::Vector<uint8_t> data_;
+  WTF::Vector<uint8_t> payload_data_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/nfc/ndef_record.idl b/third_party/blink/renderer/modules/nfc/ndef_record.idl
index e751a681..f27b8876 100644
--- a/third_party/blink/renderer/modules/nfc/ndef_record.idl
+++ b/third_party/blink/renderer/modules/nfc/ndef_record.idl
@@ -13,6 +13,8 @@
 ] interface NDEFRecord {
     readonly attribute NDEFRecordType recordType;
     readonly attribute USVString mediaType;
+    readonly attribute USVString id;
+    readonly attribute DataView? data;
     USVString? text();
     [NewObject] ArrayBuffer? arrayBuffer();
     [CallWith=ScriptState, RaisesException] object? json();
diff --git a/third_party/blink/renderer/modules/nfc/ndef_record_init.idl b/third_party/blink/renderer/modules/nfc/ndef_record_init.idl
index af2d2f1..44675a80 100644
--- a/third_party/blink/renderer/modules/nfc/ndef_record_init.idl
+++ b/third_party/blink/renderer/modules/nfc/ndef_record_init.idl
@@ -6,12 +6,10 @@
 
 typedef DOMString NDEFRecordType;
 
-typedef any NDEFRecordData;
-
 // https://w3c.github.io/web-nfc/#dom-ndefrecordinit
 
 dictionary NDEFRecordInit {
     NDEFRecordType recordType;
     USVString mediaType;
-    NDEFRecordData data;
+    any data;
 };
diff --git a/third_party/blink/renderer/modules/nfc/nfc_proxy.cc b/third_party/blink/renderer/modules/nfc/nfc_proxy.cc
index b0a84e1..83fd718 100644
--- a/third_party/blink/renderer/modules/nfc/nfc_proxy.cc
+++ b/third_party/blink/renderer/modules/nfc/nfc_proxy.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "third_party/blink/public/common/browser_interface_broker_proxy.h"
-#include "third_party/blink/renderer/core/page/focus_controller.h"
 #include "third_party/blink/renderer/modules/nfc/ndef_reader.h"
 #include "third_party/blink/renderer/modules/nfc/ndef_writer.h"
 #include "third_party/blink/renderer/modules/nfc/nfc_type_converters.h"
@@ -36,7 +35,6 @@
 // NFCProxy
 NFCProxy::NFCProxy(Document& document)
     : PageVisibilityObserver(document.GetPage()),
-      FocusChangedObserver(document.GetPage()),
       Supplement<Document>(document),
       client_receiver_(this) {}
 
@@ -50,7 +48,6 @@
   visitor->Trace(writers_);
   visitor->Trace(readers_);
   PageVisibilityObserver::Trace(visitor);
-  FocusChangedObserver::Trace(visitor);
   Supplement<Document>::Trace(visitor);
 }
 
@@ -147,14 +144,6 @@
 }
 
 void NFCProxy::PageVisibilityChanged() {
-  UpdateSuspendedStatus();
-}
-
-void NFCProxy::FocusedFrameChanged() {
-  UpdateSuspendedStatus();
-}
-
-void NFCProxy::UpdateSuspendedStatus() {
   // If service is not initialized, there cannot be any pending NFC activities.
   if (!nfc_remote_)
     return;
@@ -163,28 +152,12 @@
   // https://w3c.github.io/web-nfc/#nfc-suspended
   // TODO(https://crbug.com/520391): Suspend/Resume NFC in the browser process
   // instead to prevent a compromised renderer from using NFC in the background.
-  if (ShouldSuspendNFC())
+  if (!GetPage()->IsPageVisible())
     nfc_remote_->SuspendNFCOperations();
   else
     nfc_remote_->ResumeNFCOperations();
 }
 
-bool NFCProxy::ShouldSuspendNFC() const {
-  if (!GetPage()->IsPageVisible())
-    return true;
-
-  LocalFrame* focused_frame = GetPage()->GetFocusController().FocusedFrame();
-  LocalFrame* this_frame = GetSupplementable()->GetFrame();
-
-  if (!focused_frame || !this_frame)
-    return true;
-
-  if (focused_frame != this_frame)
-    return true;
-
-  return false;
-}
-
 void NFCProxy::EnsureMojoConnection() {
   if (nfc_remote_)
     return;
diff --git a/third_party/blink/renderer/modules/nfc/nfc_proxy.h b/third_party/blink/renderer/modules/nfc/nfc_proxy.h
index 0c0e242..922dfc1 100644
--- a/third_party/blink/renderer/modules/nfc/nfc_proxy.h
+++ b/third_party/blink/renderer/modules/nfc/nfc_proxy.h
@@ -9,7 +9,6 @@
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/nfc.mojom-blink.h"
 #include "third_party/blink/renderer/core/dom/document.h"
-#include "third_party/blink/renderer/core/page/focus_changed_observer.h"
 #include "third_party/blink/renderer/core/page/page_visibility_observer.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/wtf/hash_map.h"
@@ -25,7 +24,6 @@
 // to implementation of device::mojom::blink::NFC interface.
 class MODULES_EXPORT NFCProxy final : public GarbageCollected<NFCProxy>,
                                       public PageVisibilityObserver,
-                                      public FocusChangedObserver,
                                       public Supplement<Document>,
                                       public device::mojom::blink::NFCClient {
   USING_GARBAGE_COLLECTED_MIXIN(NFCProxy);
@@ -68,12 +66,6 @@
   // Implementation of PageVisibilityObserver.
   void PageVisibilityChanged() override;
 
-  // Implementation of FocusChangedObserver.
-  void FocusedFrameChanged() override;
-
-  void UpdateSuspendedStatus();
-  bool ShouldSuspendNFC() const;
-
   void EnsureMojoConnection();
 
   // This could only happen when the embedder does not implement NFC interface.
diff --git a/third_party/blink/renderer/modules/nfc/nfc_type_converters.cc b/third_party/blink/renderer/modules/nfc/nfc_type_converters.cc
index a9d0a1b..0d16987 100644
--- a/third_party/blink/renderer/modules/nfc/nfc_type_converters.cc
+++ b/third_party/blink/renderer/modules/nfc/nfc_type_converters.cc
@@ -31,7 +31,7 @@
 NDEFRecordPtr TypeConverter<NDEFRecordPtr, ::blink::NDEFRecord*>::Convert(
     const ::blink::NDEFRecord* record) {
   return NDEFRecord::New(record->recordType(), record->mediaType(),
-                         record->data());
+                         record->id(), record->payloadData());
 }
 
 NDEFMessagePtr TypeConverter<NDEFMessagePtr, ::blink::NDEFMessage*>::Convert(
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc
index 8bb0beb..cd4b886c 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc
@@ -47,25 +47,23 @@
   return nullptr;
 }
 
-double RTCRtpReceiver::jitterBufferDelayHint(bool& is_null, ExceptionState&) {
-  is_null = !jitter_buffer_delay_hint_.has_value();
-  return jitter_buffer_delay_hint_.value_or(0.0);
+double RTCRtpReceiver::playoutDelayHint(bool& is_null, ExceptionState&) {
+  is_null = !playout_delay_hint_.has_value();
+  return playout_delay_hint_.value_or(0.0);
 }
 
-void RTCRtpReceiver::setJitterBufferDelayHint(double value,
-                                              bool is_null,
-                                              ExceptionState& exception_state) {
+void RTCRtpReceiver::setPlayoutDelayHint(double value,
+                                         bool is_null,
+                                         ExceptionState& exception_state) {
   base::Optional<double> hint =
       is_null ? base::nullopt : base::Optional<double>(value);
   if (hint && *hint < 0.0) {
-    exception_state.ThrowDOMException(
-        DOMExceptionCode::kInvalidAccessError,
-        "jitterBufferDelayHint can't be negative");
+    exception_state.ThrowTypeError("playoutDelayHint can't be negative");
     return;
   }
 
-  jitter_buffer_delay_hint_ = hint;
-  receiver_->SetJitterBufferMinimumDelay(jitter_buffer_delay_hint_);
+  playout_delay_hint_ = hint;
+  receiver_->SetJitterBufferMinimumDelay(playout_delay_hint_);
 }
 
 HeapVector<Member<RTCRtpSynchronizationSource>>
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.h b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.h
index 79d311ec..83b396bc 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.h
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.h
@@ -43,8 +43,8 @@
   MediaStreamTrack* track() const;
   RTCDtlsTransport* transport();
   RTCDtlsTransport* rtcpTransport();
-  double jitterBufferDelayHint(bool&, ExceptionState&);
-  void setJitterBufferDelayHint(double, bool, ExceptionState&);
+  double playoutDelayHint(bool&, ExceptionState&);
+  void setPlayoutDelayHint(double, bool, ExceptionState&);
   RTCRtpReceiveParameters* getParameters();
   HeapVector<Member<RTCRtpSynchronizationSource>> getSynchronizationSources();
   HeapVector<Member<RTCRtpContributingSource>> getContributingSources();
@@ -77,7 +77,7 @@
   // Hint to the WebRTC Jitter Buffer about desired playout delay. Actual
   // observed delay may differ depending on the congestion control. |nullopt|
   // means default value must be used.
-  base::Optional<double> jitter_buffer_delay_hint_;
+  base::Optional<double> playout_delay_hint_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.idl b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.idl
index 82ea2e893..0d88ea8 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.idl
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.idl
@@ -8,7 +8,8 @@
     readonly attribute MediaStreamTrack track;
     [RuntimeEnabled=RTCDtlsTransport] readonly attribute RTCDtlsTransport? transport;
     [RuntimeEnabled=RTCDtlsTransport] readonly attribute RTCDtlsTransport? rtcpTransport;
-    [RaisesException, RuntimeEnabled=RtcJitterBufferDelayHint, Measure] attribute double? jitterBufferDelayHint;
+    // https://henbos.github.io/webrtc-extensions/#dom-rtcrtpreceiver-playoutdelayhint
+    [RaisesException, Measure] attribute double? playoutDelayHint;
     static RTCRtpCapabilities?            getCapabilities(DOMString kind);
     RTCRtpReceiveParameters               getParameters();
     sequence<RTCRtpSynchronizationSource> getSynchronizationSources();
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_buffer.cc b/third_party/blink/renderer/modules/webgpu/gpu_buffer.cc
index 81e8cfbd..bf8e359 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_buffer.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_buffer.cc
@@ -61,15 +61,12 @@
 DOMArrayBuffer* CreateArrayBufferForMappedData(void* data, size_t data_length) {
   DCHECK(data);
 
-  WTF::ArrayBufferContents::DataHandle handle(
+  WTF::ArrayBufferContents contents(
       data, data_length,
       [](void* data, size_t length, void* info) {
         // DataDeleter does nothing because Dawn wire owns the memory.
       },
-      nullptr);
-
-  WTF::ArrayBufferContents contents(
-      std::move(handle), WTF::ArrayBufferContents::SharingType::kNotShared);
+      WTF::ArrayBufferContents::SharingType::kNotShared);
 
   return DOMArrayBuffer::Create(contents);
 }
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index c3c6097..ad27079 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1400,11 +1400,6 @@
       origin_trial_feature_name: "RTCQuicTransport",
       status: "experimental",
     },
-    {
-      name: "RtcJitterBufferDelayHint",
-      origin_trial_feature_name: "RtcJitterBufferDelayHint",
-      status: "experimental",
-    },
     // Enables the use of the RTCQuicTransport object.
     {
       name: "RTCQuicTransport",
diff --git a/third_party/blink/renderer/platform/weborigin/known_ports.cc b/third_party/blink/renderer/platform/weborigin/known_ports.cc
index 5cf7ba7..6b3054a 100644
--- a/third_party/blink/renderer/platform/weborigin/known_ports.cc
+++ b/third_party/blink/renderer/platform/weborigin/known_ports.cc
@@ -46,8 +46,6 @@
       return protocol == "ftp";
     case 990:
       return protocol == "ftps";
-    case 70:
-      return protocol == "gopher";
   }
   return false;
 }
@@ -61,8 +59,6 @@
     return 21;
   if (protocol == "ftps")
     return 990;
-  if (protocol == "gopher")
-    return 70;
 
   return 0;
 }
diff --git a/third_party/blink/renderer/platform/weborigin/scheme_registry.cc b/third_party/blink/renderer/platform/weborigin/scheme_registry.cc
index 373f344..3903a94 100644
--- a/third_party/blink/renderer/platform/weborigin/scheme_registry.cc
+++ b/third_party/blink/renderer/platform/weborigin/scheme_registry.cc
@@ -249,7 +249,7 @@
 }
 
 bool SchemeRegistry::ShouldTreatURLSchemeAsLegacy(const String& scheme) {
-  return scheme == "ftp" || scheme == "gopher";
+  return scheme == "ftp";
 }
 
 bool SchemeRegistry::ShouldTrackUsageMetricsForScheme(const String& scheme) {
diff --git a/third_party/blink/renderer/platform/weborigin/scheme_registry.h b/third_party/blink/renderer/platform/weborigin/scheme_registry.h
index 9620bbe..5ea4be8b 100644
--- a/third_party/blink/renderer/platform/weborigin/scheme_registry.h
+++ b/third_party/blink/renderer/platform/weborigin/scheme_registry.h
@@ -92,8 +92,8 @@
   // Serialize the registered schemes in a comma-separated list.
   static String ListOfCorsEnabledURLSchemes();
 
-  // "Legacy" schemes (e.g. 'ftp:', 'gopher:') which we might want to treat
-  // differently from "webby" schemes.
+  // "Legacy" schemes (e.g. 'ftp:') which we might want to treat differently
+  // from "webby" schemes.
   static bool ShouldTreatURLSchemeAsLegacy(const String& scheme);
 
   // Does the scheme represent a location relevant to web compatibility metrics?
diff --git a/third_party/blink/renderer/platform/weborigin/security_origin_test.cc b/third_party/blink/renderer/platform/weborigin/security_origin_test.cc
index d58dedd..4aae4b3 100644
--- a/third_party/blink/renderer/platform/weborigin/security_origin_test.cc
+++ b/third_party/blink/renderer/platform/weborigin/security_origin_test.cc
@@ -580,7 +580,6 @@
       {"https", "example.com", 444, "https://example.com:444"},
       {"file", "", 0, "file://"},
       {"file", "example.com", 0, "file://"},
-      {"gopher", "Foo.com", 70, "gopher://foo.com"},
   };
 
   for (const auto& test : cases) {
@@ -700,9 +699,6 @@
 
       // Registered URLs
       {"ftp://example.com/", "ftp", "example.com", 21},
-      // crbug.com/781342
-      // Conversion doesn't work for gopher.
-      // {"gopher://example.com/", "gopher", "example.com", 70},
       {"ws://example.com/", "ws", "example.com", 80},
       {"wss://example.com/", "wss", "example.com", 443},
 
@@ -722,9 +718,6 @@
        123},
       {"blob:https://example.com/guid-goes-here", "https", "example.com", 443},
       {"blob:http://u:p@example.com/guid-goes-here", "http", "example.com", 80},
-
-      // Gopher:
-      {"gopher://8u.9.Vx6/", "gopher", "8u.9.vx6", 70},
   };
 
   for (const auto& test_case : cases) {
diff --git a/third_party/blink/renderer/platform/wtf/typed_arrays/array_buffer_contents.cc b/third_party/blink/renderer/platform/wtf/typed_arrays/array_buffer_contents.cc
index ac76d12..53c28e8 100644
--- a/third_party/blink/renderer/platform/wtf/typed_arrays/array_buffer_contents.cc
+++ b/third_party/blink/renderer/platform/wtf/typed_arrays/array_buffer_contents.cc
@@ -34,21 +34,6 @@
 
 namespace WTF {
 
-void ArrayBufferContents::DefaultAdjustAmountOfExternalAllocatedMemoryFunction(
-    int64_t diff) {
-  // Do nothing by default.
-}
-
-ArrayBufferContents::AdjustAmountOfExternalAllocatedMemoryFunction
-    ArrayBufferContents::adjust_amount_of_external_allocated_memory_function_ =
-        DefaultAdjustAmountOfExternalAllocatedMemoryFunction;
-
-#if DCHECK_IS_ON()
-ArrayBufferContents::AdjustAmountOfExternalAllocatedMemoryFunction
-    ArrayBufferContents::
-        last_used_adjust_amount_of_external_allocated_memory_function_;
-#endif
-
 ArrayBufferContents::ArrayBufferContents()
     : holder_(base::AdoptRef(new DataHolder())) {}
 
@@ -81,6 +66,14 @@
   }
 }
 
+ArrayBufferContents::ArrayBufferContents(void* data,
+                                         size_t length,
+                                         DataDeleter deleter,
+                                         SharingType is_shared)
+    : holder_(base::AdoptRef(new DataHolder())) {
+  holder_->Adopt(DataHandle(data, length, deleter, nullptr), is_shared);
+}
+
 ArrayBufferContents::~ArrayBufferContents() = default;
 
 void ArrayBufferContents::Detach() {
@@ -148,9 +141,6 @@
       has_registered_external_allocation_(false) {}
 
 ArrayBufferContents::DataHolder::~DataHolder() {
-  if (has_registered_external_allocation_)
-    AdjustAmountOfExternalAllocatedMemory(-static_cast<int64_t>(DataLength()));
-
   is_shared_ = kNotShared;
 }
 
@@ -165,8 +155,6 @@
     return;
 
   is_shared_ = is_shared;
-
-  RegisterExternalAllocationWithCurrentContext();
 }
 
 void ArrayBufferContents::DataHolder::Adopt(DataHandle data,
@@ -176,8 +164,6 @@
 
   data_ = std::move(data);
   is_shared_ = is_shared;
-
-  RegisterExternalAllocationWithCurrentContext();
 }
 
 void ArrayBufferContents::DataHolder::CopyMemoryFrom(const DataHolder& source) {
@@ -189,27 +175,6 @@
     return;
 
   memcpy(data_.Data(), source.Data(), source.DataLength());
-
-  RegisterExternalAllocationWithCurrentContext();
-}
-
-void ArrayBufferContents::DataHolder::
-    RegisterExternalAllocationWithCurrentContext() {
-  DCHECK(!has_registered_external_allocation_);
-  // Currently, we can only track an allocation if we have a single owner. For
-  // shared data this is not true, hence do not attempt to track at all.
-  // TODO(crbug.com/877055) Implement tracking of shared external allocations.
-  if (IsShared())
-    return;
-  AdjustAmountOfExternalAllocatedMemory(static_cast<int64_t>(DataLength()));
-}
-
-void ArrayBufferContents::DataHolder::
-    UnregisterExternalAllocationWithCurrentContext() {
-  if (!has_registered_external_allocation_)
-    return;
-  DCHECK(!IsShared());
-  AdjustAmountOfExternalAllocatedMemory(-static_cast<int64_t>(DataLength()));
 }
 
 }  // namespace WTF
diff --git a/third_party/blink/renderer/platform/wtf/typed_arrays/array_buffer_contents.h b/third_party/blink/renderer/platform/wtf/typed_arrays/array_buffer_contents.h
index 4b398f93..6d19799 100644
--- a/third_party/blink/renderer/platform/wtf/typed_arrays/array_buffer_contents.h
+++ b/third_party/blink/renderer/platform/wtf/typed_arrays/array_buffer_contents.h
@@ -114,6 +114,10 @@
                       unsigned element_byte_size,
                       SharingType is_shared,
                       InitializationPolicy);
+  ArrayBufferContents(void* data,
+                      size_t length,
+                      DataDeleter deleter,
+                      SharingType is_shared);
   ArrayBufferContents(DataHandle,
                       SharingType is_shared);
   ArrayBufferContents(ArrayBufferContents&&) = default;
@@ -144,23 +148,6 @@
   static void* AllocateMemoryOrNull(size_t, InitializationPolicy);
   static void FreeMemory(void*);
   static DataHandle CreateDataHandle(size_t, InitializationPolicy);
-  static void Initialize(
-      AdjustAmountOfExternalAllocatedMemoryFunction function) {
-    DCHECK(IsMainThread());
-    DCHECK_EQ(adjust_amount_of_external_allocated_memory_function_,
-              DefaultAdjustAmountOfExternalAllocatedMemoryFunction);
-    adjust_amount_of_external_allocated_memory_function_ = function;
-  }
-
-  void RegisterExternalAllocationWithCurrentContext() {
-    if (holder_)
-      holder_->RegisterExternalAllocationWithCurrentContext();
-  }
-
-  void UnregisterExternalAllocationWithCurrentContext() {
-    if (holder_)
-      holder_->UnregisterExternalAllocationWithCurrentContext();
-  }
 
  private:
   static void* AllocateMemoryWithFlags(size_t, InitializationPolicy, int);
@@ -186,49 +173,13 @@
     size_t DataLength() const { return data_.DataLength(); }
     bool IsShared() const { return is_shared_ == kShared; }
 
-    void RegisterExternalAllocationWithCurrentContext();
-    void UnregisterExternalAllocationWithCurrentContext();
-
    private:
-    void AdjustAmountOfExternalAllocatedMemory(int64_t diff) {
-      has_registered_external_allocation_ =
-          !has_registered_external_allocation_;
-      DCHECK(!diff || (has_registered_external_allocation_ == (diff > 0)));
-      CheckIfAdjustAmountOfExternalAllocatedMemoryIsConsistent();
-      adjust_amount_of_external_allocated_memory_function_(diff);
-    }
-
-    void AdjustAmountOfExternalAllocatedMemory(size_t diff) {
-      AdjustAmountOfExternalAllocatedMemory(static_cast<int64_t>(diff));
-    }
-
-    void CheckIfAdjustAmountOfExternalAllocatedMemoryIsConsistent() {
-      DCHECK(adjust_amount_of_external_allocated_memory_function_);
-
-#if DCHECK_IS_ON()
-      // Make sure that the function actually used is always the same.
-      // Shouldn't be updated during its use.
-      if (!last_used_adjust_amount_of_external_allocated_memory_function_) {
-        last_used_adjust_amount_of_external_allocated_memory_function_ =
-            adjust_amount_of_external_allocated_memory_function_;
-      }
-      DCHECK_EQ(adjust_amount_of_external_allocated_memory_function_,
-                last_used_adjust_amount_of_external_allocated_memory_function_);
-#endif
-    }
-
     DataHandle data_;
     SharingType is_shared_;
     bool has_registered_external_allocation_;
   };
 
   scoped_refptr<DataHolder> holder_;
-  static AdjustAmountOfExternalAllocatedMemoryFunction
-      adjust_amount_of_external_allocated_memory_function_;
-#if DCHECK_IS_ON()
-  static AdjustAmountOfExternalAllocatedMemoryFunction
-      last_used_adjust_amount_of_external_allocated_memory_function_;
-#endif
 
   DISALLOW_COPY_AND_ASSIGN(ArrayBufferContents);
 };
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 80278df..47f87d0 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -260,9 +260,6 @@
 
 # Display locking failures
 
-# MSAN failure
-crbug.com/996625 inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js [ Skip ]
-
 crbug.com/849459 fragmentation/repeating-thead-under-repeating-thead.html [ Failure ]
 
 # These tests are no longer applicable in BlinkGenPropertyTree mode.
@@ -2300,6 +2297,13 @@
 # These need a rebaseline due crbug.com/504745 on Windows when they are activated again.
 crbug.com/521124 crbug.com/410145 [ Win7 ] fast/css/font-weight-1.html [ Pass Failure ]
 
+# These need a rebaseline due crbug.com/1003497 when the relevant change lands in devtools-frontend.
+crbug.com/1003497 http/tests/devtools/sources/inline-styles-scripts-locations.js [ Pass Failure ]
+crbug.com/1003497 http/tests/devtools/startup/sources/debugger/linkifier.js [ Pass Failure ]
+crbug.com/1003497 http/tests/devtools/startup/sources/debugger/script-formatter-breakpoints-1.js [ Pass Failure ]
+crbug.com/1003497 http/tests/devtools/startup/sources/debugger/script-formatter-breakpoints-4.js [ Pass Failure ]
+crbug.com/1003497 http/tests/devtools/startup/sources/debugger/script-formatter-console.js [ Pass Failure ]
+
 # Disabled briefly until test runner support lands.
 crbug.com/479533 accessibility/show-context-menu.html [ Skip ]
 crbug.com/479533 accessibility/show-context-menu-shadowdom.html [ Skip ]
@@ -5760,7 +5764,6 @@
 crbug.com/1015187 [ Linux Mac ] virtual/cross-origin-embedder-policy/external/wpt/html/cross-origin-embedder-policy/none.https.html [ Pass Failure ]
 
 # Sheriff 2019-10-18
-crbug.com/996250 external/wpt/web-nfc/NDEFReader_scan_iframe.https.html [ Timeout ]
 crbug.com/1015254 [ Mac ] external/wpt/pointerevents/extension/pointerevent_coalesced_events_attributes.html [ Pass Failure ]
 crbug.com/1015859 [ Linux ] http/tests/devtools/a11y-axe-core/performance/landing-page-a11y-test.js [ Pass Failure ]
 crbug.com/1015975 media/video-currentTime.html [ Pass Failure ]
@@ -5769,3 +5772,6 @@
 # Sheriff 2019-10-21
 crbug.com/1016364 [ Linux Mac Debug ] http/tests/devtools/console/console-search.js [ Pass Timeout ]
 crbug.com/1016457 [ Linux Mac Debug ] external/wpt/dom/ranges/Range-mutations-dataChange.html [ Pass Timeout ]
+
+# ecosystem-infra sheriff 2019-10-22
+crbug.com/1016762 external/wpt/html/cross-origin-opener-policy/popup-redirect-cache.https.html [ Pass Failure ]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-001-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-001-expected.txt
new file mode 100644
index 0000000..549da5a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-001-expected.txt
@@ -0,0 +1,33 @@
+This is a testharness.js-based test.
+PASS 'grid' with: grid-template-columns: 0fr; and grid-template-rows: 0fr;
+PASS 'grid' with: grid-template-columns: 1fr; and grid-template-rows: 1fr;
+PASS 'grid' with: grid-template-columns: 2fr; and grid-template-rows: 2fr;
+PASS 'grid' with: grid-template-columns: minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr);
+PASS 'grid' with: grid-template-columns: minmax(0, .5fr); and grid-template-rows: minmax(0, .5fr);
+PASS 'grid' with: grid-template-columns: minmax(0, 1fr); and grid-template-rows: minmax(0, 1fr);
+PASS 'grid' with: grid-template-columns: minmax(0, 2fr); and grid-template-rows: minmax(0, 2fr);
+PASS 'grid' with: grid-template-columns: minmax(75px, 1fr); and grid-template-rows: minmax(75px, 1fr);
+FAIL 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; assert_in_array: gridTemplateColumns value "0px 0px" not in array ["50px 50px"]
+FAIL 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 50px" not in array ["0px 100px"]
+FAIL 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["100px 0px"]
+FAIL 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr; assert_in_array: gridTemplateColumns value "25px 25px" not in array ["50px 50px"]
+FAIL 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr; assert_in_array: gridTemplateColumns value "12.5px 37.5px" not in array ["25px 75px"]
+FAIL 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 0px 50px" not in array ["50px 50px 0px"]
+PASS 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 0fr);
+PASS 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 1fr);
+PASS 'grid' with: grid-template-columns: minmax(15px, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(15px, 0fr) minmax(0, 1fr);
+PASS 'grid' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(20px, 1fr) minmax(0, 1fr);
+PASS 'grid' with: grid-template-columns: minmax(30px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(30px, 1fr) minmax(0, 1fr);
+FAIL 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); assert_in_array: gridTemplateColumns value "0px 0px" not in array ["100px 0px"]
+FAIL 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "0px 50px" not in array ["100px 0px"]
+FAIL 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "25px 25px" not in array ["100px 0px"]
+FAIL 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr); assert_in_array: gridTemplateColumns value "25px 25px" not in array ["75px 25px"]
+FAIL 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; assert_in_array: gridTemplateColumns value "0px 50px" not in array ["100px 0px"]
+FAIL 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["100px 0px"]
+FAIL 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["100px 0px"]
+FAIL 'grid' with: grid-template-columns: minmax(0, 0fr) auto; and grid-template-rows: minmax(0, 0fr) auto; assert_in_array: gridTemplateColumns value "0px 50px" not in array ["0px 100px"]
+FAIL 'grid' with: grid-template-columns: minmax(0, 1fr) auto; and grid-template-rows: minmax(0, 1fr) auto; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["0px 100px"]
+FAIL 'grid' with: grid-template-columns: minmax(25px, 0fr) auto; and grid-template-rows: minmax(25px, 0fr) auto; assert_in_array: gridTemplateColumns value "25px 25px" not in array ["25px 75px"]
+FAIL 'grid' with: grid-template-columns: minmax(25px, 1fr) auto; and grid-template-rows: minmax(25px, 1fr) auto; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["25px 75px"]
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-002-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-002-expected.txt
new file mode 100644
index 0000000..95dd2e6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-002-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+FAIL 'grid' with: grid-template-columns: minmax(0, 1fr) auto auto auto; and grid-template-rows: minmax(0, 1fr) auto auto auto; assert_in_array: gridTemplateColumns value "0px 50px 50px 50px" not in array ["0px 60px 45px 45px"]
+FAIL 'grid' with: grid-template-columns: 1fr auto auto auto; and grid-template-rows: 1fr auto auto auto; assert_in_array: gridTemplateColumns value "0px 50px 50px 50px" not in array ["10px 50px 50px 50px"]
+FAIL 'grid' with: grid-template-columns: 1fr 1fr 1fr 1fr; and grid-template-rows: 1fr 1fr 1fr 1fr; assert_in_array: gridTemplateColumns value "12.5px 12.5px 12.5px 12.5px" not in array ["30px 50px 50px 50px"]
+FAIL 'grid' with: grid-template-columns: 1fr 1fr 1fr 4fr; and grid-template-rows: 1fr 1fr 1fr 4fr; assert_in_array: gridTemplateColumns value "7.14062px 7.14062px 7.14062px 28.5625px" not in array ["30px 30px 25px 100px"]
+FAIL 'grid' with: grid-template-columns: 1fr 1fr 1fr; and grid-template-rows: 1fr 1fr 1fr; assert_in_array: gridTemplateColumns value "60px 0px 0px" not in array ["60px 50px 50px"]
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/before-in-display-none-crash.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/before-in-display-none-crash.html
new file mode 100644
index 0000000..5759089
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/before-in-display-none-crash.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<title>CSS Test: Invalidating style inside display:none with ::before should not crash.</title>
+<link rel="help" href="https://crbug.com/1013570">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+  #outer { display: none }
+  #outer::before { content: " "; }
+</style>
+<div id="outer">
+  <div id="inner"></div>
+</div>
+<script>
+  test(() => {
+    assert_equals(getComputedStyle(inner).color, "rgb(0, 0, 0)");
+    inner.style.color = "green";
+    assert_equals(getComputedStyle(inner).color, "rgb(0, 128, 0)");
+  }, "Invalidating style inside display:none with ::before should not crash.");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1251-expected.txt b/third_party/blink/web_tests/external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1251-expected.txt
index e0140d8..2119566a 100644
--- a/third_party/blink/web_tests/external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1251-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1251-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 101 tests; 64 PASS, 35 FAIL, 2 TIMEOUT, 0 NOTRUN.
+Found 101 tests; 63 PASS, 36 FAIL, 2 TIMEOUT, 0 NOTRUN.
 PASS load nested browsing context <frame src>
 PASS load nested browsing context <iframe src>
 PASS load nested browsing context <object data>
@@ -72,7 +72,7 @@
 PASS URL constructor, base
 PASS Scheme ftp (getting <a>.href)
 PASS Scheme file (getting <a>.href)
-PASS Scheme gopher (getting <a>.href)
+FAIL Scheme gopher (getting <a>.href) assert_true: expected substring %26%23229%3B got gopher://example.invalid/?x=%C3%A5 expected true got false
 PASS Scheme http (getting <a>.href)
 PASS Scheme https (getting <a>.href)
 FAIL Scheme ws (getting <a>.href) assert_true: expected substring %C3%A5 got ws://example.invalid/?x=%26%23229%3B expected true got false
diff --git a/third_party/blink/web_tests/external/wpt/web-nfc/NDEFMessage_constructor.https.html b/third_party/blink/web_tests/external/wpt/web-nfc/NDEFMessage_constructor.https.html
index 88c9ec40..0ba8224 100644
--- a/third_party/blink/web_tests/external/wpt/web-nfc/NDEFMessage_constructor.https.html
+++ b/third_party/blink/web_tests/external/wpt/web-nfc/NDEFMessage_constructor.https.html
@@ -23,6 +23,11 @@
     assert_equals(message.records.length, 1, 'one text record');
     assert_equals(message.records[0].recordType, 'text', 'messageType');
     assert_equals(message.records[0].mediaType, 'text/plain', 'mediaType');
+    assert_true(message.records[0].data instanceof DataView,
+        'data returns a DataView');
+    const decoder = new TextDecoder();
+    assert_equals(decoder.decode(message.records[0].data), test_text_data,
+        'data contains the same text content');
     assert_true(typeof message.records[0].text() === 'string');
     assert_equals(message.records[0].text(), test_text_data,
         'text() contains the same text content');
diff --git a/third_party/blink/web_tests/external/wpt/web-nfc/NDEFRecord_constructor.https.html b/third_party/blink/web_tests/external/wpt/web-nfc/NDEFRecord_constructor.https.html
index 849a6ae33..6a57616 100644
--- a/third_party/blink/web_tests/external/wpt/web-nfc/NDEFRecord_constructor.https.html
+++ b/third_party/blink/web_tests/external/wpt/web-nfc/NDEFRecord_constructor.https.html
@@ -20,6 +20,9 @@
     const record = new NDEFRecord(createTextRecord(test_text_data));
     assert_equals(record.recordType, 'text', 'recordType');
     assert_equals(record.mediaType, 'text/plain', 'mediaType');
+    const decoder = new TextDecoder();
+    assert_equals(decoder.decode(record.data), test_text_data,
+        'data has the same content with the original dictionary');
     assert_equals(record.text(), test_text_data,
         'text() has the same content with the original dictionary');
   }, 'NDEFRecord constructor with text record type');
@@ -28,6 +31,9 @@
     const record = new NDEFRecord(createUrlRecord(test_url_data));
     assert_equals(record.recordType, 'url', 'recordType');
     assert_equals(record.mediaType, 'text/plain', 'mediaType');
+    const decoder = new TextDecoder();
+    assert_equals(decoder.decode(record.data), test_url_data,
+        'data has the same content with the original dictionary');
     assert_equals(record.text(), test_url_data,
         'text() has the same content with the original dictionary');
   }, 'NDEFRecord constructor with url record type');
@@ -40,6 +46,8 @@
     const record = new NDEFRecord(createOpaqueRecord(buffer));
     assert_equals(record.recordType, 'opaque', 'recordType');
     assert_equals(record.mediaType, 'application/octet-stream', 'mediaType');
+    assert_array_equals(new Uint8Array(record.data.buffer), original_data,
+        'data has the same content with the original buffer');
 
     const data_1 = record.arrayBuffer();
     assert_true(data_1 instanceof ArrayBuffer);
diff --git a/third_party/blink/web_tests/external/wpt/web-nfc/idlharness.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/web-nfc/idlharness.https.window-expected.txt
index 40fac1c..a7defad 100644
--- a/third_party/blink/web_tests/external/wpt/web-nfc/idlharness.https.window-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/web-nfc/idlharness.https.window-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 88 tests; 78 PASS, 10 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 88 tests; 81 PASS, 7 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idl_test setup
 PASS idl_test validation
 PASS NDEFMessage interface: existence and properties of interface object
@@ -20,8 +20,8 @@
 PASS NDEFRecord interface: existence and properties of interface prototype object's @@unscopables property
 PASS NDEFRecord interface: attribute recordType
 PASS NDEFRecord interface: attribute mediaType
-FAIL NDEFRecord interface: attribute id assert_true: The prototype object must have a property "id" expected true got false
-FAIL NDEFRecord interface: attribute data assert_true: The prototype object must have a property "data" expected true got false
+PASS NDEFRecord interface: attribute id
+PASS NDEFRecord interface: attribute data
 FAIL NDEFRecord interface: attribute encoding assert_true: The prototype object must have a property "encoding" expected true got false
 FAIL NDEFRecord interface: attribute lang assert_true: The prototype object must have a property "lang" expected true got false
 PASS NDEFRecord interface: operation text()
@@ -32,8 +32,8 @@
 PASS Stringification of new NDEFRecord({"recordType":"text","mediaType":"text/plain","data":"Hello World","id":"/custom/path"});
 PASS NDEFRecord interface: new NDEFRecord({"recordType":"text","mediaType":"text/plain","data":"Hello World","id":"/custom/path"}); must inherit property "recordType" with the proper type
 PASS NDEFRecord interface: new NDEFRecord({"recordType":"text","mediaType":"text/plain","data":"Hello World","id":"/custom/path"}); must inherit property "mediaType" with the proper type
-FAIL NDEFRecord interface: new NDEFRecord({"recordType":"text","mediaType":"text/plain","data":"Hello World","id":"/custom/path"}); must inherit property "id" with the proper type assert_inherits: property "id" not found in prototype chain
-FAIL NDEFRecord interface: new NDEFRecord({"recordType":"text","mediaType":"text/plain","data":"Hello World","id":"/custom/path"}); must inherit property "data" with the proper type assert_inherits: property "data" not found in prototype chain
+PASS NDEFRecord interface: new NDEFRecord({"recordType":"text","mediaType":"text/plain","data":"Hello World","id":"/custom/path"}); must inherit property "id" with the proper type
+FAIL NDEFRecord interface: new NDEFRecord({"recordType":"text","mediaType":"text/plain","data":"Hello World","id":"/custom/path"}); must inherit property "data" with the proper type Unrecognized type DataView
 FAIL NDEFRecord interface: new NDEFRecord({"recordType":"text","mediaType":"text/plain","data":"Hello World","id":"/custom/path"}); must inherit property "encoding" with the proper type assert_inherits: property "encoding" not found in prototype chain
 FAIL NDEFRecord interface: new NDEFRecord({"recordType":"text","mediaType":"text/plain","data":"Hello World","id":"/custom/path"}); must inherit property "lang" with the proper type assert_inherits: property "lang" not found in prototype chain
 PASS NDEFRecord interface: new NDEFRecord({"recordType":"text","mediaType":"text/plain","data":"Hello World","id":"/custom/path"}); must inherit property "text()" with the proper type
diff --git a/third_party/blink/web_tests/external/wpt/web-nfc/resources/nfc-helpers.js b/third_party/blink/web_tests/external/wpt/web-nfc/resources/nfc-helpers.js
index ce4079a..4685f65 100644
--- a/third_party/blink/web_tests/external/wpt/web-nfc/resources/nfc-helpers.js
+++ b/third_party/blink/web_tests/external/wpt/web-nfc/resources/nfc-helpers.js
@@ -152,6 +152,8 @@
     assert_equals(record.mediaType, expectedRecord.mediaType);
 
     // Compares record data
+    assert_array_equals(new Uint8Array(record.data),
+          new Uint8Array(expectedRecord.data));
     assert_equals(record.text(), expectedRecord.text());
     assert_array_equals(new Uint8Array(record.arrayBuffer()),
           new Uint8Array(expectedRecord.arrayBuffer()));
diff --git a/third_party/blink/web_tests/external/wpt/webrtc-extensions/META.yml b/third_party/blink/web_tests/external/wpt/webrtc-extensions/META.yml
new file mode 100644
index 0000000..4ceee06
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webrtc-extensions/META.yml
@@ -0,0 +1,3 @@
+spec: https://henbos.github.io/webrtc-extensions/
+suggested_reviewers:
+  - hbos
diff --git a/third_party/blink/web_tests/external/wpt/webrtc-extensions/RTCRtpReceiver-playoutDelayHint.html b/third_party/blink/web_tests/external/wpt/webrtc-extensions/RTCRtpReceiver-playoutDelayHint.html
new file mode 100644
index 0000000..d8e47bda
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webrtc-extensions/RTCRtpReceiver-playoutDelayHint.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Tests for RTCRtpReceiver-playoutDelayHint attribute</title>
+<link rel="help" href="https://henbos.github.io/webrtc-extensions/#dom-rtcrtpreceiver-playoutdelayhint">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<body>
+<script>
+'use strict'
+
+test(t => {
+  const pc = new RTCPeerConnection();
+  t.add_cleanup(() => pc.close());
+  const {receiver} = pc.addTransceiver('audio', {direction:'recvonly'});
+  assert_equals(receiver.playoutDelayHint, null);
+}, 'audio playoutDelayHint is null by default');
+
+test(t => {
+  const pc = new RTCPeerConnection();
+  t.add_cleanup(() => pc.close());
+  const {receiver} = pc.addTransceiver('audio', {direction:'recvonly'});
+  receiver.playoutDelayHint = 0.5;
+  assert_equals(receiver.playoutDelayHint, 0.5);
+}, 'audio playoutDelayHint accepts posititve values');
+
+test(t => {
+  const pc = new RTCPeerConnection();
+  t.add_cleanup(() => pc.close());
+  const {receiver} = pc.addTransceiver('audio', {direction:'recvonly'});
+  receiver.playoutDelayHint = 20.5;
+  assert_equals(receiver.playoutDelayHint, 20.5);
+}, 'audio playoutDelayHint accepts large positive values');
+
+test(t => {
+  const pc = new RTCPeerConnection();
+  t.add_cleanup(() => pc.close());
+  const {receiver} = pc.addTransceiver('audio', {direction:'recvonly'});
+  receiver.playoutDelayHint = 0.7
+  assert_throws(new TypeError(), () => {
+    receiver.playoutDelayHint = -0.5;
+  }, 'audio playoutDelayHint doesn\'t accept negative values');
+  assert_equals(receiver.playoutDelayHint, 0.7);
+}, 'audio playoutDelayHint returns last valid value on throw');
+
+test(t => {
+  const pc = new RTCPeerConnection();
+  t.add_cleanup(() => pc.close());
+  const {receiver} = pc.addTransceiver('audio', {direction:'recvonly'});
+  receiver.playoutDelayHint = 0.0;
+  assert_equals(receiver.playoutDelayHint, 0.0);
+}, 'audio playoutDelayHint allows zero value');
+
+test(t => {
+  const pc = new RTCPeerConnection();
+  t.add_cleanup(() => pc.close());
+  const {receiver} = pc.addTransceiver('audio', {direction:'recvonly'});
+  receiver.playoutDelayHint = 0.5;
+  receiver.playoutDelayHint = null;
+  assert_equals(receiver.playoutDelayHint, null);
+}, 'audio playoutDelayHint allows to reset value to null');
+
+test(t => {
+  const pc = new RTCPeerConnection();
+  t.add_cleanup(() => pc.close());
+  const {receiver} = pc.addTransceiver('video', {direction:'recvonly'});
+  assert_equals(receiver.playoutDelayHint, null);
+}, 'video playoutDelayHint is null by default');
+
+test(t => {
+  const pc = new RTCPeerConnection();
+  t.add_cleanup(() => pc.close());
+  const {receiver} = pc.addTransceiver('video', {direction:'recvonly'});
+  receiver.playoutDelayHint = 0.5;
+  assert_equals(receiver.playoutDelayHint, 0.5);
+}, 'video playoutDelayHint accepts posititve values');
+
+test(t => {
+  const pc = new RTCPeerConnection();
+  t.add_cleanup(() => pc.close());
+  const {receiver} = pc.addTransceiver('video', {direction:'recvonly'});
+  receiver.playoutDelayHint = 20.5;
+  assert_equals(receiver.playoutDelayHint, 20.5);
+}, 'video playoutDelayHint accepts large posititve values');
+
+test(t => {
+  const pc = new RTCPeerConnection();
+  t.add_cleanup(() => pc.close());
+  const {receiver} = pc.addTransceiver('video', {direction:'recvonly'});
+  receiver.playoutDelayHint = 0.7
+  assert_throws(new TypeError(), () => {
+    receiver.playoutDelayHint = -0.5;
+  }, 'video playoutDelayHint doesn\'t accept negative values');
+  assert_equals(receiver.playoutDelayHint, 0.7);
+}, 'video playoutDelayHint returns last valid value');
+
+test(t => {
+  const pc = new RTCPeerConnection();
+  t.add_cleanup(() => pc.close());
+  const {receiver} = pc.addTransceiver('video', {direction:'recvonly'});
+  receiver.playoutDelayHint = 0.0;
+  assert_equals(receiver.playoutDelayHint, 0.0);
+}, 'video playoutDelayHint allows zero value');
+
+test(t => {
+  const pc = new RTCPeerConnection();
+  t.add_cleanup(() => pc.close());
+  const {receiver} = pc.addTransceiver('video', {direction:'recvonly'});
+  receiver.playoutDelayHint = 0.5;
+  receiver.playoutDelayHint = null;
+  assert_equals(receiver.playoutDelayHint, null);
+}, 'video playoutDelayHint allows to reset value to null');
+</script>
+</body>
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/flex-and-content-sized-resolution-columns-expected.txt b/third_party/blink/web_tests/fast/css-grid-layout/flex-and-content-sized-resolution-columns-expected.txt
index c60be850..0074a83 100644
--- a/third_party/blink/web_tests/fast/css-grid-layout/flex-and-content-sized-resolution-columns-expected.txt
+++ b/third_party/blink/web_tests/fast/css-grid-layout/flex-and-content-sized-resolution-columns-expected.txt
@@ -1,10 +1,10 @@
 PASS window.getComputedStyle(gridFixedAndMinContentAndFlex, '').getPropertyValue('grid-template-columns') is "20px 30px 50px"
 PASS window.getComputedStyle(gridFixedAndMinContentAndFlexMultipleOverlap, '').getPropertyValue('grid-template-columns') is "20px 10px 70px"
-PASS window.getComputedStyle(gridMinMaxFixedFlexAndMaxContentAndAuto, '').getPropertyValue('grid-template-columns') is "30px 50px 20px"
-PASS window.getComputedStyle(gridMinMaxFixedFlexAndMaxContentAndAutoNoFlexSpanningItems, '').getPropertyValue('grid-template-columns') is "30px 70px 0px"
+PASS window.getComputedStyle(gridMinMaxFixedFlexAndMaxContentAndAuto, '').getPropertyValue('grid-template-columns') is "60px 20px 20px"
+PASS window.getComputedStyle(gridMinMaxFixedFlexAndMaxContentAndAutoNoFlexSpanningItems, '').getPropertyValue('grid-template-columns') is "100px 0px 0px"
 PASS window.getComputedStyle(gridMinMaxAutoFixedAndMinContentAndFixed, '').getPropertyValue('grid-template-columns') is "35px 20px 25px"
 PASS window.getComputedStyle(gridMinContentAndMinMaxFixedMinContentAndFlex, '').getPropertyValue('grid-template-columns') is "20px 20px 60px"
-PASS window.getComputedStyle(gridMaxContentAndMinMaxFixedMaxContentAndFlex, '').getPropertyValue('grid-template-columns') is "70px 20px 30px"
+PASS window.getComputedStyle(gridMaxContentAndMinMaxFixedMaxContentAndFlex, '').getPropertyValue('grid-template-columns') is "70px 20px 10px"
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/flex-and-content-sized-resolution-columns.html b/third_party/blink/web_tests/fast/css-grid-layout/flex-and-content-sized-resolution-columns.html
index 0b68649..113a142 100644
--- a/third_party/blink/web_tests/fast/css-grid-layout/flex-and-content-sized-resolution-columns.html
+++ b/third_party/blink/web_tests/fast/css-grid-layout/flex-and-content-sized-resolution-columns.html
@@ -98,11 +98,11 @@
 
 checkColumns("gridFixedAndMinContentAndFlex", "20px 30px 50px");
 checkColumns("gridFixedAndMinContentAndFlexMultipleOverlap", "20px 10px 70px");
-checkColumns("gridMinMaxFixedFlexAndMaxContentAndAuto", "30px 50px 20px");
-checkColumns("gridMinMaxFixedFlexAndMaxContentAndAutoNoFlexSpanningItems", "30px 70px 0px");
+checkColumns("gridMinMaxFixedFlexAndMaxContentAndAuto", "60px 20px 20px");
+checkColumns("gridMinMaxFixedFlexAndMaxContentAndAutoNoFlexSpanningItems", "100px 0px 0px");
 checkColumns("gridMinMaxAutoFixedAndMinContentAndFixed", "35px 20px 25px");
 checkColumns("gridMinContentAndMinMaxFixedMinContentAndFlex", "20px 20px 60px");
-checkColumns("gridMaxContentAndMinMaxFixedMaxContentAndFlex", "70px 20px 30px");
+checkColumns("gridMaxContentAndMinMaxFixedMaxContentAndFlex", "70px 20px 10px");
 
 </script>
 </html>
diff --git a/third_party/blink/web_tests/fast/dom/HTMLLinkElement/link-preload-validity.html b/third_party/blink/web_tests/fast/dom/HTMLLinkElement/link-preload-validity.html
index 375f906..6b3d994 100644
--- a/third_party/blink/web_tests/fast/dom/HTMLLinkElement/link-preload-validity.html
+++ b/third_party/blink/web_tests/fast/dom/HTMLLinkElement/link-preload-validity.html
@@ -8,7 +8,7 @@
         internals.settings.setLogPreload(true);
 </script>
 <link rel="preload" as="fetch" href="http://prefetch.wut.com.test/1.gif">
-<link rel="preload" as="image" href="gopher:???://prefetch.wut.com.test/2.gif">
+<link rel="preload" as="image" href="ftp:???://prefetch.wut.com.test/2.gif">
 <link rel="preload" as="image" href="">
 <link rel="preload" as="image">
 <link rel="preload" as="image" href="http://prefetch.wut.com.test/3.gif">
diff --git a/third_party/blink/web_tests/fast/forms/calendar-picker/resources/calendar-picker-common.js b/third_party/blink/web_tests/fast/forms/calendar-picker/resources/calendar-picker-common.js
index 4fded1e..cf5373a 100644
--- a/third_party/blink/web_tests/fast/forms/calendar-picker/resources/calendar-picker-common.js
+++ b/third_party/blink/web_tests/fast/forms/calendar-picker/resources/calendar-picker-common.js
@@ -81,16 +81,16 @@
 }
 
 function hoverOverTimeCellAt(column, row) {
-    const timeCellWidth = 52;
-    const timeCellHeight = 32;
+  const timeCellWidth = 56;
+  const timeCellHeight = 36;
 
-    skipAnimation();
-    var offset = cumulativeOffset(popupWindow.global.picker.timeColumns);
-    var x = offset[0];
-    var y = offset[1];
-    x += (column + 0.5) * timeCellWidth;
-    y += (row + 0.5) * timeCellHeight;
-    eventSender.mouseMoveTo(x, y);
+  skipAnimation();
+  var offset = cumulativeOffset(popupWindow.global.picker.timeColumns);
+  var x = offset[0];
+  var y = offset[1];
+  x += (column + 0.5) * timeCellWidth;
+  y += (row + 0.5) * timeCellHeight;
+  eventSender.mouseMoveTo(x, y);
 }
 
 function clickTimeCellAt(column, row) {
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
new file mode 100644
index 0000000..616d206
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui-high-contrast/time-picker-appearance.html b/third_party/blink/web_tests/fast/forms/controls-new-ui-high-contrast/time-picker-appearance.html
new file mode 100644
index 0000000..52c1b743
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui-high-contrast/time-picker-appearance.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<script>
+testRunner.waitUntilDone();
+</script>
+<script src="../../forms/resources/picker-common.js"></script>
+<input type="time" id="time" value="14:15">
+<script>
+openPicker(document.getElementById('time'), () => testRunner.notifyDone(), () => testRunner.notifyDone());
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/url/invalid-urls-utf8-expected.txt b/third_party/blink/web_tests/fast/url/invalid-urls-utf8-expected.txt
index 0ecb2962..606c58f8 100644
--- a/third_party/blink/web_tests/fast/url/invalid-urls-utf8-expected.txt
+++ b/third_party/blink/web_tests/fast/url/invalid-urls-utf8-expected.txt
@@ -5,7 +5,7 @@
 FAIL src should be http:///. Was http:.
 FAIL src should be https:///. Was https:.
 FAIL src should be ftp:///. Was ftp:.
-FAIL src should be gopher:///. Was gopher:.
+PASS src is expected
 FAIL src should be ws:///. Was ws:.
 FAIL src should be wss:///. Was wss:.
 FAIL src should be foo://tête à tête@host/. Was foo://t%C3%AAte %C3%A0 t%C3%AAte@host/.
@@ -23,7 +23,7 @@
 FAIL src should be ftp:/tête. Was ftp://xn--tte-fma/.
 FAIL src should be http:/tête. Was http://xn--tte-fma/.
 FAIL src should be https:/tête. Was https://xn--tte-fma/.
-FAIL src should be gopher:/tête. Was gopher://xn--tte-fma/.
+FAIL src should be gopher:/tête. Was gopher:/t%C3%AAte.
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/blink/web_tests/fast/url/script-tests/segments.js b/third_party/blink/web_tests/fast/url/script-tests/segments.js
index 9372879..18f78427 100644
--- a/third_party/blink/web_tests/fast/url/script-tests/segments.js
+++ b/third_party/blink/web_tests/fast/url/script-tests/segments.js
@@ -74,7 +74,7 @@
   ["madeupscheme:/example.com/",             ["madeupscheme:","","","/example.com/","",""]],
   ["file:/example.com/",                     ["file:","","","/example.com/","",""]],
   ["ftps:/example.com/",                     ["ftps:","","","/example.com/","",""]],
-  ["gopher:/example.com/",                   ["gopher:","example.com","","/","",""]],
+  ["gopher:/example.com/",                   ["gopher:","","","/example.com/","", ""]],
   ["ws:/example.com/",                       ["ws:","example.com","","/","",""]],
   ["wss:/example.com/",                      ["wss:","example.com","","/","",""]],
   ["data:/example.com/",                     ["data:","","","/example.com/","",""]],
@@ -86,7 +86,7 @@
   ["madeupscheme:example.com/",              ["madeupscheme:","","","example.com/","",""]],
   ["file:example.com/",                      ["file:","","","/example.com/","",""]],
   ["ftps:example.com/",                      ["ftps:","","","example.com/","",""]],
-  ["gopher:example.com/",                    ["gopher:","example.com","","/","",""]],
+  ["gopher:example.com/",                    ["gopher:","","","example.com/","", ""]],
   ["ws:example.com/",                        ["ws:","example.com","","/","",""]],
   ["wss:example.com/",                       ["wss:","example.com","","/","",""]],
   ["data:example.com/",                      ["data:","","","example.com/","",""]],
diff --git a/third_party/blink/web_tests/fast/url/standard-url-expected.txt b/third_party/blink/web_tests/fast/url/standard-url-expected.txt
index 77ae63aa..cd970b4 100644
--- a/third_party/blink/web_tests/fast/url/standard-url-expected.txt
+++ b/third_party/blink/web_tests/fast/url/standard-url-expected.txt
@@ -23,7 +23,7 @@
 PASS canonicalize('https://foo:80/') is 'https://foo:80/'
 PASS canonicalize('ftp://foo:21/') is 'ftp://foo/'
 PASS canonicalize('ftp://foo:80/') is 'ftp://foo:80/'
-PASS canonicalize('gopher://foo:70/') is 'gopher://foo/'
+FAIL canonicalize('gopher://foo:70/') should be gopher://foo/. Was gopher://foo:70/.
 PASS canonicalize('gopher://foo:443/') is 'gopher://foo:443/'
 PASS canonicalize('ws://foo:80/') is 'ws://foo/'
 PASS canonicalize('ws://foo:81/') is 'ws://foo:81/'
@@ -39,7 +39,7 @@
 PASS canonicalize('madeupscheme:/example.com/') is 'madeupscheme:/example.com/'
 PASS canonicalize('file:/example.com/') is 'file:///example.com/'
 PASS canonicalize('ftps:/example.com/') is 'ftps:/example.com/'
-PASS canonicalize('gopher:/example.com/') is 'gopher://example.com/'
+FAIL canonicalize('gopher:/example.com/') should be gopher://example.com/. Was gopher:/example.com/.
 PASS canonicalize('ws:/example.com/') is 'ws://example.com/'
 PASS canonicalize('wss:/example.com/') is 'wss://example.com/'
 PASS canonicalize('data:/example.com/') is 'data:/example.com/'
@@ -50,7 +50,7 @@
 PASS canonicalize('https:example.com/') is 'https://example.com/'
 PASS canonicalize('madeupscheme:example.com/') is 'madeupscheme:example.com/'
 PASS canonicalize('ftps:example.com/') is 'ftps:example.com/'
-PASS canonicalize('gopher:example.com/') is 'gopher://example.com/'
+FAIL canonicalize('gopher:example.com/') should be gopher://example.com/. Was gopher:example.com/.
 PASS canonicalize('ws:example.com/') is 'ws://example.com/'
 PASS canonicalize('wss:example.com/') is 'wss://example.com/'
 PASS canonicalize('data:example.com/') is 'data:example.com/'
diff --git a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/rtc-jitter-buffer-delay-hint.html b/third_party/blink/web_tests/http/tests/origin_trials/webexposed/rtc-jitter-buffer-delay-hint.html
deleted file mode 100644
index 4cf5ffb..0000000
--- a/third_party/blink/web_tests/http/tests/origin_trials/webexposed/rtc-jitter-buffer-delay-hint.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>JitterBufferDelayHint - property exposed on RTCRtpReceiver by origin trial</title>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script src="../../resources/origin-trials-helper.js"></script>
-
-<script>
-
-if (!self.internals.runtimeFlags.rtcJitterBufferDelayHintEnabled) {
-  test(t => {
-    OriginTrialsHelper.check_properties_missing(
-        this, {'RTCRtpReceiver': ['jitterBufferDelayHint']});
-  }, 'RTCRtpReceiver jitterBufferDelayHint is not available without token');
-}
-
-// Generated with command:
-// tools/origin_trials/generate_token.py http://127.0.0.1:8000 RtcJitterBufferDelayHint --expire-timestamp=2000000000
-const token = 'AooRFiyDVrZyXNbm9GQp3TYVKdLvpH99sd/OKrMUHQ8FSxG4ok5MAff2Wqu9j6rXMfuaIITeQvifdQLIvR5bTwkAAAB1eyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImlzU3ViZG9tYWluIjogdHJ1ZSwgImZlYXR1cmUiOiAiUnRjSml0dGVyQnVmZmVyRGVsYXlIaW50IiwgImV4cGlyeSI6IDIwMDAwMDAwMDB9';
-OriginTrialsHelper.add_token(token);
-
-test(t => {
-  OriginTrialsHelper.check_properties_exist(
-      this, {'RTCRtpReceiver': ['jitterBufferDelayHint']});
-}, 'RTCRtpReceiver jitterBufferDelayHint is in Origin-Trial enabled document');
-
-promise_test(async t => {
-  const pc = new RTCPeerConnection();
-  t.add_cleanup(() => pc.close());
-
-  pc.addTransceiver('audio', {direction:'recvonly'});
-  pc.addTransceiver('video', {direction:'recvonly'});
-
-  for (let receiver of pc.getReceivers()) {
-    assert_equals(receiver.jitterBufferDelayHint, null,
-       'jitterBufferDelayHint null by default');
-
-    receiver.jitterBufferDelayHint = 0.5;
-    assert_equals(receiver.jitterBufferDelayHint, 0.5,
-       'jitterBufferDelayHint saves correct value');
-
-    receiver.jitterBufferDelayHint = 20.5;
-    assert_equals(receiver.jitterBufferDelayHint, 20.5,
-       'jitterBufferDelayHint saves large value');
-
-    assert_throws('InvalidAccessError', () => {
-      receiver.jitterBufferDelayHint = -0.5;
-    }, 'jitterBufferDelayHint accepts only positive values and 0.0');
-    assert_equals(receiver.jitterBufferDelayHint, 20.5,
-       'jitterBufferDelayHint returns last valid value');
-
-    receiver.jitterBufferDelayHint = null;
-    assert_equals(receiver.jitterBufferDelayHint, null,
-       'jitterBufferDelayHint resets value to null');
-  }
-}, 'RTCRtpReceiver jitterBufferDelayHint validation');
-
-</script>
diff --git a/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js b/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js
index df05bd0..4177283 100644
--- a/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js
+++ b/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js
@@ -1,20 +1,17 @@
 (async function(testRunner) {
   var {page, session, dp} = await testRunner.startHTML(`
-    <div id='activatable' rendersubtree='invisible-activatable'>
+    <div id='activatable' rendersubtree='invisible skip-viewport-activation'>
       locked
       <div id='child'>
         child
         <div id='grandChild'>grandChild</div>
       </div>
       <div id='invisible' style='display:none'>invisible</div>
-      <div id='nested' rendersubtree='invisible-activatable'>nested</div>
+      <div id='nested' rendersubtree='invisible skip-viewport-activation'>nested</div>
       text
     </div>
-    <div id='nonActivatable' rendersubtree='invisible'>nonActivatable text</div>
+    <div id='nonActivatable' rendersubtree='invisible skip-activation'>nonActivatable text</div>
     <div id='normal'>normal text</div>
-    <script>
-      activatable.getBoundingClientRect(); // Force layout
-    </script>
   `, 'Tests accessibility values of display locked nodes');
   const dumpAccessibilityNodesFromList =
       (await testRunner.loadScript('../resources/accessibility-dumpAccessibilityNodesFromList.js'))(testRunner, session);
diff --git a/third_party/blink/web_tests/platform/fuchsia/fast/url/invalid-urls-utf8-expected.txt b/third_party/blink/web_tests/platform/fuchsia/fast/url/invalid-urls-utf8-expected.txt
index 62a4b7a..3609b0a 100644
--- a/third_party/blink/web_tests/platform/fuchsia/fast/url/invalid-urls-utf8-expected.txt
+++ b/third_party/blink/web_tests/platform/fuchsia/fast/url/invalid-urls-utf8-expected.txt
@@ -5,7 +5,7 @@
 FAIL src should be http:///. Was http:.
 FAIL src should be https:///. Was https:.
 FAIL src should be ftp:///. Was ftp:.
-FAIL src should be gopher:///. Was gopher:.
+PASS src is expected
 FAIL src should be ws:///. Was ws:.
 FAIL src should be wss:///. Was wss:.
 FAIL src should be foo://tête à tête@host/. Was foo://t%C3%AAte %C3%A0 t%C3%AAte@host/.
@@ -23,7 +23,7 @@
 FAIL src should be ftp:/tête. Was ftp://xn--tte-fma/.
 FAIL src should be http:/tête. Was http://127.0.0.1:8000/t%C3%AAte.
 FAIL src should be https:/tête. Was https://xn--tte-fma/.
-FAIL src should be gopher:/tête. Was gopher://xn--tte-fma/.
+FAIL src should be gopher:/tête. Was gopher:/t%C3%AAte.
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-expected.txt
index 5bacb56..f8f6e58 100644
--- a/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-expected.txt
+++ b/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 517 tests; 329 PASS, 188 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 517 tests; 332 PASS, 185 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Parsing: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -85,7 +85,7 @@
 FAIL Parsing: <file://example%/> against <about:blank> assert_equals: failure should set href to input expected "file://example%/" but got "file://example%25/"
 PASS Parsing: <file://[example]/> against <about:blank>
 PASS Parsing: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:/example.com/> against <http://example.org/foo/bar>
@@ -96,7 +96,7 @@
 PASS Parsing: <https:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:example.com/> against <http://example.org/foo/bar>
@@ -183,8 +183,8 @@
 PASS Parsing: <https://foo:80/> against <about:blank>
 PASS Parsing: <ftp://foo:21/> against <about:blank>
 PASS Parsing: <ftp://foo:80/> against <about:blank>
-FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: href expected "gopher://foo:70/" but got "gopher://foo/"
-PASS Parsing: <gopher://foo:443/> against <about:blank>
+FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: host expected "foo:70" but got ""
+FAIL Parsing: <gopher://foo:443/> against <about:blank> assert_equals: host expected "foo:443" but got ""
 PASS Parsing: <ws://foo:80/> against <about:blank>
 PASS Parsing: <ws://foo:81/> against <about:blank>
 PASS Parsing: <ws://foo:443/> against <about:blank>
@@ -199,7 +199,7 @@
 PASS Parsing: <madeupscheme:/example.com/> against <about:blank>
 PASS Parsing: <file:/example.com/> against <about:blank>
 PASS Parsing: <ftps:/example.com/> against <about:blank>
-FAIL Parsing: <gopher:/example.com/> against <about:blank> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <about:blank>
 PASS Parsing: <ws:/example.com/> against <about:blank>
 PASS Parsing: <wss:/example.com/> against <about:blank>
 PASS Parsing: <data:/example.com/> against <about:blank>
@@ -210,7 +210,7 @@
 PASS Parsing: <https:example.com/> against <about:blank>
 PASS Parsing: <madeupscheme:example.com/> against <about:blank>
 PASS Parsing: <ftps:example.com/> against <about:blank>
-FAIL Parsing: <gopher:example.com/> against <about:blank> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <about:blank>
 PASS Parsing: <ws:example.com/> against <about:blank>
 PASS Parsing: <wss:example.com/> against <about:blank>
 PASS Parsing: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-origin-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-origin-expected.txt
index f9acfa5a..2eff1d990 100644
--- a/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-origin-expected.txt
+++ b/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-origin-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 304 tests; 294 PASS, 10 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 304 tests; 300 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Parsing origin: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -69,7 +69,7 @@
 PASS Parsing origin: <https:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <madeupscheme:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Parsing origin: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <data:/example.com/> against <http://example.org/foo/bar>
@@ -80,7 +80,7 @@
 PASS Parsing origin: <https:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Parsing origin: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <data:example.com/> against <http://example.org/foo/bar>
@@ -146,8 +146,8 @@
 PASS Parsing origin: <https://foo:80/> against <about:blank>
 PASS Parsing origin: <ftp://foo:21/> against <about:blank>
 PASS Parsing origin: <ftp://foo:80/> against <about:blank>
-FAIL Parsing origin: <gopher://foo:70/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo"
-FAIL Parsing origin: <gopher://foo:443/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo:443"
+PASS Parsing origin: <gopher://foo:70/> against <about:blank>
+PASS Parsing origin: <gopher://foo:443/> against <about:blank>
 PASS Parsing origin: <ws://foo:80/> against <about:blank>
 PASS Parsing origin: <ws://foo:81/> against <about:blank>
 PASS Parsing origin: <ws://foo:443/> against <about:blank>
@@ -161,7 +161,7 @@
 PASS Parsing origin: <https:/example.com/> against <about:blank>
 PASS Parsing origin: <madeupscheme:/example.com/> against <about:blank>
 PASS Parsing origin: <ftps:/example.com/> against <about:blank>
-FAIL Parsing origin: <gopher:/example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:/example.com/> against <about:blank>
 PASS Parsing origin: <ws:/example.com/> against <about:blank>
 PASS Parsing origin: <wss:/example.com/> against <about:blank>
 PASS Parsing origin: <data:/example.com/> against <about:blank>
@@ -172,7 +172,7 @@
 PASS Parsing origin: <https:example.com/> against <about:blank>
 PASS Parsing origin: <madeupscheme:example.com/> against <about:blank>
 PASS Parsing origin: <ftps:example.com/> against <about:blank>
-FAIL Parsing origin: <gopher:example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:example.com/> against <about:blank>
 PASS Parsing origin: <ws:example.com/> against <about:blank>
 PASS Parsing origin: <wss:example.com/> against <about:blank>
 PASS Parsing origin: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-origin-xhtml-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-origin-xhtml-expected.txt
index f9acfa5a..2eff1d990 100644
--- a/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-origin-xhtml-expected.txt
+++ b/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-origin-xhtml-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 304 tests; 294 PASS, 10 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 304 tests; 300 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Parsing origin: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -69,7 +69,7 @@
 PASS Parsing origin: <https:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <madeupscheme:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Parsing origin: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <data:/example.com/> against <http://example.org/foo/bar>
@@ -80,7 +80,7 @@
 PASS Parsing origin: <https:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Parsing origin: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <data:example.com/> against <http://example.org/foo/bar>
@@ -146,8 +146,8 @@
 PASS Parsing origin: <https://foo:80/> against <about:blank>
 PASS Parsing origin: <ftp://foo:21/> against <about:blank>
 PASS Parsing origin: <ftp://foo:80/> against <about:blank>
-FAIL Parsing origin: <gopher://foo:70/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo"
-FAIL Parsing origin: <gopher://foo:443/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo:443"
+PASS Parsing origin: <gopher://foo:70/> against <about:blank>
+PASS Parsing origin: <gopher://foo:443/> against <about:blank>
 PASS Parsing origin: <ws://foo:80/> against <about:blank>
 PASS Parsing origin: <ws://foo:81/> against <about:blank>
 PASS Parsing origin: <ws://foo:443/> against <about:blank>
@@ -161,7 +161,7 @@
 PASS Parsing origin: <https:/example.com/> against <about:blank>
 PASS Parsing origin: <madeupscheme:/example.com/> against <about:blank>
 PASS Parsing origin: <ftps:/example.com/> against <about:blank>
-FAIL Parsing origin: <gopher:/example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:/example.com/> against <about:blank>
 PASS Parsing origin: <ws:/example.com/> against <about:blank>
 PASS Parsing origin: <wss:/example.com/> against <about:blank>
 PASS Parsing origin: <data:/example.com/> against <about:blank>
@@ -172,7 +172,7 @@
 PASS Parsing origin: <https:example.com/> against <about:blank>
 PASS Parsing origin: <madeupscheme:example.com/> against <about:blank>
 PASS Parsing origin: <ftps:example.com/> against <about:blank>
-FAIL Parsing origin: <gopher:example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:example.com/> against <about:blank>
 PASS Parsing origin: <ws:example.com/> against <about:blank>
 PASS Parsing origin: <wss:example.com/> against <about:blank>
 PASS Parsing origin: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-xhtml-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-xhtml-expected.txt
index 5bacb56..f8f6e58 100644
--- a/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-xhtml-expected.txt
+++ b/third_party/blink/web_tests/platform/linux/external/wpt/url/a-element-xhtml-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 517 tests; 329 PASS, 188 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 517 tests; 332 PASS, 185 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Parsing: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -85,7 +85,7 @@
 FAIL Parsing: <file://example%/> against <about:blank> assert_equals: failure should set href to input expected "file://example%/" but got "file://example%25/"
 PASS Parsing: <file://[example]/> against <about:blank>
 PASS Parsing: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:/example.com/> against <http://example.org/foo/bar>
@@ -96,7 +96,7 @@
 PASS Parsing: <https:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:example.com/> against <http://example.org/foo/bar>
@@ -183,8 +183,8 @@
 PASS Parsing: <https://foo:80/> against <about:blank>
 PASS Parsing: <ftp://foo:21/> against <about:blank>
 PASS Parsing: <ftp://foo:80/> against <about:blank>
-FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: href expected "gopher://foo:70/" but got "gopher://foo/"
-PASS Parsing: <gopher://foo:443/> against <about:blank>
+FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: host expected "foo:70" but got ""
+FAIL Parsing: <gopher://foo:443/> against <about:blank> assert_equals: host expected "foo:443" but got ""
 PASS Parsing: <ws://foo:80/> against <about:blank>
 PASS Parsing: <ws://foo:81/> against <about:blank>
 PASS Parsing: <ws://foo:443/> against <about:blank>
@@ -199,7 +199,7 @@
 PASS Parsing: <madeupscheme:/example.com/> against <about:blank>
 PASS Parsing: <file:/example.com/> against <about:blank>
 PASS Parsing: <ftps:/example.com/> against <about:blank>
-FAIL Parsing: <gopher:/example.com/> against <about:blank> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <about:blank>
 PASS Parsing: <ws:/example.com/> against <about:blank>
 PASS Parsing: <wss:/example.com/> against <about:blank>
 PASS Parsing: <data:/example.com/> against <about:blank>
@@ -210,7 +210,7 @@
 PASS Parsing: <https:example.com/> against <about:blank>
 PASS Parsing: <madeupscheme:example.com/> against <about:blank>
 PASS Parsing: <ftps:example.com/> against <about:blank>
-FAIL Parsing: <gopher:example.com/> against <about:blank> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <about:blank>
 PASS Parsing: <ws:example.com/> against <about:blank>
 PASS Parsing: <wss:example.com/> against <about:blank>
 PASS Parsing: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-constructor-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-constructor-expected.txt
index 041bb43..7541e76f 100644
--- a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-constructor-expected.txt
+++ b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-constructor-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 517 tests; 395 PASS, 122 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 517 tests; 398 PASS, 119 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Parsing: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -87,7 +87,7 @@
 PASS Parsing: <file://example%/> against <about:blank>
 PASS Parsing: <file://[example]/> against <about:blank>
 PASS Parsing: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:/example.com/> against <http://example.org/foo/bar>
@@ -98,7 +98,7 @@
 PASS Parsing: <https:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:example.com/> against <http://example.org/foo/bar>
@@ -185,8 +185,8 @@
 PASS Parsing: <https://foo:80/> against <about:blank>
 PASS Parsing: <ftp://foo:21/> against <about:blank>
 PASS Parsing: <ftp://foo:80/> against <about:blank>
-FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: href expected "gopher://foo:70/" but got "gopher://foo/"
-PASS Parsing: <gopher://foo:443/> against <about:blank>
+FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: host expected "foo:70" but got ""
+FAIL Parsing: <gopher://foo:443/> against <about:blank> assert_equals: host expected "foo:443" but got ""
 PASS Parsing: <ws://foo:80/> against <about:blank>
 PASS Parsing: <ws://foo:81/> against <about:blank>
 PASS Parsing: <ws://foo:443/> against <about:blank>
@@ -201,7 +201,7 @@
 PASS Parsing: <madeupscheme:/example.com/> against <about:blank>
 PASS Parsing: <file:/example.com/> against <about:blank>
 PASS Parsing: <ftps:/example.com/> against <about:blank>
-FAIL Parsing: <gopher:/example.com/> against <about:blank> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <about:blank>
 PASS Parsing: <ws:/example.com/> against <about:blank>
 PASS Parsing: <wss:/example.com/> against <about:blank>
 PASS Parsing: <data:/example.com/> against <about:blank>
@@ -212,7 +212,7 @@
 PASS Parsing: <https:example.com/> against <about:blank>
 PASS Parsing: <madeupscheme:example.com/> against <about:blank>
 PASS Parsing: <ftps:example.com/> against <about:blank>
-FAIL Parsing: <gopher:example.com/> against <about:blank> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <about:blank>
 PASS Parsing: <ws:example.com/> against <about:blank>
 PASS Parsing: <wss:example.com/> against <about:blank>
 PASS Parsing: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-origin-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-origin-expected.txt
index 42a736f..72594ff 100644
--- a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-origin-expected.txt
+++ b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-origin-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 304 tests; 291 PASS, 13 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 304 tests; 297 PASS, 7 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Origin parsing: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -69,7 +69,7 @@
 PASS Origin parsing: <https:/example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <madeupscheme:/example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Origin parsing: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Origin parsing: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <data:/example.com/> against <http://example.org/foo/bar>
@@ -80,7 +80,7 @@
 PASS Origin parsing: <https:example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Origin parsing: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Origin parsing: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <data:example.com/> against <http://example.org/foo/bar>
@@ -146,8 +146,8 @@
 PASS Origin parsing: <https://foo:80/> against <about:blank>
 PASS Origin parsing: <ftp://foo:21/> against <about:blank>
 PASS Origin parsing: <ftp://foo:80/> against <about:blank>
-FAIL Origin parsing: <gopher://foo:70/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo"
-FAIL Origin parsing: <gopher://foo:443/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo:443"
+PASS Origin parsing: <gopher://foo:70/> against <about:blank>
+PASS Origin parsing: <gopher://foo:443/> against <about:blank>
 PASS Origin parsing: <ws://foo:80/> against <about:blank>
 PASS Origin parsing: <ws://foo:81/> against <about:blank>
 PASS Origin parsing: <ws://foo:443/> against <about:blank>
@@ -161,7 +161,7 @@
 PASS Origin parsing: <https:/example.com/> against <about:blank>
 PASS Origin parsing: <madeupscheme:/example.com/> against <about:blank>
 PASS Origin parsing: <ftps:/example.com/> against <about:blank>
-FAIL Origin parsing: <gopher:/example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Origin parsing: <gopher:/example.com/> against <about:blank>
 PASS Origin parsing: <ws:/example.com/> against <about:blank>
 PASS Origin parsing: <wss:/example.com/> against <about:blank>
 PASS Origin parsing: <data:/example.com/> against <about:blank>
@@ -172,7 +172,7 @@
 PASS Origin parsing: <https:example.com/> against <about:blank>
 PASS Origin parsing: <madeupscheme:example.com/> against <about:blank>
 PASS Origin parsing: <ftps:example.com/> against <about:blank>
-FAIL Origin parsing: <gopher:example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Origin parsing: <gopher:example.com/> against <about:blank>
 PASS Origin parsing: <ws:example.com/> against <about:blank>
 PASS Origin parsing: <wss:example.com/> against <about:blank>
 PASS Origin parsing: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters-expected.txt
index 40801a0..45715a7 100644
--- a/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters-expected.txt
+++ b/third_party/blink/web_tests/platform/linux/external/wpt/url/url-setters-expected.txt
@@ -43,9 +43,9 @@
 FAIL URL: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host assert_equals: expected "file:///" but got "http://localhost/"
 FAIL <a>: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host assert_equals: expected "file:///" but got "http://localhost/"
 FAIL <area>: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host assert_equals: expected "file:///" but got "http://localhost/"
-FAIL URL: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher://test/"
-FAIL <a>: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher://test/"
-FAIL <area>: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher://test/"
+FAIL URL: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher:///test"
+FAIL <a>: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher:///test"
+FAIL <area>: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher:///test"
 FAIL URL: Setting <file:>.protocol = 'wss' assert_equals: expected "file:///" but got "wss:"
 FAIL <a>: Setting <file:>.protocol = 'wss' assert_equals: expected "file:///" but got "wss:"
 FAIL <area>: Setting <file:>.protocol = 'wss' assert_equals: expected "file:///" but got "wss:"
@@ -67,9 +67,9 @@
 FAIL URL: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
 FAIL <a>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
 FAIL <area>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
-FAIL URL: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net/"
-FAIL <a>: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net/"
-FAIL <area>: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net/"
+FAIL URL: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net"
 FAIL URL: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
 FAIL <a>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
 FAIL <area>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
new file mode 100644
index 0000000..5756558b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/url/segments-expected.txt b/third_party/blink/web_tests/platform/linux/fast/url/segments-expected.txt
index 2d1b5d6e..60ec690 100644
--- a/third_party/blink/web_tests/platform/linux/fast/url/segments-expected.txt
+++ b/third_party/blink/web_tests/platform/linux/fast/url/segments-expected.txt
@@ -74,7 +74,7 @@
 PASS segments('madeupscheme:/example.com/') is '["madeupscheme:","","","/example.com/","",""]'
 PASS segments('file:/example.com/') is '["file:","","","/example.com/","",""]'
 PASS segments('ftps:/example.com/') is '["ftps:","","","/example.com/","",""]'
-PASS segments('gopher:/example.com/') is '["gopher:","example.com","","/","",""]'
+PASS segments('gopher:/example.com/') is '["gopher:","","","/example.com/","",""]'
 PASS segments('ws:/example.com/') is '["ws:","example.com","","/","",""]'
 PASS segments('wss:/example.com/') is '["wss:","example.com","","/","",""]'
 PASS segments('data:/example.com/') is '["data:","","","/example.com/","",""]'
@@ -86,7 +86,7 @@
 PASS segments('madeupscheme:example.com/') is '["madeupscheme:","","","example.com/","",""]'
 PASS segments('file:example.com/') is '["file:","","","/example.com/","",""]'
 PASS segments('ftps:example.com/') is '["ftps:","","","example.com/","",""]'
-PASS segments('gopher:example.com/') is '["gopher:","example.com","","/","",""]'
+PASS segments('gopher:example.com/') is '["gopher:","","","example.com/","",""]'
 PASS segments('ws:example.com/') is '["ws:","example.com","","/","",""]'
 PASS segments('wss:example.com/') is '["wss:","example.com","","/","",""]'
 PASS segments('data:example.com/') is '["data:","","","example.com/","",""]'
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
new file mode 100644
index 0000000..97a1af9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png
index 007f736d..f7570b1 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png
index c699e3a..02962d4 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png
index dfd1b1b..06ce957 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png
index 2ff1457..0ccdf41 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png
index bbbf95a..b4a6fa98 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png
index 6e41100..02ebbb2 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png
index 6dd1236..ebc8b554 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
index ca39bde..5e6e0bd 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png
index 5ba91f2..5f3d0f90 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png
index 5904457..1f09d52 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
index 99a1967e..299a36f 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
new file mode 100644
index 0000000..c4eebf6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui-high-contrast/time-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/time-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/time-picker-appearance-expected.png
new file mode 100644
index 0000000..304208d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png
index 20e4df0..8246315 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png
index 8087dfd..5779a5b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png
index 1593e0d..85cb79b0 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png
index f581d92..6b5bb23 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png
index 48aa5b8..a7857b09 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png
index ece65f0f..a6bf7ec 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png
index 9940db08..26edbeb 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
index 1598997..6785c53 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png
index 2564bc9..51ad25ca 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png
index 01b3c72..e52bf5e4 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
index 78ddd7b..3ea61f4 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-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/time-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/time-picker-appearance-expected.png
new file mode 100644
index 0000000..049096ca
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
index d99af03..a256861 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-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/time-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/time-picker-appearance-expected.png
new file mode 100644
index 0000000..049096ca
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png
index 8cf5e99..3f71cb4 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png
index 5a7098b..74fe015 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png
index 8d2f421..93dfa39 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png
index 5e57f6acd..6f62caa 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png
index a0f9930..4387b0c9 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png
index 90188d2..4614bec8 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
index 2a48d6f5..ec554ef 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png
index 01f1900b..65ae850 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png
index fe09503c..d6b48584c 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
index d99af03..a256861 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
index d99af03..a256861 100644
--- a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1252-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1252-expected.txt
index 63cac4e..6b416ff 100644
--- a/third_party/blink/web_tests/platform/mac/external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1252-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1252-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 101 tests; 67 PASS, 32 FAIL, 2 TIMEOUT, 0 NOTRUN.
+Found 101 tests; 66 PASS, 33 FAIL, 2 TIMEOUT, 0 NOTRUN.
 PASS load nested browsing context <frame src>
 PASS load nested browsing context <iframe src>
 PASS load nested browsing context <object data>
@@ -72,7 +72,7 @@
 PASS URL constructor, base
 PASS Scheme ftp (getting <a>.href)
 PASS Scheme file (getting <a>.href)
-PASS Scheme gopher (getting <a>.href)
+FAIL Scheme gopher (getting <a>.href) assert_true: expected substring %E5 got gopher://example.invalid/?x=%C3%A5 expected true got false
 PASS Scheme http (getting <a>.href)
 PASS Scheme https (getting <a>.href)
 FAIL Scheme ws (getting <a>.href) assert_true: expected substring %C3%A5 got ws://example.invalid/?x=%E5 expected true got false
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-expected.txt
index 5bacb56..f8f6e58 100644
--- a/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 517 tests; 329 PASS, 188 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 517 tests; 332 PASS, 185 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Parsing: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -85,7 +85,7 @@
 FAIL Parsing: <file://example%/> against <about:blank> assert_equals: failure should set href to input expected "file://example%/" but got "file://example%25/"
 PASS Parsing: <file://[example]/> against <about:blank>
 PASS Parsing: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:/example.com/> against <http://example.org/foo/bar>
@@ -96,7 +96,7 @@
 PASS Parsing: <https:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:example.com/> against <http://example.org/foo/bar>
@@ -183,8 +183,8 @@
 PASS Parsing: <https://foo:80/> against <about:blank>
 PASS Parsing: <ftp://foo:21/> against <about:blank>
 PASS Parsing: <ftp://foo:80/> against <about:blank>
-FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: href expected "gopher://foo:70/" but got "gopher://foo/"
-PASS Parsing: <gopher://foo:443/> against <about:blank>
+FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: host expected "foo:70" but got ""
+FAIL Parsing: <gopher://foo:443/> against <about:blank> assert_equals: host expected "foo:443" but got ""
 PASS Parsing: <ws://foo:80/> against <about:blank>
 PASS Parsing: <ws://foo:81/> against <about:blank>
 PASS Parsing: <ws://foo:443/> against <about:blank>
@@ -199,7 +199,7 @@
 PASS Parsing: <madeupscheme:/example.com/> against <about:blank>
 PASS Parsing: <file:/example.com/> against <about:blank>
 PASS Parsing: <ftps:/example.com/> against <about:blank>
-FAIL Parsing: <gopher:/example.com/> against <about:blank> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <about:blank>
 PASS Parsing: <ws:/example.com/> against <about:blank>
 PASS Parsing: <wss:/example.com/> against <about:blank>
 PASS Parsing: <data:/example.com/> against <about:blank>
@@ -210,7 +210,7 @@
 PASS Parsing: <https:example.com/> against <about:blank>
 PASS Parsing: <madeupscheme:example.com/> against <about:blank>
 PASS Parsing: <ftps:example.com/> against <about:blank>
-FAIL Parsing: <gopher:example.com/> against <about:blank> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <about:blank>
 PASS Parsing: <ws:example.com/> against <about:blank>
 PASS Parsing: <wss:example.com/> against <about:blank>
 PASS Parsing: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-origin-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-origin-expected.txt
index f9acfa5a..2eff1d990 100644
--- a/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-origin-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-origin-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 304 tests; 294 PASS, 10 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 304 tests; 300 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Parsing origin: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -69,7 +69,7 @@
 PASS Parsing origin: <https:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <madeupscheme:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Parsing origin: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <data:/example.com/> against <http://example.org/foo/bar>
@@ -80,7 +80,7 @@
 PASS Parsing origin: <https:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Parsing origin: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <data:example.com/> against <http://example.org/foo/bar>
@@ -146,8 +146,8 @@
 PASS Parsing origin: <https://foo:80/> against <about:blank>
 PASS Parsing origin: <ftp://foo:21/> against <about:blank>
 PASS Parsing origin: <ftp://foo:80/> against <about:blank>
-FAIL Parsing origin: <gopher://foo:70/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo"
-FAIL Parsing origin: <gopher://foo:443/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo:443"
+PASS Parsing origin: <gopher://foo:70/> against <about:blank>
+PASS Parsing origin: <gopher://foo:443/> against <about:blank>
 PASS Parsing origin: <ws://foo:80/> against <about:blank>
 PASS Parsing origin: <ws://foo:81/> against <about:blank>
 PASS Parsing origin: <ws://foo:443/> against <about:blank>
@@ -161,7 +161,7 @@
 PASS Parsing origin: <https:/example.com/> against <about:blank>
 PASS Parsing origin: <madeupscheme:/example.com/> against <about:blank>
 PASS Parsing origin: <ftps:/example.com/> against <about:blank>
-FAIL Parsing origin: <gopher:/example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:/example.com/> against <about:blank>
 PASS Parsing origin: <ws:/example.com/> against <about:blank>
 PASS Parsing origin: <wss:/example.com/> against <about:blank>
 PASS Parsing origin: <data:/example.com/> against <about:blank>
@@ -172,7 +172,7 @@
 PASS Parsing origin: <https:example.com/> against <about:blank>
 PASS Parsing origin: <madeupscheme:example.com/> against <about:blank>
 PASS Parsing origin: <ftps:example.com/> against <about:blank>
-FAIL Parsing origin: <gopher:example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:example.com/> against <about:blank>
 PASS Parsing origin: <ws:example.com/> against <about:blank>
 PASS Parsing origin: <wss:example.com/> against <about:blank>
 PASS Parsing origin: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-origin-xhtml-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-origin-xhtml-expected.txt
index f9acfa5a..2eff1d990 100644
--- a/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-origin-xhtml-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-origin-xhtml-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 304 tests; 294 PASS, 10 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 304 tests; 300 PASS, 4 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Parsing origin: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -69,7 +69,7 @@
 PASS Parsing origin: <https:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <madeupscheme:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Parsing origin: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <data:/example.com/> against <http://example.org/foo/bar>
@@ -80,7 +80,7 @@
 PASS Parsing origin: <https:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Parsing origin: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <data:example.com/> against <http://example.org/foo/bar>
@@ -146,8 +146,8 @@
 PASS Parsing origin: <https://foo:80/> against <about:blank>
 PASS Parsing origin: <ftp://foo:21/> against <about:blank>
 PASS Parsing origin: <ftp://foo:80/> against <about:blank>
-FAIL Parsing origin: <gopher://foo:70/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo"
-FAIL Parsing origin: <gopher://foo:443/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo:443"
+PASS Parsing origin: <gopher://foo:70/> against <about:blank>
+PASS Parsing origin: <gopher://foo:443/> against <about:blank>
 PASS Parsing origin: <ws://foo:80/> against <about:blank>
 PASS Parsing origin: <ws://foo:81/> against <about:blank>
 PASS Parsing origin: <ws://foo:443/> against <about:blank>
@@ -161,7 +161,7 @@
 PASS Parsing origin: <https:/example.com/> against <about:blank>
 PASS Parsing origin: <madeupscheme:/example.com/> against <about:blank>
 PASS Parsing origin: <ftps:/example.com/> against <about:blank>
-FAIL Parsing origin: <gopher:/example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:/example.com/> against <about:blank>
 PASS Parsing origin: <ws:/example.com/> against <about:blank>
 PASS Parsing origin: <wss:/example.com/> against <about:blank>
 PASS Parsing origin: <data:/example.com/> against <about:blank>
@@ -172,7 +172,7 @@
 PASS Parsing origin: <https:example.com/> against <about:blank>
 PASS Parsing origin: <madeupscheme:example.com/> against <about:blank>
 PASS Parsing origin: <ftps:example.com/> against <about:blank>
-FAIL Parsing origin: <gopher:example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:example.com/> against <about:blank>
 PASS Parsing origin: <ws:example.com/> against <about:blank>
 PASS Parsing origin: <wss:example.com/> against <about:blank>
 PASS Parsing origin: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-xhtml-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-xhtml-expected.txt
index 5bacb56..f8f6e58 100644
--- a/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-xhtml-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/url/a-element-xhtml-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 517 tests; 329 PASS, 188 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 517 tests; 332 PASS, 185 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Parsing: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -85,7 +85,7 @@
 FAIL Parsing: <file://example%/> against <about:blank> assert_equals: failure should set href to input expected "file://example%/" but got "file://example%25/"
 PASS Parsing: <file://[example]/> against <about:blank>
 PASS Parsing: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:/example.com/> against <http://example.org/foo/bar>
@@ -96,7 +96,7 @@
 PASS Parsing: <https:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:example.com/> against <http://example.org/foo/bar>
@@ -183,8 +183,8 @@
 PASS Parsing: <https://foo:80/> against <about:blank>
 PASS Parsing: <ftp://foo:21/> against <about:blank>
 PASS Parsing: <ftp://foo:80/> against <about:blank>
-FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: href expected "gopher://foo:70/" but got "gopher://foo/"
-PASS Parsing: <gopher://foo:443/> against <about:blank>
+FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: host expected "foo:70" but got ""
+FAIL Parsing: <gopher://foo:443/> against <about:blank> assert_equals: host expected "foo:443" but got ""
 PASS Parsing: <ws://foo:80/> against <about:blank>
 PASS Parsing: <ws://foo:81/> against <about:blank>
 PASS Parsing: <ws://foo:443/> against <about:blank>
@@ -199,7 +199,7 @@
 PASS Parsing: <madeupscheme:/example.com/> against <about:blank>
 PASS Parsing: <file:/example.com/> against <about:blank>
 PASS Parsing: <ftps:/example.com/> against <about:blank>
-FAIL Parsing: <gopher:/example.com/> against <about:blank> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <about:blank>
 PASS Parsing: <ws:/example.com/> against <about:blank>
 PASS Parsing: <wss:/example.com/> against <about:blank>
 PASS Parsing: <data:/example.com/> against <about:blank>
@@ -210,7 +210,7 @@
 PASS Parsing: <https:example.com/> against <about:blank>
 PASS Parsing: <madeupscheme:example.com/> against <about:blank>
 PASS Parsing: <ftps:example.com/> against <about:blank>
-FAIL Parsing: <gopher:example.com/> against <about:blank> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <about:blank>
 PASS Parsing: <ws:example.com/> against <about:blank>
 PASS Parsing: <wss:example.com/> against <about:blank>
 PASS Parsing: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/url/url-constructor-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-constructor-expected.txt
index 041bb43..7541e76f 100644
--- a/third_party/blink/web_tests/platform/mac/external/wpt/url/url-constructor-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-constructor-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 517 tests; 395 PASS, 122 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 517 tests; 398 PASS, 119 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Parsing: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -87,7 +87,7 @@
 PASS Parsing: <file://example%/> against <about:blank>
 PASS Parsing: <file://[example]/> against <about:blank>
 PASS Parsing: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:/example.com/> against <http://example.org/foo/bar>
@@ -98,7 +98,7 @@
 PASS Parsing: <https:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:example.com/> against <http://example.org/foo/bar>
@@ -185,8 +185,8 @@
 PASS Parsing: <https://foo:80/> against <about:blank>
 PASS Parsing: <ftp://foo:21/> against <about:blank>
 PASS Parsing: <ftp://foo:80/> against <about:blank>
-FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: href expected "gopher://foo:70/" but got "gopher://foo/"
-PASS Parsing: <gopher://foo:443/> against <about:blank>
+FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: host expected "foo:70" but got ""
+FAIL Parsing: <gopher://foo:443/> against <about:blank> assert_equals: host expected "foo:443" but got ""
 PASS Parsing: <ws://foo:80/> against <about:blank>
 PASS Parsing: <ws://foo:81/> against <about:blank>
 PASS Parsing: <ws://foo:443/> against <about:blank>
@@ -201,7 +201,7 @@
 PASS Parsing: <madeupscheme:/example.com/> against <about:blank>
 PASS Parsing: <file:/example.com/> against <about:blank>
 PASS Parsing: <ftps:/example.com/> against <about:blank>
-FAIL Parsing: <gopher:/example.com/> against <about:blank> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <about:blank>
 PASS Parsing: <ws:/example.com/> against <about:blank>
 PASS Parsing: <wss:/example.com/> against <about:blank>
 PASS Parsing: <data:/example.com/> against <about:blank>
@@ -212,7 +212,7 @@
 PASS Parsing: <https:example.com/> against <about:blank>
 PASS Parsing: <madeupscheme:example.com/> against <about:blank>
 PASS Parsing: <ftps:example.com/> against <about:blank>
-FAIL Parsing: <gopher:example.com/> against <about:blank> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <about:blank>
 PASS Parsing: <ws:example.com/> against <about:blank>
 PASS Parsing: <wss:example.com/> against <about:blank>
 PASS Parsing: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/url/url-origin-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-origin-expected.txt
index 42a736f..72594ff 100644
--- a/third_party/blink/web_tests/platform/mac/external/wpt/url/url-origin-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-origin-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 304 tests; 291 PASS, 13 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 304 tests; 297 PASS, 7 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Origin parsing: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -69,7 +69,7 @@
 PASS Origin parsing: <https:/example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <madeupscheme:/example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Origin parsing: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Origin parsing: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <data:/example.com/> against <http://example.org/foo/bar>
@@ -80,7 +80,7 @@
 PASS Origin parsing: <https:example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Origin parsing: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Origin parsing: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <data:example.com/> against <http://example.org/foo/bar>
@@ -146,8 +146,8 @@
 PASS Origin parsing: <https://foo:80/> against <about:blank>
 PASS Origin parsing: <ftp://foo:21/> against <about:blank>
 PASS Origin parsing: <ftp://foo:80/> against <about:blank>
-FAIL Origin parsing: <gopher://foo:70/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo"
-FAIL Origin parsing: <gopher://foo:443/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo:443"
+PASS Origin parsing: <gopher://foo:70/> against <about:blank>
+PASS Origin parsing: <gopher://foo:443/> against <about:blank>
 PASS Origin parsing: <ws://foo:80/> against <about:blank>
 PASS Origin parsing: <ws://foo:81/> against <about:blank>
 PASS Origin parsing: <ws://foo:443/> against <about:blank>
@@ -161,7 +161,7 @@
 PASS Origin parsing: <https:/example.com/> against <about:blank>
 PASS Origin parsing: <madeupscheme:/example.com/> against <about:blank>
 PASS Origin parsing: <ftps:/example.com/> against <about:blank>
-FAIL Origin parsing: <gopher:/example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Origin parsing: <gopher:/example.com/> against <about:blank>
 PASS Origin parsing: <ws:/example.com/> against <about:blank>
 PASS Origin parsing: <wss:/example.com/> against <about:blank>
 PASS Origin parsing: <data:/example.com/> against <about:blank>
@@ -172,7 +172,7 @@
 PASS Origin parsing: <https:example.com/> against <about:blank>
 PASS Origin parsing: <madeupscheme:example.com/> against <about:blank>
 PASS Origin parsing: <ftps:example.com/> against <about:blank>
-FAIL Origin parsing: <gopher:example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Origin parsing: <gopher:example.com/> against <about:blank>
 PASS Origin parsing: <ws:example.com/> against <about:blank>
 PASS Origin parsing: <wss:example.com/> against <about:blank>
 PASS Origin parsing: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/url/url-setters-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-setters-expected.txt
index 40801a0..45715a7 100644
--- a/third_party/blink/web_tests/platform/mac/external/wpt/url/url-setters-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/url/url-setters-expected.txt
@@ -43,9 +43,9 @@
 FAIL URL: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host assert_equals: expected "file:///" but got "http://localhost/"
 FAIL <a>: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host assert_equals: expected "file:///" but got "http://localhost/"
 FAIL <area>: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host assert_equals: expected "file:///" but got "http://localhost/"
-FAIL URL: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher://test/"
-FAIL <a>: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher://test/"
-FAIL <area>: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher://test/"
+FAIL URL: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher:///test"
+FAIL <a>: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher:///test"
+FAIL <area>: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher:///test"
 FAIL URL: Setting <file:>.protocol = 'wss' assert_equals: expected "file:///" but got "wss:"
 FAIL <a>: Setting <file:>.protocol = 'wss' assert_equals: expected "file:///" but got "wss:"
 FAIL <area>: Setting <file:>.protocol = 'wss' assert_equals: expected "file:///" but got "wss:"
@@ -67,9 +67,9 @@
 FAIL URL: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
 FAIL <a>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
 FAIL <area>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
-FAIL URL: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net/"
-FAIL <a>: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net/"
-FAIL <area>: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net/"
+FAIL URL: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net"
 FAIL URL: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
 FAIL <a>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
 FAIL <area>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
new file mode 100644
index 0000000..7dad078d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/url/segments-expected.txt b/third_party/blink/web_tests/platform/mac/fast/url/segments-expected.txt
index 2d1b5d6e..60ec690 100644
--- a/third_party/blink/web_tests/platform/mac/fast/url/segments-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/fast/url/segments-expected.txt
@@ -74,7 +74,7 @@
 PASS segments('madeupscheme:/example.com/') is '["madeupscheme:","","","/example.com/","",""]'
 PASS segments('file:/example.com/') is '["file:","","","/example.com/","",""]'
 PASS segments('ftps:/example.com/') is '["ftps:","","","/example.com/","",""]'
-PASS segments('gopher:/example.com/') is '["gopher:","example.com","","/","",""]'
+PASS segments('gopher:/example.com/') is '["gopher:","","","/example.com/","",""]'
 PASS segments('ws:/example.com/') is '["ws:","example.com","","/","",""]'
 PASS segments('wss:/example.com/') is '["wss:","example.com","","/","",""]'
 PASS segments('data:/example.com/') is '["data:","","","/example.com/","",""]'
@@ -86,7 +86,7 @@
 PASS segments('madeupscheme:example.com/') is '["madeupscheme:","","","example.com/","",""]'
 PASS segments('file:example.com/') is '["file:","","","/example.com/","",""]'
 PASS segments('ftps:example.com/') is '["ftps:","","","example.com/","",""]'
-PASS segments('gopher:example.com/') is '["gopher:","example.com","","/","",""]'
+PASS segments('gopher:example.com/') is '["gopher:","","","example.com/","",""]'
 PASS segments('ws:example.com/') is '["ws:","example.com","","/","",""]'
 PASS segments('wss:example.com/') is '["wss:","example.com","","/","",""]'
 PASS segments('data:example.com/') is '["data:","","","example.com/","",""]'
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
new file mode 100644
index 0000000..d6ae5a6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png
index 00c2ab8..70324e2 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png
index d4062ea7..806a0efb 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png
index 0bac746f..c91e389 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png
index 93c432b8..a35cadb 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png
index 64110b6..abca385 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png
index eec59c7..33cbb3c 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png
index 4379d326..31c025d 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
index ecb58f8..3e46c4c 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png
index 49df9544..b1c4ba2 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png
index 9347799..08203f5 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
index d99af03..a256861 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1252-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1252-expected.txt
deleted file mode 100644
index e69de29..0000000
--- a/third_party/blink/web_tests/platform/win/external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/windows-1252-expected.txt
+++ /dev/null
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-expected.txt
index 72133cf4..4d35b866 100644
--- a/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-expected.txt
+++ b/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 517 tests; 325 PASS, 192 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 517 tests; 328 PASS, 189 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Parsing: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -85,7 +85,7 @@
 FAIL Parsing: <file://example%/> against <about:blank> assert_equals: failure should set href to input expected "file://example%/" but got "file://example%25/"
 PASS Parsing: <file://[example]/> against <about:blank>
 PASS Parsing: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:/example.com/> against <http://example.org/foo/bar>
@@ -96,7 +96,7 @@
 PASS Parsing: <https:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:example.com/> against <http://example.org/foo/bar>
@@ -183,8 +183,8 @@
 PASS Parsing: <https://foo:80/> against <about:blank>
 PASS Parsing: <ftp://foo:21/> against <about:blank>
 PASS Parsing: <ftp://foo:80/> against <about:blank>
-FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: href expected "gopher://foo:70/" but got "gopher://foo/"
-PASS Parsing: <gopher://foo:443/> against <about:blank>
+FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: host expected "foo:70" but got ""
+FAIL Parsing: <gopher://foo:443/> against <about:blank> assert_equals: host expected "foo:443" but got ""
 PASS Parsing: <ws://foo:80/> against <about:blank>
 PASS Parsing: <ws://foo:81/> against <about:blank>
 PASS Parsing: <ws://foo:443/> against <about:blank>
@@ -199,7 +199,7 @@
 PASS Parsing: <madeupscheme:/example.com/> against <about:blank>
 FAIL Parsing: <file:/example.com/> against <about:blank> assert_equals: href expected "file:///example.com/" but got "file://example.com/"
 PASS Parsing: <ftps:/example.com/> against <about:blank>
-FAIL Parsing: <gopher:/example.com/> against <about:blank> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <about:blank>
 PASS Parsing: <ws:/example.com/> against <about:blank>
 PASS Parsing: <wss:/example.com/> against <about:blank>
 PASS Parsing: <data:/example.com/> against <about:blank>
@@ -210,7 +210,7 @@
 PASS Parsing: <https:example.com/> against <about:blank>
 PASS Parsing: <madeupscheme:example.com/> against <about:blank>
 PASS Parsing: <ftps:example.com/> against <about:blank>
-FAIL Parsing: <gopher:example.com/> against <about:blank> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <about:blank>
 PASS Parsing: <ws:example.com/> against <about:blank>
 PASS Parsing: <wss:example.com/> against <about:blank>
 PASS Parsing: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-origin-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-origin-expected.txt
index 6bd21b2..1955d9f 100644
--- a/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-origin-expected.txt
+++ b/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-origin-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 304 tests; 292 PASS, 12 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 304 tests; 298 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Parsing origin: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -69,7 +69,7 @@
 PASS Parsing origin: <https:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <madeupscheme:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Parsing origin: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <data:/example.com/> against <http://example.org/foo/bar>
@@ -80,7 +80,7 @@
 PASS Parsing origin: <https:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Parsing origin: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <data:example.com/> against <http://example.org/foo/bar>
@@ -146,8 +146,8 @@
 PASS Parsing origin: <https://foo:80/> against <about:blank>
 PASS Parsing origin: <ftp://foo:21/> against <about:blank>
 PASS Parsing origin: <ftp://foo:80/> against <about:blank>
-FAIL Parsing origin: <gopher://foo:70/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo"
-FAIL Parsing origin: <gopher://foo:443/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo:443"
+PASS Parsing origin: <gopher://foo:70/> against <about:blank>
+PASS Parsing origin: <gopher://foo:443/> against <about:blank>
 PASS Parsing origin: <ws://foo:80/> against <about:blank>
 PASS Parsing origin: <ws://foo:81/> against <about:blank>
 PASS Parsing origin: <ws://foo:443/> against <about:blank>
@@ -161,7 +161,7 @@
 PASS Parsing origin: <https:/example.com/> against <about:blank>
 PASS Parsing origin: <madeupscheme:/example.com/> against <about:blank>
 PASS Parsing origin: <ftps:/example.com/> against <about:blank>
-FAIL Parsing origin: <gopher:/example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:/example.com/> against <about:blank>
 PASS Parsing origin: <ws:/example.com/> against <about:blank>
 PASS Parsing origin: <wss:/example.com/> against <about:blank>
 PASS Parsing origin: <data:/example.com/> against <about:blank>
@@ -172,7 +172,7 @@
 PASS Parsing origin: <https:example.com/> against <about:blank>
 PASS Parsing origin: <madeupscheme:example.com/> against <about:blank>
 PASS Parsing origin: <ftps:example.com/> against <about:blank>
-FAIL Parsing origin: <gopher:example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:example.com/> against <about:blank>
 PASS Parsing origin: <ws:example.com/> against <about:blank>
 PASS Parsing origin: <wss:example.com/> against <about:blank>
 PASS Parsing origin: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-origin-xhtml-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-origin-xhtml-expected.txt
index 6bd21b2..1955d9f 100644
--- a/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-origin-xhtml-expected.txt
+++ b/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-origin-xhtml-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 304 tests; 292 PASS, 12 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 304 tests; 298 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Parsing origin: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -69,7 +69,7 @@
 PASS Parsing origin: <https:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <madeupscheme:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Parsing origin: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <data:/example.com/> against <http://example.org/foo/bar>
@@ -80,7 +80,7 @@
 PASS Parsing origin: <https:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Parsing origin: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Parsing origin: <data:example.com/> against <http://example.org/foo/bar>
@@ -146,8 +146,8 @@
 PASS Parsing origin: <https://foo:80/> against <about:blank>
 PASS Parsing origin: <ftp://foo:21/> against <about:blank>
 PASS Parsing origin: <ftp://foo:80/> against <about:blank>
-FAIL Parsing origin: <gopher://foo:70/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo"
-FAIL Parsing origin: <gopher://foo:443/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo:443"
+PASS Parsing origin: <gopher://foo:70/> against <about:blank>
+PASS Parsing origin: <gopher://foo:443/> against <about:blank>
 PASS Parsing origin: <ws://foo:80/> against <about:blank>
 PASS Parsing origin: <ws://foo:81/> against <about:blank>
 PASS Parsing origin: <ws://foo:443/> against <about:blank>
@@ -161,7 +161,7 @@
 PASS Parsing origin: <https:/example.com/> against <about:blank>
 PASS Parsing origin: <madeupscheme:/example.com/> against <about:blank>
 PASS Parsing origin: <ftps:/example.com/> against <about:blank>
-FAIL Parsing origin: <gopher:/example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:/example.com/> against <about:blank>
 PASS Parsing origin: <ws:/example.com/> against <about:blank>
 PASS Parsing origin: <wss:/example.com/> against <about:blank>
 PASS Parsing origin: <data:/example.com/> against <about:blank>
@@ -172,7 +172,7 @@
 PASS Parsing origin: <https:example.com/> against <about:blank>
 PASS Parsing origin: <madeupscheme:example.com/> against <about:blank>
 PASS Parsing origin: <ftps:example.com/> against <about:blank>
-FAIL Parsing origin: <gopher:example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Parsing origin: <gopher:example.com/> against <about:blank>
 PASS Parsing origin: <ws:example.com/> against <about:blank>
 PASS Parsing origin: <wss:example.com/> against <about:blank>
 PASS Parsing origin: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-xhtml-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-xhtml-expected.txt
index 72133cf4..4d35b866 100644
--- a/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-xhtml-expected.txt
+++ b/third_party/blink/web_tests/platform/win/external/wpt/url/a-element-xhtml-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 517 tests; 325 PASS, 192 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 517 tests; 328 PASS, 189 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Parsing: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -85,7 +85,7 @@
 FAIL Parsing: <file://example%/> against <about:blank> assert_equals: failure should set href to input expected "file://example%/" but got "file://example%25/"
 PASS Parsing: <file://[example]/> against <about:blank>
 PASS Parsing: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:/example.com/> against <http://example.org/foo/bar>
@@ -96,7 +96,7 @@
 PASS Parsing: <https:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:example.com/> against <http://example.org/foo/bar>
@@ -183,8 +183,8 @@
 PASS Parsing: <https://foo:80/> against <about:blank>
 PASS Parsing: <ftp://foo:21/> against <about:blank>
 PASS Parsing: <ftp://foo:80/> against <about:blank>
-FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: href expected "gopher://foo:70/" but got "gopher://foo/"
-PASS Parsing: <gopher://foo:443/> against <about:blank>
+FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: host expected "foo:70" but got ""
+FAIL Parsing: <gopher://foo:443/> against <about:blank> assert_equals: host expected "foo:443" but got ""
 PASS Parsing: <ws://foo:80/> against <about:blank>
 PASS Parsing: <ws://foo:81/> against <about:blank>
 PASS Parsing: <ws://foo:443/> against <about:blank>
@@ -199,7 +199,7 @@
 PASS Parsing: <madeupscheme:/example.com/> against <about:blank>
 FAIL Parsing: <file:/example.com/> against <about:blank> assert_equals: href expected "file:///example.com/" but got "file://example.com/"
 PASS Parsing: <ftps:/example.com/> against <about:blank>
-FAIL Parsing: <gopher:/example.com/> against <about:blank> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <about:blank>
 PASS Parsing: <ws:/example.com/> against <about:blank>
 PASS Parsing: <wss:/example.com/> against <about:blank>
 PASS Parsing: <data:/example.com/> against <about:blank>
@@ -210,7 +210,7 @@
 PASS Parsing: <https:example.com/> against <about:blank>
 PASS Parsing: <madeupscheme:example.com/> against <about:blank>
 PASS Parsing: <ftps:example.com/> against <about:blank>
-FAIL Parsing: <gopher:example.com/> against <about:blank> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <about:blank>
 PASS Parsing: <ws:example.com/> against <about:blank>
 PASS Parsing: <wss:example.com/> against <about:blank>
 PASS Parsing: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/url/url-constructor-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/url/url-constructor-expected.txt
index 9e581df..bae425b 100644
--- a/third_party/blink/web_tests/platform/win/external/wpt/url/url-constructor-expected.txt
+++ b/third_party/blink/web_tests/platform/win/external/wpt/url/url-constructor-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 517 tests; 389 PASS, 128 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 517 tests; 392 PASS, 125 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Parsing: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -87,7 +87,7 @@
 PASS Parsing: <file://example%/> against <about:blank>
 PASS Parsing: <file://[example]/> against <about:blank>
 PASS Parsing: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:/example.com/> against <http://example.org/foo/bar>
@@ -98,7 +98,7 @@
 PASS Parsing: <https:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Parsing: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Parsing: <data:example.com/> against <http://example.org/foo/bar>
@@ -185,8 +185,8 @@
 PASS Parsing: <https://foo:80/> against <about:blank>
 PASS Parsing: <ftp://foo:21/> against <about:blank>
 PASS Parsing: <ftp://foo:80/> against <about:blank>
-FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: href expected "gopher://foo:70/" but got "gopher://foo/"
-PASS Parsing: <gopher://foo:443/> against <about:blank>
+FAIL Parsing: <gopher://foo:70/> against <about:blank> assert_equals: host expected "foo:70" but got ""
+FAIL Parsing: <gopher://foo:443/> against <about:blank> assert_equals: host expected "foo:443" but got ""
 PASS Parsing: <ws://foo:80/> against <about:blank>
 PASS Parsing: <ws://foo:81/> against <about:blank>
 PASS Parsing: <ws://foo:443/> against <about:blank>
@@ -201,7 +201,7 @@
 PASS Parsing: <madeupscheme:/example.com/> against <about:blank>
 FAIL Parsing: <file:/example.com/> against <about:blank> assert_equals: href expected "file:///example.com/" but got "file://example.com/"
 PASS Parsing: <ftps:/example.com/> against <about:blank>
-FAIL Parsing: <gopher:/example.com/> against <about:blank> assert_equals: href expected "gopher:/example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:/example.com/> against <about:blank>
 PASS Parsing: <ws:/example.com/> against <about:blank>
 PASS Parsing: <wss:/example.com/> against <about:blank>
 PASS Parsing: <data:/example.com/> against <about:blank>
@@ -212,7 +212,7 @@
 PASS Parsing: <https:example.com/> against <about:blank>
 PASS Parsing: <madeupscheme:example.com/> against <about:blank>
 PASS Parsing: <ftps:example.com/> against <about:blank>
-FAIL Parsing: <gopher:example.com/> against <about:blank> assert_equals: href expected "gopher:example.com/" but got "gopher://example.com/"
+PASS Parsing: <gopher:example.com/> against <about:blank>
 PASS Parsing: <ws:example.com/> against <about:blank>
 PASS Parsing: <wss:example.com/> against <about:blank>
 PASS Parsing: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/url/url-origin-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/url/url-origin-expected.txt
index 4d8f835..616310c9 100644
--- a/third_party/blink/web_tests/platform/win/external/wpt/url/url-origin-expected.txt
+++ b/third_party/blink/web_tests/platform/win/external/wpt/url/url-origin-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 304 tests; 289 PASS, 15 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 304 tests; 295 PASS, 9 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Loading data…
 PASS Origin parsing: <http://example	.
 org> against <http://example.org/foo/bar>
@@ -69,7 +69,7 @@
 PASS Origin parsing: <https:/example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <madeupscheme:/example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <ftps:/example.com/> against <http://example.org/foo/bar>
-FAIL Origin parsing: <gopher:/example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Origin parsing: <gopher:/example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <ws:/example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <wss:/example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <data:/example.com/> against <http://example.org/foo/bar>
@@ -80,7 +80,7 @@
 PASS Origin parsing: <https:example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <madeupscheme:example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <ftps:example.com/> against <http://example.org/foo/bar>
-FAIL Origin parsing: <gopher:example.com/> against <http://example.org/foo/bar> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Origin parsing: <gopher:example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <ws:example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <wss:example.com/> against <http://example.org/foo/bar>
 PASS Origin parsing: <data:example.com/> against <http://example.org/foo/bar>
@@ -146,8 +146,8 @@
 PASS Origin parsing: <https://foo:80/> against <about:blank>
 PASS Origin parsing: <ftp://foo:21/> against <about:blank>
 PASS Origin parsing: <ftp://foo:80/> against <about:blank>
-FAIL Origin parsing: <gopher://foo:70/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo"
-FAIL Origin parsing: <gopher://foo:443/> against <about:blank> assert_equals: origin expected "null" but got "gopher://foo:443"
+PASS Origin parsing: <gopher://foo:70/> against <about:blank>
+PASS Origin parsing: <gopher://foo:443/> against <about:blank>
 PASS Origin parsing: <ws://foo:80/> against <about:blank>
 PASS Origin parsing: <ws://foo:81/> against <about:blank>
 PASS Origin parsing: <ws://foo:443/> against <about:blank>
@@ -161,7 +161,7 @@
 PASS Origin parsing: <https:/example.com/> against <about:blank>
 PASS Origin parsing: <madeupscheme:/example.com/> against <about:blank>
 PASS Origin parsing: <ftps:/example.com/> against <about:blank>
-FAIL Origin parsing: <gopher:/example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Origin parsing: <gopher:/example.com/> against <about:blank>
 PASS Origin parsing: <ws:/example.com/> against <about:blank>
 PASS Origin parsing: <wss:/example.com/> against <about:blank>
 PASS Origin parsing: <data:/example.com/> against <about:blank>
@@ -172,7 +172,7 @@
 PASS Origin parsing: <https:example.com/> against <about:blank>
 PASS Origin parsing: <madeupscheme:example.com/> against <about:blank>
 PASS Origin parsing: <ftps:example.com/> against <about:blank>
-FAIL Origin parsing: <gopher:example.com/> against <about:blank> assert_equals: origin expected "null" but got "gopher://example.com"
+PASS Origin parsing: <gopher:example.com/> against <about:blank>
 PASS Origin parsing: <ws:example.com/> against <about:blank>
 PASS Origin parsing: <wss:example.com/> against <about:blank>
 PASS Origin parsing: <data:example.com/> against <about:blank>
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters-expected.txt
index 4ce8aeb..a14b6ec 100644
--- a/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters-expected.txt
+++ b/third_party/blink/web_tests/platform/win/external/wpt/url/url-setters-expected.txt
@@ -43,9 +43,9 @@
 FAIL URL: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host assert_equals: expected "file:///" but got "http://localhost/"
 FAIL <a>: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host assert_equals: expected "file:///" but got "http://localhost/"
 FAIL <area>: Setting <file://localhost/>.protocol = 'http' Can’t switch from file URL with no host assert_equals: expected "file:///" but got "http://localhost/"
-FAIL URL: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher://test/"
-FAIL <a>: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher://test/"
-FAIL <area>: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher://test/"
+FAIL URL: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher:///test"
+FAIL <a>: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher:///test"
+FAIL <area>: Setting <file:///test>.protocol = 'gopher' assert_equals: expected "file:///test" but got "gopher:///test"
 FAIL URL: Setting <file:>.protocol = 'wss' assert_equals: expected "file:///" but got "wss:"
 FAIL <a>: Setting <file:>.protocol = 'wss' assert_equals: expected "file:///" but got "wss:"
 FAIL <area>: Setting <file:>.protocol = 'wss' assert_equals: expected "file:///" but got "wss:"
@@ -67,9 +67,9 @@
 FAIL URL: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
 FAIL <a>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
 FAIL <area>: Setting <ssh://me@example.net>.protocol = 'http' Can’t switch from non-special scheme to special assert_equals: expected "ssh://me@example.net" but got "http://me@example.net/"
-FAIL URL: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net/"
-FAIL <a>: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net/"
-FAIL <area>: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net/"
+FAIL URL: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net"
+FAIL <a>: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net"
+FAIL <area>: Setting <ssh://me@example.net>.protocol = 'gopher' assert_equals: expected "ssh://me@example.net" but got "gopher://me@example.net"
 FAIL URL: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
 FAIL <a>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
 FAIL <area>: Setting <ssh://me@example.net>.protocol = 'file' assert_equals: expected "ssh://me@example.net" but got "file://me%40example.net/"
diff --git a/third_party/blink/web_tests/platform/win/fast/url/segments-expected.txt b/third_party/blink/web_tests/platform/win/fast/url/segments-expected.txt
index 75c822d6..1b02a928 100644
--- a/third_party/blink/web_tests/platform/win/fast/url/segments-expected.txt
+++ b/third_party/blink/web_tests/platform/win/fast/url/segments-expected.txt
@@ -74,7 +74,7 @@
 PASS segments('madeupscheme:/example.com/') is '["madeupscheme:","","","/example.com/","",""]'
 FAIL segments('file:/example.com/') should be ["file:","","","/example.com/","",""]. Was ["file:","example.com","","/","",""].
 PASS segments('ftps:/example.com/') is '["ftps:","","","/example.com/","",""]'
-PASS segments('gopher:/example.com/') is '["gopher:","example.com","","/","",""]'
+PASS segments('gopher:/example.com/') is '["gopher:","","","/example.com/","",""]'
 PASS segments('ws:/example.com/') is '["ws:","example.com","","/","",""]'
 PASS segments('wss:/example.com/') is '["wss:","example.com","","/","",""]'
 PASS segments('data:/example.com/') is '["data:","","","/example.com/","",""]'
@@ -86,7 +86,7 @@
 PASS segments('madeupscheme:example.com/') is '["madeupscheme:","","","example.com/","",""]'
 FAIL segments('file:example.com/') should be ["file:","","","/example.com/","",""]. Was ["file:","example.com","","/","",""].
 PASS segments('ftps:example.com/') is '["ftps:","","","example.com/","",""]'
-PASS segments('gopher:example.com/') is '["gopher:","example.com","","/","",""]'
+PASS segments('gopher:example.com/') is '["gopher:","","","example.com/","",""]'
 PASS segments('ws:example.com/') is '["ws:","example.com","","/","",""]'
 PASS segments('wss:example.com/') is '["wss:","example.com","","/","",""]'
 PASS segments('data:example.com/') is '["data:","","","example.com/","",""]'
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png
index 947c0fb..4ba1079 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/suggestion-picker/time-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png
index 6f61965..0eb3002 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-AM-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png
index a951503..4e252fd 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-12-PM-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png
index 8b817e3..a571fb7 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-24-hour-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png
index c16c4cc..1783daa 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowdown-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png
index 8fbf225..c309056 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-arrowup-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png
index 812fbfe97..ebfc4b1 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
index 897bec4..22cd1ae 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png
index e1ad330..ce0c000d 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-milliseconds-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png
index 47bd4dc..31bee9e 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-seconds-pm-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
index bc7a1da..a960d6e 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
index 71609a8..22ce40a 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/time-picker/time-picker-appearance-ko-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
index bc7a1da..a960d6e 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-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/time-picker-appearance-expected.png b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
new file mode 100644
index 0000000..43a241e
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh-high-contrast/fast/forms/controls-new-ui-high-contrast/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
index 9086238..a92eec57 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -5209,6 +5209,7 @@
 interface RTCRtpReceiver
     static method getCapabilities
     attribute @@toStringTag
+    getter playoutDelayHint
     getter rtcpTransport
     getter track
     getter transport
@@ -5217,6 +5218,7 @@
     method getParameters
     method getStats
     method getSynchronizationSources
+    setter playoutDelayHint
 interface RTCRtpSender
     static method getCapabilities
     attribute @@toStringTag
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index 6737247..3228441 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -5135,6 +5135,8 @@
     method constructor
 interface NDEFRecord
     attribute @@toStringTag
+    getter data
+    getter id
     getter mediaType
     getter recordType
     method arrayBuffer
@@ -6196,7 +6198,7 @@
 interface RTCRtpReceiver
     static method getCapabilities
     attribute @@toStringTag
-    getter jitterBufferDelayHint
+    getter playoutDelayHint
     getter rtcpTransport
     getter track
     getter transport
@@ -6205,7 +6207,7 @@
     method getParameters
     method getStats
     method getSynchronizationSources
-    setter jitterBufferDelayHint
+    setter playoutDelayHint
 interface RTCRtpSender
     static method getCapabilities
     attribute @@toStringTag
diff --git a/third_party/closure_compiler/README.chromium b/third_party/closure_compiler/README.chromium
index b7014df..629f18d 100644
--- a/third_party/closure_compiler/README.chromium
+++ b/third_party/closure_compiler/README.chromium
@@ -1,8 +1,8 @@
 Name: Closure compiler
 Short Name: closure-compiler
 URL: http://github.com/google/closure-compiler
-Version: v20190709
-Date: 2019/07/24 01:19
+Version: v20190929
+Date: 2019/10/07 21:43
 License: Apache 2.0
 License File: LICENSE
 Security Critical: no
diff --git a/third_party/closure_compiler/compiler/compiler.jar b/third_party/closure_compiler/compiler/compiler.jar
index a02a48c..7919dd9 100644
--- a/third_party/closure_compiler/compiler/compiler.jar
+++ b/third_party/closure_compiler/compiler/compiler.jar
Binary files differ
diff --git a/third_party/closure_compiler/externs/chrome_extensions.js b/third_party/closure_compiler/externs/chrome_extensions.js
index b2aea6c..8026fab 100644
--- a/third_party/closure_compiler/externs/chrome_extensions.js
+++ b/third_party/closure_compiler/externs/chrome_extensions.js
@@ -7595,7 +7595,7 @@
 /**
  * @param {!Object<string,(string|boolean|ResourceIdentifier)>} details
  *     Settings details.
- * @param {function(): void} callback Callback function.
+ * @param {function({setting: *}): void} callback Callback function.
  * @return {undefined}
  */
 ContentSetting.prototype.get = function(details, callback) {};
diff --git a/third_party/closure_compiler/externs/web_animations.js b/third_party/closure_compiler/externs/web_animations.js
deleted file mode 100644
index a3d5797..0000000
--- a/third_party/closure_compiler/externs/web_animations.js
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview Minimal Closure externs for Web Animations.
- * "Minimal" because the web-animations spec is in flux, Chromium's support is
- * changing, and the intended consumer (MD Settings) is actually using the
- * web-animations-js polyfill for the time being.
- * @see https://w3c.github.io/web-animations/#programming-interface
- */
-
-/**
- * @enum {number}
- * @see https://w3c.github.io/web-animations/#enumdef-fillmode
- */
-var FillMode = {
-  'none': 0,
-  'forwards': 1,
-  'backwards': 2,
-  'both': 3,
-  'auto': 4
-};
-
-/**
- * @enum {number}
- * @see https://w3c.github.io/web-animations/#enumdef-playbackdirection
- */
-var PlaybackDirection = {
-  'normal': 0,
-  'reverse': 1,
-  'alternate': 2,
-  'alternate-reverse': 3
-};
-
-/**
- * @enum {number}
- * @see https://w3c.github.io/web-animations/#enumdef-iterationcompositeoperation
- */
-var IterationCompositeOperation = {
-  'replace': 0,
-  'accumulate': 1
-};
-
-/**
- * @enum {number}
- * @see https://w3c.github.io/web-animations/#enumdef-compositeoperation
- */
-var CompositeOperation = {
-  'replace': 0,
-  'add': 1,
-  'accumulate': 2
-};
-
-/**
- * @constructor
- * @param {!Event} event
- */
-var EventHandlerNonNull = function(event) {};
-
-/** @typedef {?EventHandlerNonNull} */
-var EventHandler;
-
-/**
- * @constructor
- * @see https://w3c.github.io/web-animations/#dictdef-keyframeanimationoptions
- */
-var KeyframeAnimationOptions = function() {};
-
-/**
- * @constructor
- * @see https://w3c.github.io/web-animations/#dictdef-keyframeeffectoptions
- */
-var KeyframeEffectOptions = function() {};
-
-/** @type {number} */
-KeyframeEffectOptions.prototype.delay;
-
-/** @type {number} */
-KeyframeEffectOptions.prototype.endDelay;
-
-/** @type {!FillMode} */
-KeyframeEffectOptions.prototype.fill;
-
-/** @type {number} */
-KeyframeEffectOptions.prototype.iterationStart;
-
-/** @type {number} */
-KeyframeEffectOptions.prototype.iterations;
-
-/** @type {number|string} */
-KeyframeEffectOptions.prototype.duration;
-
-/** @type {number} */
-KeyframeEffectOptions.prototype.playbackRate;
-
-/** @type {!PlaybackDirection} */
-KeyframeEffectOptions.prototype.direction;
-
-/** @type {string} */
-KeyframeEffectOptions.prototype.easing;
-
-/** @type {string} */
-KeyframeEffectOptions.prototype.id;
-
-/**
- * @interface
- * @see https://w3c.github.io/web-animations/#animatable
- */
-var Animatable = function() {};
-
-Animatable.prototype = /** @lends {Element.prototype} */({
-  /**
-   * @param {?Array<Object>|Object} effect
-   * @param {number|!KeyframeEffectOptions=} opt_timing
-   * @return {!Animation}
-   */
-  animate: function(effect, opt_timing) {},
-});
diff --git a/tools/binary_size/libsupersize/archive.py b/tools/binary_size/libsupersize/archive.py
index 0f31348..d9621cf 100644
--- a/tools/binary_size/libsupersize/archive.py
+++ b/tools/binary_size/libsupersize/archive.py
@@ -90,7 +90,6 @@
       'assets/icudtl.dat': '../../third_party/icu/android/icudtl.dat',
       'assets/snapshot_blob_32.bin': '../../v8/snapshot_blob_32.bin',
       'assets/snapshot_blob_64.bin': '../../v8/snapshot_blob_64.bin',
-      'assets/natives_blob.bin': '../../v8/natives_blob.bin',
       'assets/unwind_cfi_32': '../../base/trace_event/cfi_backtrace_android.cc',
       'assets/webapk_dex_version.txt': (
           '../../chrome/android/webapk/libs/runtime_library_version.gni'),
diff --git a/tools/bisect_repackage/bisect_repackage.py b/tools/bisect_repackage/bisect_repackage.py
index 9a8500a..ac35986e 100644
--- a/tools/bisect_repackage/bisect_repackage.py
+++ b/tools/bisect_repackage/bisect_repackage.py
@@ -55,7 +55,6 @@
         'nacl_helper_bootstrap',
         'nacl_helper_nonsfi',
         'nacl_irt_x86_64.nexe',
-        'natives_blob.bin',
         'pnacl/',
         'product_logo_48.png',
         'resources/',
@@ -80,7 +79,6 @@
         'libGLESv2.dll',
         'locales',
         'nacl_irt_x86_64.nexe',
-        'natives_blob.bin',
         'PepperFlash',
         'resources.pak',
         'SecondaryTile.png',
diff --git a/tools/determinism/compare_build_artifacts.py b/tools/determinism/compare_build_artifacts.py
index 97faa40..fee31c8 100755
--- a/tools/determinism/compare_build_artifacts.py
+++ b/tools/determinism/compare_build_artifacts.py
@@ -30,7 +30,7 @@
     '.aab',
     '.apk',
     '.app',
-    '.bin',  # V8 snapshot files natives_blob.bin, snapshot_blob.bin
+    '.bin',  # V8 snapshot file snapshot_blob.bin
     '.dll',
     '.dylib',
     '.exe',
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 09478ac..2bc6f87 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -924,6 +924,11 @@
       'win_upload_clang': 'release_bot',
     },
 
+    'tryserver.devtools-frontend': {
+      # Use pure release as CI doesn't have a debug builder.
+      'devtools_frontend_linux_blink_rel': 'release_bot',
+    },
+
     'tryserver.v8': {
       'v8_linux_blink_rel': 'release_trybot',
       'v8_linux_chromium_gn_rel': 'release_trybot',
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 680a696..77172b5 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -3794,6 +3794,12 @@
   <int value="1" label="CVC followed by WebAuthn"/>
 </enum>
 
+<enum name="AutofillCreditCardUploadFeedback">
+  <int value="0" label="Loading indicator shown"/>
+  <int value="1" label="Failure icon shown"/>
+  <int value="2" label="Failure bubble shown"/>
+</enum>
+
 <enum name="AutofillCreditCardWebauthnResultMetric">
   <int value="0" label="Success"/>
   <int value="1" label="Other error"/>
@@ -25142,6 +25148,8 @@
   <int value="3059" label="NonOriginCleanImageBitmapTransfer"/>
   <int value="3060" label="CompressionStreamConstructor"/>
   <int value="3061" label="DecompressionStreamConstructor"/>
+  <int value="3062" label="V8RTCRtpReceiver_PlayoutDelayHint_AttributeGetter"/>
+  <int value="3063" label="V8RTCRtpReceiver_PlayoutDelayHint_AttributeSetter"/>
 </enum>
 
 <enum name="FeaturePolicyAllowlistType">
@@ -35990,8 +35998,10 @@
   <int value="-1197035323" label="ZeroSuggestRedirectToChrome:disabled"/>
   <int value="-1195194959" label="XGEOVisibleNetworks:disabled"/>
   <int value="-1190174011" label="enable-hdr"/>
+  <int value="-1185477291" label="ImeDecoderWithSandbox:enabled"/>
   <int value="-1184904651" label="enable-npapi"/>
   <int value="-1184480269" label="LsdPermissionPrompt:enabled"/>
+  <int value="-1183321008" label="ImeDecoderWithSandbox:disabled"/>
   <int value="-1183009666" label="OfflinePagesLimitlessPrefetching:disabled"/>
   <int value="-1177802205" label="enable-hosted-app-quit-notification"/>
   <int value="-1176748003"
@@ -36874,6 +36884,7 @@
   <int value="-41672681" label="WebUITabStripDemoOptions:disabled"/>
   <int value="-40935502" label="ContextualSuggestionsSlimPeekUI:enabled"/>
   <int value="-35388407" label="AshNewSystemMenu:disabled"/>
+  <int value="-31444029" label="MediaInspectorLogging:disabled"/>
   <int value="-30966385" label="enable-hardware-overlays"/>
   <int value="-29877377" label="TabHoverCardImages:disabled"/>
   <int value="-29847483" label="MemoryAblation:enabled"/>
@@ -37728,6 +37739,7 @@
   <int value="1127427821" label="OmniboxEntitySuggestions:disabled"/>
   <int value="1129542111" label="CastAllowAllIPs:disabled"/>
   <int value="1129888794" label="ash-touch-hud"/>
+  <int value="1133207726" label="MediaInspectorLogging:enabled"/>
   <int value="1133635187" label="force-gpu-rasterization"/>
   <int value="1138349838" label="EnableMDRoundedCornersOnDialogs:disabled"/>
   <int value="1139226452" label="enable-nacl-debug"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index f44e401..c02f457 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -10966,6 +10966,14 @@
   </summary>
 </histogram>
 
+<histogram name="Autofill.CreditCardUploadFeedback"
+    enum="AutofillCreditCardUploadFeedback">
+  <owner>siyua@chromium.org</owner>
+  <summary>
+    Records when credit card upload provides feedback on its status to the user.
+  </summary>
+</histogram>
+
 <histogram name="Autofill.DaysSinceLastUse.CreditCard" units="days">
   <owner>sebsg@chromium.org</owner>
   <summary>
@@ -47869,7 +47877,9 @@
 </histogram>
 
 <histogram name="FCMInvalidations.FailedSubscriptionsErrorCode"
-    enum="NetErrorCodes" expires_after="M78">
+    enum="NetErrorCodes" expires_after="never">
+<!-- expires-never: For monitoring FCM based invalidations. -->
+
   <owner>melandory@chromium.org</owner>
   <summary>Net error codes for failed subscription requests.</summary>
 </histogram>
@@ -57452,6 +57462,9 @@
 
 <histogram name="Invalidations.NetworkChannel"
     enum="InvalidationNetworkChannel" expires_after="M76">
+  <obsolete>
+    Histogram for the deprecated implementation.
+  </obsolete>
   <owner>pavely@chromium.org</owner>
   <owner>melandory@chromium.org</owner>
   <summary>Network channel used for invalidations.</summary>
@@ -145125,6 +145138,9 @@
 
 <histogram base="true" name="Sync.NonGroupedInvalidation" enum="SyncModelTypes"
     expires_after="M75">
+  <obsolete>
+    Was used during the launch to compare new and old implemetations.
+  </obsolete>
   <owner>melandory@chromium.org</owner>
   <summary>
     The number of invalidations received per sync data type for cases when only
@@ -145136,6 +145152,9 @@
 
 <histogram base="true" name="Sync.NonGroupedInvalidationKnownVersion"
     enum="SyncModelTypes" expires_after="M75">
+  <obsolete>
+    Was used during the launch to compare new and old implementations.
+  </obsolete>
   <owner>melandory@chromium.org</owner>
   <summary>
     The sync datatype of the recieved invalidation. Recorded only for the
@@ -145145,6 +145164,9 @@
 
 <histogram name="Sync.NonRedundantInvalidationPerModelType"
     enum="SyncModelTypes" expires_after="M77">
+  <obsolete>
+    Was used during the launch for the new implementation.
+  </obsolete>
   <owner>melandory@chromium.org</owner>
   <summary>
     The sync datatype of the recieved invalidation with fresh version.
diff --git a/tools/perf/benchmarks/system_health_smoke_test.py b/tools/perf/benchmarks/system_health_smoke_test.py
index 2f65fb7..ddf7229 100644
--- a/tools/perf/benchmarks/system_health_smoke_test.py
+++ b/tools/perf/benchmarks/system_health_smoke_test.py
@@ -36,9 +36,6 @@
 
 
 _DISABLED_TESTS = frozenset({
-  # crbug.com/983326 - flaky.
-  'system_health.memory_desktop/browse_accessibility:media:youtube',
-
   # crbug.com/878390 - These stories are already covered by their 2018 versions
   # and will later be removed.
   'system_health.memory_mobile/browse:tech:discourse_infinite_scroll',
@@ -92,10 +89,6 @@
   # crbug.com/769263
   'system_health.memory_desktop/play:media:soundcloud',
 
-  # crbug.com/987858
-  'system_health.memory_desktop/play:media:soundcloud:2018',
-
-
   # crbug.com/
   'system_health.memory_desktop/browse:news:nytimes',
 
diff --git a/tools/perf/contrib/cluster_telemetry/loading_base_ct.py b/tools/perf/contrib/cluster_telemetry/loading_base_ct.py
index 4f738b7f..659af6c7 100644
--- a/tools/perf/contrib/cluster_telemetry/loading_base_ct.py
+++ b/tools/perf/contrib/cluster_telemetry/loading_base_ct.py
@@ -36,6 +36,10 @@
         help='Cache temperature (string). Default to "%%default". Can be: %s' %
          ', '.join(cls._ALL_CACHE_TEMPERATURES))
 
+  @classmethod
+  def ProcessCommandLineArgs(cls, parser, args):
+    ct_benchmarks_util.ValidateCommandLineArgs(parser, args)
+
   def CreateStorySet(self, options):
     def Wait(action_runner):
       action_runner.Wait(options.wait_time)
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index cf9b138..4d7ff006 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -385,11 +385,10 @@
 crbug.com/947267 [ android-nexus-5x ] system_health.memory_mobile/background:media:imgur [ Skip ]
 crbug.com/954949 [ android-nexus-5x android-webview ] system_health.memory_mobile/browse:news:washingtonpost [ Skip ]
 crbug.com/961417 [ android-go ] system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
+crbug.com/1016701 [ android-nexus-5x ] system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
 crbug.com/1002640 [ android-pixel-2 ] system_health.memory_mobile/browse:chrome:newtab [ Skip ]
 crbug.com/1002665 [ android-pixel-2 ] system_health.memory_mobile/browse:chrome:omnibox [ Skip ]
 
-crbug.com/964960 [ android-nexus-5x ] system_health.memory_mobile/* [ Skip ]
-
 # Benchmark: tab_switching.typical_25
 crbug.com/747026 [ mac ] tab_switching.typical_25/multitab:misc:typical24 [ Skip ]
 crbug.com/883731 [ win ] tab_switching.typical_25/multitab:misc:typical24 [ Skip ]
diff --git a/tools/perf/measurements/dual_metric_measurement.py b/tools/perf/measurements/dual_metric_measurement.py
index c0ce1cf6..972cce3 100644
--- a/tools/perf/measurements/dual_metric_measurement.py
+++ b/tools/perf/measurements/dual_metric_measurement.py
@@ -27,31 +27,8 @@
       self._tbm_test.WillRunStory(platform)
 
   def Measure(self, platform, results):
-    # There are four scenarios while we migrate the press benchmarks off of
-    # the legacy value system
-    # 1. Legacy Values that get converted with the call to PopulateHistogramSet
-    #     Note: this only works when there is one page in the sotry
-    # 2. Legacy Values with TMBv2 values.  Same note as #1
-    # 3. Histograms added in the test.  Diagnostics must be added to these so
-    #   all histograms must be added through AddHistogram call.
-    # 4. Histograms added from the test as well as TBMv2 values.
-    #   Diagnostics will get added by the timeline based measurement and the
-    #   call to AddHistograms.
-    if len(results.current_page.GetJavascriptMetricHistograms()) > 0:
-      for histogram in results.current_page.GetJavascriptMetricHistograms():
-        results.AddHistogram(histogram)
-    else:
-      for value in results.current_page.GetMeasurements():
-        results.AddMeasurement(**value)
-      # This call is necessary to convert the current ScalarValues to
-      # histograms before more histograms are added.  If we don't,
-      # when histograms get added by TBM2 page_test_results will see those and
-      # not convert any existing values because it assumes they are already
-      # converted.  Therefore, so the javascript metrics don't get dropped, we
-      # have to convert them first.
-      # NOTE: this does not work if there is more than one page in this story.
-      # It will drop results from all subsequent pages. See crbug.com/902812.
-      results.PopulateHistogramSet()
+    for value in results.current_story.GetMeasurements():
+      results.AddMeasurement(**value)
     if self._enable_tracing:
       self._tbm_test.Measure(platform, results)
 
diff --git a/tools/perf/page_sets/dromaeo_pages.py b/tools/perf/page_sets/dromaeo_pages.py
index a46dd0f..30537e4 100644
--- a/tools/perf/page_sets/dromaeo_pages.py
+++ b/tools/perf/page_sets/dromaeo_pages.py
@@ -5,7 +5,6 @@
 import math
 
 from telemetry import story
-from tracing.value import histogram as histogram_module
 
 from page_sets import press_story
 
@@ -62,9 +61,7 @@
       container[key]['sum'] += math.log(value)
 
     def AddResult(name, value):
-      hg = histogram_module.Histogram(Escape(name), "unitless_biggerIsBetter")
-      hg.AddSample(value)
-      self.AddJavascriptMetricHistogram(hg)
+      self.AddMeasurement(Escape(name), 'unitless_biggerIsBetter', [value])
 
     aggregated = {}
     for data in score:
diff --git a/tools/perf/page_sets/press_story.py b/tools/perf/page_sets/press_story.py
index 1eedc27..bdf5a23a 100644
--- a/tools/perf/page_sets/press_story.py
+++ b/tools/perf/page_sets/press_story.py
@@ -36,7 +36,6 @@
         make_javascript_deterministic=self.DETERMINISTIC_JS,
         name=self.NAME if self.NAME else self.URL)
     self._measurements = []
-    self._histogram_values = []
     self._action_runner = None
 
   def AddMeasurement(self, name, unit, samples, description=None):
@@ -82,14 +81,6 @@
   def GetMeasurements(self):
     return self._measurements
 
-  def GetJavascriptMetricHistograms(self):
-    """DEPRECATED: Use measurements instead."""
-    return self._histogram_values
-
-  def AddJavascriptMetricHistogram(self, value):
-    """DEPRECATED: Use measurements instead."""
-    self._histogram_values.append(value)
-
   def ExecuteTest(self, action_runner):
     pass
 
diff --git a/tools/perf/page_sets/speedometer2_pages.py b/tools/perf/page_sets/speedometer2_pages.py
index ac5d92b..3291ff7 100644
--- a/tools/perf/page_sets/speedometer2_pages.py
+++ b/tools/perf/page_sets/speedometer2_pages.py
@@ -6,8 +6,6 @@
 """
 import re
 
-from tracing.value import histogram as histogram_module
-
 from page_sets import press_story
 
 _SPEEDOMETER_SUITE_NAME_BASE = '{0}-TodoMVC'
@@ -30,6 +28,7 @@
   'Flight'
 ]
 
+
 class Speedometer2Story(press_story.PressStory):
   URL = 'file://InteractiveRunner.html'
   NAME = 'Speedometer2'
@@ -100,36 +99,24 @@
         count=iterationCount)
     action_runner.WaitForJavaScriptCondition('testDone', timeout=600)
 
-
   def ParseTestResults(self, action_runner):
     if not self._should_filter_suites:
-      total_hg = histogram_module.Histogram("Total", "ms_smallerIsBetter")
-      total_samples = action_runner.EvaluateJavaScript(
-          'suiteValues.map(each => each.total)')
-      for s in total_samples:
-        total_hg.AddSample(s)
-      self.AddJavascriptMetricHistogram(total_hg)
-
-      runs_hg = histogram_module.Histogram("RunsPerMinute",
-                                           "unitless_biggerIsBetter")
-      runs_samples = action_runner.EvaluateJavaScript(
+      self.AddJavaScriptMeasurement(
+          'Total', 'ms_smallerIsBetter', 'suiteValues.map(each => each.total)')
+      self.AddJavaScriptMeasurement(
+          'RunsPerMinute', 'unitless_biggerIsBetter',
           'suiteValues.map(each => each.score)')
-      for s in runs_samples:
-        runs_hg.AddSample(s)
-      self.AddJavascriptMetricHistogram(runs_hg)
 
     # Extract the timings for each suite
     for suite_name in self._enabled_suites:
-      suite_hg = histogram_module.Histogram(suite_name, "ms_smallerIsBetter")
-      samples = action_runner.EvaluateJavaScript("""
-              var suite_times = [];
-              for(var i = 0; i < iterationCount; i++) {
-                suite_times.push(
-                    suiteValues[i].tests[{{ key }}].total);
-              };
-              suite_times;
-              """,
-              key=suite_name)
-      for s in samples:
-        suite_hg.AddSample(s)
-      self.AddJavascriptMetricHistogram(suite_hg)
+      self.AddJavaScriptMeasurement(
+          suite_name, 'ms_smallerIsBetter',
+          """
+          var suite_times = [];
+          for(var i = 0; i < iterationCount; i++) {
+            suite_times.push(
+                suiteValues[i].tests[{{ key }}].total);
+          };
+          suite_times;
+          """,
+          key=suite_name)
diff --git a/tools/polymer/generate_gn.py b/tools/polymer/generate_gn.py
index 5e8db46..96413fa 100755
--- a/tools/polymer/generate_gn.py
+++ b/tools/polymer/generate_gn.py
@@ -12,9 +12,6 @@
 
 _COMPILE_JS = '//third_party/closure_compiler/compile_js.gni'
 _POLYMERS = ['polymer.html', 'polymer-mini.html', 'polymer-micro.html']
-_WEB_ANIMATIONS_BASE = 'web-animations.html'
-_WEB_ANIMATIONS_EXTERNS = \
-    '//third_party/closure_compiler/externs/web_animations.js'
 _COMPILED_RESOURCES_TEMPLATE = '''
 # Copyright %d The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
@@ -61,11 +58,6 @@
             if import_base in _POLYMERS:
                 continue
 
-            if import_base == _WEB_ANIMATIONS_BASE:
-                externs += '\n  externs_list = [ "%s" ]' % \
-                    _WEB_ANIMATIONS_EXTERNS
-                continue
-
             # Only exclude these after appending web animations externs.
             if not _has_extracted_js(path.join(html_dir, html_import)):
                 continue
diff --git a/tools/polymer/generate_gn_v3.py b/tools/polymer/generate_gn_v3.py
index 9afde34..74546b3 100755
--- a/tools/polymer/generate_gn_v3.py
+++ b/tools/polymer/generate_gn_v3.py
@@ -11,9 +11,6 @@
 import sys
 
 _COMPILE_JS = '//third_party/closure_compiler/compile_js.gni'
-_WEB_ANIMATIONS_BASE = 'web-animations.html'
-_WEB_ANIMATIONS_EXTERNS = \
-    '//third_party/closure_compiler/externs/web_animations.js'
 _COMPILED_RESOURCES_TEMPLATE = '''
 # Copyright %d The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
@@ -55,10 +52,6 @@
       for i in sorted(imports):
         import_dir, import_base = path.split(i.encode('ascii'))
 
-        if import_base == _WEB_ANIMATIONS_BASE:
-          externs += '\n  externs_list = [ "%s" ]' % _WEB_ANIMATIONS_EXTERNS
-          continue
-
         # Redirect dependencies to minified Polymer to the non-minified version.
         if import_base == 'polymer_bundled.min.js':
           import_base = 'polymer_bundled.js'
diff --git a/tools/v8_context_snapshot/BUILD.gn b/tools/v8_context_snapshot/BUILD.gn
index 2d7b357..f1e8406 100644
--- a/tools/v8_context_snapshot/BUILD.gn
+++ b/tools/v8_context_snapshot/BUILD.gn
@@ -42,9 +42,6 @@
       deps = [
         ":v8_context_snapshot",
       ]
-      sources = [
-        "$root_out_dir/natives_blob.bin",
-      ]
       renaming_sources = [ "$root_out_dir/v8_context_snapshot.bin" ]
       if (current_cpu == "arm" || current_cpu == "x86" ||
           current_cpu == "mipsel") {
diff --git a/tools/v8_context_snapshot/v8_context_snapshot_generator.cc b/tools/v8_context_snapshot/v8_context_snapshot_generator.cc
index e6b5b7a7..6960b272 100644
--- a/tools/v8_context_snapshot/v8_context_snapshot_generator.cc
+++ b/tools/v8_context_snapshot/v8_context_snapshot_generator.cc
@@ -37,7 +37,6 @@
   base::CommandLine::Init(argc, argv);
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
   gin::V8Initializer::LoadV8Snapshot();
-  gin::V8Initializer::LoadV8Natives();
 #endif
 
   // Set up environment to make Blink and V8 workable.
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.cc b/ui/accessibility/platform/ax_platform_node_auralinux.cc
index 0e237b8f..0311329 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.cc
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -3186,6 +3186,12 @@
   atk_object_notify_state_change(atk_object, ATK_STATE_ICONIFIED, minimized);
 }
 
+void AXPlatformNodeAuraLinux::OnScrolledToAnchor() {
+  AtkObject* atk_object = GetOrCreateAtkObject();
+  DCHECK(ATK_IS_TEXT(atk_object));
+  g_signal_emit_by_name(atk_object, "text-caret-moved", 0);
+}
+
 void AXPlatformNodeAuraLinux::OnFocused() {
   AtkObject* atk_object = GetOrCreateAtkObject();
 
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.h b/ui/accessibility/platform/ax_platform_node_auralinux.h
index 71a3c91..f5eef3b 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.h
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.h
@@ -167,6 +167,7 @@
   void OnSubtreeWillBeDeleted();
   void OnParentChanged();
   void OnWindowVisibilityChanged();
+  void OnScrolledToAnchor();
 
   bool SupportsSelectionWithAtkSelection();
   bool SelectionAndFocusAreTheSame();
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc b/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc
index 1f7579f..bb19deb 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc
+++ b/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc
@@ -2338,4 +2338,32 @@
   ASSERT_TRUE(saw_parent_changed);
 }
 
+TEST_F(AXPlatformNodeAuraLinuxTest, TestScrolledToAnchorEvent) {
+  AXNodeData root_data;
+  root_data.id = 1;
+  root_data.role = ax::mojom::Role::kListBox;
+  root_data.child_ids.push_back(2);
+
+  AXNodeData item_1_data;
+  item_1_data.id = 2;
+  item_1_data.role = ax::mojom::Role::kListBoxOption;
+
+  Init(root_data, item_1_data);
+
+  AXNode* item_1 = GetRootNode()->children()[0];
+  AtkObject* atk_object = AtkObjectFromNode(item_1);
+
+  bool saw_caret_moved = false;
+  g_signal_connect(
+      atk_object, "text-caret-moved",
+      G_CALLBACK(+[](AtkObject*, int position, bool* saw_caret_moved) {
+        *saw_caret_moved = true;
+      }),
+      &saw_caret_moved);
+
+  GetPlatformNode(item_1)->OnScrolledToAnchor();
+
+  ASSERT_TRUE(saw_caret_moved);
+}
+
 }  // namespace ui
diff --git a/ui/android/java/src/org/chromium/ui/resources/ResourceExtractor.java b/ui/android/java/src/org/chromium/ui/resources/ResourceExtractor.java
index 8cb4eae..68c3064 100644
--- a/ui/android/java/src/org/chromium/ui/resources/ResourceExtractor.java
+++ b/ui/android/java/src/org/chromium/ui/resources/ResourceExtractor.java
@@ -35,7 +35,6 @@
 public class ResourceExtractor {
     private static final String TAG = "ui";
     private static final String ICU_DATA_FILENAME = "icudtl.dat";
-    private static final String V8_NATIVES_DATA_FILENAME = "natives_blob.bin";
     private static final String V8_SNAPSHOT_DATA_FILENAME = "snapshot_blob.bin";
     private static final String FALLBACK_LOCALE = "en-US";
     private static final String COMPRESSED_LOCALES_DIR = "locales";
@@ -342,7 +341,6 @@
     private void deleteFiles(String[] existingFileNames) {
         // These used to be extracted, but no longer are, so just clean them up.
         FileUtils.recursivelyDeleteFile(new File(getAppDataDir(), ICU_DATA_FILENAME));
-        FileUtils.recursivelyDeleteFile(new File(getAppDataDir(), V8_NATIVES_DATA_FILENAME));
         FileUtils.recursivelyDeleteFile(new File(getAppDataDir(), V8_SNAPSHOT_DATA_FILENAME));
 
         if (existingFileNames != null) {
diff --git a/ui/file_manager/file_manager/foreground/elements/BUILD.gn b/ui/file_manager/file_manager/foreground/elements/BUILD.gn
index dd9dfb303..b5e2379 100644
--- a/ui/file_manager/file_manager/foreground/elements/BUILD.gn
+++ b/ui/file_manager/file_manager/foreground/elements/BUILD.gn
@@ -102,7 +102,6 @@
 # TODO(tapted): Move this to //ui/file_manager/base.
 js_library("files_toast") {
   visibility += [ "//ui/file_manager/gallery/*" ]
-  externs_list = [ "$externs_path/web_animations.js" ]
 }
 
 # TODO(tapted): Move this to //ui/file_manager/base.
diff --git a/ui/file_manager/file_manager/foreground/js/BUILD.gn b/ui/file_manager/file_manager/foreground/js/BUILD.gn
index 62a31914..108c5708d 100644
--- a/ui/file_manager/file_manager/foreground/js/BUILD.gn
+++ b/ui/file_manager/file_manager/foreground/js/BUILD.gn
@@ -83,7 +83,6 @@
   externs_list = [
     "$externs_path/command_line_private.js",
     "$externs_path/metrics_private.js",
-    "$externs_path/web_animations.js",
     "//ui/file_manager/externs/background/crostini.js",
     "//ui/file_manager/externs/background/drive_sync_handler.js",
     "//ui/file_manager/externs/background/file_browser_background.js",
diff --git a/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn b/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn
index 5b12e94..048c544 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn
+++ b/ui/file_manager/file_manager/foreground/js/ui/BUILD.gn
@@ -64,7 +64,6 @@
   sources = []
   externs_list = [
     "$externs_path/metrics_private.js",
-    "$externs_path/web_animations.js",
     "//ui/file_manager/externs/background/crostini.js",
     "//ui/file_manager/externs/background/drive_sync_handler.js",
     "//ui/file_manager/externs/background/file_browser_background.js",
@@ -381,6 +380,15 @@
 js_library("install_linux_package_dialog") {
   deps = [
     ":file_manager_dialog_base",
+    "//ui/file_manager/file_manager/common/js:util",
+  ]
+}
+
+js_unittest("install_linux_package_dialog_unittest") {
+  deps = [
+    ":install_linux_package_dialog",
+    "//ui/file_manager/base/js:test_error_reporting",
+    "//ui/webui/resources/js:webui_resource_test",
   ]
 }
 
@@ -505,6 +513,7 @@
     ":file_table_list_unittest",
     ":file_table_unittest",
     ":file_tap_handler_unittest",
+    ":install_linux_package_dialog_unittest",
     ":multi_menu_unittest",
   ]
 }
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_manager_dialog_base_unittest.js b/ui/file_manager/file_manager/foreground/js/ui/file_manager_dialog_base_unittest.js
index 9ae8cbf..b3e51293 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_manager_dialog_base_unittest.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_manager_dialog_base_unittest.js
@@ -4,7 +4,7 @@
 
 async function testShowDialogAfterHide(done) {
   // Polyfill chrome.app.window.current().
-  /** @suppress {duplicate|checkTypes} */
+  /** @suppress {duplicate,checkTypes,const} */
   chrome.app = {window: {current: () => null}};
 
   const container =
diff --git a/ui/file_manager/file_manager/foreground/js/ui/install_linux_package_dialog.js b/ui/file_manager/file_manager/foreground/js/ui/install_linux_package_dialog.js
index b2c97324..52ae2bf 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/install_linux_package_dialog.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/install_linux_package_dialog.js
@@ -50,6 +50,7 @@
       // We re-use the same object, so reset any visual state that may be
       // changed.
       this.installButton_.hidden = false;
+      this.installButton_.disabled = true;
       this.okButton.hidden = true;
       this.cancelButton.hidden = false;
 
@@ -140,6 +141,9 @@
         this.details_frame_.appendChild(text);
         this.details_frame_.appendChild(this.document_.createElement('br'));
       }
+
+      // Allow install now.
+      this.installButton_.disabled = false;
     }
 
     /**
diff --git a/ui/file_manager/file_manager/foreground/js/ui/install_linux_package_dialog_unittest.js b/ui/file_manager/file_manager/foreground/js/ui/install_linux_package_dialog_unittest.js
new file mode 100644
index 0000000..6f1778c
--- /dev/null
+++ b/ui/file_manager/file_manager/foreground/js/ui/install_linux_package_dialog_unittest.js
@@ -0,0 +1,32 @@
+// 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.
+
+function testInstallButtonHiddenUntilInfoReady() {
+  // Polyfill chrome.app.window.current().
+  /** @suppress {checkTypes,const} */
+  chrome.app = {window: {current: () => null}};
+
+  loadTimeData.data = {};
+
+  let getInfoCallback;
+  /** @suppress {checkTypes,const} */
+  chrome.fileManagerPrivate = {
+    getLinuxPackageInfo: (entry, callback) => {
+      getInfoCallback = callback;
+    }
+  };
+  const container =
+      assertInstanceof(document.createElement('div'), HTMLElement);
+
+  const info = {name: 'n', version: 'v', info: 'i', summary: 's'};
+  const dialog = new cr.filebrowser.InstallLinuxPackageDialog(container);
+
+  // Show dialog and very that install button is disabled.
+  dialog.showInstallLinuxPackageDialog(/** @type {!Entry} */ ({}));
+  assertTrue(container.querySelector('.cr-dialog-ok').disabled);
+
+  // Button becomes enabled once info is ready.
+  getInfoCallback(info);
+  assertFalse(container.querySelector('.cr-dialog-ok').disabled);
+}
diff --git a/ui/webui/resources/cr_elements/cr_dialog/BUILD.gn b/ui/webui/resources/cr_elements/cr_dialog/BUILD.gn
index a99afac..032dd8f 100644
--- a/ui/webui/resources/cr_elements/cr_dialog/BUILD.gn
+++ b/ui/webui/resources/cr_elements/cr_dialog/BUILD.gn
@@ -16,7 +16,6 @@
     "..:cr_container_shadow_behavior",
     "//ui/webui/resources/js:assert",
   ]
-  externs_list = [ "$externs_path/web_animations.js" ]
 }
 
 polymer_modulizer("cr_dialog") {
@@ -46,5 +45,4 @@
     "//ui/webui/resources/js:assert.m",
   ]
   extra_deps = [ ":cr_dialog_module" ]
-  externs_list = [ "$externs_path/web_animations.js" ]
 }
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn b/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn
index 1ca2ad13..b331fc3 100644
--- a/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn
+++ b/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn
@@ -26,7 +26,6 @@
   deps = [
     ":cr_toolbar_search_field",
   ]
-  externs_list = [ "$externs_path/web_animations.js" ]
 }
 
 polymer_modulizer("cr_toolbar") {
diff --git a/ui/webui/resources/cr_elements/cr_view_manager/BUILD.gn b/ui/webui/resources/cr_elements/cr_view_manager/BUILD.gn
index 83079976..0ca0c51 100644
--- a/ui/webui/resources/cr_elements/cr_view_manager/BUILD.gn
+++ b/ui/webui/resources/cr_elements/cr_view_manager/BUILD.gn
@@ -15,7 +15,6 @@
   deps = [
     "//ui/webui/resources/js:assert",
   ]
-  externs_list = [ "$externs_path/web_animations.js" ]
 }
 
 polymer_modulizer("cr_view_manager") {
diff --git a/url/gurl_unittest.cc b/url/gurl_unittest.cc
index 0d7b65b..35fa263 100644
--- a/url/gurl_unittest.cc
+++ b/url/gurl_unittest.cc
@@ -567,11 +567,6 @@
     {"ftp://www.google.com:21/", 21},
     {"ftp://www.google.com:80/", 80},
 
-    // gopher
-    {"gopher://www.google.com/", 70},
-    {"gopher://www.google.com:70/", 70},
-    {"gopher://www.google.com:80/", 80},
-
     // file - no port
     {"file://www.google.com/", PORT_UNSPECIFIED},
     {"file://www.google.com:443/", PORT_UNSPECIFIED},
diff --git a/url/origin_unittest.cc b/url/origin_unittest.cc
index 978a833..1cd9889 100644
--- a/url/origin_unittest.cc
+++ b/url/origin_unittest.cc
@@ -304,7 +304,6 @@
 
       // Registered URLs
       {"ftp://example.com/", "ftp", "example.com", 21},
-      {"gopher://example.com/", "gopher", "example.com", 70},
       {"ws://example.com/", "ws", "example.com", 80},
       {"wss://example.com/", "wss", "example.com", 443},
       {"wss://user:pass@example.com/", "wss", "example.com", 443},
@@ -354,9 +353,6 @@
        123},
       {"blob:https://example.com/guid-goes-here", "https", "example.com", 443},
       {"blob:http://u:p@example.com/guid-goes-here", "http", "example.com", 80},
-
-      // Gopher:
-      {"gopher://8u.9.Vx6", "gopher", "8u.9.vx6", 70},
   };
 
   for (const auto& test_case : cases) {
diff --git a/url/url_canon_stdurl.cc b/url/url_canon_stdurl.cc
index c619322..8c9077a 100644
--- a/url/url_canon_stdurl.cc
+++ b/url/url_canon_stdurl.cc
@@ -128,10 +128,6 @@
       else if (!strncmp(scheme, kWssScheme, scheme_len))
         default_port = 443;
       break;
-    case 6:
-      if (!strncmp(scheme, kGopherScheme, scheme_len))
-        default_port = 70;
-      break;
     case 2:
       if (!strncmp(scheme, kWsScheme, scheme_len))
         default_port = 80;
diff --git a/url/url_canon_unittest.cc b/url/url_canon_unittest.cc
index f1f6258..fc98ca3 100644
--- a/url/url_canon_unittest.cc
+++ b/url/url_canon_unittest.cc
@@ -1393,7 +1393,7 @@
       {"https://foo:80/", "https://foo:80/", true},
       {"ftp://foo:21/", "ftp://foo/", true},
       {"ftp://foo:80/", "ftp://foo:80/", true},
-      {"gopher://foo:70/", "gopher://foo/", true},
+      {"gopher://foo:70/", "gopher://foo:70/", true},
       {"gopher://foo:443/", "gopher://foo:443/", true},
       {"ws://foo:80/", "ws://foo/", true},
       {"ws://foo:81/", "ws://foo:81/", true},
@@ -2325,14 +2325,12 @@
       {"ftp", 21},
       {"ws", 80},
       {"wss", 443},
-      {"gopher", 70},
       {"fake-scheme", PORT_UNSPECIFIED},
       {"HTTP", PORT_UNSPECIFIED},
       {"HTTPS", PORT_UNSPECIFIED},
       {"FTP", PORT_UNSPECIFIED},
       {"WS", PORT_UNSPECIFIED},
       {"WSS", PORT_UNSPECIFIED},
-      {"GOPHER", PORT_UNSPECIFIED},
   };
 
   for (auto& test_case : cases) {
diff --git a/url/url_constants.cc b/url/url_constants.cc
index 3540240..c70b239 100644
--- a/url/url_constants.cc
+++ b/url/url_constants.cc
@@ -20,7 +20,6 @@
 const char kFileScheme[] = "file";
 const char kFileSystemScheme[] = "filesystem";
 const char kFtpScheme[] = "ftp";
-const char kGopherScheme[] = "gopher";
 const char kHttpScheme[] = "http";
 const char kHttpsScheme[] = "https";
 const char kJavaScriptScheme[] = "javascript";
diff --git a/url/url_constants.h b/url/url_constants.h
index d538e4dc..cd82d08 100644
--- a/url/url_constants.h
+++ b/url/url_constants.h
@@ -26,7 +26,6 @@
 COMPONENT_EXPORT(URL) extern const char kFileScheme[];
 COMPONENT_EXPORT(URL) extern const char kFileSystemScheme[];
 COMPONENT_EXPORT(URL) extern const char kFtpScheme[];
-COMPONENT_EXPORT(URL) extern const char kGopherScheme[];
 COMPONENT_EXPORT(URL) extern const char kHttpScheme[];
 COMPONENT_EXPORT(URL) extern const char kHttpsScheme[];
 COMPONENT_EXPORT(URL) extern const char kJavaScriptScheme[];
diff --git a/url/url_util.cc b/url/url_util.cc
index 927ed722..e373c64 100644
--- a/url/url_util.cc
+++ b/url/url_util.cc
@@ -34,7 +34,6 @@
       // canonicalization.
       {kFileScheme, SCHEME_WITH_HOST},
       {kFtpScheme, SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION},
-      {kGopherScheme, SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION},
       {kWssScheme,
        SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION},  // WebSocket secure.
       {kWsScheme, SCHEME_WITH_HOST_PORT_AND_USER_INFORMATION},  // WebSocket.
diff --git a/weblayer/README.md b/weblayer/README.md
index d8b2b36..8d3ce9b 100644
--- a/weblayer/README.md
+++ b/weblayer/README.md
@@ -29,7 +29,18 @@
 
 `renderer` internal code which runs in the renderer process
 
-## Testing
+## Setting Up Your Build Environment
+
+If you haven't done this already, you first need to set up an Android build. If
+you are a Google employee, reach out to weblayer-team@google.com for internal
+instructions. Otherwise follow the [Android build instructions](/docs/android_build_instructions.md).
+
+## Building and Testing
+
+To run the sample app:
+
+$ autoninja -C out/Default run_weblayer_shell
+$ out/Default/bin/run_weblayer_shell
 
 To run instrumentation tests:
 
diff --git a/weblayer/test/test_launcher_delegate_impl.cc b/weblayer/test/test_launcher_delegate_impl.cc
index a1a5218..6f267fd4 100644
--- a/weblayer/test/test_launcher_delegate_impl.cc
+++ b/weblayer/test/test_launcher_delegate_impl.cc
@@ -17,6 +17,7 @@
   // Browser tests are expected not to tear-down various globals and may
   // complete with the thread priority being above NORMAL.
   test_suite.DisableCheckForLeakedGlobals();
+  test_suite.DisableCheckForThreadPriorityAtTestEnd();
   return test_suite.Run();
 }