diff --git a/DEPS b/DEPS
index 0065999..d01928e6 100644
--- a/DEPS
+++ b/DEPS
@@ -181,11 +181,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': '511124e5a896914d4b3085f9dc52890e2932bd43',
+  'skia_revision': '403c807971892049532870707729f0bc3e79e93a',
   # 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': '0fba36f90087ef91a063f9511557e05fb02343d2',
+  'v8_revision': '07c5cd8f1d0654eb3e87b48f3f241919ada0d7ca',
   # 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.
@@ -193,7 +193,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': '90bf5bece617b038e926fb16dfc30585fc9fad2b',
+  'angle_revision': 'b84cdffeec6cb4aac16120bbd83917b9cd7b4c89',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -244,7 +244,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': '28c4ea91f668f7b2aa04658e9cbebb834dcf3b01',
+  'catapult_revision': '9506caf2ea1f11687121fab0d7ad8a6e2a8abc75',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -252,7 +252,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': '58a8e025554becc5f1e027307bccb7e8678e32e0',
+  'devtools_frontend_revision': '53a21700cf151578c6ff553b2df681b1c8f06ef7',
   # 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.
@@ -312,7 +312,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.
-  'dawn_revision': '96f79f6db56b87150be2a12755fed10f91f574dc',
+  'dawn_revision': '9b2712456fe635ae460bd3bc4fbf29b78772e2e0',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -879,7 +879,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '9230b0169cb173c7432c905f8b95e692e07dbb14',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'de57a32a0bc0305098ab8ca6c28f2b3c51f4e041',
       'condition': 'checkout_linux',
   },
 
@@ -963,7 +963,7 @@
   },
 
   'src/third_party/glslang/src':
-    Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + 'e5dbc3114cb98b1592d9faa697efe5eb290c12a4',
+    Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + '51813670627c976a93f4cfbea6fa89fdb4d35cad',
 
   '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'),
@@ -1297,7 +1297,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '752dcc2bcda2f8f5f5110a48369a1cc7ab70fd3b',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'cce82035ba5bf724db4a143b6a46624239a66ff5',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1498,7 +1498,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '88d715c9115a5ce65c0bf660209dfeee9131ccd0',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '0b3a6e383e17c80e5f3adce826cce7bc202a01cf',
+    Var('webrtc_git') + '/src.git' + '@' + 'bd5874accf0faef28439ad32c1414bda8c9c25dc',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1568,7 +1568,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@65f043777aedc0a95254978c869bb3ce5c4602e6',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@3624da9ce38bf1716d3a7e89087bda9d1c82f498',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/tools/PRESUBMIT.py b/android_webview/tools/PRESUBMIT.py
index edc0f95..6a31f718 100644
--- a/android_webview/tools/PRESUBMIT.py
+++ b/android_webview/tools/PRESUBMIT.py
@@ -17,8 +17,16 @@
   """Presubmit checks run on both upload and commit.
   """
   checks = []
+
+  src_root = input_api.os_path.join(input_api.PresubmitLocalPath(), '..', '..')
   checks.extend(input_api.canned_checks.GetPylint(
-      input_api, output_api, pylintrc='pylintrc'))
+      input_api, output_api, pylintrc='pylintrc',
+      # Allows pylint to find //build/android and //third_party/catapult/devil,
+      # which some of the scripts in this directory import.
+      extra_paths_list=[
+          input_api.os_path.join(src_root, 'build', 'android'),
+          input_api.os_path.join(src_root, 'third_party', 'catapult', 'devil'),
+      ]))
   checks.extend(_GetPythonUnitTests(input_api, output_api))
   return input_api.RunTests(checks, False)
 
diff --git a/android_webview/tools/run_cts.py b/android_webview/tools/run_cts.py
index 1fc8def3..41731e5 100755
--- a/android_webview/tools/run_cts.py
+++ b/android_webview/tools/run_cts.py
@@ -7,6 +7,7 @@
 """Runs the CTS test APKs stored in CIPD."""
 
 import argparse
+import contextlib
 import json
 import logging
 import os
@@ -18,13 +19,15 @@
 
 sys.path.append(os.path.join(
     os.path.dirname(__file__), os.pardir, os.pardir, 'build', 'android'))
-import devil_chromium  # pylint: disable=import-error, unused-import
-from devil.android.ndk import abis  # pylint: disable=import-error
-from devil.android.sdk import version_codes  # pylint: disable=import-error
-from devil.android.tools import script_common  # pylint: disable=import-error
-from devil.utils import cmd_helper  # pylint: disable=import-error
-from devil.utils import logging_common  # pylint: disable=import-error
-from pylib.utils import test_filter # pylint: disable=import-error
+import devil_chromium  # pylint: disable=unused-import
+from devil.android import device_utils
+from devil.android.ndk import abis
+from devil.android.sdk import version_codes
+from devil.android.tools import script_common
+from devil.utils import cmd_helper
+from devil.utils import logging_common
+from pylib.local.emulator import avd
+from pylib.utils import test_filter
 
 # cts test archives for all platforms are stored in this bucket
 # contents need to be updated if there is an important fix to any of
@@ -316,6 +319,30 @@
   return forwarded_args
 
 
+@contextlib.contextmanager
+def GetDevice(args):
+  try:
+    emulator_instance = None
+    if args.avd_config:
+      avd_config = avd.AvdConfig(args.avd_config)
+      avd_config.Install()
+      emulator_instance = avd_config.CreateInstance()
+      # Start the emulator w/ -writable-system s.t. we can remount the system
+      # partition r/w and install our own webview provider.
+      emulator_instance.Start(writable_system=True)
+      device_utils.DeviceUtils(emulator_instance.serial).WaitUntilFullyBooted()
+
+    devices = script_common.GetDevices(args.devices, args.blacklist_file)
+    device = devices[0]
+    if len(devices) > 1:
+      logging.warning('Detection of arch and cts-release will use 1st of %d '
+                      'devices: %s', len(devices), device.serial)
+    yield device
+  finally:
+    if emulator_instance:
+      emulator_instance.Stop()
+
+
 def main():
   parser = argparse.ArgumentParser()
   parser.add_argument(
@@ -360,6 +387,13 @@
       dest='module_apk',
       help='CTS module apk name in ' + _WEBVIEW_CTS_GCS_PATH_FILE +
       ' file, without the path prefix.')
+  parser.add_argument(
+      '--avd-config',
+      type=os.path.realpath,
+      help='Path to the avd config textpb. '
+           '(See //tools/android/avd/proto for message definition'
+           ' and existing textpb files.)')
+
 
   test_filter.AddFilterOptions(parser)
   script_common.AddDeviceArguments(parser)
@@ -371,35 +405,31 @@
 
   test_runner_args.extend(ForwardArgsToTestRunner(args))
 
-  devices = script_common.GetDevices(args.devices, args.blacklist_file)
-  device = devices[0]
-  if len(devices) > 1:
-    logging.warning('Detection of arch and cts-release will use 1st of %d '
-                    'devices: %s', len(devices), device.serial)
-  arch = args.arch or DetermineArch(device)
-  cts_release = args.cts_release or DetermineCtsRelease(device)
+  with GetDevice(args) as device:
+    arch = args.arch or DetermineArch(device)
+    cts_release = args.cts_release or DetermineCtsRelease(device)
 
-  if (args.test_filter_file or args.test_filter
-      or args.isolated_script_test_filter):
-    # TODO(aluo): auto-determine the module based on the test filter and the
-    # available tests in each module
-    if not args.module_apk:
-      args.module_apk = 'CtsWebkitTestCases.apk'
+    if (args.test_filter_file or args.test_filter
+        or args.isolated_script_test_filter):
+      # TODO(aluo): auto-determine the module based on the test filter and the
+      # available tests in each module
+      if not args.module_apk:
+        args.module_apk = 'CtsWebkitTestCases.apk'
 
-  platform_modules = GetCTSModuleNames(arch, cts_release)
-  if args.module_apk and args.module_apk not in platform_modules:
-    raise Exception('--module-apk for arch==' + arch + 'and cts_release=='
-                    + cts_release + ' must be one of: '
-                    + ', '.join(platform_modules))
+    platform_modules = GetCTSModuleNames(arch, cts_release)
+    if args.module_apk and args.module_apk not in platform_modules:
+      raise Exception('--module-apk for arch==' + arch + 'and cts_release=='
+                      + cts_release + ' must be one of: '
+                      + ', '.join(platform_modules))
 
-  # Need to uninstall all previous cts webkit packages so that the
-  # MockContentProvider names won't conflict with a previously installed
-  # one under a different package name.  This is due to CtsWebkitTestCases's
-  # package name change from M to N versions of the tests while keeping the
-  # MockContentProvider's authority string the same.
-  UninstallAnyCtsWebkitPackages(device)
+    # Need to uninstall all previous cts webkit packages so that the
+    # MockContentProvider names won't conflict with a previously installed
+    # one under a different package name.  This is due to CtsWebkitTestCases's
+    # package name change from M to N versions of the tests while keeping the
+    # MockContentProvider's authority string the same.
+    UninstallAnyCtsWebkitPackages(device)
 
-  return RunAllCTSTests(args, arch, cts_release, test_runner_args)
+    return RunAllCTSTests(args, arch, cts_release, test_runner_args)
 
 
 if __name__ == '__main__':
diff --git a/ash/system/unified/unified_system_tray_view.cc b/ash/system/unified/unified_system_tray_view.cc
index 7e457e3..747e291 100644
--- a/ash/system/unified/unified_system_tray_view.cc
+++ b/ash/system/unified/unified_system_tray_view.cc
@@ -8,6 +8,8 @@
 
 #include "ash/public/cpp/ash_features.h"
 #include "ash/session/session_controller_impl.h"
+#include "ash/shelf/shelf.h"
+#include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
 #include "ash/style/ash_color_provider.h"
 #include "ash/style/default_color_constants.h"
@@ -229,9 +231,15 @@
 // static
 SkColor UnifiedSystemTrayView::GetBackgroundColor() {
   if (features::IsBackgroundBlurEnabled()) {
-    return AshColorProvider::Get()->DeprecatedGetBaseLayerColor(
-        AshColorProvider::BaseLayerType::kTransparent74,
-        kUnifiedMenuBackgroundColorWithBlur);
+    AshColorProvider::BaseLayerType layer_type =
+        Shelf::ForWindow(Shell::GetPrimaryRootWindow())
+                    ->shelf_widget()
+                    ->GetBackgroundType() == ShelfBackgroundType::kHomeLauncher
+            ? AshColorProvider::BaseLayerType::kTransparent60
+            : AshColorProvider::BaseLayerType::kTransparent74;
+
+    return AshColorProvider::Get()->GetBaseLayerColor(
+        layer_type, AshColorProvider::AshColorMode::kDark);
   }
   return AshColorProvider::Get()->DeprecatedGetBaseLayerColor(
       AshColorProvider::BaseLayerType::kTransparent90,
diff --git a/base/message_loop/message_pump_libevent_unittest.cc b/base/message_loop/message_pump_libevent_unittest.cc
index 067d335..f5dbd4006 100644
--- a/base/message_loop/message_pump_libevent_unittest.cc
+++ b/base/message_loop/message_pump_libevent_unittest.cc
@@ -47,6 +47,11 @@
   }
 
   void TearDown() override {
+    // Some tests watch |pipefds_| from the |io_thread_|. The |io_thread_| must
+    // thus be joined to ensure those watches are complete before closing the
+    // pipe.
+    io_thread_.Stop();
+
     if (IGNORE_EINTR(close(pipefds_[0])) < 0)
       PLOG(ERROR) << "close";
     if (IGNORE_EINTR(close(pipefds_[1])) < 0)
diff --git a/base/trace_event/trace_event_etw_export_win.cc b/base/trace_event/trace_event_etw_export_win.cc
index de924ce..bf7d6f10 100644
--- a/base/trace_event/trace_event_etw_export_win.cc
+++ b/base/trace_event/trace_event_etw_export_win.cc
@@ -92,6 +92,7 @@
     "latency",                               // 0x8000
     "blink.user_timing",                     // 0x10000
     "media",                                 // 0x20000
+    "loading",                               // 0x40000
 };
 const char kOtherEventsGroupName[] = "__OTHER_EVENTS";  // 0x2000000000000000
 const char kDisabledOtherEventsGroupName[] =
diff --git a/build/android/gyp/apkbuilder.py b/build/android/gyp/apkbuilder.py
index ba796cd..c460db7 100755
--- a/build/android/gyp/apkbuilder.py
+++ b/build/android/gyp/apkbuilder.py
@@ -351,12 +351,20 @@
       # 3. Dex files
       logging.debug('Adding classes.dex')
       if options.dex_file:
-        with zipfile.ZipFile(options.dex_file, 'r') as dex_zip:
-          for dex in (d for d in dex_zip.namelist() if d.endswith('.dex')):
+        with open(options.dex_file) as dex_file_obj:
+          if options.dex_file.endswith('.dex'):
+            # This is the case for incremental_install=true.
             add_to_zip(
-                apk_dex_dir + dex,
-                dex_zip.read(dex),
+                apk_dex_dir + 'classes.dex',
+                dex_file_obj.read(),
                 compress=not options.uncompress_dex)
+          else:
+            with zipfile.ZipFile(dex_file_obj) as dex_zip:
+              for dex in (d for d in dex_zip.namelist() if d.endswith('.dex')):
+                add_to_zip(
+                    apk_dex_dir + dex,
+                    dex_zip.read(dex),
+                    compress=not options.uncompress_dex)
 
       # 4. Native libraries.
       logging.debug('Adding lib/')
diff --git a/build/android/pylib/gtest/gtest_test_instance.py b/build/android/pylib/gtest/gtest_test_instance.py
index 634ab7220..904f909 100644
--- a/build/android/pylib/gtest/gtest_test_instance.py
+++ b/build/android/pylib/gtest/gtest_test_instance.py
@@ -79,8 +79,14 @@
 # TODO(jbudorick): Remove these once we're no longer parsing stdout to generate
 # results.
 _RE_TEST_STATUS = re.compile(
-    r'\[ +((?:RUN)|(?:FAILED)|(?:OK)|(?:CRASHED)) +\]'
-    r' ?([^ ]+)?(?: \((\d+) ms\))?$')
+    # Test state.
+    r'\[ +((?:RUN)|(?:FAILED)|(?:OK)|(?:CRASHED)) +\] ?'
+    # Test name.
+    r'([^ ]+)?'
+    # Optional test parameter.
+    r'(?:, where GetParam\(\) = [^()]*)?'
+    # Optional test execution time.
+    r'(?: \((\d+) ms\))?$')
 # Crash detection constants.
 _RE_TEST_ERROR = re.compile(r'FAILURES!!! Tests run: \d+,'
                                     r' Failures: \d+, Errors: 1')
diff --git a/build/android/pylib/gtest/gtest_test_instance_test.py b/build/android/pylib/gtest/gtest_test_instance_test.py
index b39da527..b39ac153a 100755
--- a/build/android/pylib/gtest/gtest_test_instance_test.py
+++ b/build/android/pylib/gtest/gtest_test_instance_test.py
@@ -177,6 +177,18 @@
     self.assertEquals(1, actual[0].GetDuration())
     self.assertEquals(base_test_result.ResultType.PASS, actual[0].GetType())
 
+  def testParseGTestOutput_parameterized(self):
+    raw_output = [
+        '[ RUN      ] Baz/FooTest.Bar/0',
+        '[   FAILED ] Baz/FooTest.Bar/0,' +
+        ' where GetParam() = 4-byte object <00-00 00-00> (1 ms)',
+    ]
+    actual = gtest_test_instance.ParseGTestOutput(raw_output, None, None)
+    self.assertEquals(1, len(actual))
+    self.assertEquals('Baz/FooTest.Bar/0', actual[0].GetName())
+    self.assertEquals(1, actual[0].GetDuration())
+    self.assertEquals(base_test_result.ResultType.FAIL, actual[0].GetType())
+
   def testParseGTestXML_none(self):
     actual = gtest_test_instance.ParseGTestXML(None)
     self.assertEquals([], actual)
diff --git a/build/android/pylib/local/emulator/avd.py b/build/android/pylib/local/emulator/avd.py
index 3a7d580..a701d2d 100644
--- a/build/android/pylib/local/emulator/avd.py
+++ b/build/android/pylib/local/emulator/avd.py
@@ -440,7 +440,11 @@
   def __str__(self):
     return '%s|%s' % (self._avd_name, (self._emulator_serial or id(self)))
 
-  def Start(self, read_only=True, snapshot_save=False, window=False):
+  def Start(self,
+            read_only=True,
+            snapshot_save=False,
+            window=False,
+            writable_system=False):
     """Starts the emulator running an instance of the given AVD."""
 
     with tempfile_ext.TemporaryFileName() as socket_path, (contextlib.closing(
@@ -469,6 +473,9 @@
         emulator_cmd.append('-read-only')
       if not snapshot_save:
         emulator_cmd.append('-no-snapshot-save')
+      if writable_system:
+        emulator_cmd.append('-writable-system')
+
       emulator_env = {}
       if self._emulator_home:
         emulator_env['ANDROID_EMULATOR_HOME'] = self._emulator_home
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 31fa3f5..04a8891 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8891849889272099440
\ No newline at end of file
+8891823804487142272
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index fd9468f0..db53a042 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-8891914193383482512
\ No newline at end of file
+8891823802666694096
\ No newline at end of file
diff --git a/cc/paint/paint_op_buffer.cc b/cc/paint/paint_op_buffer.cc
index 20afc9b..97a18290 100644
--- a/cc/paint/paint_op_buffer.cc
+++ b/cc/paint/paint_op_buffer.cc
@@ -16,6 +16,7 @@
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkRegion.h"
 #include "third_party/skia/include/core/SkSerialProcs.h"
+#include "third_party/skia/include/docs/SkPDFDocument.h"
 #include "third_party/skia/include/gpu/GrContext.h"
 
 namespace cc {
@@ -1395,9 +1396,11 @@
                                      const PaintFlags* flags,
                                      SkCanvas* canvas,
                                      const PlaybackParams& params) {
+  SkPDF::SetNodeId(canvas, op->node_id);
   flags->DrawToSk(canvas, [op](SkCanvas* c, const SkPaint& p) {
     c->drawTextBlob(op->blob.get(), op->x, op->y, p);
   });
+  SkPDF::SetNodeId(canvas, 0);
 }
 
 void RestoreOp::Raster(const RestoreOp* op,
diff --git a/cc/paint/skia_paint_canvas.cc b/cc/paint/skia_paint_canvas.cc
index f143d9e..e71b9a7 100644
--- a/cc/paint/skia_paint_canvas.cc
+++ b/cc/paint/skia_paint_canvas.cc
@@ -9,6 +9,7 @@
 #include "cc/paint/paint_recorder.h"
 #include "cc/paint/scoped_raster_flags.h"
 #include "third_party/skia/include/core/SkAnnotation.h"
+#include "third_party/skia/include/docs/SkPDFDocument.h"
 
 namespace cc {
 SkiaPaintCanvas::ContextFlushes::ContextFlushes()
@@ -317,7 +318,9 @@
                                    SkScalar y,
                                    NodeId node_id,
                                    const PaintFlags& flags) {
+  SkPDF::SetNodeId(canvas_, node_id);
   drawTextBlob(blob, x, y, flags);
+  SkPDF::SetNodeId(canvas_, 0);
 }
 
 void SkiaPaintCanvas::drawPicture(sk_sp<const PaintRecord> record) {
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 5185a5e..63c1740 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -2944,7 +2944,10 @@
     "//base/test:test_support_java",
     "//chrome/android:chrome_java",
     "//chrome/test/android:chrome_java_test_support",
+    "//content/public/test/android:android_test_message_pump_support_java",
+    "//content/public/test/android:content_java_test_support",
     "//third_party/blink/public:blink_headers_java",
+    "//third_party/blink/public/mojom:android_mojo_bindings_java",
     "//third_party/jsr-305:jsr_305_javalib",
     "//third_party/junit",
     "//third_party/mockito:mockito_java",
@@ -2953,6 +2956,7 @@
   ]
   sources = [
     "native_java_unittests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java",
+    "native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java",
   ]
 
   annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
@@ -2964,5 +2968,6 @@
   testonly = true
   sources = [
     "native_java_unittests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java",
+    "native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java",
   ]
 }
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 0d96c02..6971faf 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -876,6 +876,7 @@
   "java/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderFactory.java",
   "java/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderImpl.java",
   "java/src/org/chromium/chrome/browser/installedapp/PackageHash.java",
+  "java/src/org/chromium/chrome/browser/installedapp/PackageManagerDelegate.java",
   "java/src/org/chromium/chrome/browser/instantapps/AuthenticatedProxyActivity.java",
   "java/src/org/chromium/chrome/browser/instantapps/InstantAppsBannerData.java",
   "java/src/org/chromium/chrome/browser/instantapps/InstantAppsHandler.java",
@@ -1543,7 +1544,6 @@
   "java/src/org/chromium/chrome/browser/signin/UnifiedConsentServiceBridge.java",
   "java/src/org/chromium/chrome/browser/sms/SmsReceiverInfoBar.java",
   "java/src/org/chromium/chrome/browser/sms/SmsReceiverUma.java",
-  "java/src/org/chromium/chrome/browser/snackbar/BottomContainer.java",
   "java/src/org/chromium/chrome/browser/snackbar/smartlockautosignin/AutoSigninSnackbarController.java",
   "java/src/org/chromium/chrome/browser/snackbar/undo/UndoBarController.java",
   "java/src/org/chromium/chrome/browser/ssl/CaptivePortalHelper.java",
@@ -1756,6 +1756,7 @@
   "java/src/org/chromium/chrome/browser/tracing/TracingNotificationService.java",
   "java/src/org/chromium/chrome/browser/translate/TranslateBridge.java",
   "java/src/org/chromium/chrome/browser/translate/TranslateUtils.java",
+  "java/src/org/chromium/chrome/browser/ui/BottomContainer.java",
   "java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java",
   "java/src/org/chromium/chrome/browser/ui/ImmersiveModeManager.java",
   "java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java",
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni
index 9d8e39ae..09e03c2a 100644
--- a/chrome/android/chrome_junit_test_java_sources.gni
+++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -93,7 +93,6 @@
   "junit/src/org/chromium/chrome/browser/incognito/IncognitoTabSnapshotControllerTest.java",
   "junit/src/org/chromium/chrome/browser/infobar/IPHInfoBarSupportTest.java",
   "junit/src/org/chromium/chrome/browser/init/AsyncInitTaskRunnerTest.java",
-  "junit/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java",
   "junit/src/org/chromium/chrome/browser/installedapp/PackageHashTest.java",
   "junit/src/org/chromium/chrome/browser/invalidation/ResumableDelayedTaskRunnerTest.java",
   "junit/src/org/chromium/chrome/browser/invalidation/SessionsInvalidationManagerTest.java",
diff --git a/chrome/android/java/res/layout/main.xml b/chrome/android/java/res/layout/main.xml
index f1600c9c..e63974f 100644
--- a/chrome/android/java/res/layout/main.xml
+++ b/chrome/android/java/res/layout/main.xml
@@ -21,7 +21,7 @@
             android:layout_height="match_parent"
             android:visibility="gone" />
 
-        <org.chromium.chrome.browser.snackbar.BottomContainer
+        <org.chromium.chrome.browser.ui.BottomContainer
             android:id="@+id/bottom_container"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index d76c07ec..4583c6e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -123,7 +123,6 @@
 import org.chromium.chrome.browser.settings.SettingsLauncher;
 import org.chromium.chrome.browser.share.ShareDelegate;
 import org.chromium.chrome.browser.share.ShareDelegateImpl;
-import org.chromium.chrome.browser.snackbar.BottomContainer;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
 import org.chromium.chrome.browser.sync.SyncController;
 import org.chromium.chrome.browser.tab.Tab;
@@ -142,6 +141,7 @@
 import org.chromium.chrome.browser.toolbar.ControlContainer;
 import org.chromium.chrome.browser.toolbar.ToolbarManager;
 import org.chromium.chrome.browser.translate.TranslateBridge;
+import org.chromium.chrome.browser.ui.BottomContainer;
 import org.chromium.chrome.browser.ui.RootUiCoordinator;
 import org.chromium.chrome.browser.ui.appmenu.AppMenuBlocker;
 import org.chromium.chrome.browser.ui.appmenu.AppMenuDelegate;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java
index 9d445fb6..4595feb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java
@@ -35,6 +35,7 @@
 import org.chromium.chrome.browser.browserservices.OriginVerifier.OriginVerificationListener;
 import org.chromium.chrome.browser.browserservices.PostMessageHandler;
 import org.chromium.chrome.browser.installedapp.InstalledAppProviderImpl;
+import org.chromium.chrome.browser.installedapp.PackageManagerDelegate;
 import org.chromium.chrome.browser.util.UrlUtilities;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
 import org.chromium.content_public.browser.WebContents;
@@ -483,8 +484,8 @@
                 () -> { params.originVerifier.start(listener, origin); });
         if (relation == CustomTabsService.RELATION_HANDLE_ALL_URLS
                 && InstalledAppProviderImpl.isAppInstalledAndAssociatedWithOrigin(
-                           params.getPackageName(), URI.create(origin.toString()),
-                           ContextUtils.getApplicationContext().getPackageManager())) {
+                        params.getPackageName(), URI.create(origin.toString()),
+                        new PackageManagerDelegate())) {
             params.mLinkedOrigins.add(origin);
         }
         return true;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java
index af10ad4e2..0da9b6a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java
@@ -365,7 +365,7 @@
             }
         }
 
-        if (tab == null && mBrowserVisibilityDelegate.get() == BrowserControlsState.SHOWN) {
+        if (tab == null && mBrowserVisibilityDelegate.get() != BrowserControlsState.HIDDEN) {
             setPositionsForTabToNonFullscreen();
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderFactory.java
index b2861f6..777b617d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderFactory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderFactory.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.installedapp;
 
-import org.chromium.base.ContextUtils;
 import org.chromium.chrome.browser.instantapps.InstantAppsHandler;
 import org.chromium.content_public.browser.RenderFrameHost;
 import org.chromium.installedapp.mojom.InstalledAppProvider;
@@ -49,7 +48,7 @@
 
     @Override
     public InstalledAppProvider createImpl() {
-        return new InstalledAppProviderImpl(mFrameUrlDelegate, ContextUtils.getApplicationContext(),
-                InstantAppsHandler.getInstance());
+        return new InstalledAppProviderImpl(
+                mFrameUrlDelegate, new PackageManagerDelegate(), InstantAppsHandler.getInstance());
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderImpl.java
index 8dd9b6f4..fefa637 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderImpl.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.installedapp;
 
-import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
@@ -58,7 +57,7 @@
     private static final String TAG = "InstalledAppProvider";
 
     private final FrameUrlDelegate mFrameUrlDelegate;
-    private final Context mContext;
+    private final PackageManagerDelegate mPackageManagerDelegate;
     private final InstantAppsHandler mInstantAppsHandler;
 
     /**
@@ -78,11 +77,11 @@
         public boolean isIncognito();
     }
 
-    public InstalledAppProviderImpl(FrameUrlDelegate frameUrlDelegate, Context context,
-            InstantAppsHandler instantAppsHandler) {
+    public InstalledAppProviderImpl(FrameUrlDelegate frameUrlDelegate,
+            PackageManagerDelegate packageManagerDelegate, InstantAppsHandler instantAppsHandler) {
         assert instantAppsHandler != null;
         mFrameUrlDelegate = frameUrlDelegate;
-        mContext = context;
+        mPackageManagerDelegate = packageManagerDelegate;
         mInstantAppsHandler = instantAppsHandler;
     }
 
@@ -136,7 +135,6 @@
 
         ArrayList<RelatedApplication> installedApps = new ArrayList<RelatedApplication>();
         int delayMillis = 0;
-        PackageManager pm = mContext.getPackageManager();
         for (int i = 0; i < Math.min(relatedApps.length, MAX_ALLOWED_RELATED_APPS); i++) {
             RelatedApplication app = relatedApps[i];
             // If the package is of type "play", it is installed, and the origin is associated with
@@ -156,7 +154,8 @@
                 }
 
                 delayMillis += calculateDelayForPackageMs(app.id);
-                if (isAppInstalledAndAssociatedWithOrigin(app.id, frameUrl, pm)) {
+                if (isAppInstalledAndAssociatedWithOrigin(
+                            app.id, frameUrl, mPackageManagerDelegate)) {
                     installedApps.add(app);
                 }
             }
@@ -185,7 +184,7 @@
     private void setVersionInfo(RelatedApplication installedApp) {
         assert installedApp.id != null;
         try {
-            PackageInfo info = mContext.getPackageManager().getPackageInfo(installedApp.id, 0);
+            PackageInfo info = mPackageManagerDelegate.getPackageInfo(installedApp.id, 0);
             installedApp.version = info.versionName;
         } catch (NameNotFoundException e) {
         }
@@ -224,7 +223,7 @@
      *                origin of this URL. Can be null.
      */
     public static boolean isAppInstalledAndAssociatedWithOrigin(
-            String packageName, URI frameUrl, PackageManager pm) {
+            String packageName, URI frameUrl, PackageManagerDelegate pm) {
         // TODO(yusufo): Move this to a better/shared location before crbug.com/749876 is closed.
 
         ThreadUtils.assertOnBackgroundThread();
@@ -273,7 +272,7 @@
      * @return The list of asset statements, parsed from JSON.
      * @throws NameNotFoundException if the application is not installed.
      */
-    private static JSONArray getAssetStatements(String packageName, PackageManager pm)
+    private static JSONArray getAssetStatements(String packageName, PackageManagerDelegate pm)
             throws NameNotFoundException {
         // Get the <meta-data> from this app's manifest.
         // Throws NameNotFoundException if the application is not installed.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/installedapp/PackageManagerDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/installedapp/PackageManagerDelegate.java
new file mode 100644
index 0000000..84c6d471
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/installedapp/PackageManagerDelegate.java
@@ -0,0 +1,44 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.installedapp;
+
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Resources;
+
+import org.chromium.base.ContextUtils;
+
+/**
+ * A wrapper around the PackageManager that may be overridden for testing.
+ */
+public class PackageManagerDelegate {
+    /**
+     * See {@link PackageManager#getApplicationInfo(String, int)}
+     */
+    public ApplicationInfo getApplicationInfo(String packageName, int flags)
+            throws NameNotFoundException {
+        return ContextUtils.getApplicationContext().getPackageManager().getApplicationInfo(
+                packageName, flags);
+    }
+
+    /**
+     * See {@link PackageManager#getResourcesForApplication(ApplicationInfo)}
+     */
+    public Resources getResourcesForApplication(ApplicationInfo appInfo)
+            throws NameNotFoundException {
+        return ContextUtils.getApplicationContext().getPackageManager().getResourcesForApplication(
+                appInfo);
+    }
+
+    /**
+     * See {@link PackageManager#getPackageInfo(String, int)}
+     */
+    public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException {
+        return ContextUtils.getApplicationContext().getPackageManager().getPackageInfo(
+                packageName, flags);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManager.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManager.java
index 69174b07..cacc397 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManager.java
@@ -27,46 +27,6 @@
  * Reads, writes, and migrates preferences related to network usage and privacy.
  */
 public class PrivacyPreferencesManager implements CrashReportingPermissionManager{
-    // "crash_dump_upload", "crash_dump_upload_no_cellular" - Deprecated prefs used for
-    // 3-option setting for usage and crash reporting. Last used in M55, removed in M78.
-
-    // "cellular_experiment" - Deprecated pref corresponding to the finch experiment
-    // controlling migration from 3-option setting to ON/OFF toggle for usage and crash
-    // reporting. Last used in M55, removed in M78.
-
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB = "physical_web";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_SHARING = "physical_web_sharing";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_HAS_DEFERRED_METRICS_KEY =
-            "PhysicalWeb.HasDeferredMetrics";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_OPT_IN_DECLINE_BUTTON_PRESS_COUNT =
-            "PhysicalWeb.OptIn.DeclineButtonPressed";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_OPT_IN_ENABLE_BUTTON_PRESS_COUNT =
-            "PhysicalWeb.OptIn.EnableButtonPressed";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_PREFS_FEATURE_DISABLED_COUNT =
-            "PhysicalWeb.Prefs.FeatureDisabled";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_PREFS_FEATURE_ENABLED_COUNT =
-            "PhysicalWeb.Prefs.FeatureEnabled";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_PREFS_LOCATION_DENIED_COUNT =
-            "PhysicalWeb.Prefs.LocationDenied";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_PREFS_LOCATION_GRANTED_COUNT =
-            "PhysicalWeb.Prefs.LocationGranted";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_PWS_BACKGROUND_RESOLVE_TIMES =
-            "PhysicalWeb.ResolveTime.Background";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_PWS_FOREGROUND_RESOLVE_TIMES =
-            "PhysicalWeb.ResolveTime.Foreground";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_PWS_REFRESH_RESOLVE_TIMES =
-            "PhysicalWeb.ResolveTime.Refresh";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_URL_SELECTED_COUNT =
-            "PhysicalWeb.UrlSelected";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_TOTAL_URLS_INITIAL_COUNTS =
-            "PhysicalWeb.TotalUrls.OnInitialDisplay";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_TOTAL_URLS_REFRESH_COUNTS =
-            "PhysicalWeb.TotalUrls.OnRefresh";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_ACTIVITY_REFERRALS =
-            "PhysicalWeb.ActivityReferral";
-    private static final String DEPRECATED_PREF_PHYSICAL_WEB_PHYSICAL_WEB_STATE =
-            "PhysicalWeb.State";
-
     public static final String PREF_METRICS_REPORTING = "metrics_reporting";
     private static final String PREF_METRICS_IN_SAMPLE = "in_metrics_sample";
     private static final String PREF_NETWORK_PREDICTIONS = "network_predictions";
@@ -84,8 +44,6 @@
     PrivacyPreferencesManager(Context context) {
         mContext = context;
         mSharedPreferences = ContextUtils.getAppSharedPreferences();
-
-        migratePhysicalWebPreferences();
     }
 
     public static PrivacyPreferencesManager getInstance() {
@@ -95,29 +53,6 @@
         return sInstance;
     }
 
-    // TODO(https://crbug.com/826540): Remove some time after 5/2019.
-    public void migratePhysicalWebPreferences() {
-        SharedPreferences.Editor editor = mSharedPreferences.edit();
-        editor.remove(DEPRECATED_PREF_PHYSICAL_WEB)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_SHARING)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_HAS_DEFERRED_METRICS_KEY)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_OPT_IN_DECLINE_BUTTON_PRESS_COUNT)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_OPT_IN_ENABLE_BUTTON_PRESS_COUNT)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_PREFS_FEATURE_DISABLED_COUNT)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_PREFS_FEATURE_ENABLED_COUNT)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_PREFS_LOCATION_DENIED_COUNT)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_PREFS_LOCATION_GRANTED_COUNT)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_PWS_BACKGROUND_RESOLVE_TIMES)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_PWS_FOREGROUND_RESOLVE_TIMES)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_PWS_REFRESH_RESOLVE_TIMES)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_URL_SELECTED_COUNT)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_TOTAL_URLS_INITIAL_COUNTS)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_TOTAL_URLS_REFRESH_COUNTS)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_ACTIVITY_REFERRALS)
-                .remove(DEPRECATED_PREF_PHYSICAL_WEB_PHYSICAL_WEB_STATE)
-                .apply();
-    }
-
     /**
      * Migrate and delete old preferences.  Note that migration has to happen in Android-specific
      * code because we need to access ALLOW_PRERENDER sharedPreference.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
index e15fb77..133ad364 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
@@ -22,7 +22,6 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.task.PostTask;
 import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
-import org.chromium.components.signin.AccountIdProvider;
 import org.chromium.components.signin.AccountTrackerService;
 import org.chromium.components.signin.ChromeSigninController;
 import org.chromium.components.signin.base.CoreAccountInfo;
@@ -411,11 +410,8 @@
     private void progressSignInFlowSeedSystemAccounts() {
         if (mAccountTrackerService.checkAndSeedSystemAccounts()) {
             progressSignInFlowCheckPolicy();
-        } else if (AccountIdProvider.getInstance().canBeUsed()) {
-            mSignInState.mBlockedOnAccountSeeding = true;
         } else {
-            Log.w(TAG, "Cancelling the sign-in process as Google Play services is unavailable");
-            abortSignIn();
+            mSignInState.mBlockedOnAccountSeeding = true;
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java
index f85e364..ffd03cc9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java
@@ -36,27 +36,19 @@
     StartSurfaceToolbarMediator(PropertyModel model) {
         mPropertyModel = model;
         mPropertyModel.set(MENU_IS_VISIBLE, !FeatureUtilities.isBottomToolbarEnabled());
-
-        // Observers
-
-        mTabModelSelectorObserver = new EmptyTabModelSelectorObserver() {
-            @Override
-            public void onTabModelSelected(TabModel newModel, TabModel oldModel) {
-                mPropertyModel.set(IS_INCOGNITO, mTabModelSelector.isIncognitoSelected());
-            }
-        };
     }
 
     void onNativeLibraryReady() {
-        if (mTemplateUrlObserver != null) {
-            mTemplateUrlObserver = new TemplateUrlServiceObserver() {
-                @Override
-                public void onTemplateURLServiceChanged() {
-                    mPropertyModel.set(LOGO_IS_VISIBLE,
-                            TemplateUrlServiceFactory.get().isDefaultSearchEngineGoogle());
-                }
-            };
-        }
+        assert mTemplateUrlObserver == null;
+
+        mTemplateUrlObserver = new TemplateUrlServiceObserver() {
+            @Override
+            public void onTemplateURLServiceChanged() {
+                mPropertyModel.set(LOGO_IS_VISIBLE,
+                        TemplateUrlServiceFactory.get().isDefaultSearchEngineGoogle());
+            }
+        };
+
         TemplateUrlServiceFactory.get().addObserver(mTemplateUrlObserver);
         mPropertyModel.set(
                 LOGO_IS_VISIBLE, TemplateUrlServiceFactory.get().isDefaultSearchEngineGoogle());
@@ -82,7 +74,7 @@
     void setTabModelSelector(TabModelSelector selector) {
         mTabModelSelector = selector;
 
-        if (mTabModelSelector != null) {
+        if (mTabModelSelectorObserver == null) {
             mTabModelSelectorObserver = new EmptyTabModelSelectorObserver() {
                 @Override
                 public void onTabModelSelected(TabModel newModel, TabModel oldModel) {
@@ -90,6 +82,7 @@
                 }
             };
         }
+        mPropertyModel.set(IS_INCOGNITO, mTabModelSelector.isIncognitoSelected());
         mTabModelSelector.addObserver(mTabModelSelectorObserver);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/BottomContainer.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomContainer.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/snackbar/BottomContainer.java
rename to chrome/android/java/src/org/chromium/chrome/browser/ui/BottomContainer.java
index 09f9ec36..2e8ca85f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/snackbar/BottomContainer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomContainer.java
@@ -2,7 +2,7 @@
 // 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.snackbar;
+package org.chromium.chrome.browser.ui;
 
 import android.content.Context;
 import android.util.AttributeSet;
@@ -81,5 +81,5 @@
     public void onContentOffsetChanged(int offset) {}
 
     @Override
-    public void onToggleOverlayVideoMode(boolean enabled) { }
+    public void onToggleOverlayVideoMode(boolean enabled) {}
 }
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 a180f896..e61d770 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
@@ -10,7 +10,6 @@
 import android.content.Context;
 import android.graphics.Color;
 import android.graphics.Rect;
-import android.support.v4.view.ViewCompat;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 import android.view.View;
@@ -275,9 +274,6 @@
                 (TouchRestrictingFrameLayout) findViewById(R.id.bottom_sheet_content);
         mBottomSheetContentContainer.setBottomSheet(this);
         mBottomSheetContentContainer.setBackgroundResource(R.drawable.top_round);
-        // TODO(b/146412594): Replace the color with default_bg_color once available.
-        ViewCompat.setBackgroundTintList(mBottomSheetContentContainer,
-                getResources().getColorStateList(R.color.default_bg_color_elev_3));
 
         mContainerWidth = root.getWidth();
         mContainerHeight = root.getHeight();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java
similarity index 84%
rename from chrome/android/junit/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java
rename to chrome/android/native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java
index d61626c..87c5231 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java
+++ b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java
@@ -4,40 +4,36 @@
 
 package org.chromium.chrome.browser.installedapp;
 
-import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.AssetManager;
 import android.content.res.Resources;
 import android.os.Bundle;
+import android.os.Looper;
 import android.util.Pair;
 
-import org.junit.After;
 import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowPackageManager;
 
-import org.chromium.base.ThreadUtils;
-import org.chromium.base.task.test.CustomShadowAsyncTask;
-import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.TimeoutTimer;
 import org.chromium.chrome.browser.instantapps.InstantAppsHandler;
+import org.chromium.content_public.browser.test.NestedSystemMessageHandler;
+import org.chromium.content_public.browser.test.util.CriteriaHelper;
 import org.chromium.installedapp.mojom.InstalledAppProvider;
 import org.chromium.installedapp.mojom.RelatedApplication;
 
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /** Ensure that the InstalledAppProvider returns the correct apps. */
-@RunWith(BaseRobolectricTestRunner.class)
-@Config(manifest = Config.NONE, shadows = {CustomShadowAsyncTask.class})
 public class InstalledAppProviderTest {
     private static final String ASSET_STATEMENTS_KEY =
             InstalledAppProviderImpl.ASSET_STATEMENTS_KEY;
@@ -67,16 +63,51 @@
     private static final String ORIGIN_DIFFERENT_HOST = "https://example.org:8000";
     private static final String ORIGIN_DIFFERENT_PORT = "https://example.com:8001";
 
+    private FakePackageManager mFakePackageManager;
     private FakeFrameUrlDelegate mFrameUrlDelegate;
     private InstalledAppProviderTestImpl mInstalledAppProvider;
     private FakeInstantAppsHandler mFakeInstantAppsHandler;
 
+    private static class FakePackageManager extends PackageManagerDelegate {
+        private Map<String, PackageInfo> mPackageInfo = new HashMap<>();
+        private Map<String, Resources> mResources = new HashMap<>();
+
+        public void addPackageInfo(PackageInfo packageInfo) {
+            mPackageInfo.put(packageInfo.packageName, packageInfo);
+        }
+
+        public void addResources(String packageName, Resources resources) {
+            mResources.put(packageName, resources);
+        }
+
+        @Override
+        public ApplicationInfo getApplicationInfo(String packageName, int flags)
+                throws NameNotFoundException {
+            return getPackageInfo(packageName, flags).applicationInfo;
+        }
+
+        @Override
+        public Resources getResourcesForApplication(ApplicationInfo appInfo)
+                throws NameNotFoundException {
+            if (!mResources.containsKey(appInfo.packageName)) throw new NameNotFoundException();
+            return mResources.get(appInfo.packageName);
+        }
+
+        @Override
+        public PackageInfo getPackageInfo(String packageName, int flags)
+                throws NameNotFoundException {
+            if (!mPackageInfo.containsKey(packageName)) throw new NameNotFoundException();
+            return mPackageInfo.get(packageName);
+        }
+    }
+
     private static class InstalledAppProviderTestImpl extends InstalledAppProviderImpl {
         private long mLastDelayMillis;
 
-        public InstalledAppProviderTestImpl(FrameUrlDelegate frameUrlDelegate, Context context,
+        public InstalledAppProviderTestImpl(FrameUrlDelegate frameUrlDelegate,
+                PackageManagerDelegate packageManagerDelegate,
                 FakeInstantAppsHandler instantAppsHandler) {
-            super(frameUrlDelegate, context, instantAppsHandler);
+            super(frameUrlDelegate, packageManagerDelegate, instantAppsHandler);
         }
 
         public long getLastDelayMillis() {
@@ -136,10 +167,8 @@
         packageInfo.applicationInfo.packageName = packageName;
         packageInfo.applicationInfo.metaData = metaData;
 
-        ShadowPackageManager packageManager =
-                Shadows.shadowOf(RuntimeEnvironment.application.getPackageManager());
-        packageManager.addPackage(packageInfo);
-        ShadowPackageManager.resources.put(packageInfo.packageName, resources);
+        mFakePackageManager.addPackageInfo(packageInfo);
+        mFakePackageManager.addResources(packageName, resources);
     }
 
     /**
@@ -150,15 +179,24 @@
      * for these tests).
      */
     private static class FakeResources extends Resources {
+        private static AssetManager sAssetManager = createAssetManager();
         private final int mId;
         private final String mValue;
 
+        private static AssetManager createAssetManager() {
+            try {
+                return (AssetManager) AssetManager.class.getConstructor().newInstance();
+            } catch (Exception e) {
+                return null;
+            }
+        }
+
         // Do not warn about deprecated call to Resources(); the documentation says code is not
         // supposed to create its own Resources object, but we are using it to fake out the
         // Resources, and there is no other way to do that.
         @SuppressWarnings("deprecation")
         public FakeResources(int identifier, String value) {
-            super(new AssetManager(), null, null);
+            super(sAssetManager, null, null);
             mId = identifier;
             mValue = value;
         }
@@ -276,7 +314,8 @@
      * returned.
      */
     private void verifyInstalledApps(RelatedApplication[] manifestRelatedApps,
-            RelatedApplication[] expectedInstalledRelatedApps) {
+            RelatedApplication[] expectedInstalledRelatedApps) throws Exception {
+        final AtomicBoolean called = new AtomicBoolean(false);
         mInstalledAppProvider.filterInstalledApps(
                 manifestRelatedApps, new InstalledAppProvider.FilterInstalledAppsResponse() {
                     @Override
@@ -288,30 +327,42 @@
                             Assert.assertEquals(
                                     expectedInstalledRelatedApps[i], installedRelatedApps[i]);
                         }
+                        called.set(true);
                     }
                 });
+        pollUiThread(() -> called.get());
     }
 
-    @Before
+    private static void pollUiThread(final Callable<Boolean> criteria) throws Exception {
+        boolean isSatisfied = criteria.call();
+        TimeoutTimer timer = new TimeoutTimer(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL);
+        while (!isSatisfied && !timer.isTimedOut()) {
+            NestedSystemMessageHandler.runSingleNestedLooperTask(Looper.myQueue());
+            isSatisfied = criteria.call();
+        }
+        Assert.assertTrue(isSatisfied);
+    }
+
+    @CalledByNative
+    public static InstalledAppProviderTest create() {
+        return new InstalledAppProviderTest();
+    }
+
+    private InstalledAppProviderTest() {}
+
+    @CalledByNative
     public void setUp() {
-        // Avoid triggering asserts in InstalledAppProviderImpl that check they are being run off
-        // the UI thread (since this is a single-threaded test).
-        ThreadUtils.setThreadAssertsDisabledForTesting(true);
+        mFakePackageManager = new FakePackageManager();
         mFrameUrlDelegate = new FakeFrameUrlDelegate(URL_ON_ORIGIN);
         mFakeInstantAppsHandler = new FakeInstantAppsHandler();
         mInstalledAppProvider = new InstalledAppProviderTestImpl(
-                mFrameUrlDelegate, RuntimeEnvironment.application, mFakeInstantAppsHandler);
-    }
-
-    @After
-    public void tearDown() {
-        ThreadUtils.setThreadAssertsDisabledForTesting(false);
+                mFrameUrlDelegate, mFakePackageManager, mFakeInstantAppsHandler);
     }
 
     /** Origin of the page using the API is missing certain parts of the URI. */
-    @Test
     @Feature({"InstalledApp"})
-    public void testOriginMissingParts() {
+    @CalledByNative
+    public void testOriginMissingParts() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
         setAssetStatement(PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URLS, ORIGIN);
@@ -325,9 +376,9 @@
     }
 
     /** Incognito mode with one related Android app. */
-    @Test
     @Feature({"InstalledApp"})
-    public void testIncognitoWithOneInstalledRelatedApp() {
+    @CalledByNative
+    public void testIncognitoWithOneInstalledRelatedApp() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
         setAssetStatement(PACKAGE_NAME_1, NAMESPACE_WEB, RELATION_HANDLE_ALL_URLS, ORIGIN);
@@ -342,9 +393,9 @@
      *
      * <p>An Android app relates to the web app, but not mutual.
      */
-    @Test
     @Feature({"InstalledApp"})
-    public void testNoRelatedApps() {
+    @CalledByNative
+    public void testNoRelatedApps() throws Exception {
         // The web manifest has no related apps.
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {};
 
@@ -361,9 +412,9 @@
      *
      * <p>An Android app relates to the web app, but not mutual.
      */
-    @Test
     @Feature({"InstalledApp"})
-    public void testOneRelatedAppNoId() {
+    @CalledByNative
+    public void testOneRelatedAppNoId() throws Exception {
         RelatedApplication manifestRelatedApps[] =
                 new RelatedApplication[] {createRelatedApplication(PLATFORM_ANDROID, null, null)};
 
@@ -379,9 +430,9 @@
      * <p>An Android app with the same id relates to the web app. This should be ignored since the
      * manifest doesn't mention the Android app.
      */
-    @Test
     @Feature({"InstalledApp"})
-    public void testOneRelatedNonAndroidApp() {
+    @CalledByNative
+    public void testOneRelatedNonAndroidApp() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_OTHER, PACKAGE_NAME_1, null)};
 
@@ -396,9 +447,9 @@
      *
      * <p>Another Android app relates to the web app, but not mutual.
      */
-    @Test
     @Feature({"InstalledApp"})
-    public void testOneRelatedAppNotInstalled() {
+    @CalledByNative
+    public void testOneRelatedAppNotInstalled() throws Exception {
         // The web manifest has a related Android app named |PACKAGE_NAME_1|.
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
@@ -411,11 +462,12 @@
         verifyInstalledApps(manifestRelatedApps, expectedInstalledRelatedApps);
     }
 
-    /** Android app manifest has an asset_statements key, but the resource it links to is missing.
+    /**
+     * Android app manifest has an asset_statements key, but the resource it links to is missing.
      */
-    @Test
     @Feature({"InstalledApp"})
-    public void testOneRelatedAppBrokenAssetStatementsResource() {
+    @CalledByNative
+    public void testOneRelatedAppBrokenAssetStatementsResource() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -429,9 +481,9 @@
     }
 
     /** One related Android app; Android app is not mutually related (has no asset_statements). */
-    @Test
     @Feature({"InstalledApp"})
-    public void testOneRelatedAppNoAssetStatements() {
+    @CalledByNative
+    public void testOneRelatedAppNoAssetStatements() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -441,9 +493,9 @@
     }
 
     /** One related Android app; Android app is not mutually related (has no asset_statements). */
-    @Test
     @Feature({"InstalledApp"})
-    public void testOneRelatedAppNoAssetStatementsNullMetadata() {
+    @CalledByNative
+    public void testOneRelatedAppNoAssetStatementsNullMetadata() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -460,9 +512,9 @@
      * The Android app is related to a web app with a different host. - The Android app is related
      * to a web app with a different port.
      */
-    @Test
     @Feature({"InstalledApp"})
-    public void testOneRelatedAppRelatedToDifferentOrigins() {
+    @CalledByNative
+    public void testOneRelatedAppRelatedToDifferentOrigins() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -481,9 +533,9 @@
     }
 
     /** One related Android app; Android app is installed and mutually related. */
-    @Test
     @Feature({"InstalledApp"})
-    public void testOneInstalledRelatedApp() {
+    @CalledByNative
+    public void testOneInstalledRelatedApp() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -498,9 +550,9 @@
      *
      * <p>This simulates navigating the frame while keeping the same Mojo service open.
      */
-    @Test
     @Feature({"InstalledApp"})
-    public void testDynamicallyChangingUrl() {
+    @CalledByNative
+    public void testDynamicallyChangingUrl() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -526,9 +578,9 @@
     }
 
     /** One related Android app (installed and mutually related), with a non-null URL field. */
-    @Test
     @Feature({"InstalledApp"})
-    public void testInstalledRelatedAppWithUrl() {
+    @CalledByNative
+    public void testInstalledRelatedAppWithUrl() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, URL_UNRELATED)};
 
@@ -539,9 +591,9 @@
     }
 
     /** One related Android app; Android app is related to multiple origins. */
-    @Test
     @Feature({"InstalledApp"})
-    public void testMultipleAssetStatements() {
+    @CalledByNative
+    public void testMultipleAssetStatements() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -549,7 +601,7 @@
         // app.
         String statements = "["
                 + createAssetStatement(
-                          NAMESPACE_WEB, RELATION_HANDLE_ALL_URLS, ORIGIN_DIFFERENT_HOST)
+                        NAMESPACE_WEB, RELATION_HANDLE_ALL_URLS, ORIGIN_DIFFERENT_HOST)
                 + ", " + createAssetStatement(NAMESPACE_WEB, RELATION_HANDLE_ALL_URLS, ORIGIN)
                 + "]";
         setStringResource(PACKAGE_NAME_1, ASSET_STATEMENTS_KEY, statements);
@@ -559,9 +611,9 @@
     }
 
     /** A JSON syntax error in the Android app's asset statement. */
-    @Test
     @Feature({"InstalledApp"})
-    public void testAssetStatementSyntaxError() {
+    @CalledByNative
+    public void testAssetStatementSyntaxError() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -573,9 +625,9 @@
     }
 
     /** The Android app's asset statement is not an array. */
-    @Test
     @Feature({"InstalledApp"})
-    public void testAssetStatementNotArray() {
+    @CalledByNative
+    public void testAssetStatementNotArray() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -587,9 +639,9 @@
     }
 
     /** The Android app's asset statement array contains non-objects. */
-    @Test
     @Feature({"InstalledApp"})
-    public void testAssetStatementArrayNoObjects() {
+    @CalledByNative
+    public void testAssetStatementArrayNoObjects() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -608,9 +660,9 @@
      * <p>Currently, the relation string (in the Android package's asset statement) is ignored, so
      * the app is still returned as "installed".
      */
-    @Test
     @Feature({"InstalledApp"})
-    public void testAssetStatementNoRelation() {
+    @CalledByNative
+    public void testAssetStatementNoRelation() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -630,9 +682,9 @@
      * <p>Currently, the relation string (in the Android package's asset statement) is ignored, so
      * any will do. Is this desirable, or do we want to require a specific relation string?
      */
-    @Test
     @Feature({"InstalledApp"})
-    public void testAssetStatementNonStandardRelation() {
+    @CalledByNative
+    public void testAssetStatementNonStandardRelation() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -645,9 +697,9 @@
     }
 
     /** Android app has no "target" in the asset statement. */
-    @Test
     @Feature({"InstalledApp"})
-    public void testAssetStatementNoTarget() {
+    @CalledByNative
+    public void testAssetStatementNoTarget() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -659,9 +711,9 @@
     }
 
     /** Android app has no "namespace" in the asset statement. */
-    @Test
     @Feature({"InstalledApp"})
-    public void testAssetStatementNoNamespace() {
+    @CalledByNative
+    public void testAssetStatementNoNamespace() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -675,9 +727,9 @@
     }
 
     /** Android app is related, but not to the web namespace. */
-    @Test
     @Feature({"InstalledApp"})
-    public void testNonWebAssetStatement() {
+    @CalledByNative
+    public void testNonWebAssetStatement() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -688,9 +740,9 @@
     }
 
     /** Android app has no "site" in the asset statement. */
-    @Test
     @Feature({"InstalledApp"})
-    public void testAssetStatementNoSite() {
+    @CalledByNative
+    public void testAssetStatementNoSite() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -704,9 +756,9 @@
     }
 
     /** Android app has a syntax error in the "site" field of the asset statement. */
-    @Test
     @Feature({"InstalledApp"})
-    public void testAssetStatementSiteSyntaxError() {
+    @CalledByNative
+    public void testAssetStatementSiteSyntaxError() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -718,9 +770,9 @@
     }
 
     /** Android app has a "site" field missing certain parts of the URI (scheme, host, port). */
-    @Test
     @Feature({"InstalledApp"})
-    public void testAssetStatementSiteMissingParts() {
+    @CalledByNative
+    public void testAssetStatementSiteMissingParts() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -744,9 +796,9 @@
      * <p>The path part shouldn't really be there (according to the Digital Asset Links spec), but
      * if it is, we are lenient and just ignore it (matching only the origin).
      */
-    @Test
     @Feature({"InstalledApp"})
-    public void testAssetStatementSiteHasPath() {
+    @CalledByNative
+    public void testAssetStatementSiteHasPath() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -762,9 +814,9 @@
      *
      * <p>Another Android app relates to the web app, but not mutual.
      */
-    @Test
     @Feature({"InstalledApp"})
-    public void testExtraInstalledApp() {
+    @CalledByNative
+    public void testExtraInstalledApp() throws Exception {
         RelatedApplication manifestRelatedApps[] = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
 
@@ -781,9 +833,9 @@
      * <p>Web app also related to an app with the same name on another platform, and another Android
      * app which is not installed.
      */
-    @Test
     @Feature({"InstalledApp"})
-    public void testMultipleInstalledRelatedApps() {
+    @CalledByNative
+    public void testMultipleInstalledRelatedApps() throws Exception {
         RelatedApplication[] manifestRelatedApps = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null),
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_2, null),
@@ -798,9 +850,9 @@
     }
 
     /** Tests the pseudo-random artificial delay to counter a timing attack. */
-    @Test
     @Feature({"InstalledApp"})
-    public void testArtificialDelay() {
+    @CalledByNative
+    public void testArtificialDelay() throws Exception {
         byte[] salt = {0x64, 0x09, -0x68, -0x25, 0x70, 0x11, 0x25, 0x24, 0x68, -0x1a, 0x08, 0x79,
                 -0x12, -0x50, 0x3b, -0x57, -0x17, -0x4d, 0x46, 0x02};
         PackageHash.setGlobalSaltForTesting(salt);
@@ -825,9 +877,9 @@
         Assert.assertEquals(5, mInstalledAppProvider.getLastDelayMillis());
     }
 
-    @Test
     @Feature({"InstalledApp"})
-    public void testMultipleAppsIncludingInstantApps() {
+    @CalledByNative
+    public void testMultipleAppsIncludingInstantApps() throws Exception {
         RelatedApplication[] manifestRelatedApps = new RelatedApplication[] {
                 createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null),
                 // Instant Apps:
@@ -848,9 +900,9 @@
      * Multiple related uninstalled apps (over the allowed limit) followed by one related Android
      * app which is installed and mutually related.
      */
-    @Test
     @Feature({"InstalledApp"})
-    public void testRelatedAppsOverAllowedThreshold() {
+    @CalledByNative
+    public void testRelatedAppsOverAllowedThreshold() throws Exception {
         RelatedApplication manifestRelatedApps[] =
                 new RelatedApplication[MAX_ALLOWED_RELATED_APPS + 1];
         for (int i = 0; i < MAX_ALLOWED_RELATED_APPS; i++) {
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index c3742d3e..7c17f8d1 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1148,33 +1148,6 @@
     "performance_manager/observers/isolation_context_metrics.h",
     "performance_manager/observers/metrics_collector.cc",
     "performance_manager/observers/metrics_collector.h",
-    "performance_manager/persistence/site_data/exponential_moving_average.cc",
-    "performance_manager/persistence/site_data/exponential_moving_average.h",
-    "performance_manager/persistence/site_data/feature_usage.h",
-    "performance_manager/persistence/site_data/leveldb_site_data_store.cc",
-    "performance_manager/persistence/site_data/leveldb_site_data_store.h",
-    "performance_manager/persistence/site_data/non_recording_site_data_cache.cc",
-    "performance_manager/persistence/site_data/non_recording_site_data_cache.h",
-    "performance_manager/persistence/site_data/noop_site_data_writer.cc",
-    "performance_manager/persistence/site_data/noop_site_data_writer.h",
-    "performance_manager/persistence/site_data/site_data_cache.h",
-    "performance_manager/persistence/site_data/site_data_cache_facade.cc",
-    "performance_manager/persistence/site_data/site_data_cache_facade.h",
-    "performance_manager/persistence/site_data/site_data_cache_facade_factory.cc",
-    "performance_manager/persistence/site_data/site_data_cache_facade_factory.h",
-    "performance_manager/persistence/site_data/site_data_cache_factory.cc",
-    "performance_manager/persistence/site_data/site_data_cache_factory.h",
-    "performance_manager/persistence/site_data/site_data_cache_impl.cc",
-    "performance_manager/persistence/site_data/site_data_cache_impl.h",
-    "performance_manager/persistence/site_data/site_data_cache_inspector.h",
-    "performance_manager/persistence/site_data/site_data_impl.cc",
-    "performance_manager/persistence/site_data/site_data_impl.h",
-    "performance_manager/persistence/site_data/site_data_reader.cc",
-    "performance_manager/persistence/site_data/site_data_reader.h",
-    "performance_manager/persistence/site_data/site_data_store.h",
-    "performance_manager/persistence/site_data/site_data_writer.cc",
-    "performance_manager/persistence/site_data/site_data_writer.h",
-    "performance_manager/persistence/site_data/tab_visibility.h",
     "performance_monitor/metric_evaluator_helper_win.cc",
     "performance_monitor/metric_evaluator_helper_win.h",
     "performance_monitor/process_metrics_history.cc",
@@ -3330,6 +3303,33 @@
       "obsolete_system/obsolete_system_win.cc",
       "page_load_metrics/observers/session_restore_page_load_metrics_observer.cc",
       "page_load_metrics/observers/session_restore_page_load_metrics_observer.h",
+      "performance_manager/persistence/site_data/exponential_moving_average.cc",
+      "performance_manager/persistence/site_data/exponential_moving_average.h",
+      "performance_manager/persistence/site_data/feature_usage.h",
+      "performance_manager/persistence/site_data/leveldb_site_data_store.cc",
+      "performance_manager/persistence/site_data/leveldb_site_data_store.h",
+      "performance_manager/persistence/site_data/non_recording_site_data_cache.cc",
+      "performance_manager/persistence/site_data/non_recording_site_data_cache.h",
+      "performance_manager/persistence/site_data/noop_site_data_writer.cc",
+      "performance_manager/persistence/site_data/noop_site_data_writer.h",
+      "performance_manager/persistence/site_data/site_data_cache.h",
+      "performance_manager/persistence/site_data/site_data_cache_facade.cc",
+      "performance_manager/persistence/site_data/site_data_cache_facade.h",
+      "performance_manager/persistence/site_data/site_data_cache_facade_factory.cc",
+      "performance_manager/persistence/site_data/site_data_cache_facade_factory.h",
+      "performance_manager/persistence/site_data/site_data_cache_factory.cc",
+      "performance_manager/persistence/site_data/site_data_cache_factory.h",
+      "performance_manager/persistence/site_data/site_data_cache_impl.cc",
+      "performance_manager/persistence/site_data/site_data_cache_impl.h",
+      "performance_manager/persistence/site_data/site_data_cache_inspector.h",
+      "performance_manager/persistence/site_data/site_data_impl.cc",
+      "performance_manager/persistence/site_data/site_data_impl.h",
+      "performance_manager/persistence/site_data/site_data_reader.cc",
+      "performance_manager/persistence/site_data/site_data_reader.h",
+      "performance_manager/persistence/site_data/site_data_store.h",
+      "performance_manager/persistence/site_data/site_data_writer.cc",
+      "performance_manager/persistence/site_data/site_data_writer.h",
+      "performance_manager/persistence/site_data/tab_visibility.h",
       "permissions/attestation_permission_request.cc",
       "permissions/attestation_permission_request.h",
       "policy/local_sync_policy_handler.cc",
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index eb9a7f5..faca0e9 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -3574,7 +3574,6 @@
     case service_manager::SandboxType::kNetwork:
     case service_manager::SandboxType::kCdm:
     case service_manager::SandboxType::kPdfCompositor:
-    case service_manager::SandboxType::kProfiling:
     case service_manager::SandboxType::kAudio:
       // Should never reach here.
       CHECK(0);
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index fd69f52..efa9948 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -534,6 +534,8 @@
     "arc/file_system_watcher/arc_file_system_watcher_service.h",
     "arc/file_system_watcher/arc_file_system_watcher_util.cc",
     "arc/file_system_watcher/arc_file_system_watcher_util.h",
+    "arc/file_system_watcher/file_system_scanner.cc",
+    "arc/file_system_watcher/file_system_scanner.h",
     "arc/fileapi/arc_content_file_system_async_file_util.cc",
     "arc/fileapi/arc_content_file_system_async_file_util.h",
     "arc/fileapi/arc_content_file_system_backend_delegate.cc",
@@ -2603,6 +2605,7 @@
     "arc/extensions/arc_support_message_host_unittest.cc",
     "arc/file_system_watcher/arc_file_system_watcher_service_unittest.cc",
     "arc/file_system_watcher/arc_file_system_watcher_util_unittest.cc",
+    "arc/file_system_watcher/file_system_scanner_unittest.cc",
     "arc/fileapi/arc_content_file_system_async_file_util_unittest.cc",
     "arc/fileapi/arc_content_file_system_file_stream_reader_unittest.cc",
     "arc/fileapi/arc_content_file_system_file_stream_writer_unittest.cc",
diff --git a/chrome/browser/chromeos/arc/auth/arc_active_directory_enrollment_token_fetcher.cc b/chrome/browser/chromeos/arc/auth/arc_active_directory_enrollment_token_fetcher.cc
index c933349b..c32f692 100644
--- a/chrome/browser/chromeos/arc/auth/arc_active_directory_enrollment_token_fetcher.cc
+++ b/chrome/browser/chromeos/arc/auth/arc_active_directory_enrollment_token_fetcher.cc
@@ -159,7 +159,8 @@
     case policy::DM_STATUS_SERVICE_ARC_DISABLED:
     case policy::DM_STATUS_SERVICE_POLICY_NOT_FOUND: {
       // POLICY_NOT_FOUND is the first error encountered when the domain is not
-      // set up yet in CPanel, so just treat it the same as ARC_DISABLED.
+      // set up yet in the Admin console, so just treat it the same as
+      // ARC_DISABLED.
       fetch_status = Status::ARC_DISABLED;
       break;
     }
diff --git a/chrome/browser/chromeos/arc/file_system_watcher/file_system_scanner.cc b/chrome/browser/chromeos/arc/file_system_watcher/file_system_scanner.cc
new file mode 100644
index 0000000..9c05ffa
--- /dev/null
+++ b/chrome/browser/chromeos/arc/file_system_watcher/file_system_scanner.cc
@@ -0,0 +1,298 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/arc/file_system_watcher/file_system_scanner.h"
+
+#include <fts.h>
+#include <sys/stat.h>
+
+#include "base/files/file_enumerator.h"
+#include "base/sequenced_task_runner.h"
+#include "base/task/post_task.h"
+#include "chrome/browser/chromeos/arc/file_system_watcher/arc_file_system_watcher_util.h"
+#include "components/arc/mojom/file_system.mojom.h"
+#include "components/arc/session/arc_bridge_service.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
+
+using content::BrowserThread;
+
+namespace arc {
+
+namespace {
+
+struct FTSCloser {
+  void operator()(FTS* fts) {
+    if (fts)
+      fts_close(fts);
+  }
+};
+
+// The scan interval for FileSystemScanner instances.
+// This value needs to be bigger than 1 second since we subtract 1 second
+// inside IsModified function to handle the timekeeper issue. In order to get
+// more information about the issue, please check the comments above IsModified
+// function.
+//
+// TODO(crbug/1037824): Measure the battery usage to find an optimal value for
+// this.
+constexpr base::TimeDelta kRegularScanInterval =
+    base::TimeDelta::FromSeconds(5);
+
+// This value is used to handle the delay caused by timekeeper when reading the
+// ctime values. For more information, please read the comments inside
+// IsModified function.
+//
+// This value MUST NOT exceed |kRegularScanInterval|.
+constexpr base::TimeDelta kCtimeCorrection = base::TimeDelta::FromSeconds(1);
+
+// Returns ctime for the file |path| using stat(2).
+// If stat fails for some reason, e.g., the file does not exists, then it
+// returns base::Time().
+base::Time GetLastChangedTime(const base::FilePath& path) {
+  struct stat st = {};
+  const int res = stat(path.value().c_str(), &st);
+  if (res < 0) {
+    DPLOG(ERROR) << "Couldn't stat " << path.value();
+    return base::Time();
+  }
+  return base::Time::FromTimeSpec(st.st_ctim);
+}
+
+// Returns true if ctime of |path| is after |previous_scan_time|.
+bool IsModified(const base::FilePath& path,
+                base::Time previous_scan_time,
+                FileSystemScanner::GetLastChangeTimeCallback ctime_callback) {
+  // It is possible that ctime of the file might be before |previous_scan_time|
+  // even if the file has been modified after |previous_scan_time|.
+  //
+  // The reason for this is the concept of timekeeping in linux kernel. When
+  // writing to a file, ctime is updated using the value from the timekeeper
+  // which is updated by interrupts. However, when we use base::Time::Now() to
+  // update |previous_scan_time|, that call reads the system clock time directly
+  // instead of reading it from the timekeeper. Therefore, if the file is
+  // modified just after |previous_scan_time| is updated, it is possible
+  // that ctime is updated before an interrupt has been triggered.
+  //
+  // Thus, we add |kCtimeCorrection| to the ctime before the comparison to
+  // ensure we do not miss any modifications.
+  //
+  // Since |previous_scan_time| is updated at the beginning of a scan, it might
+  // be possible for a file to be identified as modified twice if it is modified
+  // after the |previous_scan_time| is stored but before the file is checked by
+  // the scan. It is expected and preferred compared to miss a file
+  // modification, e.g., if we store |previous_scan_time| at the end of a scan.
+  base::Time ctime = ctime_callback.Run(path) + kCtimeCorrection;
+  return previous_scan_time <= ctime;
+}
+
+// The following functions are made non-member functions because they can be
+// executed on any thread other than the UI thread, and the FileSystemScanner is
+// created on UI thread.
+//
+// It is not possible to PostTask an object's member function to a thread
+// other than the one where the object is allocated, using weak pointers.
+
+// Returns Android paths of all media files (recursively) under |directory|.
+std::vector<std::string> FullScan(const base::FilePath& directory,
+                                  base::Time previous_scan_time,
+                                  const base::FilePath& cros_dir,
+                                  const base::FilePath& android_dir) {
+  std::vector<std::string> media_files;
+  base::FileEnumerator file_enum(directory, true /* recursive */,
+                                 base::FileEnumerator::FILES);
+  for (auto path = file_enum.Next(); !path.empty(); path = file_enum.Next()) {
+    if (!HasAndroidSupportedMediaExtension(path))
+      continue;
+    media_files.push_back(GetAndroidPath(path, cros_dir, android_dir).value());
+  }
+  return media_files;
+}
+
+// Iterates over the files in |cros_dir| and calls respective mojo functions
+// for modified files and directories.
+RegularScanResult RegularScan(
+    base::Time previous_scan_time,
+    const base::FilePath& cros_dir,
+    const base::FilePath& android_dir,
+    FileSystemScanner::GetLastChangeTimeCallback ctime_callback) {
+  char* argv[] = {const_cast<char*>(cros_dir.value().c_str()), nullptr};
+  std::unique_ptr<FTS, FTSCloser> fts{
+      fts_open(argv, FTS_PHYSICAL | FTS_NOCHDIR | FTS_XDEV, nullptr)};
+  if (!fts) {
+    LOG(ERROR) << "Regular scan failed because the path cannot be opened.";
+    return {};
+  }
+
+  RegularScanResult result;
+  // Keeps track of the last modified directory to force RequestMediaScan for
+  // all media files under a modified directory.
+  base::FilePath topmost_modified_dir;
+
+  // FileEnumerator does not guarantee the traversal ordering. Thus, fts_read is
+  // preferred here since it provides the preorder traversal which is important
+  // to cache |topmost_modified_dir|.
+  FTSENT* p;
+  while ((p = fts_read(fts.get())) != nullptr) {
+    // There is no fts* MSAN interceptor yet in the codebase, so this
+    // manual MSAN_UNPOISON needs to be done to avoid false MSAN test runs
+    // failures.
+    MSAN_UNPOISON(p, sizeof(FTSENT));
+    MSAN_UNPOISON(p->fts_path, p->fts_pathlen + 1);
+    base::FilePath path(p->fts_path);
+    if (p->fts_info == FTS_D) {
+      if (!IsModified(path, previous_scan_time, ctime_callback))
+        continue;
+      if (!topmost_modified_dir.IsParent(path))
+        topmost_modified_dir = path;
+      // Since the directory is modified, push it into the buffer to search for
+      // removed files and remove their entries from MediaStore.
+      result.modified_directories.push_back(
+          GetAndroidPath(path, cros_dir, android_dir).value());
+    } else if (p->fts_info == FTS_F &&
+               HasAndroidSupportedMediaExtension(path)) {
+      if (IsModified(path, previous_scan_time, ctime_callback) ||
+          topmost_modified_dir.IsParent(path)) {
+        // If it is modified or its under a directory which is modified, push it
+        // into the buffer to trigger media scan later.
+        result.modified_files.push_back(
+            GetAndroidPath(path, cros_dir, android_dir).value());
+      }
+    }
+  }
+  return result;
+}
+
+}  // namespace
+
+RegularScanResult::RegularScanResult() = default;
+RegularScanResult::~RegularScanResult() = default;
+RegularScanResult::RegularScanResult(RegularScanResult&&) = default;
+RegularScanResult& RegularScanResult::operator=(RegularScanResult&&) = default;
+
+FileSystemScanner::FileSystemScanner(const base::FilePath& cros_dir,
+                                     const base::FilePath& android_dir,
+                                     ArcBridgeService* arc_bridge_service)
+    : FileSystemScanner(cros_dir,
+                        android_dir,
+                        arc_bridge_service,
+                        base::BindRepeating(&GetLastChangedTime)) {}
+
+FileSystemScanner::FileSystemScanner(const base::FilePath& cros_dir,
+                                     const base::FilePath& android_dir,
+                                     ArcBridgeService* arc_bridge_service,
+                                     GetLastChangeTimeCallback ctime_callback)
+    : state_(State::kIdle),
+      cros_dir_(cros_dir),
+      android_dir_(android_dir),
+      arc_bridge_service_(arc_bridge_service),
+      scan_runner_(
+          base::CreateSequencedTaskRunner({base::ThreadPool(), base::MayBlock(),
+                                           base::TaskPriority::BEST_EFFORT})),
+      ctime_callback_(ctime_callback) {}
+
+FileSystemScanner::~FileSystemScanner() = default;
+
+void FileSystemScanner::Start() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  ScheduleFullScan();
+}
+
+// TODO(risan): Consider to rename this to "Post".
+void FileSystemScanner::ScheduleFullScan() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  // Stop the timer to prevent scheduling regular scans before the full scan
+  // finishes.
+  timer_.Stop();
+  // Invalidate WeakPtrs to cancel callbacks to prevent the scanner being idle.
+  weak_ptr_factory_.InvalidateWeakPtrs();
+  state_ = State::kWaitingForScanToFinish;
+  // TODO(risan): We could skip a bunch of FullScan queued in the sequence if
+  // several SystemTimeClock change happened later (in separate CL). To do the
+  // skip, we could have a boolean variable full_scan_requested, and PostTask
+  // full_scan_requested from the OnFullScanFinished.
+  base::PostTaskAndReplyWithResult(
+      scan_runner_.get(), FROM_HERE,
+      base::BindOnce(&FullScan, cros_dir_, previous_scan_time_, cros_dir_,
+                     android_dir_),
+      base::BindOnce(&FileSystemScanner::OnFullScanFinished,
+                     weak_ptr_factory_.GetWeakPtr(), base::Time::Now()));
+  ReindexDirectory(android_dir_.value());
+}
+
+void FileSystemScanner::OnFullScanFinished(
+    base::Time current_scan_time,
+    std::vector<std::string> media_files) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK_EQ(state_, State::kWaitingForScanToFinish);
+  if (!media_files.empty())
+    RequestMediaScan(media_files);
+  previous_scan_time_ = current_scan_time;
+  state_ = State::kIdle;
+  timer_.Start(FROM_HERE, kRegularScanInterval, this,
+               &FileSystemScanner::ScheduleRegularScan);
+}
+
+void FileSystemScanner::ScheduleRegularScan() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  // Do not schedule another scan if there is an ongoing scan happening.
+  if (state_ != State::kIdle)
+    return;
+  state_ = State::kWaitingForScanToFinish;
+  base::PostTaskAndReplyWithResult(
+      scan_runner_.get(), FROM_HERE,
+      base::BindOnce(&RegularScan, previous_scan_time_, cros_dir_, android_dir_,
+                     ctime_callback_),
+      base::BindOnce(&FileSystemScanner::OnRegularScanFinished,
+                     weak_ptr_factory_.GetWeakPtr(), base::Time::Now()));
+}
+
+void FileSystemScanner::OnRegularScanFinished(base::Time current_scan_time,
+                                              RegularScanResult result) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK_NE(state_, State::kIdle);
+  if (!result.modified_files.empty())
+    RequestMediaScan(result.modified_files);
+  if (!result.modified_directories.empty())
+    RequestFileRemovalScan(result.modified_directories);
+  previous_scan_time_ = current_scan_time;
+  state_ = State::kIdle;
+}
+
+void FileSystemScanner::ReindexDirectory(const std::string& directory) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  auto* instance = ARC_GET_INSTANCE_FOR_METHOD(
+      arc_bridge_service_->file_system(), ReindexDirectory);
+  if (!instance) {
+    LOG(WARNING) << "Failed to call ReindexDirectory.";
+    return;
+  }
+  instance->ReindexDirectory(directory);
+}
+
+void FileSystemScanner::RequestFileRemovalScan(
+    const std::vector<std::string>& directories) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  auto* instance = ARC_GET_INSTANCE_FOR_METHOD(
+      arc_bridge_service_->file_system(), RequestFileRemovalScan);
+  if (!instance) {
+    LOG(WARNING) << "Failed to call RequestFileRemovalScan.";
+    return;
+  }
+  instance->RequestFileRemovalScan(directories);
+}
+
+void FileSystemScanner::RequestMediaScan(
+    const std::vector<std::string>& files) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  auto* instance = ARC_GET_INSTANCE_FOR_METHOD(
+      arc_bridge_service_->file_system(), RequestMediaScan);
+  if (!instance) {
+    LOG(WARNING) << "Failed to call RequestMediaScan.";
+    return;
+  }
+  instance->RequestMediaScan(files);
+}
+
+}  // namespace arc
\ No newline at end of file
diff --git a/chrome/browser/chromeos/arc/file_system_watcher/file_system_scanner.h b/chrome/browser/chromeos/arc/file_system_watcher/file_system_scanner.h
new file mode 100644
index 0000000..1e3b44f
--- /dev/null
+++ b/chrome/browser/chromeos/arc/file_system_watcher/file_system_scanner.h
@@ -0,0 +1,162 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_ARC_FILE_SYSTEM_WATCHER_FILE_SYSTEM_SCANNER_H_
+#define CHROME_BROWSER_CHROMEOS_ARC_FILE_SYSTEM_WATCHER_FILE_SYSTEM_SCANNER_H_
+
+#include <string>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/files/file_path.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
+
+namespace arc {
+
+class ArcBridgeService;
+
+struct RegularScanResult {
+  RegularScanResult();
+  ~RegularScanResult();
+  RegularScanResult(RegularScanResult&&);
+  RegularScanResult& operator=(RegularScanResult&&);
+
+  std::vector<std::string> modified_files;
+  std::vector<std::string> modified_directories;
+};
+
+// Periodical scanner to detect file system modifications in a directory. It is
+// activated when FileSystemWatcher throws an error, e.g., the file system is
+// too large.
+// TODO(risan): Address all remaining feedbacks from next iterations of
+// https://chromium-review.googlesource.com/c/chromium/src/+/1946177 before
+// enabling this.
+class FileSystemScanner {
+ public:
+  using GetLastChangeTimeCallback =
+      base::RepeatingCallback<base::Time(const base::FilePath& path)>;
+
+  // |cros_dir| is the directory that will be scanned by the scanner.
+  // |android_dir| is the respective path of |cros_dir| which is mounted to the
+  // Android container.
+  FileSystemScanner(const base::FilePath& cros_dir,
+                    const base::FilePath& android_dir,
+                    ArcBridgeService* arc_bridge_service);
+
+  // This constructor is only testing.
+  FileSystemScanner(const base::FilePath& cros_dir,
+                    const base::FilePath& android_dir,
+                    ArcBridgeService* arc_bridge_service,
+                    GetLastChangeTimeCallback ctime_callback);
+
+  FileSystemScanner(const FileSystemScanner&) = delete;
+  FileSystemScanner& operator=(const FileSystemScanner&) = delete;
+
+  ~FileSystemScanner();
+
+  // Starts scanning the directory.
+  void Start();
+
+ private:
+  // Schedules a full scan that triggers RequestMediaScan for all files and
+  // triggers ReindexDirectory for |android_dir_|. The reason for reindexing is
+  // to ensure that there are no indexes for non-existing files in MediaStore.
+  void ScheduleFullScan();
+
+  // Called after a full scan is finished. It updates |previous_scan_time_|
+  // accordingly. It also  updates the state, so that a regular scan can be
+  // scheduled.
+  void OnFullScanFinished(base::Time current_scan_time,
+                          std::vector<std::string> media_files);
+
+  // Schedules a regular scan if there is no ongoing scan at that time. Regular
+  // scan triggers RequestMediaScan only for the files that are modified after
+  // the previous (full or regular) scan. It also calls RequestFileRemovalScan
+  // for the modified directories to detect the removed files and directories
+  // under them. So that, their entries are removed from MediaStore.
+  void ScheduleRegularScan();
+
+  // Called after a regular scan is finished. It updates |previous_scan_time_|
+  // accordingly. It also updates the state, so that another regular scan can be
+  // done without skipping unless there is a full scan scheduled.
+  void OnRegularScanFinished(base::Time current_scan_time,
+                             RegularScanResult result);
+
+  // Wrapper function that calls ReindexDirectory through mojo interface.
+  void ReindexDirectory(const std::string& directory_path);
+
+  // Wrapper function that calls RequestFileRemovalScan through mojo interface.
+  void RequestFileRemovalScan(const std::vector<std::string>& directory_paths);
+
+  // Wrapper function that calls RequestMediaScan through mojo interface.
+  void RequestMediaScan(const std::vector<std::string>& files);
+
+  // Internal state which is used to skip regular scans when there is an ongoing
+  // regular scan or there is a full scan scheduled and has not finished yet.
+  enum class State {
+    // Neither a regular scan nor full scan is happening. A scan can only be
+    // scheduled in this state.
+    kIdle,
+    // There is a scan which is already PostTask'ed but haven't finished yet.
+    // State will return to |kIdle| in the OnScanFinished function.
+    kWaitingForScanToFinish,
+  };
+  State state_;
+
+  const base::FilePath cros_dir_;
+  const base::FilePath android_dir_;
+  ArcBridgeService* const arc_bridge_service_;
+
+  // The timestamp of the start of the last scan.
+  base::Time previous_scan_time_;
+  // The task runner which runs the scans to avoid blocking the UI thread.
+  scoped_refptr<base::SequencedTaskRunner> scan_runner_;
+  // Calls ScheduleRegularScan every |kFileSystemScannerInterval|.
+  base::RepeatingTimer timer_;
+  GetLastChangeTimeCallback ctime_callback_;
+  base::WeakPtrFactory<FileSystemScanner> weak_ptr_factory_{this};
+
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest, ScheduleFullScan);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanCreateTopLevelFile);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanCreateTopLevelDirectory);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanModifyTopLevelFile);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanModifyTopLevelDirectory);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanRenameTopLevelFile);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanRenameTopLevelDirectory);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanDeleteTopLevelFile);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanDeleteTopLevelDirectory);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanCreateNestedFile);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanCreateNestedDirectory);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanModifyNestedFile);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanModifyNestedDirectory);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanRenameNestedFile);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanRenameNestedDirectory);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanDeleteNestedFile);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanDeleteNestedDirectory);
+  FRIEND_TEST_ALL_PREFIXES(ArcFileSystemScannerTest,
+                           ScheduleRegularScanNoChange);
+};
+
+}  // namespace arc
+
+#endif  // CHROME_BROWSER_CHROMEOS_ARC_FILE_SYSTEM_WATCHER_FILE_SYSTEM_SCANNER_H_
diff --git a/chrome/browser/chromeos/arc/file_system_watcher/file_system_scanner_unittest.cc b/chrome/browser/chromeos/arc/file_system_watcher/file_system_scanner_unittest.cc
new file mode 100644
index 0000000..d950263
--- /dev/null
+++ b/chrome/browser/chromeos/arc/file_system_watcher/file_system_scanner_unittest.cc
@@ -0,0 +1,477 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/arc/file_system_watcher/file_system_scanner.h"
+
+#include <unistd.h>
+
+#include <string>
+#include <vector>
+
+#include "base/files/file_enumerator.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/files/scoped_temp_dir.h"
+#include "chrome/browser/chromeos/arc/file_system_watcher/arc_file_system_watcher_util.h"
+#include "chrome/browser/chromeos/arc/fileapi/arc_file_system_bridge.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chrome/test/base/testing_profile.h"
+#include "chrome/test/base/testing_profile_manager.h"
+#include "components/arc/arc_service_manager.h"
+#include "components/arc/session/arc_bridge_service.h"
+#include "components/arc/test/connection_holder_util.h"
+#include "components/arc/test/fake_file_system_instance.h"
+#include "content/public/test/browser_task_environment.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::_;
+using ::testing::AnyNumber;
+using ::testing::Return;
+
+namespace arc {
+
+namespace {
+
+constexpr char kTestingProfileName[] = "test-user";
+
+class FileUtil {
+ public:
+  void SetLastChangeTime(const base::FilePath& path, base::Time ctime) {
+    ctimes_[path] = ctime;
+  }
+
+  base::Time GetLastChangeTime(const base::FilePath& path) {
+    return ctimes_[path];
+  }
+
+ private:
+  std::map<base::FilePath, base::Time> ctimes_;
+};
+
+}  // namespace
+
+class ArcFileSystemScannerTest : public ::testing::Test {
+ protected:
+  void SetUp() override {
+    android_dir_ = base::FilePath(FakeFileSystemInstance::kFakeAndroidPath);
+    // TODO(risan): ASSERT_TRUE inside this won't terminate. Instead, this
+    // should return boolean and we should return from this SetUp() when it is
+    // false.
+    CreateDummyFilesAndDirectories();
+
+    // Setting up profile.
+    profile_manager_ = std::make_unique<TestingProfileManager>(
+        TestingBrowserProcess::GetGlobal());
+    ASSERT_TRUE(profile_manager_->SetUp());
+    Profile* profile =
+        profile_manager_->CreateTestingProfile(kTestingProfileName);
+
+    // Setting up FakeFileSystemInstance.
+    auto ctime_callback = base::BindRepeating(&FileUtil::GetLastChangeTime,
+                                              base::Unretained(&file_util_));
+    file_system_instance_.SetGetLastChangeTimeCallback(ctime_callback);
+    file_system_instance_.SetCrosDir(temp_dir_.GetPath());
+
+    // Setting up ArcBridgeService and inject FakeFileSystemInstance.
+    arc_file_system_bridge_ =
+        std::make_unique<ArcFileSystemBridge>(profile, &arc_bridge_service_);
+    arc_bridge_service_.file_system()->SetInstance(&file_system_instance_);
+    WaitForInstanceReady(arc_bridge_service_.file_system());
+    ASSERT_TRUE(file_system_instance_.InitCalled());
+
+    // Setting up the FileSystemScanner.
+    file_system_scanner_ = std::make_unique<FileSystemScanner>(
+        temp_dir_.GetPath(), android_dir_, &arc_bridge_service_,
+        ctime_callback);
+  }
+
+  void TearDown() override {
+    arc_bridge_service_.file_system()->CloseInstance(&file_system_instance_);
+    arc_file_system_bridge_.reset();
+    profile_manager_.reset();
+    expected_media_store_.clear();
+  }
+
+  void CreateDummyFilesAndDirectories() {
+    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+    base::FilePath dir = temp_dir_.GetPath();
+    ASSERT_TRUE(CreateDirectory(dir, base::Time()));
+    ASSERT_TRUE(CreateFile(dir.AppendASCII("1.png"), base::Time()));
+    ASSERT_TRUE(CreateDirectory(dir.AppendASCII("a"), base::Time()));
+    ASSERT_TRUE(CreateFile(dir.AppendASCII("a/2.png"), base::Time()));
+    ASSERT_TRUE(CreateDirectory(dir.AppendASCII("a/b"), base::Time()));
+    ASSERT_TRUE(CreateFile(dir.AppendASCII("a/b/3.png"), base::Time()));
+  }
+
+  // TODO(risan): expected_media_store_ needs to be set by the callers
+  // instead of here. It should be called by the callers for explicitness.
+  void ModifyDirectory(const base::FilePath& path, base::Time ctime) {
+    expected_media_store_[GetAndroidPath(path, temp_dir_.GetPath(),
+                                         android_dir_)] = base::Time();
+    file_util_.SetLastChangeTime(path, ctime);
+  }
+
+  void ModifyFile(const base::FilePath& path, base::Time ctime) {
+    expected_media_store_[GetAndroidPath(path, temp_dir_.GetPath(),
+                                         android_dir_)] = ctime;
+    file_util_.SetLastChangeTime(path, ctime);
+  }
+
+  bool CreateFile(const base::FilePath& path, base::Time ctime) {
+    base::FilePath parent = path.DirName();
+    ModifyFile(path, ctime);
+    ModifyDirectory(parent, ctime);
+    return WriteFile(path, "42", sizeof("42")) == sizeof("42");
+  }
+
+  bool CreateDirectory(const base::FilePath& path, base::Time ctime) {
+    file_util_.SetLastChangeTime(path, ctime);
+    ModifyDirectory(path.DirName(), ctime);
+    return base::CreateDirectory(path);
+  }
+
+  bool RenameFile(const base::FilePath& old_path,
+                  const base::FilePath& new_path,
+                  base::Time ctime) {
+    DeleteFileRecursively(old_path, ctime);
+    return CreateFile(new_path, ctime);
+  }
+
+  bool RenameDirectory(const base::FilePath& old_path,
+                       const base::FilePath& new_path,
+                       base::Time ctime) {
+    base::FilePath android_old_path =
+        GetAndroidPath(old_path, temp_dir_.GetPath(), android_dir_);
+    base::FilePath android_new_path =
+        GetAndroidPath(new_path, temp_dir_.GetPath(), android_dir_);
+
+    // Collect all files to be renamed recursively under the |old_path|.
+    std::vector<base::FilePath> to_be_renamed = {android_old_path};
+    for (const auto& entry : expected_media_store_) {
+      if (android_old_path.IsParent(entry.first)) {
+        to_be_renamed.push_back(entry.first);
+      }
+    }
+
+    // Update media store index for all files under |old_path| to be under the
+    // |new_path|.
+    for (const auto& to_be_renamed_path : to_be_renamed) {
+      base::FilePath path = android_new_path;
+      android_old_path.AppendRelativePath(to_be_renamed_path, &path);
+      expected_media_store_[path] = expected_media_store_[to_be_renamed_path];
+      expected_media_store_.erase(to_be_renamed_path);
+    }
+
+    // Set the ctime accordingly.
+    file_util_.SetLastChangeTime(new_path, ctime);
+    ModifyDirectory(new_path.DirName(), ctime);
+    return Move(old_path, new_path);
+  }
+
+  bool DeleteFileRecursively(const base::FilePath& path, base::Time ctime) {
+    base::FilePath android_path =
+        GetAndroidPath(path, temp_dir_.GetPath(), android_dir_);
+
+    // Collect all files to be removed recursively under the |path|.
+    std::vector<base::FilePath> to_be_removed = {android_path};
+    for (const auto& entry : expected_media_store_) {
+      if (android_path.IsParent(entry.first)) {
+        to_be_removed.push_back(entry.first);
+      }
+    }
+
+    // Update media store index to remove the collected files.
+    for (const auto& to_be_removed_path : to_be_removed) {
+      expected_media_store_.erase(to_be_removed_path);
+    }
+
+    // Set the ctime accordingly.
+    ModifyDirectory(path.DirName(), ctime);
+    return base::DeleteFileRecursively(path);
+  }
+
+  std::unique_ptr<TestingProfileManager> profile_manager_;
+  ArcBridgeService arc_bridge_service_;
+  base::FilePath android_dir_;
+  base::ScopedTempDir temp_dir_;
+  std::unique_ptr<FileSystemScanner> file_system_scanner_;
+  content::BrowserTaskEnvironment task_environment_;
+  FakeFileSystemInstance file_system_instance_;
+  std::unique_ptr<ArcFileSystemBridge> arc_file_system_bridge_;
+  std::unique_ptr<TestingProfile> profile_;
+  FileUtil file_util_;
+  std::map<base::FilePath, base::Time> expected_media_store_;
+};
+
+TEST_F(ArcFileSystemScannerTest, ScheduleFullScan) {
+  file_system_scanner_->ScheduleFullScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanCreateTopLevelFile) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::Time now = base::Time::Now();
+  base::FilePath dir = temp_dir_.GetPath();
+
+  // Test if the scanner catches creation of top level files.
+  ASSERT_TRUE(CreateFile(dir.AppendASCII("foo.png"), now));
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanCreateTopLevelDirectory) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::Time now = base::Time::Now();
+  base::FilePath dir = temp_dir_.GetPath();
+
+  // Test if the scanner catches creation of top level directories.
+  ASSERT_TRUE(CreateDirectory(dir.AppendASCII("foo"), now));
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanModifyTopLevelFile) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::Time now = base::Time::Now();
+  base::FilePath dir = temp_dir_.GetPath();
+
+  // Test if the scanner catches creation of top level files.
+  ModifyFile(dir.AppendASCII("1.png"), now);
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanModifyTopLevelDirectory) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::Time now = base::Time::Now();
+  base::FilePath dir = temp_dir_.GetPath();
+
+  // Test if the scanner catches creation of top level files.
+  ModifyDirectory(dir.AppendASCII("a"), now);
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanRenameTopLevelFile) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::Time now = base::Time::Now();
+  base::FilePath dir = temp_dir_.GetPath();
+
+  // Test if the scanner catches creation of top level files.
+  ASSERT_TRUE(
+      RenameFile(dir.AppendASCII("1.png"), dir.AppendASCII("foo.jpg"), now));
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanRenameTopLevelDirectory) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::Time now = base::Time::Now();
+  base::FilePath dir = temp_dir_.GetPath();
+
+  // Test if the scanner catches creation of top level files.
+  ASSERT_TRUE(
+      RenameDirectory(dir.AppendASCII("a"), dir.AppendASCII("foo"), now));
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanDeleteTopLevelFile) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::FilePath dir = temp_dir_.GetPath();
+  base::Time now = base::Time::Now();
+
+  // Test if the scanner catches when top level files are deleted.
+  ASSERT_TRUE(DeleteFileRecursively(dir.AppendASCII("1.png"), now));
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanDeleteTopLevelDirectory) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::FilePath dir = temp_dir_.GetPath();
+  base::Time now = base::Time::Now();
+
+  // Test if the scanner catches when top level files are deleted.
+  ASSERT_TRUE(DeleteFileRecursively(dir.AppendASCII("a"), now));
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanCreateNestedFile) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::Time now = base::Time::Now();
+  base::FilePath dir = temp_dir_.GetPath();
+
+  // Test if the scanner catches creation of top level files.
+  ASSERT_TRUE(CreateFile(dir.AppendASCII("a/foo.png"), now));
+  ASSERT_TRUE(CreateFile(dir.AppendASCII("a/b/bar.png"), now));
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanCreateNestedDirectory) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::Time now = base::Time::Now();
+  base::FilePath dir = temp_dir_.GetPath();
+
+  // Test if the scanner catches creation of top level files.
+  ASSERT_TRUE(CreateDirectory(dir.AppendASCII("a/foo"), now));
+  ASSERT_TRUE(CreateDirectory(dir.AppendASCII("a/b/bar"), now));
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanRenameNestedFile) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::Time now = base::Time::Now();
+  base::FilePath dir = temp_dir_.GetPath();
+
+  // Test if the scanner catches creation of top level files.
+  ASSERT_TRUE(RenameFile(dir.AppendASCII("a/2.png"),
+                         dir.AppendASCII("a/foo.jpg"), now));
+  ASSERT_TRUE(RenameFile(dir.AppendASCII("a/b/3.png"),
+                         dir.AppendASCII("a/b/bar.jpg"), now));
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanRenameNestedDirectory) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::Time now = base::Time::Now();
+  base::FilePath dir = temp_dir_.GetPath();
+
+  // Test if the scanner catches creation of top level files.
+  ASSERT_TRUE(
+      RenameDirectory(dir.AppendASCII("a/b"), dir.AppendASCII("a/foo"), now));
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanModifyNestedFile) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::Time now = base::Time::Now();
+  base::FilePath dir = temp_dir_.GetPath();
+
+  // Test if the scanner catches creation of top level files.
+  ModifyFile(dir.AppendASCII("a/2.png"), now);
+  ModifyFile(dir.AppendASCII("a/b/3.png"), now);
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanModifyNestedDirectory) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::Time now = base::Time::Now();
+  base::FilePath dir = temp_dir_.GetPath();
+
+  // Test if the scanner catches creation of top level files.
+  ModifyDirectory(dir.AppendASCII("a/b"), now);
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanDeleteNestedFile) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::FilePath dir = temp_dir_.GetPath();
+  base::Time now = base::Time::Now();
+
+  // Test if the scanner catches when top level files are deleted.
+  ASSERT_TRUE(DeleteFileRecursively(dir.AppendASCII("a/2.png"), now));
+  ASSERT_TRUE(DeleteFileRecursively(dir.AppendASCII("a/b/3.png"), now));
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanDeleteNestedDirectory) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+  // EXPECT_NE(expected_media_store_, file_system_instance_.GetMediaStore());
+  base::FilePath dir = temp_dir_.GetPath();
+  base::Time now = base::Time::Now();
+
+  // Test if the scanner catches when top level files are deleted.
+  ASSERT_TRUE(DeleteFileRecursively(dir.AppendASCII("a/b"), now));
+
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+TEST_F(ArcFileSystemScannerTest, ScheduleRegularScanNoChange) {
+  file_system_instance_.SetMediaStore(expected_media_store_);
+
+  base::Time now = base::Time::Now();
+
+  // Test if the scanner works as intended when there are no file system
+  // events.
+  file_system_scanner_->previous_scan_time_ = now;
+  file_system_scanner_->ScheduleRegularScan();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(expected_media_store_, file_system_instance_.GetMediaStore());
+}
+
+}  // namespace arc
diff --git a/chrome/browser/chromeos/arc/intent_helper/arc_settings_service.cc b/chrome/browser/chromeos/arc/intent_helper/arc_settings_service.cc
index 552f3f9..0f160fb9 100644
--- a/chrome/browser/chromeos/arc/intent_helper/arc_settings_service.cc
+++ b/chrome/browser/chromeos/arc/intent_helper/arc_settings_service.cc
@@ -40,7 +40,6 @@
 #include "components/arc/arc_prefs.h"
 #include "components/arc/arc_util.h"
 #include "components/arc/intent_helper/arc_intent_helper_bridge.h"
-#include "components/arc/intent_helper/font_size_util.h"
 #include "components/arc/mojom/backup_settings.mojom.h"
 #include "components/arc/mojom/pip.mojom.h"
 #include "components/arc/session/arc_bridge_service.h"
@@ -66,6 +65,8 @@
 
 constexpr char kArcProxyBypassListDelimiter[] = ",";
 
+constexpr float kAndroidFontScaleNormal = 1;
+
 bool GetHttpProxyServer(const ProxyConfigDictionary* proxy_config_dict,
                         std::string* host,
                         int* port) {
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
index c075b34..7f3ce8a 100644
--- a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
@@ -427,15 +427,7 @@
   status_uploader_.reset(new StatusUploader(
       client(),
       std::make_unique<DeviceStatusCollector>(
-          local_state_, chromeos::system::StatisticsProvider::GetInstance(),
-          DeviceStatusCollector::VolumeInfoFetcher(),
-          DeviceStatusCollector::CPUStatisticsFetcher(),
-          DeviceStatusCollector::CPUTempFetcher(),
-          DeviceStatusCollector::AndroidStatusFetcher(),
-          DeviceStatusCollector::TpmStatusFetcher(),
-          DeviceStatusCollector::EMMCLifetimeFetcher(),
-          DeviceStatusCollector::StatefulPartitionInfoFetcher(),
-          DeviceStatusCollector::CrosHealthdDataFetcher()),
+          local_state_, chromeos::system::StatisticsProvider::GetInstance()),
       task_runner_, kDeviceStatusUploadFrequency));
 }
 
diff --git a/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc b/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc
index 967d4ab..87c4dee 100644
--- a/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc
+++ b/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc
@@ -945,6 +945,21 @@
       pref_service_, prefs::kDeviceActivityTimes);
 }
 
+DeviceStatusCollector::DeviceStatusCollector(
+    PrefService* pref_service,
+    chromeos::system::StatisticsProvider* provider)
+    : DeviceStatusCollector(
+          pref_service,
+          provider,
+          DeviceStatusCollector::VolumeInfoFetcher(),
+          DeviceStatusCollector::CPUStatisticsFetcher(),
+          DeviceStatusCollector::CPUTempFetcher(),
+          DeviceStatusCollector::AndroidStatusFetcher(),
+          DeviceStatusCollector::TpmStatusFetcher(),
+          DeviceStatusCollector::EMMCLifetimeFetcher(),
+          DeviceStatusCollector::StatefulPartitionInfoFetcher(),
+          DeviceStatusCollector::CrosHealthdDataFetcher()) {}
+
 DeviceStatusCollector::~DeviceStatusCollector() {
   power_manager_->RemoveObserver(this);
 }
diff --git a/chrome/browser/chromeos/policy/status_collector/device_status_collector.h b/chrome/browser/chromeos/policy/status_collector/device_status_collector.h
index 9af5e63..4d4d7c95 100644
--- a/chrome/browser/chromeos/policy/status_collector/device_status_collector.h
+++ b/chrome/browser/chromeos/policy/status_collector/device_status_collector.h
@@ -177,6 +177,13 @@
       const EMMCLifetimeFetcher& emmc_lifetime_fetcher,
       const StatefulPartitionInfoFetcher& stateful_partition_info_fetcher,
       const CrosHealthdDataFetcher& cros_healthd_data_fetcher);
+
+  // Constructor with default callbacks. These callbacks are always executed on
+  // Blocking Pool. Caller is responsible for passing already initialized
+  // |pref_service|.
+  DeviceStatusCollector(PrefService* pref_service,
+                        chromeos::system::StatisticsProvider* provider);
+
   ~DeviceStatusCollector() override;
 
   // StatusCollector:
diff --git a/chrome/browser/chromeos/policy/status_uploader_unittest.cc b/chrome/browser/chromeos/policy/status_uploader_unittest.cc
index 03ed4c68..574dfd7f 100644
--- a/chrome/browser/chromeos/policy/status_uploader_unittest.cc
+++ b/chrome/browser/chromeos/policy/status_uploader_unittest.cc
@@ -56,18 +56,7 @@
 class MockDeviceStatusCollector : public policy::DeviceStatusCollector {
  public:
   explicit MockDeviceStatusCollector(PrefService* local_state)
-      : DeviceStatusCollector(
-            local_state,
-            nullptr,
-            policy::DeviceStatusCollector::VolumeInfoFetcher(),
-            policy::DeviceStatusCollector::CPUStatisticsFetcher(),
-            policy::DeviceStatusCollector::CPUTempFetcher(),
-            policy::DeviceStatusCollector::AndroidStatusFetcher(),
-            policy::DeviceStatusCollector::TpmStatusFetcher(),
-            policy::DeviceStatusCollector::EMMCLifetimeFetcher(),
-            policy::DeviceStatusCollector::StatefulPartitionInfoFetcher(),
-            policy::DeviceStatusCollector::CrosHealthdDataFetcher()) {}
-
+      : DeviceStatusCollector(local_state, nullptr) {}
   MOCK_METHOD1(GetStatusAsync, void(const policy::StatusCollectorCallback&));
 
   MOCK_METHOD0(OnSubmittedSuccessfully, void());
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
index ad115513..36919752 100644
--- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -3072,6 +3072,55 @@
             1);
 }
 
+// Regression test for http://crbug.com/996940. Requests that redirected to an
+// appcache handled URL could have request ID collisions.
+IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, RedirectToAppCacheRequest) {
+  embedded_test_server()->ServeFilesFromSourceDirectory("content/test/data");
+  ASSERT_TRUE(StartEmbeddedTestServer());
+
+  GURL main_url = embedded_test_server()->GetURL(
+      "/appcache/simple_page_with_manifest.html");
+
+  base::string16 expected_title = base::ASCIIToUTF16("AppCache updated");
+
+  // Load the main page first to make sure it is cached. After the first
+  // navigation, load the extension, then navigate again.
+  EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), main_url));
+  content::TitleWatcher title_watcher(
+      browser()->tab_strip_model()->GetActiveWebContents(), expected_title);
+  EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+
+  TestExtensionDir test_dir;
+  test_dir.WriteManifest(R"({
+        "name": "Web Request Appcache Redirect Test",
+        "manifest_version": 2,
+        "version": "0.1",
+        "background": { "scripts": ["background.js"] },
+        "permissions": ["<all_urls>", "webRequest"]
+      })");
+  test_dir.WriteFile(FILE_PATH_LITERAL("background.js"), R"(
+        window.numErrors = 0;
+        chrome.webRequest.onErrorOccurred.addListener(function(details) {
+          window.numErrors++;
+        }, {urls: ['<all_urls>']});
+
+        chrome.test.sendMessage('ready');
+      )");
+
+  ExtensionTestMessageListener listener("ready", false);
+  const Extension* extension = LoadExtension(test_dir.UnpackedPath());
+  ASSERT_TRUE(extension);
+  EXPECT_TRUE(listener.WaitUntilSatisfied());
+
+  // This navigation should go through appcache.
+  EXPECT_TRUE(ui_test_utils::NavigateToURL(
+      browser(),
+      embedded_test_server()->GetURL("/server-redirect?" + main_url.spec())));
+
+  EXPECT_EQ(
+      GetCountFromBackgroundPage(extension, profile(), "window.numErrors"), 0);
+}
+
 // Regression test for https://crbug.com/1019614.
 IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, HSTSUpgradeAfterRedirect) {
   net::EmbeddedTestServer https_test_server(
diff --git a/chrome/browser/extensions/forced_extensions/installation_tracker.cc b/chrome/browser/extensions/forced_extensions/installation_tracker.cc
index 8ca32cc2..2852478 100644
--- a/chrome/browser/extensions/forced_extensions/installation_tracker.cc
+++ b/chrome/browser/extensions/forced_extensions/installation_tracker.cc
@@ -35,7 +35,8 @@
       pref_service_(profile->GetPrefs()),
       start_time_(base::Time::Now()),
       timer_(std::move(timer)) {
-  observer_.Add(registry_);
+  registry_observer_.Add(registry_);
+  reporter_observer_.Add(InstallationReporter::Get(profile_));
   pref_change_registrar_.Init(pref_service_);
   pref_change_registrar_.Add(
       pref_names::kInstallForceList,
@@ -132,7 +133,8 @@
 }
 
 void InstallationTracker::OnShutdown(ExtensionRegistry*) {
-  observer_.RemoveAll();
+  registry_observer_.RemoveAll();
+  reporter_observer_.RemoveAll();
   pref_change_registrar_.RemoveAll();
   timer_->Stop();
 }
@@ -237,7 +239,8 @@
   }
   reported_ = true;
   InstallationReporter::Get(profile_)->Clear();
-  observer_.RemoveAll();
+  registry_observer_.RemoveAll();
+  reporter_observer_.RemoveAll();
   pref_change_registrar_.RemoveAll();
   timer_->Stop();
 }
diff --git a/chrome/browser/extensions/forced_extensions/installation_tracker.h b/chrome/browser/extensions/forced_extensions/installation_tracker.h
index 714241d1..6053d414 100644
--- a/chrome/browser/extensions/forced_extensions/installation_tracker.h
+++ b/chrome/browser/extensions/forced_extensions/installation_tracker.h
@@ -121,7 +121,10 @@
   // Tracks whether stats were already reported for the session.
   bool reported_ = false;
 
-  ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> observer_{this};
+  ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
+      registry_observer_{this};
+  ScopedObserver<InstallationReporter, InstallationReporter::Observer>
+      reporter_observer_{this};
 
   // Tracks installation reporting timeout.
   std::unique_ptr<base::OneShotTimer> timer_;
diff --git a/chrome/browser/extensions/forced_extensions/installation_tracker_unittest.cc b/chrome/browser/extensions/forced_extensions/installation_tracker_unittest.cc
index 801fc048..0d85f11 100644
--- a/chrome/browser/extensions/forced_extensions/installation_tracker_unittest.cc
+++ b/chrome/browser/extensions/forced_extensions/installation_tracker_unittest.cc
@@ -165,8 +165,9 @@
       kExtensionId2,
       InstallationReporter::FailureReason::CRX_INSTALL_ERROR_OTHER,
       CrxInstallErrorDetail::UNEXPECTED_ID);
-  EXPECT_TRUE(fake_timer_->IsRunning());
-  fake_timer_->Fire();
+  // InstallationTracker shuts down timer because all extension are either
+  // loaded or failed.
+  EXPECT_FALSE(fake_timer_->IsRunning());
   histogram_tester_.ExpectTotalCount(kLoadTimeStats, 0);
   histogram_tester_.ExpectUniqueSample(kTimedOutStats, 2, 1);
   histogram_tester_.ExpectUniqueSample(kTimedOutNotInstalledStats, 2, 1);
diff --git a/chrome/browser/installedapp/installed_app_provider_unittest.cc b/chrome/browser/installedapp/installed_app_provider_unittest.cc
new file mode 100644
index 0000000..c8c5288
--- /dev/null
+++ b/chrome/browser/installedapp/installed_app_provider_unittest.cc
@@ -0,0 +1,196 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_android.h"
+#include "chrome/android/native_j_unittests_jni_headers/InstalledAppProviderTest_jni.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using base::android::AttachCurrentThread;
+
+class InstalledAppProviderTest : public ::testing::Test {
+ public:
+  InstalledAppProviderTest() {
+    JNIEnv* env = AttachCurrentThread();
+    j_test_.Reset(Java_InstalledAppProviderTest_create(env));
+  }
+
+  void SetUp() override {
+    JNIEnv* env = AttachCurrentThread();
+    Java_InstalledAppProviderTest_setUp(env, j_test_);
+  }
+
+  const base::android::ScopedJavaGlobalRef<jobject>& j_test() {
+    return j_test_;
+  }
+
+ private:
+  base::android::ScopedJavaGlobalRef<jobject> j_test_;
+};
+
+TEST_F(InstalledAppProviderTest, TestOriginMissingParts) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testOriginMissingParts(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestIncognitoWithOneInstalledRelatedApp) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testIncognitoWithOneInstalledRelatedApp(
+      env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestNoRelatedApps) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testNoRelatedApps(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestOneRelatedAppNoId) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testOneRelatedAppNoId(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestOneRelatedNonAndroidApp) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testOneRelatedNonAndroidApp(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestOneRelatedAppNotInstalled) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testOneRelatedAppNotInstalled(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest,
+       TestOneRelatedAppBrokenAssetStatementsResource) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testOneRelatedAppBrokenAssetStatementsResource(
+      env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestOneRelatedAppNoAssetStatements) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testOneRelatedAppNoAssetStatements(env,
+                                                                   j_test());
+}
+
+TEST_F(InstalledAppProviderTest,
+       TestOneRelatedAppNoAssetStatementsNullMetadata) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testOneRelatedAppNoAssetStatementsNullMetadata(
+      env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestOneRelatedAppRelatedToDifferentOrigins) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testOneRelatedAppRelatedToDifferentOrigins(
+      env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestOneInstalledRelatedApp) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testOneInstalledRelatedApp(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestDynamicallyChangingUrl) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testDynamicallyChangingUrl(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestInstalledRelatedAppWithUrl) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testInstalledRelatedAppWithUrl(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestMultipleAssetStatements) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testMultipleAssetStatements(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestAssetStatementSyntaxError) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testAssetStatementSyntaxError(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestAssetStatementNotArray) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testAssetStatementNotArray(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestAssetStatementArrayNoObjects) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testAssetStatementArrayNoObjects(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestAssetStatementNoRelation) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testAssetStatementNoRelation(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestAssetStatementNonStandardRelation) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testAssetStatementNonStandardRelation(env,
+                                                                      j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestAssetStatementNoTarget) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testAssetStatementNoTarget(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestAssetStatementNoNamespace) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testAssetStatementNoNamespace(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestNonWebAssetStatement) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testNonWebAssetStatement(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestAssetStatementNoSite) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testAssetStatementNoSite(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestAssetStatementSiteSyntaxError) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testAssetStatementSiteSyntaxError(env,
+                                                                  j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestAssetStatementSiteMissingParts) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testAssetStatementSiteMissingParts(env,
+                                                                   j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestAssetStatementSiteHasPath) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testAssetStatementSiteHasPath(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestExtraInstalledApp) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testExtraInstalledApp(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestMultipleInstalledRelatedApps) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testMultipleInstalledRelatedApps(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestArtificialDelay) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testArtificialDelay(env, j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestMultipleAppsIncludingInstantApps) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testMultipleAppsIncludingInstantApps(env,
+                                                                     j_test());
+}
+
+TEST_F(InstalledAppProviderTest, TestRelatedAppsOverAllowedThreshold) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_InstalledAppProviderTest_testRelatedAppsOverAllowedThreshold(env,
+                                                                    j_test());
+}
diff --git a/chrome/browser/media/router/providers/cast/cast_session_tracker.cc b/chrome/browser/media/router/providers/cast/cast_session_tracker.cc
index 0e2553f..e624c3a 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_tracker.cc
+++ b/chrome/browser/media/router/providers/cast/cast_session_tracker.cc
@@ -183,7 +183,7 @@
   for (auto& media : media_list) {
     const base::Value* media_session_id_value =
         media.FindKeyOfType("mediaSessionId", base::Value::Type::INTEGER);
-    if (!media_session_id_value)
+    if (!media_session_id_value || media.FindKey("media"))
       continue;
 
     auto session_media_it = std::find_if(
diff --git a/chrome/browser/media/router/providers/cast/cast_session_tracker.h b/chrome/browser/media/router/providers/cast/cast_session_tracker.h
index bd744b5..1b4017f 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_tracker.h
+++ b/chrome/browser/media/router/providers/cast/cast_session_tracker.h
@@ -110,6 +110,8 @@
                            HandleMediaStatusMessageFancy);
   FRIEND_TEST_ALL_PREFIXES(CastSessionTrackerTest,
                            CopySavedMediaFieldsToMediaList);
+  FRIEND_TEST_ALL_PREFIXES(CastSessionTrackerTest,
+                           DoNotCopySavedMediaFieldsWhenFieldPresent);
 };
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/cast_session_tracker_unittest.cc b/chrome/browser/media/router/providers/cast/cast_session_tracker_unittest.cc
index 1bf1e217..ce1525c 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_tracker_unittest.cc
+++ b/chrome/browser/media/router/providers/cast/cast_session_tracker_unittest.cc
@@ -7,6 +7,7 @@
 #include "base/test/values_test_util.h"
 #include "chrome/browser/media/router/test/test_helper.h"
 #include "chrome/common/media_router/test/test_helper.h"
+#include "components/cast_channel/cast_message_util.h"
 #include "components/cast_channel/cast_test_util.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -15,7 +16,9 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 using base::test::IsJson;
-using base::test::ParseJsonDeprecated;
+using base::test::ParseJson;
+using cast_channel::kMediaNamespace;
+using cast_channel::kReceiverNamespace;
 using testing::_;
 using testing::ByRef;
 using testing::Eq;
@@ -98,8 +101,8 @@
     session_tracker_.OnInternalMessage(
         sink_.cast_data().cast_channel_id,
         cast_channel::InternalMessage(
-            cast_channel::CastMessageType::kReceiverStatus, "theNamespace",
-            std::move(*ParseJsonDeprecated(kReceiverStatus))));
+            cast_channel::CastMessageType::kReceiverStatus, kReceiverNamespace,
+            ParseJson(kReceiverStatus)));
 
     session_ = session_tracker_.GetSessions().begin()->second.get();
     ASSERT_TRUE(session_);
@@ -144,8 +147,8 @@
   session_tracker_.OnInternalMessage(
       sink_.cast_data().cast_channel_id,
       cast_channel::InternalMessage(
-          cast_channel::CastMessageType::kReceiverStatus, "theNamespace",
-          std::move(*ParseJsonDeprecated(kIdleReceiverStatus))));
+          cast_channel::CastMessageType::kReceiverStatus, kReceiverNamespace,
+          ParseJson(kIdleReceiverStatus)));
 }
 
 TEST_F(CastSessionTrackerTest, GetSessions) {
@@ -192,8 +195,7 @@
   session_tracker_.OnInternalMessage(
       sink_.cast_data().cast_channel_id,
       cast_channel::InternalMessage(cast_channel::CastMessageType::kMediaStatus,
-                                    "theNamespace",
-                                    std::move(*ParseJsonDeprecated(R"({
+                                    kMediaNamespace, ParseJson(R"({
     "status": [{
         "playerState": "anything but IDLE",
         "supportedMediaRequests": 0,
@@ -201,7 +203,7 @@
         "playerState": "IDLE",
       },
     ],
-  })"))));
+  })")));
 
   // Check that the stored media value is the same as the 'status' field in the
   // outgoing message.
@@ -248,8 +250,7 @@
   session_tracker_.OnInternalMessage(
       sink_.cast_data().cast_channel_id,
       cast_channel::InternalMessage(cast_channel::CastMessageType::kMediaStatus,
-                                    "theNamespace",
-                                    std::move(*ParseJsonDeprecated(R"({
+                                    kMediaNamespace, ParseJson(R"({
     "requestId": 12345,
     "status": [{
         "playerState": "anything but IDLE",
@@ -260,7 +261,7 @@
       },
     ],
     "xyzzy": "xyzzyValue2",
-  })"))));
+  })")));
 
   // Check that the stored media value is the same as the 'status' field in the
   // outgoing message.
@@ -280,8 +281,7 @@
   session_tracker_.OnInternalMessage(
       sink_.cast_data().cast_channel_id,
       cast_channel::InternalMessage(cast_channel::CastMessageType::kMediaStatus,
-                                    "theNamespace",
-                                    std::move(*ParseJsonDeprecated(R"({
+                                    kMediaNamespace, ParseJson(R"({
     "status": [{
         "media": "theMedia",
         "mediaSessionId": 345,
@@ -290,7 +290,7 @@
         "xyzzy": "xyzzy1",
       },
     ],
-  })"))));
+  })")));
 
   // Check that the stored media value is what we expected.
   ASSERT_THAT(*session_->value().FindKey("media"), IsJson(R"([{
@@ -327,8 +327,7 @@
   session_tracker_.OnInternalMessage(
       sink_.cast_data().cast_channel_id,
       cast_channel::InternalMessage(cast_channel::CastMessageType::kMediaStatus,
-                                    "theNamespace",
-                                    std::move(*ParseJsonDeprecated(R"({
+                                    kMediaNamespace, ParseJson(R"({
     "status": [{
         "mediaSessionId": 345,
         "playerState": "anything but IDLE",
@@ -336,7 +335,7 @@
         "xyzzy": "xyzzy2",
       },
     ],
-  })"))));
+  })")));
 
   // Check that the stored media value is the same as the 'status' field in the
   // outgoing message.
@@ -350,4 +349,49 @@
   }])"));
 }
 
+TEST_F(CastSessionTrackerTest, DoNotCopySavedMediaFieldsWhenFieldPresent) {
+  AddSinkAndSendReceiverStatusResponse();
+
+  // Add media status information to the session with mediaSessionId = 345.
+  session_tracker_.OnInternalMessage(
+      sink_.cast_data().cast_channel_id,
+      cast_channel::InternalMessage(cast_channel::CastMessageType::kMediaStatus,
+                                    kMediaNamespace, ParseJson(R"({
+    "status": [{
+        "media": "oldMedia",
+        "mediaSessionId": 345,
+        "playerState": "anything but IDLE",
+        "supportedMediaRequests": 0,
+        "xyzzy": "xyzzy1",
+      },
+    ],
+  })")));
+
+  // Receive a message referring to the previously stored mediaSessionId with a
+  // new 'media' value.
+  session_tracker_.OnInternalMessage(
+      sink_.cast_data().cast_channel_id,
+      cast_channel::InternalMessage(cast_channel::CastMessageType::kMediaStatus,
+                                    kMediaNamespace, ParseJson(R"({
+    "status": [{
+        "media": "newMedia",
+        "mediaSessionId": 345,
+        "playerState": "anything but IDLE",
+        "supportedMediaRequests": 0,
+        "xyzzy": "xyzzy2",
+      },
+    ],
+  })")));
+
+  // Check that 'media' field has the new value rather than the cached value.
+  EXPECT_THAT(*session_->value().FindKey("media"), IsJson(R"([{
+    "media": "newMedia",
+    "mediaSessionId": 345,
+    "playerState": "anything but IDLE",
+    "sessionId": "theSessionId",
+    "supportedMediaRequests": [],
+    "xyzzy": "xyzzy2",
+  }])"));
+}
+
 }  // namespace media_router
diff --git a/chrome/browser/navigation_predictor/navigation_predictor_preconnect_client_browsertest.cc b/chrome/browser/navigation_predictor/navigation_predictor_preconnect_client_browsertest.cc
index e4547f1..93982a0 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor_preconnect_client_browsertest.cc
+++ b/chrome/browser/navigation_predictor/navigation_predictor_preconnect_client_browsertest.cc
@@ -285,13 +285,9 @@
 };
 
 // TODO(https://crbug.com/1039813): Test fails consistently on MacOS 10.13
-#if defined(OS_MACOSX)
-#define MAYBE_PreconnectSearchWithFeature DISABLED_PreconnectSearchWithFeature
-#else
-#define MAYBE_PreconnectSearchWithFeature PreconnectSearchWithFeature
-#endif
+// TODO(https://crbug.com/1040153): Test fails consistently on Win 7 as well.
 IN_PROC_BROWSER_TEST_F(NavigationPredictorPreconnectClientBrowserTestWithSearch,
-                       MAYBE_PreconnectSearchWithFeature) {
+                       DISABLED_PreconnectSearchWithFeature) {
   static const char kShortName[] = "test";
   static const char kSearchURL[] =
       "/anchors_different_area.html?q={searchTerms}";
diff --git a/chrome/browser/notifications/scheduler/notification_schedule_service_factory.cc b/chrome/browser/notifications/scheduler/notification_schedule_service_factory.cc
index 7ad74b9..eca323e 100644
--- a/chrome/browser/notifications/scheduler/notification_schedule_service_factory.cc
+++ b/chrome/browser/notifications/scheduler/notification_schedule_service_factory.cc
@@ -23,18 +23,22 @@
 #include "chrome/browser/notifications/scheduler/display_agent_android.h"
 #include "chrome/browser/notifications/scheduler/notification_background_task_scheduler_android.h"
 #include "chrome/browser/updates/update_notification_client.h"
+#include "chrome/browser/updates/update_notification_service_factory.h"
 #endif  // defined(OS_ANDROID)
 
 namespace {
 std::unique_ptr<notifications::NotificationSchedulerClientRegistrar>
-RegisterClients() {
+RegisterClients(content::BrowserContext* context) {
   auto client_registrar =
       std::make_unique<notifications::NotificationSchedulerClientRegistrar>();
   // TODO(xingliu): Register clients here.
 #if defined(OS_ANDROID)
   // Register UpdateNotificationClient.
+  auto update_notification_service_callback = base::BindRepeating(
+      &UpdateNotificationServiceFactory::GetForBrowserContext, context);
   auto chrome_update_client =
-      std::make_unique<updates::UpdateNotificationClient>();
+      std::make_unique<updates::UpdateNotificationClient>(
+          std::move(update_notification_service_callback));
   client_registrar->RegisterClient(
       notifications::SchedulerClientType::kChromeUpdate,
       std::move(chrome_update_client));
@@ -72,7 +76,7 @@
   auto* profile = Profile::FromBrowserContext(context);
   base::FilePath storage_dir =
       profile->GetPath().Append(chrome::kNotificationSchedulerStorageDirname);
-  auto client_registrar = RegisterClients();
+  auto client_registrar = RegisterClients(context);
 #if defined(OS_ANDROID)
   auto display_agent = std::make_unique<DisplayAgentAndroid>();
   auto background_task_scheduler =
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
index 81f3c2a9..20199b34 100644
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -506,21 +506,41 @@
     static List<String> createDeprecatedKeysForTesting() {
         // clang-format off
         return Arrays.asList(
+                "PhysicalWeb.ActivityReferral",
+                "PhysicalWeb.HasDeferredMetrics",
+                "PhysicalWeb.OptIn.DeclineButtonPressed",
+                "PhysicalWeb.OptIn.EnableButtonPressed",
+                "PhysicalWeb.Prefs.FeatureDisabled",
+                "PhysicalWeb.Prefs.FeatureEnabled",
+                "PhysicalWeb.Prefs.LocationDenied",
+                "PhysicalWeb.Prefs.LocationGranted",
+                "PhysicalWeb.ResolveTime.Background",
+                "PhysicalWeb.ResolveTime.Foreground",
+                "PhysicalWeb.ResolveTime.Refresh",
+                "PhysicalWeb.State",
+                "PhysicalWeb.TotalUrls.OnInitialDisplay",
+                "PhysicalWeb.TotalUrls.OnRefresh",
+                "PhysicalWeb.UrlSelected",
                 "PrefMigrationVersion",
                 "allow_low_end_device_ui",
                 "allow_starting_service_manager_only",
                 "bookmark_search_history",
+                "cellular_experiment",
                 "chrome_home_enabled_date",
                 "chrome_home_info_promo_shown",
                 "chrome_home_opt_out_snackbar_shown",
                 "chrome_home_user_enabled",
                 "chrome_modern_design_enabled",
                 "click_to_call_open_dialer_directly",
+                "crash_dump_upload",
+                "crash_dump_upload_no_cellular",
                 "home_page_button_force_enabled",
                 "homepage_tile_enabled",
                 "inflate_toolbar_on_background_thread",
                 "ntp_button_enabled",
                 "ntp_button_variant",
+                "physical_web",
+                "physical_web_sharing",
                 "sole_integration_enabled",
                 "tab_persistent_store_task_runner_enabled",
                 "webapk_number_of_uninstalls",
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.js b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.js
index 7a55a35..3f3fd2b 100644
--- a/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.js
+++ b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.js
@@ -328,7 +328,7 @@
      * This is stored ID of currently focused element to restore id on returns
      * to this dialog from Language / Timezone Selection dialogs.
      */
-    focusedElement_: 'languageSelectionButton',
+    focusedElement_: 'welcomeNextButton',
 
     onLanguageClicked_: function() {
       this.focusedElement_ = 'languageSelectionButton';
diff --git a/chrome/browser/resources/hangout_services/manifest.json b/chrome/browser/resources/hangout_services/manifest.json
index 166d0ed..a474e9f 100644
--- a/chrome/browser/resources/hangout_services/manifest.json
+++ b/chrome/browser/resources/hangout_services/manifest.json
@@ -5,7 +5,7 @@
   "name": "Google Hangouts",
   // Note: Always update the version number when this file is updated. Chrome
   // triggers extension preferences update on the version increase.
-  "version": "1.3.14",
+  "version": "1.3.15",
   "manifest_version": 2,
   "externally_connectable": {
     "matches": [
diff --git a/chrome/browser/resources/hangout_services/thunk.js b/chrome/browser/resources/hangout_services/thunk.js
index 061dca0..a619ce98 100644
--- a/chrome/browser/resources/hangout_services/thunk.js
+++ b/chrome/browser/resources/hangout_services/thunk.js
@@ -232,9 +232,14 @@
     if (method == 'chooseDesktopMedia') {
       const sources = message['sources'];
       let cancelId = null;
-      if (port.sender.tab) {
+      const tab = port.sender.tab;
+      if (tab) {
+        // Per crbug.com/425344, in order to allow an <iframe> on a different
+        // domain, to get desktop media, we need to set the tab.url to match
+        // the <iframe>, even though it doesn't really load the new url.
+        tab.url = port.sender.url;
         cancelId = chrome.desktopCapture.chooseDesktopMedia(
-            sources, port.sender.tab, sendResponse);
+            sources, tab, sendResponse);
       } else {
         const requestInfo = {};
         requestInfo['guestProcessId'] = port.sender.guestProcessId || 0;
@@ -246,7 +251,7 @@
       port.onDisconnect.addListener(function() {
         // This method has no effect if called after the user has selected a
         // desktop media source, so it does not need to be conditional.
-        if (port.sender.tab) {
+        if (tab) {
           chrome.desktopCapture.cancelChooseDesktopMedia(cancelId);
         } else {
           chrome.webrtcDesktopCapturePrivate.cancelChooseDesktopMedia(cancelId);
diff --git a/chrome/browser/resources/new_tab_page/theme_icon.html b/chrome/browser/resources/new_tab_page/theme_icon.html
index fbd4eff..9a133b45 100644
--- a/chrome/browser/resources/new_tab_page/theme_icon.html
+++ b/chrome/browser/resources/new_tab_page/theme_icon.html
@@ -10,7 +10,12 @@
     visibility: hidden;
   }
 
-  :host([selected]) #ring {
+  #checkMark {
+    visibility: hidden;
+  }
+
+  :host([selected]) #ring,
+  :host([selected]) #checkMark {
     visibility: visible;
   }
 
@@ -28,6 +33,14 @@
   #rightColor {
     stop-color: var(--ntp-theme-icon-frame-color);
   }
+
+  #checkMark circle {
+    fill: var(--google-blue-refresh-500);
+  }
+
+  #checkMark path {
+    fill: white;
+  }
 </style>
 <svg xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink">
@@ -38,7 +51,13 @@
       <stop id="rightColor" offset="100%"></stop>
     </linearGradient>
   </defs>
-  <!-- TODO(crbug.com/1032327): Add check mark when selected. -->
   <circle id="ring" cx="36" cy="36" r="36"></circle>
   <circle id="circle" cx="36" cy="36" r="32"></circle>
+  <g id="checkMark" transform="translate(48.5, 3.5)">
+    <circle cx="10" cy="10" r="10"></circle>
+    <path d="m 2.9885708,9.99721 5.0109458,4.98792 0.00275,-0.003
+        0.024151,0.0227 8.9741604,-9.01557 -1.431323,-1.42476 -7.5742214,7.6092
+        -3.6031671,-3.58665 z">
+    </path>
+  </g>
 </svg>
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
index 12e3c4a..1caac1f 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
@@ -283,6 +283,13 @@
     base::FilePath::StringType extension(path.FinalExtension());
     std::transform(extension.begin(), extension.end(), extension.begin(),
                    tolower);
+
+    // TODO: Replace this DCHECK with a static assert once std::is_sorted is
+    // constexpr in C++20.
+    DCHECK(std::is_sorted(
+        kSupportedDLPFileTypes.begin(), kSupportedDLPFileTypes.end(),
+        [](const base::FilePath::StringType& a,
+           const base::FilePath::StringType& b) { return a.compare(b) < 0; }));
     return std::binary_search(kSupportedDLPFileTypes.begin(),
                               kSupportedDLPFileTypes.end(), extension);
   }
@@ -583,9 +590,10 @@
 void DeepScanningDialogDelegate::UploadFileForDeepScanning(
     const base::FilePath& path,
     std::unique_ptr<BinaryUploadService::Request> request) {
-  DCHECK_EQ(
-      DlpDeepScanningClientRequest::FILE_UPLOAD,
-      request->deep_scanning_request().dlp_scan_request().content_source());
+  DCHECK(
+      !data_.do_dlp_scan ||
+      (DlpDeepScanningClientRequest::FILE_UPLOAD ==
+       request->deep_scanning_request().dlp_scan_request().content_source()));
   BinaryUploadService* upload_service =
       g_browser_process->safe_browsing_service()->GetBinaryUploadService(
           Profile::FromBrowserContext(web_contents_->GetBrowserContext()));
diff --git a/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc b/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc
index f43537e..fa0f2985 100644
--- a/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/sync/test/integration/sync_integration_test_util.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
 #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
+#include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/browser/bookmark_node.h"
 #include "components/policy/core/common/mock_configuration_policy_provider.h"
 #include "components/policy/core/common/policy_map.h"
@@ -56,6 +57,7 @@
 using bookmarks_helper::DeleteFaviconMappings;
 using bookmarks_helper::ExpireFavicon;
 using bookmarks_helper::GetBookmarkBarNode;
+using bookmarks_helper::GetBookmarkModel;
 using bookmarks_helper::GetManagedNode;
 using bookmarks_helper::GetOtherNode;
 using bookmarks_helper::GetSyncedBookmarksNode;
@@ -2144,6 +2146,38 @@
   ASSERT_EQ(initial_count + 2, CountAllBookmarks(1));
 }
 
+IN_PROC_BROWSER_TEST_P(TwoClientBookmarksSyncTest, ReorderChildren) {
+  const GURL google_url("http://www.google.com");
+  const GURL yahoo_url("http://www.yahoo.com");
+
+  ASSERT_TRUE(SetupClients());
+
+  ASSERT_NE(nullptr, AddURL(/*profile=*/0, /*index=*/0, "Google", google_url));
+  ASSERT_NE(nullptr, AddURL(/*profile=*/0, /*index=*/1, "Yahoo", yahoo_url));
+
+  ASSERT_TRUE(SetupSync());
+  ASSERT_TRUE(BookmarksMatchChecker().Wait());
+
+  ASSERT_EQ(2U, GetBookmarkBarNode(0)->children().size());
+  ASSERT_EQ(2U, GetBookmarkBarNode(1)->children().size());
+  ASSERT_EQ(google_url, GetBookmarkBarNode(0)->children().front()->url());
+  ASSERT_EQ(google_url, GetBookmarkBarNode(1)->children().front()->url());
+  ASSERT_EQ(yahoo_url, GetBookmarkBarNode(0)->children().back()->url());
+  ASSERT_EQ(yahoo_url, GetBookmarkBarNode(1)->children().back()->url());
+
+  GetBookmarkModel(0)->ReorderChildren(
+      GetBookmarkBarNode(0), {GetBookmarkBarNode(0)->children().back().get(),
+                              GetBookmarkBarNode(0)->children().front().get()});
+  EXPECT_TRUE(BookmarksMatchChecker().Wait());
+
+  ASSERT_EQ(2U, GetBookmarkBarNode(0)->children().size());
+  ASSERT_EQ(2U, GetBookmarkBarNode(1)->children().size());
+  EXPECT_EQ(yahoo_url, GetBookmarkBarNode(0)->children().front()->url());
+  EXPECT_EQ(yahoo_url, GetBookmarkBarNode(1)->children().front()->url());
+  EXPECT_EQ(google_url, GetBookmarkBarNode(0)->children().back()->url());
+  EXPECT_EQ(google_url, GetBookmarkBarNode(1)->children().back()->url());
+}
+
 INSTANTIATE_TEST_SUITE_P(All,
                          TwoClientBookmarksSyncTest,
                          ::testing::Values(false, true));
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 94245543..9ffc63c6 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -3915,10 +3915,14 @@
       "extensions/extension_install_ui_factory.h",
       "extensions/extension_installed_bubble.cc",
       "extensions/extension_installed_bubble.h",
+      "extensions/extension_installed_waiter.cc",
+      "extensions/extension_installed_waiter.h",
       "extensions/extension_message_bubble_bridge.cc",
       "extensions/extension_message_bubble_bridge.h",
       "extensions/extension_message_bubble_factory.cc",
       "extensions/extension_message_bubble_factory.h",
+      "extensions/extension_removal_watcher.cc",
+      "extensions/extension_removal_watcher.h",
       "extensions/extensions_container.h",
       "extensions/hosted_app_browser_controller.cc",
       "extensions/hosted_app_browser_controller.h",
diff --git a/chrome/browser/ui/extensions/extension_installed_bubble.cc b/chrome/browser/ui/extensions/extension_installed_bubble.cc
index 98be5c8..cdb9953 100644
--- a/chrome/browser/ui/extensions/extension_installed_bubble.cc
+++ b/chrome/browser/ui/extensions/extension_installed_bubble.cc
@@ -20,6 +20,8 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_list_observer.h"
+#include "chrome/browser/ui/extensions/extension_installed_waiter.h"
+#include "chrome/browser/ui/extensions/extension_removal_watcher.h"
 #include "chrome/browser/ui/sync/sync_promo_ui.h"
 #include "chrome/common/extensions/api/extension_action/action_info.h"
 #include "chrome/common/extensions/api/omnibox/omnibox_handler.h"
@@ -34,124 +36,6 @@
 
 namespace {
 
-// How long to wait for browser action animations to complete before retrying.
-const int kAnimationWaitMs = 50;
-// How often we retry when waiting for browser action animation to end.
-const int kAnimationWaitRetries = 10;
-
-// Class responsible for showing the bubble after it's installed. Owns itself.
-class ExtensionInstalledBubbleObserver
-    : public BrowserListObserver,
-      public extensions::ExtensionRegistryObserver {
- public:
-  explicit ExtensionInstalledBubbleObserver(
-      scoped_refptr<const extensions::Extension> extension,
-      Browser* browser,
-      const SkBitmap& icon)
-      : extension_(extension),
-        browser_(browser),
-        icon_(icon),
-        animation_wait_retries_(0) {
-    // |extension| has been initialized but not loaded at this point. We need to
-    // wait on showing the Bubble until the EXTENSION_LOADED gets fired.
-    extension_registry_observer_.Add(
-        extensions::ExtensionRegistry::Get(browser->profile()));
-    BrowserList::AddObserver(this);
-  }
-
-  void Run() { OnExtensionLoaded(nullptr, extension_.get()); }
-
- private:
-  ~ExtensionInstalledBubbleObserver() override {
-    BrowserList::RemoveObserver(this);
-  }
-
-  // BrowserListObserver:
-  void OnBrowserClosing(Browser* browser) override {
-    if (browser_ == browser) {
-      // Browser is closing before the bubble was shown.
-      // TODO(hcarmona): Look into logging this with the BubbleManager.
-      delete this;
-    }
-  }
-
-  // extensions::ExtensionRegistryObserver:
-  void OnExtensionLoaded(content::BrowserContext* browser_context,
-                         const extensions::Extension* extension) override {
-    if (extension == extension_.get()) {
-      // PostTask to ourself to allow all EXTENSION_LOADED Observers to run.
-      // Only then can we be sure that a BrowserAction or PageAction has had
-      // views created which we can inspect for the purpose of previewing of
-      // pointing to them.
-      base::ThreadTaskRunnerHandle::Get()->PostTask(
-          FROM_HERE,
-          base::BindOnce(&ExtensionInstalledBubbleObserver::Initialize,
-                         weak_factory_.GetWeakPtr()));
-    }
-  }
-
-  void OnExtensionUnloaded(
-      content::BrowserContext* browser_context,
-      const extensions::Extension* extension,
-      extensions::UnloadedExtensionReason reason) override {
-    if (extension == extension_.get()) {
-      // Extension is going away.
-      delete this;
-    }
-  }
-
-  void Initialize() {
-    bubble_ =
-        std::make_unique<ExtensionInstalledBubble>(extension_, browser_, icon_);
-    Show();
-  }
-
-  // Called internally via PostTask to show the bubble.
-  void Show() {
-    DCHECK(bubble_);
-    // TODO(hcarmona): Investigate having the BubbleManager query the bubble
-    // for |ShouldShow|. This is important because the BubbleManager may decide
-    // to delay showing the bubble.
-    if (bubble_->ShouldShow()) {
-      // Must be 2 lines because the manager will take ownership of bubble.
-      BubbleManager* manager = browser_->GetBubbleManager();
-      manager->ShowBubble(std::move(bubble_));
-      delete this;
-      return;
-    }
-    if (animation_wait_retries_++ < kAnimationWaitRetries) {
-      base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-          FROM_HERE,
-          base::BindOnce(&ExtensionInstalledBubbleObserver::Show,
-                         weak_factory_.GetWeakPtr()),
-          base::TimeDelta::FromMilliseconds(kAnimationWaitMs));
-    } else {
-      // Retries are over; won't try again.
-      // TODO(hcarmona): Look into logging this with the BubbleManager.
-      delete this;
-    }
-  }
-
-  scoped_refptr<const extensions::Extension> extension_;
-  Browser* const browser_;
-  SkBitmap icon_;
-
-  // The bubble that will be shown when the extension has finished installing.
-  std::unique_ptr<ExtensionInstalledBubble> bubble_;
-
-  ScopedObserver<extensions::ExtensionRegistry,
-                 extensions::ExtensionRegistryObserver>
-      extension_registry_observer_{this};
-
-  // The number of times to retry showing the bubble if |browser_'s| toolbar
-  // is animating.
-  int animation_wait_retries_;
-
-  base::WeakPtrFactory<ExtensionInstalledBubbleObserver> weak_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(ExtensionInstalledBubbleObserver);
-};
-
 // Returns the keybinding for an extension command, or a null if none exists.
 std::unique_ptr<extensions::Command> GetCommand(
     const std::string& extension_id,
@@ -246,6 +130,83 @@
   return ExtensionInstalledBubble::ANCHOR_APP_MENU;
 }
 
+// This helper class wraps the state needed to construct an
+// ExtensionInstalledBubble. It is illegal to construct ExtensionInstalledBubble
+// before the extension is installed, so we can't construct it directly to pass
+// into the waiter; this class defers constructing it until it is actually
+// needed.
+class ExtensionUiWaiter {
+ public:
+  static void WaitForUi(scoped_refptr<const extensions::Extension> extension,
+                        Browser* browser,
+                        const SkBitmap& icon) {
+    (new ExtensionUiWaiter(extension, browser, icon))->Wait();
+  }
+
+  ExtensionUiWaiter(const ExtensionUiWaiter& other) = delete;
+  ExtensionUiWaiter& operator=(const ExtensionUiWaiter& other) = delete;
+
+ private:
+  // This class manages its own lifetime.
+  ExtensionUiWaiter(scoped_refptr<const extensions::Extension> extension,
+                    Browser* browser,
+                    const SkBitmap& icon)
+      : extension_(extension), browser_(browser), icon_(icon) {
+    removal_watcher_ = std::make_unique<ExtensionRemovalWatcher>(
+        browser, extension,
+        base::Bind(&ExtensionUiWaiter::OnExtensionRemoved,
+                   weak_factory_.GetWeakPtr()));
+  }
+  virtual ~ExtensionUiWaiter() = default;
+
+  void Wait() {
+    DCHECK(extensions::ExtensionRegistry::Get(browser_->profile())
+               ->enabled_extensions()
+               .GetByID(extension_->id()));
+
+    constexpr int kMaxRetries = 10;
+    constexpr auto kRetryDelay = base::TimeDelta::FromMilliseconds(50);
+    if (!bubble_) {
+      bubble_ = std::make_unique<ExtensionInstalledBubble>(extension_, browser_,
+                                                           std::move(icon_));
+    }
+
+    if (bubble_->ShouldShow()) {
+      Show();
+      return;
+    }
+
+    if (retries_++ >= kMaxRetries) {
+      StopWaiting();
+      return;
+    }
+
+    base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+        FROM_HERE,
+        base::BindOnce(&ExtensionUiWaiter::Wait, weak_factory_.GetWeakPtr()),
+        kRetryDelay);
+  }
+
+  void StopWaiting() { delete this; }
+
+  void Show() {
+    BubbleManager* manager = browser_->GetBubbleManager();
+    manager->ShowBubble(std::move(bubble_));
+    delete this;
+  }
+
+  void OnExtensionRemoved() { delete this; }
+
+  const scoped_refptr<const extensions::Extension> extension_;
+  Browser* browser_;
+  SkBitmap icon_;
+  std::unique_ptr<ExtensionInstalledBubble> bubble_;
+  std::unique_ptr<ExtensionRemovalWatcher> removal_watcher_;
+  int retries_ = 0;
+
+  base::WeakPtrFactory<ExtensionUiWaiter> weak_factory_{this};
+};
+
 }  // namespace
 
 // static
@@ -253,15 +214,12 @@
     scoped_refptr<const extensions::Extension> extension,
     Browser* browser,
     const SkBitmap& icon) {
-  // The ExtensionInstalledBubbleObserver will delete itself when the
-  // ExtensionInstalledBubble is shown or when it can't be shown anymore.
-  auto* observer =
-      new ExtensionInstalledBubbleObserver(extension, browser, icon);
-  extensions::ExtensionRegistry* reg =
-      extensions::ExtensionRegistry::Get(browser->profile());
-  if (reg->enabled_extensions().GetByID(extension->id())) {
-    observer->Run();
-  }
+  // Wait for the extension to become installed, then wait for its UI to become
+  // ready. ExtensionUiWaiter will handle creating and displaying the actual
+  // bubble once the UI is ready.
+  ExtensionInstalledWaiter::WaitForInstall(
+      extension, browser,
+      base::BindOnce(&ExtensionUiWaiter::WaitForUi, extension, browser, icon));
 }
 
 ExtensionInstalledBubble::ExtensionInstalledBubble(
diff --git a/chrome/browser/ui/extensions/extension_installed_waiter.cc b/chrome/browser/ui/extensions/extension_installed_waiter.cc
new file mode 100644
index 0000000..05f86362
--- /dev/null
+++ b/chrome/browser/ui/extensions/extension_installed_waiter.cc
@@ -0,0 +1,84 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/extensions/extension_installed_waiter.h"
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_list.h"
+
+namespace {
+base::RepeatingClosure* g_giving_up_callback = nullptr;
+}  // namespace
+
+// static
+void ExtensionInstalledWaiter::WaitForInstall(
+    scoped_refptr<const extensions::Extension> extension,
+    Browser* browser,
+    base::OnceClosure done_callback) {
+  (new ExtensionInstalledWaiter(extension, browser, std::move(done_callback)))
+      ->RunCallbackIfExtensionInstalled();
+}
+
+void ExtensionInstalledWaiter::SetGivingUpCallbackForTesting(
+    base::RepeatingClosure callback) {
+  if (g_giving_up_callback)
+    delete g_giving_up_callback;
+  if (!callback.is_null())
+    g_giving_up_callback = new base::RepeatingClosure(callback);
+  else
+    g_giving_up_callback = nullptr;
+}
+
+ExtensionInstalledWaiter::ExtensionInstalledWaiter(
+    scoped_refptr<const extensions::Extension> extension,
+    Browser* browser,
+    base::OnceClosure done_callback)
+    : extension_(extension),
+      browser_(browser),
+      done_callback_(std::move(done_callback)) {
+  extension_registry_observer_.Add(
+      extensions::ExtensionRegistry::Get(browser->profile()));
+  removal_watcher_ = std::make_unique<ExtensionRemovalWatcher>(
+      browser, extension,
+      base::Bind(&ExtensionInstalledWaiter::OnExtensionRemoved,
+                 weak_factory_.GetWeakPtr()));
+}
+
+ExtensionInstalledWaiter::~ExtensionInstalledWaiter() {
+  if (done_callback_)
+    g_giving_up_callback->Run();
+}
+
+void ExtensionInstalledWaiter::RunCallbackIfExtensionInstalled() {
+  if (IsExtensionInstalled()) {
+    std::move(done_callback_).Run();
+    delete this;
+    return;
+  }
+}
+
+bool ExtensionInstalledWaiter::IsExtensionInstalled() const {
+  extensions::ExtensionRegistry* registry =
+      extensions::ExtensionRegistry::Get(browser_->profile());
+  return registry->enabled_extensions().GetByID(extension_->id());
+}
+
+void ExtensionInstalledWaiter::OnExtensionLoaded(
+    content::BrowserContext* browser_context,
+    const extensions::Extension* extension) {
+  if (extension != extension_.get())
+    return;
+
+  // Only call Wait() after all the other extension observers have had a chance
+  // to run.
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindOnce(&ExtensionInstalledWaiter::RunCallbackIfExtensionInstalled,
+                     weak_factory_.GetWeakPtr()));
+}
+
+void ExtensionInstalledWaiter::OnExtensionRemoved() {
+  delete this;
+}
diff --git a/chrome/browser/ui/extensions/extension_installed_waiter.h b/chrome/browser/ui/extensions/extension_installed_waiter.h
new file mode 100644
index 0000000..3dbe58b
--- /dev/null
+++ b/chrome/browser/ui/extensions/extension_installed_waiter.h
@@ -0,0 +1,76 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_EXTENSIONS_EXTENSION_INSTALLED_WAITER_H_
+#define CHROME_BROWSER_UI_EXTENSIONS_EXTENSION_INSTALLED_WAITER_H_
+
+#include "base/callback.h"
+#include "base/memory/weak_ptr.h"
+#include "base/scoped_observer.h"
+#include "base/time/time.h"
+#include "chrome/browser/ui/extensions/extension_removal_watcher.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_registry_observer.h"
+
+class Browser;
+
+// ExtensionInstalledWaiter is used to wait for a given extension to be
+// installed in a given browser's profile.
+class ExtensionInstalledWaiter : public extensions::ExtensionRegistryObserver {
+ public:
+  // Wait until both:
+  // 1. |extension| is installed into |browser|
+  // 2. All EXTENSION_LOADED observers have been notified of (1)
+  // and then invoke |done_callback|.
+  // If either |browser| is destroyed or |extension| is uninstalled from it
+  // before that happens, |done_callback| is not run.
+  static void WaitForInstall(
+      scoped_refptr<const extensions::Extension> extension,
+      Browser* browser,
+      base::OnceClosure done_callback);
+
+  // Sets a callback for testing purposes to be invoked whenever an
+  // ExtensionInstalledWaiter gives up on waiting for any reason. You should not
+  // need this in production code!
+  static void SetGivingUpCallbackForTesting(base::RepeatingClosure callback);
+
+ private:
+  // This class manages its own lifetime.
+  ExtensionInstalledWaiter(scoped_refptr<const extensions::Extension> extension,
+                           Browser* browser,
+                           base::OnceClosure done_callback);
+  ~ExtensionInstalledWaiter() override;
+
+  ExtensionInstalledWaiter(const ExtensionInstalledWaiter& other) = delete;
+  ExtensionInstalledWaiter& operator=(const ExtensionInstalledWaiter& other) =
+      delete;
+
+  // Check if the extension is installed. If so, run |done_callback_| and
+  // self-destruct.
+  void RunCallbackIfExtensionInstalled();
+
+  // Returns whether condition (1) as described above WaitForInstall
+  // are true. Condition (2) is guaranteed by logic in OnExtensionLoaded.
+  bool IsExtensionInstalled() const;
+
+  // ExtensionRegistryObserver:
+  void OnExtensionLoaded(content::BrowserContext* browser_context,
+                         const extensions::Extension* extension) override;
+
+  void OnExtensionRemoved();
+
+  const scoped_refptr<const extensions::Extension> extension_;
+  const Browser* const browser_;
+  base::OnceClosure done_callback_;
+
+  ScopedObserver<extensions::ExtensionRegistry,
+                 extensions::ExtensionRegistryObserver>
+      extension_registry_observer_{this};
+
+  std::unique_ptr<ExtensionRemovalWatcher> removal_watcher_;
+
+  base::WeakPtrFactory<ExtensionInstalledWaiter> weak_factory_{this};
+};
+
+#endif  // CHROME_BROWSER_UI_EXTENSIONS_EXTENSION_INSTALLED_WAITER_H_
diff --git a/chrome/browser/ui/extensions/extension_installed_waiter_unittest.cc b/chrome/browser/ui/extensions/extension_installed_waiter_unittest.cc
new file mode 100644
index 0000000..3b670cc
--- /dev/null
+++ b/chrome/browser/ui/extensions/extension_installed_waiter_unittest.cc
@@ -0,0 +1,142 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/extensions/extension_installed_waiter.h"
+
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/load_error_reporter.h"
+#include "chrome/browser/extensions/test_extension_system.h"
+#include "chrome/test/base/browser_with_test_window_test.h"
+#include "content/public/test/browser_task_environment.h"
+#include "extensions/browser/extension_system.h"
+#include "extensions/common/extension_builder.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using extensions::Extension;
+
+class ExtensionInstalledWaiterTest : public BrowserWithTestWindowTest {
+ public:
+  ExtensionInstalledWaiterTest()
+      : BrowserWithTestWindowTest(
+            base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
+  ~ExtensionInstalledWaiterTest() override = default;
+
+  void SetUp() override {
+    BrowserWithTestWindowTest::SetUp();
+    extensions::LoadErrorReporter::Init(false);
+    extensions::TestExtensionSystem* extension_system =
+        static_cast<extensions::TestExtensionSystem*>(
+            extensions::ExtensionSystem::Get(profile()));
+    extension_system->CreateExtensionService(
+        base::CommandLine::ForCurrentProcess(), base::FilePath(), false);
+    extension_service_ =
+        extensions::ExtensionSystem::Get(profile())->extension_service();
+  }
+
+  void TearDown() override {
+    ExtensionInstalledWaiter::SetGivingUpCallbackForTesting(
+        base::NullCallback());
+    BrowserWithTestWindowTest::TearDown();
+  }
+
+  void WaitFor(scoped_refptr<const Extension> extension,
+               Browser* test_browser = nullptr) {
+    ExtensionInstalledWaiter::SetGivingUpCallbackForTesting(base::BindRepeating(
+        &ExtensionInstalledWaiterTest::GivingUp, base::Unretained(this)));
+    if (!test_browser)
+      test_browser = browser();
+    ExtensionInstalledWaiter::WaitForInstall(
+        extension, test_browser,
+        base::BindOnce(&ExtensionInstalledWaiterTest::Done,
+                       base::Unretained(this)));
+  }
+
+  void Done() { done_called_++; }
+  void GivingUp() { giving_up_called_++; }
+
+ protected:
+  int done_called_ = 0;
+  int giving_up_called_ = 0;
+
+  scoped_refptr<const Extension> MakeExtensionNamed(const std::string& name) {
+    return extensions::ExtensionBuilder(name).Build();
+  }
+
+  extensions::ExtensionService* extension_service() {
+    return extension_service_;
+  }
+
+ private:
+  extensions::ExtensionService* extension_service_ = nullptr;
+};
+
+TEST_F(ExtensionInstalledWaiterTest, ExtensionIsAlreadyInstalled) {
+  auto extension = MakeExtensionNamed("foo");
+  extension_service()->AddExtension(extension.get());
+
+  WaitFor(extension);
+  EXPECT_EQ(1, done_called_);
+}
+
+TEST_F(ExtensionInstalledWaiterTest, ExtensionInstall) {
+  auto extension = MakeExtensionNamed("foo");
+
+  WaitFor(extension);
+  EXPECT_EQ(0, done_called_);
+
+  extension_service()->AddExtension(extension.get());
+
+  // ExtensionInstalledWaiter must *not* call the done callback on the same
+  // runloop cycle as the extension installation, to allow all the other
+  // observers to run.
+  EXPECT_FALSE(task_environment()->MainThreadIsIdle());
+  EXPECT_EQ(0, done_called_);
+
+  task_environment()->RunUntilIdle();
+  EXPECT_EQ(1, done_called_);
+}
+
+TEST_F(ExtensionInstalledWaiterTest, NotTheExtensionYouAreLookingFor) {
+  auto foo = MakeExtensionNamed("foo");
+  auto bar = MakeExtensionNamed("bar");
+
+  WaitFor(foo);
+  EXPECT_EQ(0, done_called_);
+
+  extension_service()->AddExtension(bar.get());
+  task_environment()->RunUntilIdle();
+  EXPECT_EQ(0, done_called_);
+
+  extension_service()->AddExtension(foo.get());
+  task_environment()->RunUntilIdle();
+  EXPECT_EQ(1, done_called_);
+}
+
+TEST_F(ExtensionInstalledWaiterTest, ExtensionUninstalledWhileWaiting) {
+  auto extension = MakeExtensionNamed("foo");
+
+  WaitFor(extension);
+  EXPECT_EQ(0, done_called_);
+
+  extension_service()->AddExtension(extension.get());
+  extension_service()->UnloadExtension(
+      extension->id(), extensions::UnloadedExtensionReason::UNINSTALL);
+  EXPECT_EQ(1, giving_up_called_);
+
+  task_environment()->RunUntilIdle();
+  EXPECT_EQ(0, done_called_);
+}
+
+TEST_F(ExtensionInstalledWaiterTest, BrowserShutdownWhileWaiting) {
+  std::unique_ptr<BrowserWindow> window = CreateBrowserWindow();
+  std::unique_ptr<Browser> browser =
+      CreateBrowser(profile(), Browser::TYPE_NORMAL, false, window.get());
+
+  auto foo = MakeExtensionNamed("foo");
+  WaitFor(foo, browser.get());
+
+  browser->OnWindowClosing();
+  EXPECT_EQ(1, giving_up_called_);
+  EXPECT_EQ(0, done_called_);
+}
diff --git a/chrome/browser/ui/extensions/extension_removal_watcher.cc b/chrome/browser/ui/extensions/extension_removal_watcher.cc
new file mode 100644
index 0000000..2d1ed12a
--- /dev/null
+++ b/chrome/browser/ui/extensions/extension_removal_watcher.cc
@@ -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.
+
+#include "chrome/browser/ui/extensions/extension_removal_watcher.h"
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_list.h"
+
+ExtensionRemovalWatcher::ExtensionRemovalWatcher(
+    Browser* browser,
+    scoped_refptr<const extensions::Extension> extension,
+    base::OnceClosure callback)
+    : browser_(browser), extension_(extension), callback_(std::move(callback)) {
+  extension_registry_observer_.Add(
+      extensions::ExtensionRegistry::Get(browser->profile()));
+  BrowserList::AddObserver(this);
+}
+
+ExtensionRemovalWatcher::~ExtensionRemovalWatcher() {
+  BrowserList::RemoveObserver(this);
+}
+
+void ExtensionRemovalWatcher::OnBrowserClosing(Browser* browser) {
+  if (browser == browser_ && callback_)
+    std::move(callback_).Run();
+}
+
+void ExtensionRemovalWatcher::OnExtensionUnloaded(
+    content::BrowserContext* browser_context,
+    const extensions::Extension* extension,
+    extensions::UnloadedExtensionReason reason) {
+  if (extension == extension_.get() && callback_)
+    std::move(callback_).Run();
+}
diff --git a/chrome/browser/ui/extensions/extension_removal_watcher.h b/chrome/browser/ui/extensions/extension_removal_watcher.h
new file mode 100644
index 0000000..ed6ef45c
--- /dev/null
+++ b/chrome/browser/ui/extensions/extension_removal_watcher.h
@@ -0,0 +1,45 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_EXTENSIONS_EXTENSION_REMOVAL_WATCHER_H_
+#define CHROME_BROWSER_UI_EXTENSIONS_EXTENSION_REMOVAL_WATCHER_H_
+
+#include "base/callback.h"
+#include "base/memory/weak_ptr.h"
+#include "base/scoped_observer.h"
+#include "chrome/browser/ui/browser_list_observer.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_registry_observer.h"
+
+// ExtensionRemovalWatcher watches a browser and an extension for either:
+// 1) The browser being closed, or
+// 2) The extension being uninstalled from the browser's profile
+// and in either case, invokes the provided callback.
+class ExtensionRemovalWatcher : public BrowserListObserver,
+                                public extensions::ExtensionRegistryObserver {
+ public:
+  ExtensionRemovalWatcher(Browser* browser,
+                          scoped_refptr<const extensions::Extension> extension,
+                          base::OnceClosure callback);
+  ~ExtensionRemovalWatcher() override;
+
+ private:
+  // ExtensionRegistryObserver:
+  void OnExtensionUnloaded(content::BrowserContext* browser_context,
+                           const extensions::Extension* extension,
+                           extensions::UnloadedExtensionReason reason) override;
+
+  // BrowserListObserver:
+  void OnBrowserClosing(Browser* browser) override;
+
+  const Browser* browser_;
+  const scoped_refptr<const extensions::Extension> extension_;
+  base::OnceClosure callback_;
+
+  ScopedObserver<extensions::ExtensionRegistry,
+                 extensions::ExtensionRegistryObserver>
+      extension_registry_observer_{this};
+};
+
+#endif  // CHROME_BROWSER_UI_EXTENSIONS_EXTENSION_REMOVAL_WATCHER_H_
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
index 63529eed..e0eaf0e 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
@@ -46,10 +46,7 @@
     g_browser_process->profile_manager()->
         GetProfileAttributesStorage().AddObserver(this);
   }
-  if (browser_view_->tabstrip()) {
-    DCHECK(!tab_strip_observer_.IsObserving(browser_view_->tabstrip()));
-    tab_strip_observer_.Add(browser_view_->tabstrip());
-  }
+  MaybeObserveTabstrip();
 }
 
 BrowserNonClientFrameView::~BrowserNonClientFrameView() {
@@ -61,6 +58,7 @@
 }
 
 void BrowserNonClientFrameView::OnBrowserViewInitViewsComplete() {
+  MaybeObserveTabstrip();
   UpdateMinimumSize();
 }
 
@@ -387,6 +385,13 @@
 }
 #endif
 
+void BrowserNonClientFrameView::MaybeObserveTabstrip() {
+  if (browser_view_->tabstrip()) {
+    DCHECK(!tab_strip_observer_.IsObserving(browser_view_->tabstrip()));
+    tab_strip_observer_.Add(browser_view_->tabstrip());
+  }
+}
+
 const ui::ThemeProvider*
 BrowserNonClientFrameView::GetThemeProviderForProfile() const {
   // Because the frame's accessor reads the ThemeProvider from the profile and
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view.h b/chrome/browser/ui/views/frame/browser_non_client_frame_view.h
index 62df95c..e0a92ab5 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view.h
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view.h
@@ -177,6 +177,8 @@
   int GetSystemMenuY() const override;
 #endif
 
+  void MaybeObserveTabstrip();
+
   // Gets a theme provider that should be non-null even before we're added to a
   // view hierarchy.
   const ui::ThemeProvider* GetThemeProviderForProfile() const;
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 34d47dfd..c6c1235 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -430,72 +430,6 @@
   browser_->tab_strip_model()->AddObserver(this);
   immersive_mode_controller_ = chrome::CreateImmersiveModeController();
   md_observer_.Add(ui::MaterialDesignController::GetInstance());
-
-  // Top container holds tab strip region and toolbar and lives at the front of
-  // the view hierarchy.
-  top_container_ = AddChildView(std::make_unique<TopContainerView>(this));
-  tab_strip_region_view_ =
-      top_container_->AddChildView(std::make_unique<TabStripRegionView>());
-
-  // TabStrip takes ownership of the controller.
-  auto tabstrip_controller = std::make_unique<BrowserTabStripController>(
-      browser_->tab_strip_model(), this);
-  BrowserTabStripController* tabstrip_controller_ptr =
-      tabstrip_controller.get();
-  tabstrip_ = tab_strip_region_view_->AddChildView(std::make_unique<TabStrip>(
-      std::move(tabstrip_controller)));  // Takes ownership.
-  tabstrip_controller_ptr->InitFromModel(tabstrip_);
-
-  // Create WebViews early so |webui_tab_strip_| can observe their size.
-  auto devtools_web_view =
-      std::make_unique<views::WebView>(browser_->profile());
-  devtools_web_view->SetID(VIEW_ID_DEV_TOOLS_DOCKED);
-  devtools_web_view->SetVisible(false);
-
-  auto contents_web_view =
-      std::make_unique<ContentsWebView>(browser_->profile());
-  contents_web_view->SetID(VIEW_ID_TAB_CONTAINER);
-  contents_web_view->SetEmbedFullscreenWidgetMode(true);
-
-  auto contents_container = std::make_unique<views::View>();
-  devtools_web_view_ =
-      contents_container->AddChildView(std::move(devtools_web_view));
-  contents_web_view_ =
-      contents_container->AddChildView(std::move(contents_web_view));
-  contents_container->SetLayoutManager(std::make_unique<ContentsLayoutManager>(
-      devtools_web_view_, contents_web_view_));
-
-  toolbar_ = top_container_->AddChildView(
-      std::make_unique<ToolbarView>(browser_.get(), this));
-
-  contents_separator_ =
-      top_container_->AddChildView(std::make_unique<ContentsSeparator>());
-
-  web_contents_close_handler_ =
-      std::make_unique<WebContentsCloseHandler>(contents_web_view_);
-
-  contents_container_ = AddChildView(std::move(contents_container));
-  set_contents_view(contents_container_);
-
-  // InfoBarContainer needs to be added as a child here for drop-shadow, but
-  // needs to come after toolbar in focus order (see EnsureFocusOrder()).
-  infobar_container_ =
-      AddChildView(std::make_unique<InfoBarContainerView>(this));
-
-  InitStatusBubble();
-
-  // Create do-nothing view for the sake of controlling the z-order of the find
-  // bar widget.
-  find_bar_host_view_ = AddChildView(std::make_unique<View>());
-
-#if defined(OS_WIN)
-  // Create a custom JumpList and add it to an observer of TabRestoreService
-  // so we can update the custom JumpList when a tab is added or removed.
-  if (JumpList::Enabled())
-    load_complete_listener_ = std::make_unique<LoadCompleteListener>(this);
-#endif
-
-  MaybeInitializeWebUITabStrip();
 }
 
 BrowserView::~BrowserView() {
@@ -2545,78 +2479,19 @@
 
 void BrowserView::ViewHierarchyChanged(
     const views::ViewHierarchyChangedDetails& details) {
-  // Override here in order to suppress the call to
-  // views::ClientView::ViewHierarchyChanged();
-}
+  if (details.child != this)
+    return;
 
-void BrowserView::AddedToWidget() {
-  views::ClientView::AddedToWidget();
+  // On removal, this class may not have a widget anymore, so go to the parent.
+  auto* widget = details.is_add ? GetWidget() : details.parent->GetWidget();
+  if (!widget)
+    return;
 
-#if defined(OS_CHROMEOS)
-  // TopControlsSlideController must be initialized here in AddedToWidget()
-  // rather than Init() as it depends on the browser frame being ready.
-  if (IsBrowserTypeNormal()) {
-    DCHECK(frame_);
-    top_controls_slide_controller_ =
-        std::make_unique<TopControlsSlideControllerChromeOS>(this);
+  bool init = !initialized_ && details.is_add;
+  if (init) {
+    InitViews();
+    initialized_ = true;
   }
-#endif
-
-  GetWidget()->AddObserver(this);
-
-  // Stow a pointer to this object onto the window handle so that we can get at
-  // it later when all we have is a native view.
-  GetWidget()->SetNativeWindowProperty(kBrowserViewKey, this);
-
-  // Stow a pointer to the browser's profile onto the window handle so that we
-  // can get it later when all we have is a native view.
-  GetWidget()->SetNativeWindowProperty(Profile::kProfileKey,
-                                       browser_->profile());
-
-#if defined(USE_AURA)
-  // Stow a pointer to the browser's profile onto the window handle so
-  // that windows will be styled with the appropriate NativeTheme.
-  SetThemeProfileForWindow(GetNativeWindow(), browser_->profile());
-#endif
-
-  toolbar_->Init();
-
-  LoadAccelerators();
-
-  // |immersive_mode_controller_| may depend on the presence of a Widget, so it
-  // is initialized here.
-  immersive_mode_controller_->Init(this);
-  immersive_mode_controller_->AddObserver(this);
-
-  // See https://crbug.com/993502.
-  views::View* web_footer_experiment = nullptr;
-  if (base::FeatureList::IsEnabled(features::kWebFooterExperiment)) {
-    web_footer_experiment = AddChildView(
-        std::make_unique<WebFooterExperimentView>(browser_->profile()));
-  }
-
-  // TODO(https://crbug.com/1036519): Remove BrowserViewLayout dependence on
-  // Widget and move to the constructor.
-  auto browser_view_layout = std::make_unique<BrowserViewLayout>(
-      std::make_unique<BrowserViewLayoutDelegateImpl>(this),
-      GetWidget()->GetNativeView(), this, top_container_,
-      tab_strip_region_view_, tabstrip_, toolbar_, infobar_container_,
-      contents_container_, immersive_mode_controller_.get(),
-      web_footer_experiment, contents_separator_);
-  SetLayoutManager(std::move(browser_view_layout));
-
-  EnsureFocusOrder();
-
-  // This browser view may already have a custom button provider set (e.g the
-  // hosted app frame).
-  if (!toolbar_button_provider_)
-    SetToolbarButtonProvider(toolbar_);
-
-  frame_->OnBrowserViewInitViewsComplete();
-  frame_->GetFrameView()->UpdateMinimumSize();
-  using_native_frame_ = frame_->ShouldUseNativeFrame();
-
-  initialized_ = true;
 }
 
 void BrowserView::PaintChildren(const views::PaintInfo& paint_info) {
@@ -2695,6 +2570,131 @@
   ToolbarSizeChanged(is_animating);
 }
 
+void BrowserView::InitViews() {
+  // TopControlsSlideController must be initialized here in InitViews() rather
+  // than Init() as it depends on the browser frame being ready.
+#if defined(OS_CHROMEOS)
+  if (IsBrowserTypeNormal()) {
+    DCHECK(frame_);
+    top_controls_slide_controller_ =
+        std::make_unique<TopControlsSlideControllerChromeOS>(this);
+  }
+#endif
+
+  GetWidget()->AddObserver(this);
+
+  // Stow a pointer to this object onto the window handle so that we can get at
+  // it later when all we have is a native view.
+  GetWidget()->SetNativeWindowProperty(kBrowserViewKey, this);
+
+  // Stow a pointer to the browser's profile onto the window handle so that we
+  // can get it later when all we have is a native view.
+  GetWidget()->SetNativeWindowProperty(Profile::kProfileKey,
+                                       browser_->profile());
+
+#if defined(USE_AURA)
+  // Stow a pointer to the browser's profile onto the window handle so
+  // that windows will be styled with the appropriate NativeTheme.
+  SetThemeProfileForWindow(GetNativeWindow(), browser_->profile());
+#endif
+
+  LoadAccelerators();
+
+  // Top container holds tab strip region and toolbar and lives at the front of
+  // the view hierarchy.
+  top_container_ = new TopContainerView(this);
+  AddChildView(top_container_);
+  tab_strip_region_view_ = new TabStripRegionView();
+  top_container_->AddChildView(tab_strip_region_view_);
+
+  // TabStrip takes ownership of the controller.
+  BrowserTabStripController* tabstrip_controller =
+      new BrowserTabStripController(browser_->tab_strip_model(), this);
+  tabstrip_ =
+      new TabStrip(std::unique_ptr<TabStripController>(tabstrip_controller));
+  tab_strip_region_view_->AddChildView(tabstrip_);  // Takes ownership.
+  tabstrip_controller->InitFromModel(tabstrip_);
+
+  // Create WebViews early so |webui_tab_strip_| can observe their size.
+  devtools_web_view_ = new views::WebView(browser_->profile());
+  devtools_web_view_->SetID(VIEW_ID_DEV_TOOLS_DOCKED);
+  devtools_web_view_->SetVisible(false);
+
+  contents_web_view_ = new ContentsWebView(browser_->profile());
+  contents_web_view_->SetID(VIEW_ID_TAB_CONTAINER);
+  contents_web_view_->SetEmbedFullscreenWidgetMode(true);
+
+  contents_container_ = new views::View();
+  contents_container_->AddChildView(devtools_web_view_);
+  contents_container_->AddChildView(contents_web_view_);
+  contents_container_->SetLayoutManager(std::make_unique<ContentsLayoutManager>(
+      devtools_web_view_, contents_web_view_));
+
+  toolbar_ = top_container_->AddChildView(
+      std::make_unique<ToolbarView>(browser_.get(), this));
+  toolbar_->Init();
+
+  contents_separator_ =
+      top_container_->AddChildView(std::make_unique<ContentsSeparator>());
+
+  // This browser view may already have a custom button provider set (e.g the
+  // hosted app frame).
+  if (!toolbar_button_provider_)
+    SetToolbarButtonProvider(toolbar_);
+
+  web_contents_close_handler_.reset(
+      new WebContentsCloseHandler(contents_web_view_));
+
+  AddChildView(contents_container_);
+  set_contents_view(contents_container_);
+
+  // InfoBarContainer needs to be added as a child here for drop-shadow, but
+  // needs to come after toolbar in focus order (see EnsureFocusOrder()).
+  infobar_container_ = new InfoBarContainerView(this);
+  AddChildView(infobar_container_);
+
+  InitStatusBubble();
+
+  // Create do-nothing view for the sake of controlling the z-order of the find
+  // bar widget.
+  find_bar_host_view_ = new View();
+  AddChildView(find_bar_host_view_);
+
+  immersive_mode_controller_->Init(this);
+  immersive_mode_controller_->AddObserver(this);
+
+  // See https://crbug.com/993502.
+  views::View* web_footer_experiment = nullptr;
+  if (base::FeatureList::IsEnabled(features::kWebFooterExperiment)) {
+    web_footer_experiment = AddChildView(
+        std::make_unique<WebFooterExperimentView>(browser_->profile()));
+  }
+
+  auto browser_view_layout = std::make_unique<BrowserViewLayout>(
+      std::make_unique<BrowserViewLayoutDelegateImpl>(this),
+      GetWidget()->GetNativeView(), this, top_container_,
+      tab_strip_region_view_, tabstrip_, toolbar_, infobar_container_,
+      contents_container_, immersive_mode_controller_.get(),
+      web_footer_experiment, contents_separator_);
+  SetLayoutManager(std::move(browser_view_layout));
+
+  EnsureFocusOrder();
+
+#if defined(OS_WIN)
+  // Create a custom JumpList and add it to an observer of TabRestoreService
+  // so we can update the custom JumpList when a tab is added or removed.
+  if (JumpList::Enabled()) {
+    load_complete_listener_ = std::make_unique<LoadCompleteListener>(this);
+  }
+#endif
+
+  frame_->OnBrowserViewInitViewsComplete();
+  frame_->GetFrameView()->UpdateMinimumSize();
+  using_native_frame_ = frame_->ShouldUseNativeFrame();
+
+  MaybeInitializeWebUITabStrip();
+}
+
 void BrowserView::MaybeInitializeWebUITabStrip() {
 #if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
   if (browser_->SupportsWindowFeature(Browser::FEATURE_TABSTRIP) &&
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index dde5b3b..4bf8b2c 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -498,7 +498,6 @@
   void OnGestureEvent(ui::GestureEvent* event) override;
   void ViewHierarchyChanged(
       const views::ViewHierarchyChangedDetails& details) override;
-  void AddedToWidget() override;
   void PaintChildren(const views::PaintInfo& paint_info) override;
   void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
   void ChildPreferredSizeChanged(View* child) override;
@@ -580,6 +579,9 @@
   // affected.
   void RevealTabStripIfNeeded();
 
+  // Constructs and initializes the child views.
+  void InitViews();
+
   // Make sure the WebUI tab strip exists if it should.
   void MaybeInitializeWebUITabStrip();
 
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 4e8b77f2..7ea7416 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
@@ -106,6 +106,7 @@
     : LocationBarBubbleDelegateView(anchor_view, web_contents),
       controller_(controller) {
   observer_.Add(controller);
+  DialogDelegate::set_buttons(ui::DIALOG_BUTTON_NONE);
 }
 
 CookieControlsBubbleView::~CookieControlsBubbleView() = default;
@@ -151,6 +152,18 @@
     if (extra_view_)
       extra_view_->SetVisible(false);
   }
+
+  DialogDelegate::set_button_label(
+      ui::DIALOG_BUTTON_OK,
+      intermediate_step_ == IntermediateStep::kTurnOffButton
+          ? l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON)
+          : l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_TURN_ON_BUTTON));
+  DialogDelegate::set_buttons(
+      (intermediate_step_ == IntermediateStep::kTurnOffButton ||
+       status_ == CookieControlsController::Status::kDisabledForSite)
+          ? ui::DIALOG_BUTTON_OK
+          : ui::DIALOG_BUTTON_NONE);
+
   DialogModelChanged();
   Layout();
 
@@ -168,23 +181,6 @@
   LocationBarBubbleDelegateView::CloseBubble();
 }
 
-int CookieControlsBubbleView::GetDialogButtons() const {
-  if (intermediate_step_ == IntermediateStep::kTurnOffButton ||
-      status_ == CookieControlsController::Status::kDisabledForSite) {
-    return ui::DIALOG_BUTTON_OK;
-  }
-  return ui::DIALOG_BUTTON_NONE;
-}
-
-base::string16 CookieControlsBubbleView::GetDialogButtonLabel(
-    ui::DialogButton button) const {
-  if (intermediate_step_ == IntermediateStep::kTurnOffButton)
-    return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_TURN_OFF_BUTTON);
-  DCHECK_EQ(status_, CookieControlsController::Status::kDisabledForSite);
-  DCHECK_EQ(intermediate_step_, IntermediateStep::kNone);
-  return l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_TURN_ON_BUTTON);
-}
-
 void CookieControlsBubbleView::Init() {
   const ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
   SetLayoutManager(std::make_unique<views::BoxLayout>(
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 6de68c6..45ef2cf 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
@@ -55,8 +55,6 @@
 
   // LocationBarBubbleDelegateView:
   void CloseBubble() override;
-  int GetDialogButtons() const override;
-  base::string16 GetDialogButtonLabel(ui::DialogButton button) const override;
   void Init() override;
   base::string16 GetWindowTitle() const override;
   bool ShouldShowWindowTitle() const override;
diff --git a/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc b/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc
index 596f9f2..b868428 100644
--- a/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc
+++ b/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc
@@ -138,7 +138,9 @@
 }
 
 int CredentialLeakDialogView::GetDialogButtons() const {
-  return controller_->ShouldShowCancelButton()
+  // |controller_| can be nullptr when the framework calls this method after a
+  // button click.
+  return controller_ && controller_->ShouldShowCancelButton()
              ? ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL
              : ui::DIALOG_BUTTON_OK;
 }
@@ -153,7 +155,9 @@
 }
 
 base::string16 CredentialLeakDialogView::GetWindowTitle() const {
-  return controller_->GetTitle();
+  // |controller_| can be nullptr when the framework calls this method after a
+  // button click.
+  return controller_ ? controller_->GetTitle() : base::string16();
 }
 
 void CredentialLeakDialogView::InitWindow() {
diff --git a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
index 95e3357..bcc202d 100644
--- a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
+++ b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
@@ -338,6 +338,7 @@
       incognito_tab_html(
           ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
               IDR_INCOGNITO_TAB_HTML));
+  CHECK(*incognito_tab_html);
 
   std::string full_html =
       ReplaceTemplateExpressions(*incognito_tab_html, replacements);
@@ -404,6 +405,7 @@
       guest_tab_html(
           ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
               guest_tab_idr));
+  CHECK(*guest_tab_html);
   ui::TemplateReplacements replacements;
   ui::TemplateReplacementsFromDictionaryValue(localized_strings, &replacements);
   std::string full_html =
@@ -520,6 +522,7 @@
       new_tab_html(
           ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
               IDR_NEW_TAB_4_HTML));
+  CHECK(*new_tab_html);
   std::string full_html = webui::GetI18nTemplateHtml(
       base::StringPiece(reinterpret_cast<const char*>((*new_tab_html)->front()),
                         (*new_tab_html)->size()),
@@ -550,6 +553,7 @@
       new_tab_theme_css(
           ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
               IDR_NEW_INCOGNITO_TAB_THEME_CSS));
+  CHECK(*new_tab_theme_css);
 
   // Create the string from our template and the replacements.
   std::string full_css =
@@ -629,6 +633,7 @@
       new_tab_theme_css(
           ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
               IDR_NEW_TAB_4_THEME_CSS));
+  CHECK(*new_tab_theme_css);
 
   // Create the string from our template and the replacements.
   std::string css_string =
diff --git a/chrome/browser/updates/update_notification_client.cc b/chrome/browser/updates/update_notification_client.cc
index 25d59c6..61805c8 100644
--- a/chrome/browser/updates/update_notification_client.cc
+++ b/chrome/browser/updates/update_notification_client.cc
@@ -2,20 +2,32 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "chrome/browser/updates/update_notification_client.h"
+
 #include <utility>
 
-#include "chrome/browser/updates/update_notification_client.h"
+#include "chrome/browser/updates/update_notification_service.h"
+#include "chrome/browser/updates/update_notification_service_bridge.h"
 
 namespace updates {
 
-UpdateNotificationClient::UpdateNotificationClient() = default;
+UpdateNotificationClient::UpdateNotificationClient(GetServiceCallback callback)
+    : get_service_callback_(std::move(callback)) {}
 
 UpdateNotificationClient::~UpdateNotificationClient() = default;
 
 void UpdateNotificationClient::BeforeShowNotification(
     std::unique_ptr<NotificationData> notification_data,
     NotificationDataCallback callback) {
-  NOTIMPLEMENTED();
+  auto* update_notification_service = get_service_callback_.Run();
+  DCHECK(update_notification_service);
+  if (!update_notification_service->IsReadyToDisplay()) {
+    std::move(callback).Run(nullptr);
+    return;
+  }
+  updates::UpdateLastShownTimeStamp(base::Time::Now());
+  // TODO(hesen): Record metrics, and add iHNR buttons.
+  std::move(callback).Run(std::move(notification_data));
 }
 
 void UpdateNotificationClient::OnSchedulerInitialized(
diff --git a/chrome/browser/updates/update_notification_client.h b/chrome/browser/updates/update_notification_client.h
index 84d0307..87d1782 100644
--- a/chrome/browser/updates/update_notification_client.h
+++ b/chrome/browser/updates/update_notification_client.h
@@ -9,10 +9,13 @@
 #include <set>
 #include <string>
 
+#include "base/bind.h"
 #include "chrome/browser/notifications/scheduler/public/notification_scheduler_client.h"
 
 namespace updates {
 
+class UpdateNotificationService;
+
 // Client side code for Chrome Update notification, integrated with
 // notificaiton scheduler system.
 class UpdateNotificationClient
@@ -20,8 +23,10 @@
  public:
   using NotificationData = notifications::NotificationData;
   using UserActionData = notifications::UserActionData;
+  using GetServiceCallback =
+      base::RepeatingCallback<UpdateNotificationService*()>;
 
-  UpdateNotificationClient();
+  explicit UpdateNotificationClient(GetServiceCallback callback);
   ~UpdateNotificationClient() override;
 
  private:
@@ -33,6 +38,8 @@
                               std::set<std::string> guids) override;
   void OnUserAction(const UserActionData& action_data) override;
 
+  GetServiceCallback get_service_callback_;
+
   DISALLOW_COPY_AND_ASSIGN(UpdateNotificationClient);
 };
 
diff --git a/chrome/renderer/autofill/password_generation_agent_browsertest.cc b/chrome/renderer/autofill/password_generation_agent_browsertest.cc
index 41b7cd6..983114df 100644
--- a/chrome/renderer/autofill/password_generation_agent_browsertest.cc
+++ b/chrome/renderer/autofill/password_generation_agent_browsertest.cc
@@ -606,14 +606,7 @@
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
 }
 
-// https://crbug.com/1036807.
-#if defined(OS_WIN) || defined(OS_LINUX)
-#define MAYBE_MaximumCharsForGenerationOffer \
-  DISABLED_MaximumCharsForGenerationOffer
-#else
-#define MAYBE_MaximumCharsForGenerationOffer MaximumCharsForGenerationOffer
-#endif
-TEST_F(PasswordGenerationAgentTest, MAYBE_MaximumCharsForGenerationOffer) {
+TEST_F(PasswordGenerationAgentTest, MaximumCharsForGenerationOffer) {
   base::HistogramTester histogram_tester;
 
   LoadHTMLWithUserGesture(kAccountCreationFormHTML);
@@ -669,6 +662,7 @@
   // display event is sent.
   EXPECT_CALL(fake_pw_client_, GenerationElementLostFocus());
   LoadHTMLWithUserGesture(kSigninFormHTML);
+  fake_pw_client_.Flush();
 
   histogram_tester.ExpectBucketCount(
       "PasswordGeneration.Event",
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 28a3cd26..d44bc77 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3270,17 +3270,6 @@
     "../browser/performance_manager/mechanisms/working_set_trimmer_win_unittest.cc",
     "../browser/performance_manager/observers/isolation_context_metrics_unittest.cc",
     "../browser/performance_manager/observers/metrics_collector_unittest.cc",
-    "../browser/performance_manager/persistence/site_data/exponential_moving_average_unittest.cc",
-    "../browser/performance_manager/persistence/site_data/leveldb_site_data_store_unittest.cc",
-    "../browser/performance_manager/persistence/site_data/non_recording_site_data_cache_unittest.cc",
-    "../browser/performance_manager/persistence/site_data/site_data_cache_facade_unittest.cc",
-    "../browser/performance_manager/persistence/site_data/site_data_cache_factory_unittest.cc",
-    "../browser/performance_manager/persistence/site_data/site_data_cache_impl_unittest.cc",
-    "../browser/performance_manager/persistence/site_data/site_data_impl_unittest.cc",
-    "../browser/performance_manager/persistence/site_data/site_data_reader_unittest.cc",
-    "../browser/performance_manager/persistence/site_data/site_data_writer_unittest.cc",
-    "../browser/performance_manager/persistence/site_data/unittest_utils.cc",
-    "../browser/performance_manager/persistence/site_data/unittest_utils.h",
     "../browser/performance_manager/render_process_host_proxy_unittest.cc",
     "../browser/performance_manager/test_support/page_aggregator.cc",
     "../browser/performance_manager/test_support/page_aggregator.h",
@@ -3792,6 +3781,7 @@
       "../browser/autofill/credit_card_accessory_controller_impl_unittest.cc",
       "../browser/autofill/manual_filling_controller_impl_unittest.cc",
       "../browser/contextmenu/chrome_context_menu_populator_unittest.cc",
+      "../browser/installedapp/installed_app_provider_unittest.cc",
       "../browser/media/android/cdm/media_drm_origin_id_manager_unittest.cc",
       "../browser/metrics/chrome_android_metrics_provider_unittest.cc",
       "../browser/page_load_metrics/observers/android_page_load_metrics_observer_unittest.cc",
@@ -3944,6 +3934,19 @@
       "../browser/resource_coordinator/tracing_lifecycle_unit_observer_unittest.cc",
       "../browser/resource_coordinator/usage_clock_unittest.cc",
 
+      # The site data database isn't supported on Android.
+      "../browser/performance_manager/persistence/site_data/exponential_moving_average_unittest.cc",
+      "../browser/performance_manager/persistence/site_data/leveldb_site_data_store_unittest.cc",
+      "../browser/performance_manager/persistence/site_data/non_recording_site_data_cache_unittest.cc",
+      "../browser/performance_manager/persistence/site_data/site_data_cache_facade_unittest.cc",
+      "../browser/performance_manager/persistence/site_data/site_data_cache_factory_unittest.cc",
+      "../browser/performance_manager/persistence/site_data/site_data_cache_impl_unittest.cc",
+      "../browser/performance_manager/persistence/site_data/site_data_impl_unittest.cc",
+      "../browser/performance_manager/persistence/site_data/site_data_reader_unittest.cc",
+      "../browser/performance_manager/persistence/site_data/site_data_writer_unittest.cc",
+      "../browser/performance_manager/persistence/site_data/unittest_utils.cc",
+      "../browser/performance_manager/persistence/site_data/unittest_utils.h",
+
       # Android does not use the Message Center notification system.
       "../browser/notifications/notification_ui_manager_unittest.cc",
       "../browser/platform_util_unittest.cc",
@@ -4017,6 +4020,7 @@
       "../browser/ui/cookie_controls/cookie_controls_controller_unittest.cc",
       "../browser/ui/exclusive_access/fullscreen_controller_state_unittest.cc",
       "../browser/ui/extensions/extension_action_view_controller_unittest.cc",
+      "../browser/ui/extensions/extension_installed_waiter_unittest.cc",
       "../browser/ui/extensions/extension_message_bubble_bridge_unittest.cc",
       "../browser/ui/global_error/global_error_service_unittest.cc",
       "../browser/ui/global_media_controls/cast_media_notification_item_unittest.cc",
diff --git a/chrome/test/data/extensions/theme/Cached Theme.pak b/chrome/test/data/extensions/theme/Cached Theme.pak
index 405498f8c..93732d5 100644
--- a/chrome/test/data/extensions/theme/Cached Theme.pak
+++ b/chrome/test/data/extensions/theme/Cached Theme.pak
Binary files differ
diff --git a/chrome/test/data/webui/new_tab_page/theme_icon_test.js b/chrome/test/data/webui/new_tab_page/theme_icon_test.js
index 68e1c0c..edcf864 100644
--- a/chrome/test/data/webui/new_tab_page/theme_icon_test.js
+++ b/chrome/test/data/webui/new_tab_page/theme_icon_test.js
@@ -63,11 +63,12 @@
         queryAll('#gradient > stop')[1], 'stop-color', 'rgb(255, 0, 0)');
   });
 
-  test('selecting icon shows ring', async () => {
+  test('selecting icon shows ring and check mark', async () => {
     // Act.
     themeIcon.setAttribute('selected', true);
 
     // Assert.
     assertStyle(query('#ring'), 'visibility', 'visible');
+    assertStyle(query('#checkMark'), 'visibility', 'visible');
   });
 });
diff --git a/chrome/tools/build/mac/FILES.cfg b/chrome/tools/build/mac/FILES.cfg
index 91654c3..2089a89e 100644
--- a/chrome/tools/build/mac/FILES.cfg
+++ b/chrome/tools/build/mac/FILES.cfg
@@ -129,9 +129,4 @@
     'buildtype': ['dev', 'official'],
     'archive': 'devtools-frontend.zip',
   },
-  # Updater files:
-  {
-    'filename': 'GoogleUpdate.app',
-    'buildtype': ['official'],
-  }
 ]
diff --git a/chromecast/BUILD.gn b/chromecast/BUILD.gn
index a43acc6..5cea2c2d9 100644
--- a/chromecast/BUILD.gn
+++ b/chromecast/BUILD.gn
@@ -583,7 +583,6 @@
     "DISABLE_SECURE_FLAC_OPUS_DECODING=$disable_secure_flac_and_opus_decoding",
     "ENABLE_ASSISTANT=$enable_assistant",
     "ENABLE_CAST_FRAGMENT=$enable_cast_fragment",
-    "ENABLE_CAST_WAYLAND_SERVER=$enable_cast_wayland_server",
     "ENABLE_CHROMECAST_EXTENSIONS=$enable_chromecast_extensions",
     "ENABLE_EXTERNAL_MOJO_SERVICES=$enable_external_mojo_services",
     "ENABLE_PLAYREADY=$enable_playready",
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn
index 5f38a408..3ef8091c 100644
--- a/chromecast/browser/BUILD.gn
+++ b/chromecast/browser/BUILD.gn
@@ -397,7 +397,7 @@
     ]
   }
 
-  if (enable_cast_wayland_server) {
+  if (is_linux && use_ozone) {
     sources += [
       "exo/cast_wm_helper.cc",
       "exo/cast_wm_helper.h",
diff --git a/chromecast/browser/android/apk/res-values/values/strings.xml b/chromecast/browser/android/apk/res-values/values/strings.xml
index 6e01b910..d9650e3 100644
--- a/chromecast/browser/android/apk/res-values/values/strings.xml
+++ b/chromecast/browser/android/apk/res-values/values/strings.xml
@@ -8,6 +8,6 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            tools:ignore="MissingTranslation,UnusedResources">
-    <string name="app_name">Chromecast Android Shell</string>
+    <string name="app_name">Chromecast built-in</string>
     <string name="browser_process_initialization_failed">Initialization failed.</string>
 </resources>
diff --git a/chromecast/browser/cast_browser_main_parts.cc b/chromecast/browser/cast_browser_main_parts.cc
index 81b9466..51dcf9b 100644
--- a/chromecast/browser/cast_browser_main_parts.cc
+++ b/chromecast/browser/cast_browser_main_parts.cc
@@ -123,7 +123,7 @@
 #include "extensions/browser/extension_prefs.h"  // nogncheck
 #endif
 
-#if BUILDFLAG(ENABLE_CAST_WAYLAND_SERVER)
+#if defined(OS_LINUX) && defined(USE_OZONE)
 #include "chromecast/browser/exo/wayland_server_controller.h"
 #endif
 
@@ -629,7 +629,7 @@
       cast_browser_process_->browser_context());
 #endif
 
-#if BUILDFLAG(ENABLE_CAST_WAYLAND_SERVER)
+#if defined(OS_LINUX) && defined(USE_OZONE)
   wayland_server_controller_ =
       std::make_unique<WaylandServerController>(window_manager_.get());
 #endif
@@ -712,7 +712,7 @@
 }
 
 void CastBrowserMainParts::PostMainMessageLoopRun() {
-#if BUILDFLAG(ENABLE_CAST_WAYLAND_SERVER)
+#if defined(OS_LINUX) && defined(USE_OZONE)
   wayland_server_controller_.reset();
 #endif
 #if BUILDFLAG(ENABLE_CHROMECAST_EXTENSIONS)
diff --git a/chromecast/browser/cast_browser_main_parts.h b/chromecast/browser/cast_browser_main_parts.h
index e952f22..4480a46e 100644
--- a/chromecast/browser/cast_browser_main_parts.h
+++ b/chromecast/browser/cast_browser_main_parts.h
@@ -130,7 +130,7 @@
   std::unique_ptr<PrefService> user_pref_service_;
 #endif
 
-#if BUILDFLAG(ENABLE_CAST_WAYLAND_SERVER)
+#if defined(OS_LINUX) && defined(USE_OZONE)
   std::unique_ptr<WaylandServerController> wayland_server_controller_;
 #endif
 
diff --git a/chromecast/browser/cast_content_browser_client.cc b/chromecast/browser/cast_content_browser_client.cc
index aff2572..fa721ffc 100644
--- a/chromecast/browser/cast_content_browser_client.cc
+++ b/chromecast/browser/cast_content_browser_client.cc
@@ -126,9 +126,9 @@
 #include "chromecast/external_mojo/broker_service/broker_service.h"
 #endif
 
-#if BUILDFLAG(ENABLE_CAST_WAYLAND_SERVER)
+#if defined(OS_LINUX) && defined(USE_OZONE)
 #include "chromecast/browser/webview/webview_controller.h"
-#endif  // BUILDFLAG(ENABLE_CAST_WAYLAND_SERVER)
+#endif  // defined(OS_LINUX) && defined(USE_OZONE)
 
 #if BUILDFLAG(ENABLE_CAST_RENDERER)
 #include "base/sequenced_task_runner.h"
@@ -811,12 +811,12 @@
             handle, general_audience_browsing_service_.get()));
   }
 
-#if BUILDFLAG(ENABLE_CAST_WAYLAND_SERVER)
+#if defined(OS_LINUX) && defined(USE_OZONE)
   auto webview_throttle = WebviewController::MaybeGetNavigationThrottle(handle);
   if (webview_throttle) {
     throttles.push_back(std::move(webview_throttle));
   }
-#endif  // BUILDFLAG(ENABLE_CAST_WAYLAND_SERVER)
+#endif  // defined(OS_LINUX) && defined(USE_OZONE)
 
   return throttles;
 }
diff --git a/chromecast/browser/cast_content_browser_client_receiver_bindings.cc b/chromecast/browser/cast_content_browser_client_receiver_bindings.cc
index e82f43d..23e002ad 100644
--- a/chromecast/browser/cast_content_browser_client_receiver_bindings.cc
+++ b/chromecast/browser/cast_content_browser_client_receiver_bindings.cc
@@ -36,7 +36,7 @@
 #include "chromecast/external_mojo/broker_service/broker_service.h"
 #endif
 
-#if BUILDFLAG(ENABLE_CAST_WAYLAND_SERVER)
+#if defined(OS_LINUX) && defined(USE_OZONE)
 #include "chromecast/browser/webview/js_channel_service.h"
 #include "chromecast/common/mojom/js_channel.mojom.h"
 #endif
@@ -232,7 +232,7 @@
 void CastContentBrowserClient::BindHostReceiverForRenderer(
     content::RenderProcessHost* render_process_host,
     mojo::GenericPendingReceiver receiver) {
-#if BUILDFLAG(ENABLE_CAST_WAYLAND_SERVER)
+#if defined(OS_LINUX) && defined(USE_OZONE)
   if (auto r = receiver.As<::chromecast::mojom::JsChannelBindingProvider>()) {
     JsChannelService::Create(render_process_host, std::move(r),
                              base::ThreadTaskRunnerHandle::Get());
diff --git a/chromecast/chromecast.gni b/chromecast/chromecast.gni
index faa8dff..1cf5f4d 100644
--- a/chromecast/chromecast.gni
+++ b/chromecast/chromecast.gni
@@ -104,9 +104,6 @@
   # cast CMA media backend and supporting Widevine or Playready.
   disable_secure_flac_and_opus_decoding = false
 
-  # Set to true to enable wayland server
-  enable_cast_wayland_server = false
-
   # Set to true to enable mixing in CastAudioManager. Only needed on devices
   # that do not have a mixer in the CMA backend.
   enable_cast_audio_manager_mixer =
diff --git a/chromecast/renderer/cast_content_renderer_client.cc b/chromecast/renderer/cast_content_renderer_client.cc
index 4a050b9..45941c2 100644
--- a/chromecast/renderer/cast_content_renderer_client.cc
+++ b/chromecast/renderer/cast_content_renderer_client.cc
@@ -192,7 +192,7 @@
   dispatcher->OnRenderFrameCreated(render_frame);
 #endif
 
-#if BUILDFLAG(ENABLE_CAST_WAYLAND_SERVER)
+#if defined(OS_LINUX) && defined(USE_OZONE)
   // JsChannelBindings destroys itself when the RenderFrame is destroyed.
   JsChannelBindings::Create(render_frame);
 #endif
diff --git a/chromeos/printing/printer_translator.h b/chromeos/printing/printer_translator.h
index 6803752..e81ea83 100644
--- a/chromeos/printing/printer_translator.h
+++ b/chromeos/printing/printer_translator.h
@@ -19,7 +19,7 @@
 CHROMEOS_EXPORT extern const char kPrinterId[];
 
 // Returns a new printer populated with the fields from |pref|.  Processes
-// dictionaries from policy i.e. cPanel.
+// dictionaries from policy.
 CHROMEOS_EXPORT std::unique_ptr<Printer> RecommendedPrinterToPrinter(
     const base::DictionaryValue& pref);
 
diff --git a/components/arc/BUILD.gn b/components/arc/BUILD.gn
index 1769c9d..df59239 100644
--- a/components/arc/BUILD.gn
+++ b/components/arc/BUILD.gn
@@ -34,8 +34,6 @@
     "intent_helper/arc_intent_helper_observer.h",
     "intent_helper/control_camera_app_delegate.h",
     "intent_helper/factory_reset_delegate.h",
-    "intent_helper/font_size_util.cc",
-    "intent_helper/font_size_util.h",
     "intent_helper/intent_constants.cc",
     "intent_helper/intent_constants.h",
     "intent_helper/intent_filter.cc",
@@ -371,7 +369,6 @@
     "ime/arc_ime_service_unittest.cc",
     "intent_helper/activity_icon_loader_unittest.cc",
     "intent_helper/arc_intent_helper_bridge_unittest.cc",
-    "intent_helper/font_size_util_unittest.cc",
     "intent_helper/intent_filter_unittest.cc",
     "intent_helper/link_handler_model_unittest.cc",
     "metrics/arc_metrics_service_unittest.cc",
diff --git a/components/arc/intent_helper/font_size_util.cc b/components/arc/intent_helper/font_size_util.cc
deleted file mode 100644
index 968db7d..0000000
--- a/components/arc/intent_helper/font_size_util.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/arc/intent_helper/font_size_util.h"
-
-#include <algorithm>
-
-namespace arc {
-
-double ConvertFontSizeChromeToAndroid(int default_size,
-                                      int default_fixed_size,
-                                      int minimum_size) {
-  // kWebKitDefaultFixedFontSize is automatically set to be 3 pixels smaller
-  // than kWebKitDefaultFontSize when Chrome's settings page's main font
-  // dropdown control is adjusted.  If the user specifically sets a higher
-  // fixed font size we will want to take into account the adjustment.
-  default_fixed_size += 3;
-  int max_chrome_size =
-      std::max({default_fixed_size, default_size, minimum_size});
-
-  double android_scale = kAndroidFontScaleSmall;
-  if (max_chrome_size >= kChromeFontSizeVeryLarge) {
-    android_scale = kAndroidFontScaleHuge;
-  } else if (max_chrome_size >= kChromeFontSizeLarge) {
-    android_scale = kAndroidFontScaleLarge;
-  } else if (max_chrome_size >= kChromeFontSizeNormal) {
-    android_scale = kAndroidFontScaleNormal;
-  }
-
-  return android_scale;
-}
-
-}  // namespace arc
diff --git a/components/arc/intent_helper/font_size_util.h b/components/arc/intent_helper/font_size_util.h
deleted file mode 100644
index e7cc9ef..0000000
--- a/components/arc/intent_helper/font_size_util.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_ARC_INTENT_HELPER_FONT_SIZE_UTIL_H_
-#define COMPONENTS_ARC_INTENT_HELPER_FONT_SIZE_UTIL_H_
-
-namespace arc {
-
-// The following values were obtained from chrome://settings and Android's
-// Display settings on Nov 2015. They are expected to remain stable.
-const float kAndroidFontScaleSmall = 0.85;
-const float kAndroidFontScaleNormal = 1;
-const float kAndroidFontScaleLarge = 1.15;
-const float kAndroidFontScaleHuge = 1.3;
-const int kChromeFontSizeNormal = 16;
-const int kChromeFontSizeLarge = 20;
-const int kChromeFontSizeVeryLarge = 24;
-
-// Android has only a single float value for system-wide font size
-// (font_scale).  Chrome has three main int pixel values that affect
-// system-wide font size.  We will take the largest font value of the three
-// main font values on Chrome and convert to an Android size.
-double ConvertFontSizeChromeToAndroid(int default_size,
-                                      int default_fixed_size,
-                                      int minimum_size);
-
-}  // namespace arc
-
-#endif  // COMPONENTS_ARC_INTENT_HELPER_FONT_SIZE_UTIL_H_
diff --git a/components/arc/intent_helper/font_size_util_unittest.cc b/components/arc/intent_helper/font_size_util_unittest.cc
deleted file mode 100644
index 31cbd60d..0000000
--- a/components/arc/intent_helper/font_size_util_unittest.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/arc/intent_helper/font_size_util.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace arc {
-
-TEST(ArcSettingsServiceTest, FontSizeConvertChromeToAndroid) {
-  // Does not return a value smaller than Small.
-  EXPECT_DOUBLE_EQ(kAndroidFontScaleSmall,
-                   ConvertFontSizeChromeToAndroid(0, 0, 0));
-
-  // Does not return a value larger than Huge
-  EXPECT_DOUBLE_EQ(kAndroidFontScaleHuge,
-                   ConvertFontSizeChromeToAndroid(100, 100, 100));
-
-  // The max of any Chrome values is what determines the Android value.
-  EXPECT_DOUBLE_EQ(kAndroidFontScaleLarge,
-                   ConvertFontSizeChromeToAndroid(20, 0, 0));
-  EXPECT_DOUBLE_EQ(kAndroidFontScaleLarge,
-                   ConvertFontSizeChromeToAndroid(0, 20, 0));
-  EXPECT_DOUBLE_EQ(kAndroidFontScaleLarge,
-                   ConvertFontSizeChromeToAndroid(0, 0, 20));
-
-  // default fixed font size is adjusted up three pixels
-  EXPECT_DOUBLE_EQ(kAndroidFontScaleLarge,
-                   ConvertFontSizeChromeToAndroid(0, 17, 0));
-
-  // Small converts properly.
-  EXPECT_DOUBLE_EQ(kAndroidFontScaleSmall,
-                   ConvertFontSizeChromeToAndroid(12, 0, 0));
-
-  // Normal converts properly.
-  EXPECT_DOUBLE_EQ(kAndroidFontScaleNormal,
-                   ConvertFontSizeChromeToAndroid(16, 0, 0));
-
-  // Large converts properly.
-  EXPECT_DOUBLE_EQ(kAndroidFontScaleLarge,
-                   ConvertFontSizeChromeToAndroid(20, 0, 0));
-
-  // Very large converts properly.
-  EXPECT_DOUBLE_EQ(kAndroidFontScaleHuge,
-                   ConvertFontSizeChromeToAndroid(24, 0, 0));
-}
-
-}  // namespace arc
diff --git a/components/arc/mojom/file_system.mojom b/components/arc/mojom/file_system.mojom
index 16f0b9a..4c3176e 100644
--- a/components/arc/mojom/file_system.mojom
+++ b/components/arc/mojom/file_system.mojom
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Next MinVersion: 14
+// Next MinVersion: 15
 
 module arc.mojom;
 
@@ -278,7 +278,7 @@
       (FileSelectorElements elements);
 };
 
-// Next method ID: 19
+// Next method ID: 21
 interface FileSystemInstance {
   // Notes about Android Documents Provider:
   //
@@ -409,6 +409,13 @@
   // MediaProvider is removed.
   RequestMediaScan@0(array<string> paths);
 
+  // Reloads and refreshes entries in MediaStore under |directory_path|.
+  [MinVersion=14] ReindexDirectory@19(string directory_path);
+
+  // Searches for the removed files/directories under the given
+  // |directory_paths| (non-recursively) in MediaStore and removes them.
+  [MinVersion=14] RequestFileRemovalScan@20(array<string> directory_paths);
+
   // Opens URLs by sending an intent to the specified activity.
   // Since this grants read/write URL permissions to the activity, callers must
   // ensure that the user is correctly aware of the URLs and the activity they
diff --git a/components/arc/test/fake_file_system_instance.cc b/components/arc/test/fake_file_system_instance.cc
index ef07647..0ff365df 100644
--- a/components/arc/test/fake_file_system_instance.cc
+++ b/components/arc/test/fake_file_system_instance.cc
@@ -62,6 +62,8 @@
 
 }  // namespace
 
+constexpr base::FilePath::CharType FakeFileSystemInstance::kFakeAndroidPath[];
+
 FakeFileSystemInstance::File::File(const std::string& url,
                                    const std::string& content,
                                    const std::string& mime_type,
@@ -174,6 +176,23 @@
   roots_.push_back(root);
 }
 
+void FakeFileSystemInstance::SetGetLastChangeTimeCallback(
+    GetLastChangeTimeCallback ctime_callback) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  ctime_callback_ = ctime_callback;
+}
+
+void FakeFileSystemInstance::SetCrosDir(const base::FilePath& cros_dir) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  cros_dir_ = cros_dir;
+}
+
+void FakeFileSystemInstance::SetMediaStore(
+    const std::map<base::FilePath, base::Time>& media_store) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  media_store_ = media_store;
+}
+
 void FakeFileSystemInstance::TriggerWatchers(
     const std::string& authority,
     const std::string& document_id,
@@ -555,10 +574,65 @@
       FROM_HERE, base::BindOnce(std::move(callback), true));
 }
 
+// TODO(risan): "Added" directory might not be handled. Please double check
+// this.
 void FakeFileSystemInstance::RequestMediaScan(
     const std::vector<std::string>& paths) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  // Do nothing and pretend we scaned them.
+  // TODO(risan): This is to prevent crashing other tests that expect nothing
+  // from RequestMediaScan, e.g., the following:
+  // FilesAppBrowserTest.Test/dirContextMenuDocumentsProvider_DocumentsProvider
+  if (cros_dir_.empty())
+    return;
+  for (const auto& path : paths) {
+    base::FilePath file_path = base::FilePath(path);
+    base::FilePath cros_path = GetCrosPath(file_path);
+    if (PathExists(cros_path)) {
+      // For each existing path, index itself and all parent directories of
+      // it.
+      base::Time ctime;
+      if (!DirectoryExists(cros_path))
+        ctime = ctime_callback_.Run(cros_path);
+      media_store_[file_path] = ctime;
+      file_path = file_path.DirName();
+      while (file_path != base::FilePath(kFakeAndroidPath).DirName()) {
+        media_store_[file_path] = base::Time();
+        file_path = file_path.DirName();
+      }
+    } else {
+      // When a file or directory does not exist, it means it has been
+      // deleted. So we need to erase its index entry in |media_store_|, and
+      // also the entries of all files/directories underneath it if it is a
+      // directory.
+      for (auto it = media_store_.begin(); it != media_store_.end();) {
+        if (it->first == file_path || file_path.IsParent(it->first))
+          media_store_.erase(it++);
+        else
+          ++it;
+      }
+    }
+  }
+}
+
+void FakeFileSystemInstance::RequestFileRemovalScan(
+    const std::vector<std::string>& directory_paths) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  ReindexDirectory(kFakeAndroidPath);
+}
+
+void FakeFileSystemInstance::ReindexDirectory(
+    const std::string& directory_path) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  std::vector<std::string> paths = {directory_path};
+  base::FilePath directory_file_path(directory_path);
+  for (const auto& entry : media_store_) {
+    base::FilePath entry_path = entry.first;
+    if (!directory_file_path.IsParent(entry_path)) {
+      continue;
+    }
+    paths.push_back(entry_path.value());
+  }
+  RequestMediaScan(paths);
 }
 
 void FakeFileSystemInstance::OpenUrlsWithPermission(
@@ -637,4 +711,12 @@
   return fd_write;
 }
 
+base::FilePath FakeFileSystemInstance::GetCrosPath(
+    const base::FilePath& android_path) const {
+  base::FilePath cros_path(cros_dir_);
+  base::FilePath android_dir(kFakeAndroidPath);
+  android_dir.AppendRelativePath(android_path, &cros_path);
+  return cros_path;
+}
+
 }  // namespace arc
diff --git a/components/arc/test/fake_file_system_instance.h b/components/arc/test/fake_file_system_instance.h
index 9031bb5..c40dbf3 100644
--- a/components/arc/test/fake_file_system_instance.h
+++ b/components/arc/test/fake_file_system_instance.h
@@ -54,6 +54,15 @@
 class FakeFileSystemInstance : public mojom::FileSystemInstance {
  public:
   // Specification of a fake file available to content URL based methods.
+  using GetLastChangeTimeCallback =
+      base::RepeatingCallback<base::Time(const base::FilePath& path)>;
+
+  // TODO(risan): Consider if this is really needed, and whether we should just
+  // use the simpler option by using the original directory as is.
+  // The path for the top level directory considered in MediaStore.
+  static constexpr base::FilePath::CharType kFakeAndroidPath[] =
+      FILE_PATH_LITERAL("/android/path");
+
   struct File {
     enum class Seekable {
       NO,
@@ -181,6 +190,20 @@
   // Adds a root accessible by document provider based methods.
   void AddRoot(const Root& root);
 
+  // Fake the GetLastChangedTime implementation.
+  void SetGetLastChangeTimeCallback(GetLastChangeTimeCallback ctime_callback);
+
+  // Sets the path for the top level cros directory considered in MediaStore.
+  // TODO(risan): Consider to not use this (if we go without different android
+  // path approach). Another possibility to consider is probably to bind mount
+  // the directory in the caller test and do android_path conversion for the
+  // caller? In any case, this we don't want cros to be exposed to this instance
+  // that lives under Android.
+  void SetCrosDir(const base::FilePath& cros_dir);
+
+  // Sets the initial media store content.
+  void SetMediaStore(const std::map<base::FilePath, base::Time>& media_store);
+
   // Triggers watchers installed to a document.
   void TriggerWatchers(const std::string& authority,
                        const std::string& document_id,
@@ -225,6 +248,11 @@
     return handled_url_requests_;
   }
 
+  // Returns the content of the fake media store index.
+  const std::map<base::FilePath, base::Time>& GetMediaStore() const {
+    return media_store_;
+  }
+
   // mojom::FileSystemInstance:
   void AddWatcher(const std::string& authority,
                   const std::string& document_id,
@@ -273,6 +301,9 @@
   void RemoveWatcher(int64_t watcher_id,
                      RemoveWatcherCallback callback) override;
   void RequestMediaScan(const std::vector<std::string>& paths) override;
+  void RequestFileRemovalScan(
+      const std::vector<std::string>& directory_paths) override;
+  void ReindexDirectory(const std::string& directory_path) override;
   void OpenUrlsWithPermission(mojom::OpenUrlsRequestPtr request,
                               OpenUrlsWithPermissionCallback callback) override;
 
@@ -302,6 +333,9 @@
   // read by calling GetFileContent() with the passed |url|.
   base::ScopedFD CreateStreamFileDescriptorToWrite(const std::string& url);
 
+  // Returns the cros file path for |android_path|.
+  base::FilePath GetCrosPath(const base::FilePath& android_path) const;
+
   THREAD_CHECKER(thread_checker_);
 
   base::ScopedTempDir temp_dir_;
@@ -340,6 +374,15 @@
   // List of roots added by AddRoot().
   std::vector<Root> roots_;
 
+  // Fake MediaStore database index.
+  std::map<base::FilePath, base::Time> media_store_;
+
+  // Fake GetLastChangedTime function callback.
+  GetLastChangeTimeCallback ctime_callback_;
+
+  // The path for the top level cros directory considered in MediaStore.
+  base::FilePath cros_dir_;
+
   int64_t next_watcher_id_ = 1;
   int get_child_documents_count_ = 0;
 
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc
index 218da39..019f3fbe 100644
--- a/components/autofill/core/browser/personal_data_manager.cc
+++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -77,7 +77,8 @@
   kNotMigrated = 0,
   kMigratedFromCanonicalEmail = 1,
   kMigratedFromNonCanonicalEmail = 2,
-  kMaxValue = kMigratedFromNonCanonicalEmail,
+  kNotMigratedUnexpectedPrimaryAccountIdWithEmail = 3,
+  kMaxValue = kNotMigratedUnexpectedPrimaryAccountIdWithEmail,
 };
 
 template <typename T>
@@ -2531,7 +2532,15 @@
 
   // When migration is started or done, the primary account is created from a
   // Gaia ID.
-  DCHECK(!primary_account_id.IsEmail());
+  if (primary_account_id.IsEmail()) {
+    DLOG(ERROR) << "Unexpected primary account id from an email ["
+                << primary_account_id << "].";
+    base::UmaHistogramEnumeration(
+        "Autofill.MigrateUserOptedInToWalletSync",
+        MigrateUserOptedInWalletSyncType::
+            kNotMigratedUnexpectedPrimaryAccountIdWithEmail);
+    return;
+  }
 
   CoreAccountId legacy_account_id_from_email =
       CoreAccountId::FromEmail(gaia::CanonicalizeEmail(primary_account.email));
diff --git a/components/exo/BUILD.gn b/components/exo/BUILD.gn
index 9704c816..618d3b6 100644
--- a/components/exo/BUILD.gn
+++ b/components/exo/BUILD.gn
@@ -254,6 +254,7 @@
       "//ash:test_support",
       "//ash/keyboard/ui",
       "//ash/public/cpp",
+      "//chromeos/constants",
     ]
   }
 
diff --git a/components/exo/pointer.cc b/components/exo/pointer.cc
index 01f0dcf..fd4460a 100644
--- a/components/exo/pointer.cc
+++ b/components/exo/pointer.cc
@@ -262,24 +262,20 @@
   if (!capture_window_)
     return;
 
-  auto* capture_client = WMHelper::GetInstance()->GetCaptureClient();
-  capture_client->RemoveObserver(this);
-  if (capture_window_ && capture_window_->HasCapture())
-    capture_client->ReleaseCapture(capture_window_);
-  capture_window_ = nullptr;
+  // Remove the pre-target handler that consumes all mouse events.
+  aura::Env::GetInstance()->RemovePreTargetHandler(this);
 
   auto* cursor_client = WMHelper::GetInstance()->GetCursorClient();
   cursor_client->UnlockCursor();
   cursor_client->ShowCursor();
 
-  aura::Window* focusedWindow = WMHelper::GetInstance()->GetFocusedWindow();
-  aura::Window* root = focusedWindow->GetRootWindow();
+  aura::Window* root = capture_window_->GetRootWindow();
   gfx::Point p = location_when_pointer_capture_enabled_
                      ? *location_when_pointer_capture_enabled_
                      : root->bounds().CenterPoint();
   root->MoveCursorTo(p);
 
-  focus_surface_ = nullptr;
+  capture_window_ = nullptr;
   location_when_pointer_capture_enabled_.reset();
   UpdateCursor();
 }
@@ -312,15 +308,24 @@
   if (!base::FeatureList::IsEnabled(kPointerCapture))
     return false;
 
+  if (capture_surface->window() !=
+      WMHelper::GetInstance()->GetFocusedWindow()) {
+    LOG(ERROR)
+        << "Cannot enable pointer capture on a window that is not focused.";
+    return false;
+  }
+
   if (!capture_surface->HasSurfaceObserver(this))
     capture_surface->AddSurfaceObserver(this);
 
   capture_window_ = capture_surface->window();
 
-  auto* capture_client = WMHelper::GetInstance()->GetCaptureClient();
-  capture_client->SetCapture(capture_window_);
-  capture_client->AddObserver(this);
+  // Add a pre-target handler that can consume all mouse events before it gets
+  // sent to other targets.
+  aura::Env::GetInstance()->AddPreTargetHandler(
+      this, ui::EventTarget::Priority::kSystem);
 
+  // TODO(b/146082565): Do not hide cursor when enabling pointer capture.
   auto* cursor_client = WMHelper::GetInstance()->GetCursorClient();
   cursor_client->HideCursor();
   cursor_client->LockCursor();
@@ -354,6 +359,8 @@
     pointer_constraint_delegate_->OnConstraintBroken();
     UnconstrainPointer();
   }
+  if (surface && surface->window() == capture_window_)
+    DisablePointerCapture();
   if (surface == focus_surface_) {
     SetFocus(nullptr, gfx::PointF(), 0);
     return;
@@ -388,8 +395,7 @@
 
   TRACE_EXO_INPUT_EVENT(event);
 
-  if (event->IsMouseEvent() && event->type() != ui::ET_MOUSE_EXITED &&
-      event->type() != ui::ET_MOUSE_CAPTURE_CHANGED) {
+  if (event->IsMouseEvent() && event->type() != ui::ET_MOUSE_CAPTURE_CHANGED) {
     // Generate motion event if location changed. We need to check location
     // here as mouse movement can generate both "moved" and "entered" events
     // but OnPointerMotion should only be called if location changed since
@@ -402,16 +408,18 @@
                              : gfx::ToFlooredPoint(location_in_root) ==
                                    gfx::ToFlooredPoint(location_);
     if (!same_location) {
-      if (relative_pointer_delegate_)
-        HandleRelativePointerMotion(event->time_stamp(), location_in_root);
+      bool needs_frame =
+          HandleRelativePointerMotion(event->time_stamp(), location_in_root);
       if (capture_window_) {
         if (ShouldMoveToCenter())
           MoveCursorToCenterOfActiveDisplay();
-      } else {
+      } else if (event->type() != ui::ET_MOUSE_EXITED) {
         delegate_->OnPointerMotion(event->time_stamp(), location_in_target);
+        needs_frame = true;
       }
+      if (needs_frame)
+        delegate_->OnPointerFrame();
       location_ = location_in_root;
-      delegate_->OnPointerFrame();
     }
   }
   switch (event->type()) {
@@ -481,6 +489,12 @@
   }
 
   last_event_type_ = event->type();
+
+  // Consume all mouse events when pointer capture is enabled.
+  if (capture_window_) {
+    event->SetHandled();
+    event->StopPropagation();
+  }
 }
 
 void Pointer::OnScrollEvent(ui::ScrollEvent* event) {
@@ -517,16 +531,12 @@
     default:
       break;
   }
-}
 
-////////////////////////////////////////////////////////////////////////////////
-// aura::client::CaptureClientObserver overrides:
-
-void Pointer::OnCaptureChanged(aura::Window* lost_capture,
-                               aura::Window* gained_capture) {
-  // Note: This observer is only set when pointer capture in enabled.
-  if (capture_window_ && gained_capture != capture_window_)
-    DisablePointerCapture();
+  // Consume all mouse events when pointer capture is enabled.
+  if (capture_window_) {
+    event->SetHandled();
+    event->StopPropagation();
+  }
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -565,14 +575,23 @@
 
 void Pointer::OnWindowFocused(aura::Window* gained_focus,
                               aura::Window* lost_focus) {
-  if (capture_window_)
-    DisablePointerCapture();
+  if (capture_window_ && capture_window_ != gained_focus) {
+    if (pointer_constraint_delegate_) {
+      pointer_constraint_delegate_->OnConstraintBroken();
+      UnconstrainPointer();
+    } else {
+      DisablePointerCapture();
+    }
+  }
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 // Pointer, private:
 
 Surface* Pointer::GetEffectiveTargetForEvent(ui::LocatedEvent* event) const {
+  if (capture_window_)
+    return Surface::AsSurface(capture_window_);
+
   Surface* target = GetTargetSurfaceForLocatedEvent(event);
 
   if (!target)
@@ -598,7 +617,8 @@
     delegate_->OnPointerEnter(surface, location, button_flags);
     location_ = GetLocationInRoot(surface, location);
     focus_surface_ = surface;
-    focus_surface_->AddSurfaceObserver(this);
+    if (!focus_surface_->HasSurfaceObserver(this))
+      focus_surface_->AddSurfaceObserver(this);
   }
   delegate_->OnPointerFrame();
   UpdateCursor();
@@ -744,27 +764,28 @@
 }
 
 bool Pointer::ShouldMoveToCenter() {
-  // Early out if the pointer doesn't have a surface in focus.
-  if (!focus_surface_)
+  if (!capture_window_)
     return false;
 
-  gfx::Rect rect =
-      WMHelper::GetInstance()->GetFocusedWindow()->GetRootWindow()->bounds();
-
+  gfx::Rect rect = capture_window_->GetRootWindow()->bounds();
   rect.Inset(rect.width() / 6, rect.height() / 6);
   return !rect.Contains(location_.x(), location_.y());
 }
 
 void Pointer::MoveCursorToCenterOfActiveDisplay() {
-  aura::Window* focusedWindow = WMHelper::GetInstance()->GetFocusedWindow();
-  aura::Window* root = focusedWindow->GetRootWindow();
+  if (!capture_window_)
+    return;
+  aura::Window* root = capture_window_->GetRootWindow();
   gfx::Point p = root->bounds().CenterPoint();
   location_synthetic_move_ = p;
   root->MoveCursorTo(p);
 }
 
-void Pointer::HandleRelativePointerMotion(base::TimeTicks time_stamp,
+bool Pointer::HandleRelativePointerMotion(base::TimeTicks time_stamp,
                                           gfx::PointF location_in_root) {
+  if (!relative_pointer_delegate_)
+    return false;
+
   if (location_synthetic_move_) {
     gfx::Point synthetic = *location_synthetic_move_;
     // Since MoveCursorTo() takes integer coordinates, the resulting move could
@@ -774,13 +795,14 @@
       // This was a synthetic move event, so do not forward it and clear the
       // synthetic move.
       location_synthetic_move_.reset();
-      return;
+      return false;
     }
   }
 
   gfx::PointF delta(location_in_root.x() - location_.x(),
                     location_in_root.y() - location_.y());
   relative_pointer_delegate_->OnPointerRelativeMotion(time_stamp, delta);
+  return true;
 }
 
 }  // namespace exo
diff --git a/components/exo/pointer.h b/components/exo/pointer.h
index 6d78386..0478501 100644
--- a/components/exo/pointer.h
+++ b/components/exo/pointer.h
@@ -15,7 +15,6 @@
 #include "components/exo/surface_tree_host.h"
 #include "components/exo/wm_helper.h"
 #include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/aura/client/capture_client_observer.h"
 #include "ui/aura/client/cursor_client_observer.h"
 #include "ui/aura/client/focus_change_observer.h"
 #include "ui/base/cursor/cursor.h"
@@ -48,7 +47,6 @@
 class Pointer : public SurfaceTreeHost,
                 public SurfaceObserver,
                 public ui::EventHandler,
-                public aura::client::CaptureClientObserver,
                 public aura::client::CursorClientObserver,
                 public aura::client::FocusChangeObserver {
  public:
@@ -82,10 +80,6 @@
   void OnScrollEvent(ui::ScrollEvent* event) override;
   void OnGestureEvent(ui::GestureEvent* event) override;
 
-  // Overridden from aura::client::CaptureClientObserver:
-  void OnCaptureChanged(aura::Window* lost_capture,
-                        aura::Window* gained_capture) override;
-
   // Overridden from aura::client::CursorClientObserver:
   void OnCursorSizeChanged(ui::CursorSize cursor_size) override;
   void OnCursorDisplayChanged(const display::Display& display) override;
@@ -161,8 +155,9 @@
   // Moves the cursor to center of the active display.
   void MoveCursorToCenterOfActiveDisplay();
 
-  // Process the delta for relative pointer motion.
-  void HandleRelativePointerMotion(base::TimeTicks time_stamp,
+  // Process the delta for relative pointer motion. Returns true if relative
+  // motion was sent to the delegate, false otherwise.
+  bool HandleRelativePointerMotion(base::TimeTicks time_stamp,
                                    gfx::PointF location_in_target);
 
   // The delegate instance that all events are dispatched to.
@@ -192,7 +187,7 @@
   // location of a generated move that was sent which should not be forwarded.
   base::Optional<gfx::Point> location_synthetic_move_;
 
-  // The window with input capture. Pointer capture is enabled if and only if
+  // The window with pointer capture. Pointer capture is enabled if and only if
   // this is not null.
   aura::Window* capture_window_ = nullptr;
 
diff --git a/components/exo/pointer_unittest.cc b/components/exo/pointer_unittest.cc
index a45bab8..54ff8be 100644
--- a/components/exo/pointer_unittest.cc
+++ b/components/exo/pointer_unittest.cc
@@ -10,10 +10,13 @@
 #include "ash/wm/window_positioning_utils.h"
 #include "base/bind.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_feature_list.h"
 #include "components/exo/buffer.h"
 #include "components/exo/data_source.h"
 #include "components/exo/data_source_delegate.h"
+#include "components/exo/pointer_constraint_delegate.h"
 #include "components/exo/pointer_delegate.h"
+#include "components/exo/relative_pointer_delegate.h"
 #include "components/exo/seat.h"
 #include "components/exo/shell_surface.h"
 #include "components/exo/sub_surface.h"
@@ -25,10 +28,15 @@
 #include "components/viz/service/surfaces/surface_manager.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "ui/aura/client/cursor_client.h"
+#include "ui/aura/client/focus_client.h"
 #include "ui/events/event_utils.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/views/widget/widget.h"
 
+#if defined(OS_CHROMEOS)
+#include "chromeos/constants/chromeos_features.h"
+#endif
+
 namespace exo {
 namespace {
 
@@ -49,6 +57,27 @@
   MOCK_METHOD0(OnPointerFrame, void());
 };
 
+class MockRelativePointerDelegate : public RelativePointerDelegate {
+ public:
+  MockRelativePointerDelegate() = default;
+  ~MockRelativePointerDelegate() = default;
+
+  // Overridden from RelativePointerDelegate:
+  MOCK_METHOD1(OnPointerDestroying, void(Pointer*));
+  MOCK_METHOD2(OnPointerRelativeMotion,
+               void(base::TimeTicks, const gfx::PointF&));
+};
+
+class MockPointerConstraintDelegate : public PointerConstraintDelegate {
+ public:
+  MockPointerConstraintDelegate() = default;
+  ~MockPointerConstraintDelegate() = default;
+
+  // Overridden from PointerConstraintDelegate:
+  MOCK_METHOD0(OnConstraintBroken, void());
+  MOCK_METHOD0(GetConstrainedSurface, Surface*());
+};
+
 class TestDataSourceDelegate : public DataSourceDelegate {
  public:
   TestDataSourceDelegate() {}
@@ -921,5 +950,321 @@
   pointer.reset();
 }
 
+TEST_F(PointerTest, OnPointerRelativeMotion) {
+  auto surface = std::make_unique<Surface>();
+  auto shell_surface = std::make_unique<ShellSurface>(surface.get());
+  gfx::Size buffer_size(10, 10);
+  std::unique_ptr<Buffer> buffer(
+      new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)));
+  surface->Attach(buffer.get());
+  surface->Commit();
+
+  MockPointerDelegate delegate;
+  MockRelativePointerDelegate relative_delegate;
+  Seat seat;
+  auto pointer = std::make_unique<Pointer>(&delegate, &seat);
+  ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow());
+  pointer->RegisterRelativePointerDelegate(&relative_delegate);
+
+  EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(surface.get()))
+      .WillRepeatedly(testing::Return(true));
+  EXPECT_CALL(delegate, OnPointerFrame()).Times(9);
+
+  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::PointF(), 0));
+  generator.MoveMouseTo(surface->window()->GetBoundsInScreen().origin());
+
+  EXPECT_CALL(delegate, OnPointerMotion(testing::_, gfx::PointF(1, 1)));
+  EXPECT_CALL(relative_delegate,
+              OnPointerRelativeMotion(testing::_, gfx::PointF(1, 1)));
+  generator.MoveMouseTo(surface->window()->GetBoundsInScreen().origin() +
+                        gfx::Vector2d(1, 1));
+
+  EXPECT_CALL(delegate, OnPointerMotion(testing::_, gfx::PointF(2, 2)));
+  EXPECT_CALL(relative_delegate,
+              OnPointerRelativeMotion(testing::_, gfx::PointF(1, 1)));
+  generator.MoveMouseTo(surface->window()->GetBoundsInScreen().origin() +
+                        gfx::Vector2d(2, 2));
+
+  auto sub_surface = std::make_unique<Surface>();
+  auto sub = std::make_unique<SubSurface>(sub_surface.get(), surface.get());
+  surface->SetSubSurfacePosition(sub_surface.get(), gfx::Point(5, 5));
+  gfx::Size sub_buffer_size(5, 5);
+  auto sub_buffer = std::make_unique<Buffer>(
+      exo_test_helper()->CreateGpuMemoryBuffer(sub_buffer_size));
+  sub_surface->Attach(sub_buffer.get());
+  sub_surface->Commit();
+  surface->Commit();
+
+  EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(sub_surface.get()))
+      .WillRepeatedly(testing::Return(true));
+
+  EXPECT_CALL(delegate, OnPointerLeave(surface.get()));
+  EXPECT_CALL(delegate, OnPointerEnter(sub_surface.get(), gfx::PointF(), 0));
+  // OnPointerMotion will not be called, because the pointer location is already
+  // sent with OnPointerEnter, but we should still receive
+  // OnPointerRelativeMotion.
+  EXPECT_CALL(relative_delegate,
+              OnPointerRelativeMotion(testing::_, gfx::PointF(3, 3)));
+  generator.MoveMouseTo(sub_surface->window()->GetBoundsInScreen().origin());
+
+  EXPECT_CALL(delegate, OnPointerMotion(testing::_, gfx::PointF(1, 1)));
+  EXPECT_CALL(relative_delegate,
+              OnPointerRelativeMotion(testing::_, gfx::PointF(1, 1)));
+  generator.MoveMouseTo(sub_surface->window()->GetBoundsInScreen().origin() +
+                        gfx::Vector2d(1, 1));
+
+  const gfx::Point child_surface_origin =
+      sub_surface->window()->GetBoundsInScreen().origin() +
+      gfx::Vector2d(10, 10);
+  auto child_surface = std::make_unique<Surface>();
+  auto child_shell_surface = std::make_unique<ShellSurface>(
+      child_surface.get(), child_surface_origin, true, false,
+      ash::desks_util::GetActiveDeskContainerId());
+  child_shell_surface->DisableMovement();
+  child_shell_surface->SetParent(shell_surface.get());
+  gfx::Size child_buffer_size(15, 15);
+  auto child_buffer = std::make_unique<Buffer>(
+      exo_test_helper()->CreateGpuMemoryBuffer(child_buffer_size));
+  child_surface->Attach(child_buffer.get());
+  child_surface->Commit();
+
+  EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(child_surface.get()))
+      .WillRepeatedly(testing::Return(true));
+
+  EXPECT_CALL(delegate, OnPointerLeave(sub_surface.get()));
+  EXPECT_CALL(delegate, OnPointerEnter(child_surface.get(), gfx::PointF(), 0));
+  // OnPointerMotion will not be called, because the pointer location is already
+  // sent with OnPointerEnter, but we should still receive
+  // OnPointerRelativeMotion.
+  EXPECT_CALL(relative_delegate,
+              OnPointerRelativeMotion(testing::_, gfx::PointF(9, 9)));
+  generator.MoveMouseTo(child_surface->window()->GetBoundsInScreen().origin());
+
+  EXPECT_CALL(delegate, OnPointerMotion(testing::_, gfx::PointF(10, 10)));
+  EXPECT_CALL(relative_delegate,
+              OnPointerRelativeMotion(testing::_, gfx::PointF(10, 10)));
+  generator.MoveMouseTo(child_surface->window()->GetBoundsInScreen().origin() +
+                        gfx::Vector2d(10, 10));
+
+  EXPECT_CALL(delegate, OnPointerDestroying(pointer.get()));
+  EXPECT_CALL(relative_delegate, OnPointerDestroying(pointer.get()));
+  pointer.reset();
+}
+
+#if defined(OS_CHROMEOS)
+TEST_F(PointerTest, ConstrainPointer) {
+  auto scoped_feature_list = std::make_unique<base::test::ScopedFeatureList>();
+  scoped_feature_list->InitAndEnableFeature(
+      chromeos::features::kExoPointerLock);
+
+  auto surface = std::make_unique<Surface>();
+  auto shell_surface = std::make_unique<ShellSurface>(surface.get());
+  gfx::Size buffer_size(10, 10);
+  auto buffer = std::make_unique<Buffer>(
+      exo_test_helper()->CreateGpuMemoryBuffer(buffer_size));
+  surface->Attach(buffer.get());
+  surface->Commit();
+
+  MockPointerDelegate delegate;
+  MockPointerConstraintDelegate constraint_delegate;
+  Seat seat;
+  auto pointer = std::make_unique<Pointer>(&delegate, &seat);
+  aura::client::GetFocusClient(ash::Shell::GetPrimaryRootWindow())
+      ->FocusWindow(surface->window());
+  ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow());
+
+  EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(surface.get()))
+      .WillRepeatedly(testing::Return(true));
+
+  EXPECT_CALL(constraint_delegate, GetConstrainedSurface())
+      .WillRepeatedly(testing::Return(surface.get()));
+  EXPECT_TRUE(pointer->ConstrainPointer(&constraint_delegate));
+
+  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::PointF(), 0));
+  EXPECT_CALL(delegate, OnPointerFrame());
+  generator.MoveMouseTo(surface->window()->GetBoundsInScreen().origin());
+
+  EXPECT_CALL(delegate, OnPointerMotion(testing::_, testing::_)).Times(0);
+  generator.MoveMouseTo(surface->window()->GetBoundsInScreen().origin() +
+                        gfx::Vector2d(-1, -1));
+
+  auto child_surface = std::make_unique<Surface>();
+  auto child_shell_surface = std::make_unique<ShellSurface>(
+      child_surface.get(), gfx::Point(), true, false,
+      ash::desks_util::GetActiveDeskContainerId());
+  child_shell_surface->DisableMovement();
+  child_shell_surface->SetParent(shell_surface.get());
+  gfx::Size child_buffer_size(15, 15);
+  auto child_buffer = std::make_unique<Buffer>(
+      exo_test_helper()->CreateGpuMemoryBuffer(child_buffer_size));
+  child_surface->Attach(child_buffer.get());
+  child_surface->Commit();
+
+  EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(child_surface.get()))
+      .WillRepeatedly(testing::Return(true));
+
+  generator.MoveMouseTo(child_surface->window()->GetBoundsInScreen().origin());
+
+  EXPECT_CALL(delegate, OnPointerLeave(surface.get()));
+  EXPECT_CALL(delegate, OnPointerEnter(child_surface.get(), gfx::PointF(), 0));
+  EXPECT_CALL(delegate, OnPointerFrame());
+  // Moving the cursor to a different surface should change the focus when
+  // the pointer is unconstrained.
+  pointer->UnconstrainPointer();
+  generator.MoveMouseTo(child_surface->window()->GetBoundsInScreen().origin());
+
+  EXPECT_CALL(delegate, OnPointerDestroying(pointer.get()));
+  pointer.reset();
+}
+#endif
+
+#if defined(OS_CHROMEOS)
+TEST_F(PointerTest, ConstrainPointerFailsWhenSurfaceIsNotFocused) {
+  auto scoped_feature_list = std::make_unique<base::test::ScopedFeatureList>();
+  scoped_feature_list->InitAndEnableFeature(
+      chromeos::features::kExoPointerLock);
+
+  auto surface = std::make_unique<Surface>();
+  auto shell_surface = std::make_unique<ShellSurface>(surface.get());
+  gfx::Size buffer_size(10, 10);
+  auto buffer = std::make_unique<Buffer>(
+      exo_test_helper()->CreateGpuMemoryBuffer(buffer_size));
+  surface->Attach(buffer.get());
+  surface->Commit();
+
+  MockPointerDelegate delegate;
+  MockPointerConstraintDelegate constraint_delegate;
+  Seat seat;
+  auto pointer = std::make_unique<Pointer>(&delegate, &seat);
+  aura::client::FocusClient* focus_client =
+      aura::client::GetFocusClient(ash::Shell::GetPrimaryRootWindow());
+  focus_client->FocusWindow(nullptr);
+  ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow());
+
+  EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(surface.get()))
+      .WillRepeatedly(testing::Return(true));
+
+  EXPECT_CALL(constraint_delegate, GetConstrainedSurface())
+      .WillRepeatedly(testing::Return(surface.get()));
+  EXPECT_FALSE(pointer->ConstrainPointer(&constraint_delegate));
+
+  auto child_surface = std::make_unique<Surface>();
+  auto child_shell_surface = std::make_unique<ShellSurface>(
+      child_surface.get(), gfx::Point(), true, false,
+      ash::desks_util::GetActiveDeskContainerId());
+  child_shell_surface->DisableMovement();
+  child_shell_surface->SetParent(shell_surface.get());
+  gfx::Size child_buffer_size(15, 15);
+  auto child_buffer = std::make_unique<Buffer>(
+      exo_test_helper()->CreateGpuMemoryBuffer(child_buffer_size));
+  child_surface->Attach(child_buffer.get());
+  child_surface->Commit();
+
+  EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(child_surface.get()))
+      .WillRepeatedly(testing::Return(true));
+
+  focus_client->FocusWindow(child_surface->window());
+  EXPECT_FALSE(pointer->ConstrainPointer(&constraint_delegate));
+
+  focus_client->FocusWindow(surface->window());
+  EXPECT_TRUE(pointer->ConstrainPointer(&constraint_delegate));
+
+  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::PointF(), 0));
+  EXPECT_CALL(delegate, OnPointerFrame());
+  generator.MoveMouseTo(surface->window()->GetBoundsInScreen().origin());
+
+  pointer->UnconstrainPointer();
+
+  EXPECT_CALL(delegate, OnPointerDestroying(pointer.get()));
+  pointer.reset();
+}
+#endif
+
+#if defined(OS_CHROMEOS)
+TEST_F(PointerTest, UnconstrainPointerWhenSurfaceIsDestroyed) {
+  auto scoped_feature_list = std::make_unique<base::test::ScopedFeatureList>();
+  scoped_feature_list->InitAndEnableFeature(
+      chromeos::features::kExoPointerLock);
+
+  auto surface = std::make_unique<Surface>();
+  auto shell_surface = std::make_unique<ShellSurface>(surface.get());
+  gfx::Size buffer_size(10, 10);
+  auto buffer = std::make_unique<Buffer>(
+      exo_test_helper()->CreateGpuMemoryBuffer(buffer_size));
+  surface->Attach(buffer.get());
+  surface->Commit();
+
+  MockPointerDelegate delegate;
+  MockPointerConstraintDelegate constraint_delegate;
+  Seat seat;
+  auto pointer = std::make_unique<Pointer>(&delegate, &seat);
+  aura::client::GetFocusClient(ash::Shell::GetPrimaryRootWindow())
+      ->FocusWindow(surface->window());
+  ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow());
+
+  EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(surface.get()))
+      .WillRepeatedly(testing::Return(true));
+
+  EXPECT_CALL(constraint_delegate, GetConstrainedSurface())
+      .WillRepeatedly(testing::Return(surface.get()));
+  EXPECT_TRUE(pointer->ConstrainPointer(&constraint_delegate));
+
+  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::PointF(), 0));
+  EXPECT_CALL(delegate, OnPointerFrame());
+  generator.MoveMouseTo(surface->window()->GetBoundsInScreen().origin());
+
+  // Constraint should be broken if surface is destroyed.
+  EXPECT_CALL(constraint_delegate, OnConstraintBroken());
+  EXPECT_CALL(delegate, OnPointerLeave(surface.get()));
+  EXPECT_CALL(delegate, OnPointerFrame());
+  pointer->OnSurfaceDestroying(surface.get());
+
+  EXPECT_CALL(delegate, OnPointerDestroying(pointer.get()));
+  pointer.reset();
+}
+#endif
+
+#if defined(OS_CHROMEOS)
+TEST_F(PointerTest, UnconstrainPointerWhenWindowLosesFocus) {
+  auto scoped_feature_list = std::make_unique<base::test::ScopedFeatureList>();
+  scoped_feature_list->InitAndEnableFeature(
+      chromeos::features::kExoPointerLock);
+
+  auto surface = std::make_unique<Surface>();
+  auto shell_surface = std::make_unique<ShellSurface>(surface.get());
+  gfx::Size buffer_size(10, 10);
+  auto buffer = std::make_unique<Buffer>(
+      exo_test_helper()->CreateGpuMemoryBuffer(buffer_size));
+  surface->Attach(buffer.get());
+  surface->Commit();
+
+  MockPointerDelegate delegate;
+  MockPointerConstraintDelegate constraint_delegate;
+  Seat seat;
+  auto pointer = std::make_unique<Pointer>(&delegate, &seat);
+  aura::client::FocusClient* focus_client =
+      aura::client::GetFocusClient(ash::Shell::GetPrimaryRootWindow());
+  focus_client->FocusWindow(surface->window());
+  ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow());
+
+  EXPECT_CALL(delegate, CanAcceptPointerEventsForSurface(surface.get()))
+      .WillRepeatedly(testing::Return(true));
+
+  EXPECT_CALL(constraint_delegate, GetConstrainedSurface())
+      .WillRepeatedly(testing::Return(surface.get()));
+  EXPECT_TRUE(pointer->ConstrainPointer(&constraint_delegate));
+
+  EXPECT_CALL(delegate, OnPointerEnter(surface.get(), gfx::PointF(), 0));
+  EXPECT_CALL(delegate, OnPointerFrame());
+  generator.MoveMouseTo(surface->window()->GetBoundsInScreen().origin());
+
+  EXPECT_CALL(constraint_delegate, OnConstraintBroken());
+  focus_client->FocusWindow(nullptr);
+
+  EXPECT_CALL(delegate, OnPointerDestroying(pointer.get()));
+  pointer.reset();
+}
+#endif
+
 }  // namespace
 }  // namespace exo
diff --git a/components/feed/core/feed_networking_host.cc b/components/feed/core/feed_networking_host.cc
index 697a04c..7280256 100644
--- a/components/feed/core/feed_networking_host.cc
+++ b/components/feed/core/feed_networking_host.cc
@@ -77,7 +77,8 @@
                                 signin::AccessTokenInfo access_token_info);
   void StartLoader();
   std::unique_ptr<network::SimpleURLLoader> MakeLoader();
-  void SetRequestHeaders(network::ResourceRequest* request) const;
+  void SetRequestHeaders(bool has_request_body,
+                         network::ResourceRequest* request) const;
   void PopulateRequestBody(network::SimpleURLLoader* loader);
   void OnSimpleLoaderComplete(std::unique_ptr<std::string> response);
 
@@ -232,7 +233,7 @@
     resource_request->site_for_cookies = net::SiteForCookies::FromUrl(url);
   }
 
-  SetRequestHeaders(resource_request.get());
+  SetRequestHeaders(!request_body_.empty(), resource_request.get());
 
   auto simple_loader = network::SimpleURLLoader::Create(
       std::move(resource_request), traffic_annotation);
@@ -243,10 +244,13 @@
   return simple_loader;
 }
 
-void NetworkFetch::SetRequestHeaders(network::ResourceRequest* request) const {
-  request->headers.SetHeader(net::HttpRequestHeaders::kContentType,
-                             kContentType);
-  request->headers.SetHeader(kContentEncoding, kGzip);
+void NetworkFetch::SetRequestHeaders(bool has_request_body,
+                                     network::ResourceRequest* request) const {
+  if (has_request_body) {
+    request->headers.SetHeader(net::HttpRequestHeaders::kContentType,
+                               kContentType);
+    request->headers.SetHeader(kContentEncoding, kGzip);
+  }
 
   variations::SignedIn signed_in_status = variations::SignedIn::kNo;
   if (!access_token_.empty()) {
diff --git a/components/feed/core/feed_networking_host_unittest.cc b/components/feed/core/feed_networking_host_unittest.cc
index 5190192..05e28b7 100644
--- a/components/feed/core/feed_networking_host_unittest.cc
+++ b/components/feed/core/feed_networking_host_unittest.cc
@@ -246,7 +246,6 @@
   MockResponseDoneCallback done_callback;
   net::HttpRequestHeaders headers;
   base::RunLoop interceptor_run_loop;
-  base::HistogramTester histogram_tester;
 
   test_factory()->SetInterceptor(
       base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
@@ -254,9 +253,9 @@
         interceptor_run_loop.Quit();
       }));
 
-  SendRequestAndRespond("http://foobar.com/feed", "POST", "", "",
-                      net::HTTP_OK, network::URLLoaderCompletionStatus(),
-                      &done_callback);
+  SendRequestAndRespond("http://foobar.com/feed", "POST", "body", "",
+                        net::HTTP_OK, network::URLLoaderCompletionStatus(),
+                        &done_callback);
 
   std::string content_encoding;
   std::string authorization;
@@ -267,6 +266,23 @@
   EXPECT_EQ(authorization, "Bearer access_token");
 }
 
+TEST_F(FeedNetworkingHostTest, ShouldNotSendContentEncodingForEmptyBody) {
+  MockResponseDoneCallback done_callback;
+  net::HttpRequestHeaders headers;
+  base::RunLoop interceptor_run_loop;
+
+  test_factory()->SetInterceptor(
+      base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
+        headers = request.headers;
+        interceptor_run_loop.Quit();
+      }));
+
+  SendRequestAndRespond("http://foobar.com/feed", "GET", "", "", net::HTTP_OK,
+                        network::URLLoaderCompletionStatus(), &done_callback);
+
+  EXPECT_FALSE(headers.HasHeader("content-encoding"));
+}
+
 TEST_F(FeedNetworkingHostTest, ShouldReportSizeHistograms) {
   std::string uncompressed_request_string(2048, 'a');
   std::string response_string(1024, 'b');
diff --git a/components/policy/core/browser/proxy_policy_handler_unittest.cc b/components/policy/core/browser/proxy_policy_handler_unittest.cc
index bb5c6a13..3380b20 100644
--- a/components/policy/core/browser/proxy_policy_handler_unittest.cc
+++ b/components/policy/core/browser/proxy_policy_handler_unittest.cc
@@ -212,8 +212,8 @@
   EXPECT_FALSE(store_->GetValue(proxy_config::prefs::kProxy, &value));
 }
 
-// Regression test for http://crbug.com/78016, CPanel returns empty strings
-// for unset properties.
+// Regression test for http://crbug.com/78016, device management server returns
+// empty strings for unset properties.
 TEST_F(ProxyPolicyHandlerTest, PacScriptProxyModeBug78016) {
   PolicyMap policy;
   policy.Set(key::kProxyServer, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto
index 159836a..82a63599 100644
--- a/components/policy/proto/device_management_backend.proto
+++ b/components/policy/proto/device_management_backend.proto
@@ -197,7 +197,7 @@
 
   // Device display name.  By default, server generates the name in
   // the format of "Machine Model - Machine Id".  However, domain
-  // admin can update it using CPanel, so do NOT treat it as constant.
+  // admin can update it using Admin console, so do NOT treat it as constant.
   optional string machine_name = 2;
 
   // Enum listing the possible modes the device should be locked into when the
@@ -443,7 +443,7 @@
   // filled if the display name is available.
   //
   // The display name of the machine as generated by the server or set
-  // by the Administrator in the CPanel GUI. This is the same thing as
+  // by the Administrator in the Admin console GUI. This is the same thing as
   // |machine_name| in DeviceRegisterResponse but it might have
   // changed since then.
   optional string machine_name = 5;
diff --git a/components/policy/tools/template_writers/writers/doc_writer_unittest.py b/components/policy/tools/template_writers/writers/doc_writer_unittest.py
index 369cc1e6..23a57cf 100755
--- a/components/policy/tools/template_writers/writers/doc_writer_unittest.py
+++ b/components/policy/tools/template_writers/writers/doc_writer_unittest.py
@@ -1613,7 +1613,7 @@
   def testGoogleCloudChromeOsPolicies(self):
     # Tests whether Chrome OS policies with management type 'google_cloud'
     # don't print example values etc. since they are managed through Google's
-    # CPanel/DPanel, not Active Directory GPO.
+    # Admin console, not Active Directory GPO.
     policy = {
         'name':
             'PolicyName',
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc
index 35bcee6..1af8977a 100644
--- a/components/printing/renderer/print_render_frame_helper.cc
+++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -1043,6 +1043,10 @@
   return true;
 }
 
+bool PrintRenderFrameHelper::Delegate::ShouldGenerateTaggedPDF() {
+  return false;
+}
+
 PrintRenderFrameHelper::PrintRenderFrameHelper(
     content::RenderFrame* render_frame,
     std::unique_ptr<Delegate> delegate)
@@ -1259,6 +1263,10 @@
 
 void PrintRenderFrameHelper::OnPrintPreviewDialogClosed() {
   ScopedIPC scoped_ipc(weak_ptr_factory_.GetWeakPtr());
+  // TODO(jschettler): Remove these CHECKs when finished investigating
+  // https://crbug.com/1019847.
+  CHECK(!render_frame_gone_);
+  CHECK(print_preview_context_.source_frame());
   print_preview_context_.source_frame()->DispatchAfterPrintEvent();
 }
 #endif  // BUILDFLAG(ENABLE_PRINT_PREVIEW)
@@ -1865,6 +1873,18 @@
                         print_params.document_cookie);
   CHECK(metafile.Init());
 
+  // If tagged PDF exporting is enabled, we also need to capture an
+  // accessibility tree and store it in the metafile. AXTreeSnapshotter
+  // should stay alive through the end of this function, because text
+  // drawing commands are only annotated with a DOMNodeId if accessibility
+  // is enabled.
+  std::unique_ptr<content::AXTreeSnapshotter> snapshotter;
+  if (delegate_->ShouldGenerateTaggedPDF()) {
+    snapshotter = render_frame()->CreateAXTreeSnapshotter();
+    snapshotter->Snapshot(ui::kAXModeComplete, 0,
+                          &metafile.accessibility_tree());
+  }
+
   PrintHostMsg_DidPrintDocument_Params page_params;
   gfx::Size* page_size_in_dpi;
   gfx::Rect* content_area_in_dpi;
@@ -2549,7 +2569,9 @@
 
 blink::WebLocalFrame*
 PrintRenderFrameHelper::PrintPreviewContext::source_frame() {
-  DCHECK(state_ != UNINITIALIZED);
+  // TODO(jschettler): Change this back to DCHECK when finished investigating
+  // https://crbug.com/1019847.
+  CHECK(state_ != UNINITIALIZED);
   return source_frame_.GetFrame();
 }
 
diff --git a/components/printing/renderer/print_render_frame_helper.h b/components/printing/renderer/print_render_frame_helper.h
index bd00b17..0778dee 100644
--- a/components/printing/renderer/print_render_frame_helper.h
+++ b/components/printing/renderer/print_render_frame_helper.h
@@ -106,6 +106,10 @@
     // The default implementation returns |true|.
     virtual bool IsScriptedPrintEnabled();
 
+    // Whether we should send extra metadata necessary to produce a tagged
+    // (accessible) PDF.
+    virtual bool ShouldGenerateTaggedPDF();
+
     // Returns true if printing is overridden and the default behavior should be
     // skipped for |frame|.
     virtual bool OverridePrint(blink::WebLocalFrame* frame) = 0;
diff --git a/components/safe_browsing/content/password_protection/metrics_util.h b/components/safe_browsing/content/password_protection/metrics_util.h
index 8a0c75d7..ace035a 100644
--- a/components/safe_browsing/content/password_protection/metrics_util.h
+++ b/components/safe_browsing/content/password_protection/metrics_util.h
@@ -48,7 +48,6 @@
 extern const char kPasswordOnFocusRequestOutcomeHistogram[];
 extern const char kPasswordOnFocusVerdictHistogram[];
 extern const char kNonSyncPasswordEntryRequestOutcomeHistogram[];
-extern const char kProtectedPasswordEntryRequestOutcomeHistogram[];
 extern const char kNonSyncPasswordEntryVerdictHistogram[];
 extern const char kSyncPasswordChromeSettingsHistogram[];
 extern const char kSyncPasswordEntryRequestOutcomeHistogram[];
diff --git a/components/services/pdf_compositor/BUILD.gn b/components/services/pdf_compositor/BUILD.gn
index ccc4858..2e0e99a 100644
--- a/components/services/pdf_compositor/BUILD.gn
+++ b/components/services/pdf_compositor/BUILD.gn
@@ -20,6 +20,7 @@
     "//printing/common",
     "//skia",
     "//third_party/blink/public:blink_headers",
+    "//ui/accessibility",
   ]
 
   if (is_win) {
diff --git a/components/services/pdf_compositor/DEPS b/components/services/pdf_compositor/DEPS
index 3dec59eb..980abab 100644
--- a/components/services/pdf_compositor/DEPS
+++ b/components/services/pdf_compositor/DEPS
@@ -11,4 +11,5 @@
   "+third_party/skia",
   "+third_party/blink/public/platform", # Test web sandbox support.
   "+ui/base/ui_base_features.h",  # UI features.
+  "+ui/accessibility",  # Tagged PDF exporting.
 ]
diff --git a/components/services/pdf_compositor/pdf_compositor_impl.cc b/components/services/pdf_compositor/pdf_compositor_impl.cc
index e3692fb1..5f1bca07 100644
--- a/components/services/pdf_compositor/pdf_compositor_impl.cc
+++ b/components/services/pdf_compositor/pdf_compositor_impl.cc
@@ -27,6 +27,7 @@
 #include "third_party/skia/include/core/SkGraphics.h"
 #include "third_party/skia/include/core/SkSerialProcs.h"
 #include "third_party/skia/src/utils/SkMultiPictureDocument.h"
+#include "ui/accessibility/ax_tree_update.h"
 
 #if defined(OS_WIN)
 #include "content/public/child/dwrite_font_proxy_init_win.h"
@@ -336,7 +337,8 @@
   }
 
   SkDynamicMemoryWStream wstream;
-  sk_sp<SkDocument> doc = MakePdfDocument(creator_, &wstream);
+  sk_sp<SkDocument> doc =
+      MakePdfDocument(creator_, ui::AXTreeUpdate(), &wstream);
 
   for (const auto& page : pages) {
     SkCanvas* canvas = doc->beginPage(page.fSize.width(), page.fSize.height());
@@ -447,7 +449,7 @@
 PdfCompositorImpl::FrameInfo::~FrameInfo() = default;
 
 PdfCompositorImpl::DocumentInfo::DocumentInfo(const std::string& creator)
-    : doc(MakePdfDocument(creator, &compositor_stream)) {}
+    : doc(MakePdfDocument(creator, ui::AXTreeUpdate(), &compositor_stream)) {}
 
 PdfCompositorImpl::DocumentInfo::~DocumentInfo() = default;
 
diff --git a/components/sync_bookmarks/bookmark_model_merger.cc b/components/sync_bookmarks/bookmark_model_merger.cc
index 579848ee..fc0e358 100644
--- a/components/sync_bookmarks/bookmark_model_merger.cc
+++ b/components/sync_bookmarks/bookmark_model_merger.cc
@@ -361,10 +361,6 @@
     bookmarks::BookmarkModel* bookmark_model) {
   DCHECK(bookmark_model);
 
-  if (!base::FeatureList::IsEnabled(switches::kMergeBookmarksUsingGUIDs)) {
-    return {};
-  }
-
   // Build a temporary lookup table for remote GUIDs.
   std::unordered_map<std::string, const RemoteTreeNode*>
       guid_to_remote_node_map;
@@ -402,9 +398,14 @@
 
     if (node->is_folder() != remote_entity.is_folder ||
         (node->is_url() &&
-         node->url() != remote_entity.specifics.bookmark().url())) {
+         node->url() != remote_entity.specifics.bookmark().url()) ||
+        !base::FeatureList::IsEnabled(switches::kMergeBookmarksUsingGUIDs)) {
       // If local node and its remote node match are conflicting in node type or
-      // URL, replace local GUID with a random GUID.
+      // URL, replace local GUID with a random GUID. The logic is applied
+      // unconditionally if kMergeBookmarksUsingGUIDs is disabled, since no
+      // GUID-based matches take place and GUIDs need to be reassigned to avoid
+      // collisions (they will be reassigned once again if there is a semantic
+      // match).
       // TODO(crbug.com/978430): Local GUIDs should also be reassigned if they
       // match a remote originator_client_item_id.
       ReplaceBookmarkNodeGUID(node, base::GenerateGUID(), bookmark_model);
@@ -607,10 +608,12 @@
   const bookmarks::BookmarkNode* node = parent->children()[index].get();
   DCHECK(!FindMatchingRemoteNodeByGUID(node));
   DCHECK(base::IsValidGUID(node->guid()));
-  const std::string sync_id =
-      base::FeatureList::IsEnabled(switches::kMergeBookmarksUsingGUIDs)
-          ? node->guid()
-          : base::GenerateGUID();
+
+  // The node's GUID cannot run into collisions because
+  // FindGuidMatchesOrReassignLocal() takes care of reassigning local GUIDs if
+  // they won't actually be merged with the remote bookmark with the same GUID
+  // (e.g. incompatible types).
+  const std::string sync_id = node->guid();
   const int64_t server_version = syncer::kUncommittedVersion;
   const base::Time creation_time = base::Time::Now();
   const std::string& suffix = syncer::GenerateSyncableBookmarkHash(
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl.cc b/components/sync_bookmarks/bookmark_model_observer_impl.cc
index a5c8e8f..aa6e3a4 100644
--- a/components/sync_bookmarks/bookmark_model_observer_impl.cc
+++ b/components/sync_bookmarks/bookmark_model_observer_impl.cc
@@ -96,10 +96,10 @@
   // Assign a temp server id for the entity. Will be overriden by the actual
   // server id upon receiving commit response.
   DCHECK(base::IsValidGUID(node->guid()));
-  const std::string sync_id =
-      base::FeatureList::IsEnabled(switches::kMergeBookmarksUsingGUIDs)
-          ? node->guid()
-          : base::GenerateGUID();
+
+  // Local bookmark creations should have used a random GUID so it's safe to
+  // use it as originator client item ID, without the risk for collision.
+  const std::string sync_id = node->guid();
   const int64_t server_version = syncer::kUncommittedVersion;
   const base::Time creation_time = base::Time::Now();
   const sync_pb::UniquePosition unique_position =
@@ -266,7 +266,7 @@
                    : syncer::UniquePosition::After(position, suffix);
 
     const sync_pb::EntitySpecifics specifics = CreateSpecificsFromBookmarkNode(
-        node, model, /*force_favicon_load=*/true);
+        child.get(), model, /*force_favicon_load=*/true);
 
     bookmark_tracker_->Update(sync_id, entity->metadata()->server_version(),
                               modification_time, position.ToProto(), specifics);
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc b/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc
index a186cb00..4184ac9 100644
--- a/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc
+++ b/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc
@@ -134,10 +134,8 @@
       bookmark_tracker()->GetEntitiesWithLocalChanges(kMaxEntries);
   ASSERT_THAT(local_changes.size(), 1U);
   EXPECT_THAT(local_changes[0]->bookmark_node(), Eq(bookmark_node));
-  if (base::FeatureList::IsEnabled(switches::kMergeBookmarksUsingGUIDs)) {
-    EXPECT_THAT(local_changes[0]->metadata()->server_id(),
-                Eq(bookmark_node->guid()));
-  }
+  EXPECT_THAT(local_changes[0]->metadata()->server_id(),
+              Eq(bookmark_node->guid()));
 }
 
 TEST_F(BookmarkModelObserverImplTest,
diff --git a/components/viz/host/hit_test/hit_test_query.cc b/components/viz/host/hit_test/hit_test_query.cc
index b79acee..54cd565 100644
--- a/components/viz/host/hit_test/hit_test_query.cc
+++ b/components/viz/host/hit_test/hit_test_query.cc
@@ -7,7 +7,6 @@
 #include "base/containers/stack.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
-#include "base/timer/elapsed_timer.h"
 #include "components/viz/common/features.h"
 #include "components/viz/common/hit_test/hit_test_region_list.h"
 #include "ui/gfx/geometry/point_conversions.h"
@@ -106,8 +105,6 @@
     const std::vector<FrameSinkId>& target_ancestors,
     const gfx::PointF& location_in_root,
     gfx::PointF* transformed_location) const {
-  base::ElapsedTimer transform_timer;
-
   if (hit_test_data_.empty())
     return false;
 
@@ -131,10 +128,6 @@
   // TODO(crbug.com/966944): Cache the matrix product such that the transform
   // can be done immediately.
   *transformed_location = location_in_root;
-  UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES("Event.VizHitTest.TransformTimeUs",
-                                          transform_timer.Elapsed(),
-                                          base::TimeDelta::FromMicroseconds(1),
-                                          base::TimeDelta::FromSeconds(10), 50);
   return TransformLocationForTargetRecursively(
       target_ancestors, target_ancestors.size() - 1, 0, transformed_location);
 }
@@ -166,7 +159,6 @@
   if (hit_test_data_.empty())
     return Target();
 
-  base::ElapsedTimer target_timer;
   Target target;
   size_t start_index = 0;
   if (!FindIndexOfFrameSink(frame_sink_id, &start_index))
@@ -175,10 +167,6 @@
   FindTargetInRegionForLocation(event_source, location, start_index,
                                 is_location_relative_to_parent, frame_sink_id,
                                 &target);
-  UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES("Event.VizHitTest.TargetTimeUs",
-                                          target_timer.Elapsed(),
-                                          base::TimeDelta::FromMicroseconds(1),
-                                          base::TimeDelta::FromSeconds(10), 50);
   return target;
 }
 
diff --git a/components/viz/service/display_embedder/image_context_impl.cc b/components/viz/service/display_embedder/image_context_impl.cc
index e37a86e..e38ce38b 100644
--- a/components/viz/service/display_embedder/image_context_impl.cc
+++ b/components/viz/service/display_embedder/image_context_impl.cc
@@ -42,16 +42,21 @@
       render_pass_id_(render_pass_id),
       mipmap_(mipmap ? GrMipMapped::kYes : GrMipMapped::kNo) {}
 
+ImageContextImpl::~ImageContextImpl() {
+  if (fallback_context_state_)
+    gpu::DeleteGrBackendTexture(fallback_context_state_, &fallback_texture_);
+}
+
 void ImageContextImpl::OnContextLost() {
   if (representation_) {
     representation_->OnContextLost();
     representation_ = nullptr;
   }
-}
 
-ImageContextImpl::~ImageContextImpl() {
-  if (fallback_context_state_)
-    gpu::DeleteGrBackendTexture(fallback_context_state_, &fallback_texture_);
+  if (fallback_context_state_) {
+    fallback_context_state_ = nullptr;
+    fallback_texture_ = {};
+  }
 }
 
 void ImageContextImpl::CreateFallbackImage(
diff --git a/components/viz/service/hit_test/hit_test_aggregator.cc b/components/viz/service/hit_test/hit_test_aggregator.cc
index ee8eee16..bbf7ebf 100644
--- a/components/viz/service/hit_test/hit_test_aggregator.cc
+++ b/components/viz/service/hit_test/hit_test_aggregator.cc
@@ -4,8 +4,6 @@
 
 #include "components/viz/service/hit_test/hit_test_aggregator.h"
 
-#include "base/metrics/histogram_macros.h"
-#include "base/timer/elapsed_timer.h"
 #include "base/trace_event/trace_event.h"
 #include "components/viz/common/hit_test/hit_test_region_list.h"
 #include "components/viz/common/quads/debug_border_draw_quad.h"
@@ -57,12 +55,7 @@
   hit_test_debug_ = false;
   hit_test_debug_ask_regions_ = 0;
 
-  base::ElapsedTimer aggregate_timer;
   AppendRoot(display_surface_id);
-  UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES("Event.VizHitTest.AggregateTimeUs",
-                                          aggregate_timer.Elapsed(),
-                                          base::TimeDelta::FromMicroseconds(1),
-                                          base::TimeDelta::FromSeconds(10), 50);
   SendHitTestData();
 
   if (hit_test_debug_ && render_passes) {
@@ -192,7 +185,6 @@
 
   DCHECK_GE(region_index, 1u);
   int32_t child_count = region_index - 1;
-  UMA_HISTOGRAM_COUNTS_1000("Event.VizHitTest.HitTestRegions", region_index);
   SetRegionAt(0, surface_id.frame_sink_id(), hit_test_region_list->flags,
               hit_test_region_list->async_hit_test_reasons,
               hit_test_region_list->bounds, hit_test_region_list->transform,
diff --git a/content/app/content_main_runner_impl.cc b/content/app/content_main_runner_impl.cc
index ecb7001..3b37ef6 100644
--- a/content/app/content_main_runner_impl.cc
+++ b/content/app/content_main_runner_impl.cc
@@ -491,11 +491,6 @@
   InitializeFieldTrialAndFeatureList();
   delegate->PostFieldTrialInitialization();
 
-  service_manager::SandboxType sandbox_type =
-      service_manager::SandboxTypeFromCommandLine(command_line);
-  if (sandbox_type == service_manager::SandboxType::kProfiling)
-    sandbox::SetUseLocaltimeOverride(false);
-
   for (size_t i = 0; i < base::size(kMainFunctions); ++i) {
     if (process_type == kMainFunctions[i].name)
       return kMainFunctions[i].function(main_params);
diff --git a/content/browser/browsing_data/browsing_data_remover_impl.cc b/content/browser/browsing_data/browsing_data_remover_impl.cc
index f115e243..503ba73 100644
--- a/content/browser/browsing_data/browsing_data_remover_impl.cc
+++ b/content/browser/browsing_data/browsing_data_remover_impl.cc
@@ -459,11 +459,14 @@
         delete_begin, delete_end, nullable_filter,
         CreateTaskCompletionClosureForMojo(TracingDataType::kCodeCaches));
 
-    // When clearing cache, wipe accumulated network related data
-    // (TransportSecurityState and HttpServerPropertiesManager data).
-    network_context->ClearNetworkingHistorySince(
-        delete_begin,
-        CreateTaskCompletionClosureForMojo(TracingDataType::kNetworkHistory));
+    // TODO(crbug.com/1985971) : Implement filtering for NetworkHistory.
+    if (filter_builder->GetMode() == BrowsingDataFilterBuilder::BLACKLIST) {
+      // When clearing cache, wipe accumulated network related data
+      // (TransportSecurityState and HttpServerPropertiesManager data).
+      network_context->ClearNetworkingHistorySince(
+          delete_begin,
+          CreateTaskCompletionClosureForMojo(TracingDataType::kNetworkHistory));
+    }
 
     // Clears the PrefetchedSignedExchangeCache of all RenderFrameHostImpls.
     RenderFrameHostImpl::ClearAllPrefetchedSignedExchangeCache();
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index a2c47a3..8f84049 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -595,6 +595,11 @@
           base::ThreadTaskRunnerHandle::Get()));
 
       default_loader_used_ = false;
+      // If |url_loader_| already exists, this means we are following a redirect
+      // using an interceptor. In this case we should make sure to reset the
+      // loader, similar to what is done in Restart().
+      if (url_loader_)
+        url_loader_->ResetForFollowRedirect();
       url_loader_ = blink::ThrottlingURLLoader::CreateLoaderAndStart(
           std::move(single_request_factory), std::move(throttles),
           frame_tree_node_id_, global_request_id_.request_id,
diff --git a/content/browser/renderer_host/render_widget_targeter.cc b/content/browser/renderer_host/render_widget_targeter.cc
index dd2876a..8a18f925b 100644
--- a/content/browser/renderer_host/render_widget_targeter.cc
+++ b/content/browser/renderer_host/render_widget_targeter.cc
@@ -146,16 +146,6 @@
   return false;
 }
 
-void RenderWidgetTargeter::TargetingRequest::StartQueueingTimeTracker() {
-  tracker =
-      std::make_unique<TracingUmaTracker>("Event.AsyncTargeting.TimeInQueue");
-}
-
-void RenderWidgetTargeter::TargetingRequest::StopQueueingTimeTracker() {
-  if (tracker)
-    tracker->StopAndRecord();
-}
-
 bool RenderWidgetTargeter::TargetingRequest::IsWebInputEventRequest() const {
   return !!event;
 }
@@ -223,7 +213,6 @@
 
 void RenderWidgetTargeter::ResolveTargetingRequest(TargetingRequest request) {
   if (request_in_flight_) {
-    request.StartQueueingTimeTracker();
     requests_.push(std::move(request));
     return;
   }
@@ -340,7 +329,6 @@
     if (!request.GetRootView())
       continue;
 
-    request.StopQueueingTimeTracker();
     // Only notify the delegate once that the current event queue is being
     // flushed. Once all the events are flushed, notify the delegate again.
     if (!events_being_flushed) {
diff --git a/content/browser/renderer_host/render_widget_targeter.h b/content/browser/renderer_host/render_widget_targeter.h
index e9ac770..7b29f17 100644
--- a/content/browser/renderer_host/render_widget_targeter.h
+++ b/content/browser/renderer_host/render_widget_targeter.h
@@ -155,10 +155,6 @@
     gfx::PointF GetLocation() const;
     const ui::LatencyInfo& GetLatency() const;
 
-    // Queued TargetingRequest
-    void StartQueueingTimeTracker();
-    void StopQueueingTimeTracker();
-
    private:
     base::WeakPtr<RenderWidgetHostViewBase> root_view;
 
@@ -171,9 +167,6 @@
     ui::WebScopedInputEvent event;
     ui::LatencyInfo latency;
 
-    // To track how long the request has been queued.
-    std::unique_ptr<TracingUmaTracker> tracker;
-
     DISALLOW_COPY_AND_ASSIGN(TargetingRequest);
   };
 
diff --git a/content/browser/sandbox_parameters_mac.mm b/content/browser/sandbox_parameters_mac.mm
index 2f53e6dd..d83664e 100644
--- a/content/browser/sandbox_parameters_mac.mm
+++ b/content/browser/sandbox_parameters_mac.mm
@@ -239,7 +239,6 @@
       SetupPPAPISandboxParameters(client);
 #endif
       break;
-    case service_manager::SandboxType::kProfiling:
     case service_manager::SandboxType::kUtility:
       SetupUtilitySandboxParameters(client, command_line);
       break;
diff --git a/content/browser/site_per_process_hit_test_browsertest.cc b/content/browser/site_per_process_hit_test_browsertest.cc
index 48cb1eb..bb0d2623 100644
--- a/content/browser/site_per_process_hit_test_browsertest.cc
+++ b/content/browser/site_per_process_hit_test_browsertest.cc
@@ -10,7 +10,6 @@
 #include "base/stl_util.h"
 #include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
-#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_timeouts.h"
 #include "build/build_config.h"
@@ -3055,47 +3054,6 @@
   EXPECT_FALSE(child_frame_monitor.EventWasReceived());
 }
 
-IN_PROC_BROWSER_TEST_F(SitePerProcessHitTestBrowserTest,
-                       RecordTimeInQueueMetric) {
-  GURL main_url(embedded_test_server()->GetURL(
-      "/frame_tree/page_with_masked_iframe.html"));
-  EXPECT_TRUE(NavigateToURL(shell(), main_url));
-
-  FrameTreeNode* root = web_contents()->GetFrameTree()->root();
-  ASSERT_EQ(1U, root->child_count());
-
-  FrameTreeNode* child_node = root->child_at(0);
-
-  RenderWidgetHostInputEventRouter* router =
-      web_contents()->GetInputEventRouter();
-
-  WaitForHitTestData(child_node->current_frame_host());
-
-  router->GetRenderWidgetTargeterForTests()
-      ->set_async_hit_test_timeout_delay_for_testing(base::TimeDelta());
-
-  RenderWidgetHostViewBase* root_view = static_cast<RenderWidgetHostViewBase*>(
-      root->current_frame_host()->GetRenderWidgetHost()->GetView());
-
-  blink::WebMouseEvent child_event(
-      blink::WebInputEvent::kMouseDown, blink::WebInputEvent::kNoModifiers,
-      blink::WebInputEvent::GetStaticTimeStampForTests());
-  child_event.button = blink::WebPointerProperties::Button::kLeft;
-  SetWebEventPositions(&child_event, gfx::Point(75, 75), root_view);
-  child_event.click_count = 1;
-
-  base::HistogramTester tester;
-
-  InputEventAckWaiter waiter(root_view->GetRenderWidgetHost(),
-                             blink::WebInputEvent::kMouseDown);
-  // Need at least two events to generate a queue.
-  router->RouteMouseEvent(root_view, &child_event, ui::LatencyInfo());
-  router->RouteMouseEvent(root_view, &child_event, ui::LatencyInfo());
-  waiter.Wait();
-
-  tester.ExpectTotalCount("Event.AsyncTargeting.TimeInQueue", 1);
-}
-
 // Tooltips aren't used on Android, so no need to compile/run this test in that
 // case.
 #if !defined(OS_ANDROID)
diff --git a/content/browser/utility_process_host.cc b/content/browser/utility_process_host.cc
index bcbe661..0ce9c82 100644
--- a/content/browser/utility_process_host.cc
+++ b/content/browser/utility_process_host.cc
@@ -85,7 +85,6 @@
         sandbox_type_ == service_manager::SandboxType::kNetwork ||
         sandbox_type_ == service_manager::SandboxType::kCdm ||
         sandbox_type_ == service_manager::SandboxType::kPdfCompositor ||
-        sandbox_type_ == service_manager::SandboxType::kProfiling ||
         sandbox_type_ == service_manager::SandboxType::kPpapi ||
 #if defined(OS_CHROMEOS)
         sandbox_type_ == service_manager::SandboxType::kIme ||
diff --git a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/NestedSystemMessageHandler.java b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/NestedSystemMessageHandler.java
index cedb5804..06b1444f 100644
--- a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/NestedSystemMessageHandler.java
+++ b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/NestedSystemMessageHandler.java
@@ -24,22 +24,74 @@
  * and dispatch them.
  */
 @JNINamespace("content")
-class NestedSystemMessageHandler {
-    // See org.chromium.base.SystemMessageHandler for more message ids.
-    // The id here should not conflict with the ones in SystemMessageHandler.
+public class NestedSystemMessageHandler {
     private static final int QUIT_MESSAGE = 10;
     private static final Handler sHandler = new Handler();
+    private static final Method sNextMethod = getMethod(MessageQueue.class, "next");
+    private static final Field sMessageTargetField = getField(Message.class, "target");
+    private static final Field sMessageFlagsField = getField(Message.class, "flags");
+
+    private static Field getField(Class<?> clazz, String name) {
+        Field f = null;
+        try {
+            f = clazz.getDeclaredField(name);
+            f.setAccessible(true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return f;
+    }
+
+    private static Method getMethod(Class<?> clazz, String name) {
+        Method m = null;
+        try {
+            m = clazz.getDeclaredMethod(name);
+            m.setAccessible(true);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return m;
+    }
 
     private NestedSystemMessageHandler() {}
 
     /**
+     * Runs a single nested task on the provided MessageQueue
+     *
+     * @return whether the current loop should quit.
+     */
+    public static boolean runSingleNestedLooperTask(MessageQueue queue)
+            throws IllegalArgumentException, IllegalAccessException, SecurityException,
+                   InvocationTargetException {
+        boolean quitLoop = false;
+        Message msg = (Message) sNextMethod.invoke(queue);
+        if (msg == null) return true;
+        if (msg.what == QUIT_MESSAGE) {
+            quitLoop = true;
+        }
+        Handler target = (Handler) sMessageTargetField.get(msg);
+
+        if (target == null) {
+            // No target is a magic identifier for the quit message.
+            quitLoop = true;
+        } else {
+            target.dispatchMessage(msg);
+        }
+
+        // Unset in-use flag.
+        Integer oldFlags = (Integer) sMessageFlagsField.get(msg);
+        sMessageFlagsField.set(msg, oldFlags & ~(1 << 0 /* FLAG_IN_USE */));
+
+        msg.recycle();
+        return quitLoop;
+    }
+
+    /**
      * Processes messages from the current MessageQueue till the queue becomes idle.
      */
     @SuppressWarnings("unused")
     @CalledByNative
-    private boolean runNestedLoopTillIdle() {
-        boolean quitLoop = false;
-
+    private static boolean runNestedLoopTillIdle() {
         MessageQueue queue = Looper.myQueue();
         queue.addIdleHandler(new MessageQueue.IdleHandler() {
             @Override
@@ -49,107 +101,14 @@
             }
         });
 
-        Class<?> messageQueueClazz = queue.getClass();
-        Method nextMethod = null;
         try {
-            nextMethod = messageQueueClazz.getDeclaredMethod("next");
-        } catch (SecurityException e) {
+            while (!runSingleNestedLooperTask(queue)) {
+            }
+        } catch (IllegalArgumentException | IllegalAccessException | SecurityException
+                | InvocationTargetException e) {
             e.printStackTrace();
             return false;
-        } catch (NoSuchMethodException e) {
-            e.printStackTrace();
-            return false;
-        }
-        nextMethod.setAccessible(true);
-
-        while (!quitLoop) {
-            Message msg = null;
-            try {
-                msg = (Message) nextMethod.invoke(queue);
-            } catch (IllegalArgumentException e) {
-                e.printStackTrace();
-                return false;
-            } catch (IllegalAccessException e) {
-                e.printStackTrace();
-                return false;
-            } catch (InvocationTargetException e) {
-                e.printStackTrace();
-                return false;
-            }
-
-            if (msg != null) {
-                if (msg.what == QUIT_MESSAGE) {
-                    quitLoop = true;
-                }
-                Class messageClazz = msg.getClass();
-                Field targetFiled = null;
-                try {
-                    targetFiled = messageClazz.getDeclaredField("target");
-                } catch (SecurityException e) {
-                    e.printStackTrace();
-                    return false;
-                } catch (NoSuchFieldException e) {
-                    e.printStackTrace();
-                    return false;
-                }
-                targetFiled.setAccessible(true);
-
-                Handler target = null;
-                try {
-                    target = (Handler) targetFiled.get(msg);
-                } catch (IllegalArgumentException e) {
-                    e.printStackTrace();
-                    return false;
-                } catch (IllegalAccessException e) {
-                    e.printStackTrace();
-                    return false;
-                }
-
-                if (target == null) {
-                    // No target is a magic identifier for the quit message.
-                    quitLoop = true;
-                } else {
-                    target.dispatchMessage(msg);
-                }
-
-                // Unset in-use flag.
-                Field flagsField = null;
-                try {
-                    flagsField = messageClazz.getDeclaredField("flags");
-                } catch (IllegalArgumentException e) {
-                    e.printStackTrace();
-                    return false;
-                } catch (SecurityException e) {
-                    e.printStackTrace();
-                    return false;
-                } catch (NoSuchFieldException e) {
-                    e.printStackTrace();
-                    return false;
-                }
-                flagsField.setAccessible(true);
-
-                try {
-                    Integer oldFlags = (Integer) flagsField.get(msg);
-                    flagsField.set(msg, oldFlags & ~(1 << 0 /* FLAG_IN_USE */));
-                } catch (IllegalArgumentException e) {
-                    e.printStackTrace();
-                    return false;
-                } catch (IllegalAccessException e) {
-                    e.printStackTrace();
-                    return false;
-                }
-
-                msg.recycle();
-            } else {
-                quitLoop = true;
-            }
         }
         return true;
     }
-
-    @SuppressWarnings("unused")
-    @CalledByNative
-    private static NestedSystemMessageHandler create() {
-        return new NestedSystemMessageHandler();
-    }
 }
diff --git a/content/public/test/nested_message_pump_android.cc b/content/public/test/nested_message_pump_android.cc
index 12e54af..8e7b22e3 100644
--- a/content/public/test/nested_message_pump_android.cc
+++ b/content/public/test/nested_message_pump_android.cc
@@ -6,21 +6,12 @@
 
 #include "base/android/jni_android.h"
 #include "base/android/scoped_java_ref.h"
-#include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "content/public/test/android/test_support_content_jni_headers/NestedSystemMessageHandler_jni.h"
 
-namespace {
-
-base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject>>::
-    DestructorAtExit g_message_handler_obj = LAZY_INSTANCE_INITIALIZER;
-
-}  // namespace
-
-
 namespace content {
 
 struct NestedMessagePumpAndroid::RunState {
@@ -94,8 +85,7 @@
     // No native tasks to process right now. Process tasks from the Java
     // System message handler. This will return when the java message queue
     // is idle.
-    bool ret = Java_NestedSystemMessageHandler_runNestedLoopTillIdle(
-        env, g_message_handler_obj.Get());
+    bool ret = Java_NestedSystemMessageHandler_runNestedLoopTillIdle(env);
     CHECK(ret) << "Error running java message loop, tests will likely fail.";
 
     if (state_->delayed_work_time.is_null()) {
@@ -118,13 +108,7 @@
   state_ = previous_state;
 }
 
-void NestedMessagePumpAndroid::Attach(
-    base::MessagePump::Delegate* delegate) {
-  JNIEnv* env = base::android::AttachCurrentThread();
-  DCHECK(env);
-  g_message_handler_obj.Get().Reset(
-      Java_NestedSystemMessageHandler_create(env));
-}
+void NestedMessagePumpAndroid::Attach(base::MessagePump::Delegate* delegate) {}
 
 void NestedMessagePumpAndroid::Quit() {
   if (state_) {
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc
index 132bf22..586c311 100644
--- a/content/renderer/accessibility/render_accessibility_impl.cc
+++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -134,6 +134,7 @@
 
   BlinkAXTreeSource tree_source(render_frame_, ax_mode);
   tree_source.SetRoot(root);
+  tree_source.EnableDOMNodeIDs();
   ScopedFreezeBlinkAXTreeSource freeze(&tree_source);
 
   // The serializer returns an AXContentTreeUpdate, which can store a complete
diff --git a/device/bluetooth/dbus/bluetooth_adapter_client.cc b/device/bluetooth/dbus/bluetooth_adapter_client.cc
index 9f7288e..9843814 100644
--- a/device/bluetooth/dbus/bluetooth_adapter_client.cc
+++ b/device/bluetooth/dbus/bluetooth_adapter_client.cc
@@ -224,11 +224,10 @@
       dbus::ObjectProxy* object_proxy,
       const dbus::ObjectPath& object_path,
       const std::string& interface_name) override {
-    Properties* properties = new Properties(
+    return new Properties(
         object_proxy, interface_name,
-        base::Bind(&BluetoothAdapterClientImpl::OnPropertyChanged,
-                   weak_ptr_factory_.GetWeakPtr(), object_path));
-    return static_cast<dbus::PropertySet*>(properties);
+        base::BindRepeating(&BluetoothAdapterClientImpl::OnPropertyChanged,
+                            weak_ptr_factory_.GetWeakPtr(), object_path));
   }
 
   // BluetoothAdapterClient override.
diff --git a/device/bluetooth/dbus/bluetooth_device_client.cc b/device/bluetooth/dbus/bluetooth_device_client.cc
index 4ef0162..2f71e142 100644
--- a/device/bluetooth/dbus/bluetooth_device_client.cc
+++ b/device/bluetooth/dbus/bluetooth_device_client.cc
@@ -246,11 +246,10 @@
       dbus::ObjectProxy* object_proxy,
       const dbus::ObjectPath& object_path,
       const std::string& interface_name) override {
-    Properties* properties =
-        new Properties(object_proxy, interface_name,
-                       base::Bind(&BluetoothDeviceClientImpl::OnPropertyChanged,
-                                  weak_ptr_factory_.GetWeakPtr(), object_path));
-    return static_cast<dbus::PropertySet*>(properties);
+    return new Properties(
+        object_proxy, interface_name,
+        base::BindRepeating(&BluetoothDeviceClientImpl::OnPropertyChanged,
+                            weak_ptr_factory_.GetWeakPtr(), object_path));
   }
 
   // BluetoothDeviceClient override.
diff --git a/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.cc b/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.cc
index 43a33b4..c8bb761 100644
--- a/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.cc
+++ b/device/bluetooth/dbus/bluetooth_gatt_characteristic_client.cc
@@ -231,11 +231,11 @@
       dbus::ObjectProxy* object_proxy,
       const dbus::ObjectPath& object_path,
       const std::string& interface_name) override {
-    Properties* properties = new Properties(
+    return new Properties(
         object_proxy, interface_name,
-        base::Bind(&BluetoothGattCharacteristicClientImpl::OnPropertyChanged,
-                   weak_ptr_factory_.GetWeakPtr(), object_path));
-    return static_cast<dbus::PropertySet*>(properties);
+        base::BindRepeating(
+            &BluetoothGattCharacteristicClientImpl::OnPropertyChanged,
+            weak_ptr_factory_.GetWeakPtr(), object_path));
   }
 
   // dbus::ObjectManager::Interface override.
diff --git a/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.cc b/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.cc
index 2406a7d..ae142baa83 100644
--- a/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.cc
+++ b/device/bluetooth/dbus/bluetooth_gatt_descriptor_client.cc
@@ -150,11 +150,11 @@
       dbus::ObjectProxy* object_proxy,
       const dbus::ObjectPath& object_path,
       const std::string& interface_name) override {
-    Properties* properties = new Properties(
+    return new Properties(
         object_proxy, interface_name,
-        base::Bind(&BluetoothGattDescriptorClientImpl::OnPropertyChanged,
-                   weak_ptr_factory_.GetWeakPtr(), object_path));
-    return static_cast<dbus::PropertySet*>(properties);
+        base::BindRepeating(
+            &BluetoothGattDescriptorClientImpl::OnPropertyChanged,
+            weak_ptr_factory_.GetWeakPtr(), object_path));
   }
 
   // dbus::ObjectManager::Interface override.
diff --git a/device/bluetooth/dbus/bluetooth_gatt_service_client.cc b/device/bluetooth/dbus/bluetooth_gatt_service_client.cc
index 06b69f8..9d9eb3db 100644
--- a/device/bluetooth/dbus/bluetooth_gatt_service_client.cc
+++ b/device/bluetooth/dbus/bluetooth_gatt_service_client.cc
@@ -69,11 +69,10 @@
       dbus::ObjectProxy* object_proxy,
       const dbus::ObjectPath& object_path,
       const std::string& interface_name) override {
-    Properties* properties = new Properties(
+    return new Properties(
         object_proxy, interface_name,
-        base::Bind(&BluetoothGattServiceClientImpl::OnPropertyChanged,
-                   weak_ptr_factory_.GetWeakPtr(), object_path));
-    return static_cast<dbus::PropertySet*>(properties);
+        base::BindRepeating(&BluetoothGattServiceClientImpl::OnPropertyChanged,
+                            weak_ptr_factory_.GetWeakPtr(), object_path));
   }
 
   // dbus::ObjectManager::Interface override.
diff --git a/device/bluetooth/dbus/bluetooth_input_client.cc b/device/bluetooth/dbus/bluetooth_input_client.cc
index 9d37cd6..7b3a130 100644
--- a/device/bluetooth/dbus/bluetooth_input_client.cc
+++ b/device/bluetooth/dbus/bluetooth_input_client.cc
@@ -56,11 +56,10 @@
       dbus::ObjectProxy* object_proxy,
       const dbus::ObjectPath& object_path,
       const std::string& interface_name) override {
-    Properties* properties =
-        new Properties(object_proxy, interface_name,
-                       base::Bind(&BluetoothInputClientImpl::OnPropertyChanged,
-                                  weak_ptr_factory_.GetWeakPtr(), object_path));
-    return static_cast<dbus::PropertySet*>(properties);
+    return new Properties(
+        object_proxy, interface_name,
+        base::BindRepeating(&BluetoothInputClientImpl::OnPropertyChanged,
+                            weak_ptr_factory_.GetWeakPtr(), object_path));
   }
 
   // BluetoothInputClient override.
diff --git a/device/bluetooth/dbus/bluetooth_media_transport_client.cc b/device/bluetooth/dbus/bluetooth_media_transport_client.cc
index 28898ed..841fb9e4 100644
--- a/device/bluetooth/dbus/bluetooth_media_transport_client.cc
+++ b/device/bluetooth/dbus/bluetooth_media_transport_client.cc
@@ -73,11 +73,11 @@
       dbus::ObjectProxy* object_proxy,
       const dbus::ObjectPath& object_path,
       const std::string& interface_name) override {
-    Properties* properties = new Properties(
+    return new Properties(
         object_proxy, interface_name,
-        base::Bind(&BluetoothMediaTransportClientImpl::OnPropertyChanged,
-                   weak_ptr_factory_.GetWeakPtr(), object_path));
-    return properties;
+        base::BindRepeating(
+            &BluetoothMediaTransportClientImpl::OnPropertyChanged,
+            weak_ptr_factory_.GetWeakPtr(), object_path));
   }
 
   void ObjectAdded(const dbus::ObjectPath& object_path,
diff --git a/device/bluetooth/dbus/fake_bluetooth_device_client.cc b/device/bluetooth/dbus/fake_bluetooth_device_client.cc
index a2731b13..f16c5c90 100644
--- a/device/bluetooth/dbus/fake_bluetooth_device_client.cc
+++ b/device/bluetooth/dbus/fake_bluetooth_device_client.cc
@@ -320,9 +320,9 @@
       max_transmit_power_(kUnkownPower),
       delay_start_discovery_(false),
       should_leave_connections_pending_(false) {
-  std::unique_ptr<Properties> properties(new Properties(
-      base::Bind(&FakeBluetoothDeviceClient::OnPropertyChanged,
-                 base::Unretained(this), dbus::ObjectPath(kPairedDevicePath))));
+  std::unique_ptr<Properties> properties(new Properties(base::BindRepeating(
+      &FakeBluetoothDeviceClient::OnPropertyChanged, base::Unretained(this),
+      dbus::ObjectPath(kPairedDevicePath))));
   properties->address.ReplaceValue(kPairedDeviceAddress);
   properties->bluetooth_class.ReplaceValue(kPairedDeviceClass);
   properties->name.ReplaceValue(kPairedDeviceName);
@@ -714,9 +714,9 @@
   if (base::Contains(device_list_, device_path))
     return;
 
-  std::unique_ptr<Properties> properties(
-      new Properties(base::Bind(&FakeBluetoothDeviceClient::OnPropertyChanged,
-                                base::Unretained(this), device_path)));
+  std::unique_ptr<Properties> properties(new Properties(
+      base::BindRepeating(&FakeBluetoothDeviceClient::OnPropertyChanged,
+                          base::Unretained(this), device_path)));
   properties->adapter.ReplaceValue(adapter_path);
   properties->type.ReplaceValue(BluetoothDeviceClient::kTypeBredr);
   properties->type.set_valid(true);
@@ -849,9 +849,9 @@
   if (base::Contains(device_list_, device_path))
     return;
 
-  std::unique_ptr<Properties> properties(
-      new Properties(base::Bind(&FakeBluetoothDeviceClient::OnPropertyChanged,
-                                base::Unretained(this), device_path)));
+  std::unique_ptr<Properties> properties(new Properties(
+      base::BindRepeating(&FakeBluetoothDeviceClient::OnPropertyChanged,
+                          base::Unretained(this), device_path)));
   properties->adapter.ReplaceValue(adapter_path);
   properties->name.ReplaceValue(props.device_name);
   properties->name.set_valid(true);
@@ -1904,9 +1904,9 @@
     device_path = dbus::ObjectPath(adapter_path.value() + "/dev" + id);
   } while (base::Contains(device_list_, device_path));
 
-  std::unique_ptr<Properties> properties(
-      new Properties(base::Bind(&FakeBluetoothDeviceClient::OnPropertyChanged,
-                                base::Unretained(this), device_path)));
+  std::unique_ptr<Properties> properties(new Properties(
+      base::BindRepeating(&FakeBluetoothDeviceClient::OnPropertyChanged,
+                          base::Unretained(this), device_path)));
   properties->adapter.ReplaceValue(adapter_path);
 
   properties->address.ReplaceValue(device_address);
diff --git a/device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_client.cc b/device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_client.cc
index 42b8acff..5fb46d8 100644
--- a/device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_client.cc
+++ b/device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_client.cc
@@ -398,10 +398,10 @@
   // ==== Heart Rate Measurement Characteristic ====
   heart_rate_measurement_path_ =
       service_path.value() + "/" + kHeartRateMeasurementPathComponent;
-  heart_rate_measurement_properties_.reset(new Properties(
-      base::Bind(&FakeBluetoothGattCharacteristicClient::OnPropertyChanged,
-                 weak_ptr_factory_.GetWeakPtr(),
-                 dbus::ObjectPath(heart_rate_measurement_path_))));
+  heart_rate_measurement_properties_.reset(new Properties(base::BindRepeating(
+      &FakeBluetoothGattCharacteristicClient::OnPropertyChanged,
+      weak_ptr_factory_.GetWeakPtr(),
+      dbus::ObjectPath(heart_rate_measurement_path_))));
   heart_rate_measurement_properties_->uuid.ReplaceValue(
       kHeartRateMeasurementUUID);
   heart_rate_measurement_properties_->service.ReplaceValue(service_path);
@@ -412,10 +412,10 @@
   // ==== Body Sensor Location Characteristic ====
   body_sensor_location_path_ =
       service_path.value() + "/" + kBodySensorLocationPathComponent;
-  body_sensor_location_properties_.reset(new Properties(
-      base::Bind(&FakeBluetoothGattCharacteristicClient::OnPropertyChanged,
-                 weak_ptr_factory_.GetWeakPtr(),
-                 dbus::ObjectPath(body_sensor_location_path_))));
+  body_sensor_location_properties_.reset(new Properties(base::BindRepeating(
+      &FakeBluetoothGattCharacteristicClient::OnPropertyChanged,
+      weak_ptr_factory_.GetWeakPtr(),
+      dbus::ObjectPath(body_sensor_location_path_))));
   body_sensor_location_properties_->uuid.ReplaceValue(kBodySensorLocationUUID);
   body_sensor_location_properties_->service.ReplaceValue(service_path);
   flags.clear();
@@ -425,10 +425,10 @@
   // ==== Heart Rate Control Point Characteristic ====
   heart_rate_control_point_path_ =
       service_path.value() + "/" + kHeartRateControlPointPathComponent;
-  heart_rate_control_point_properties_.reset(new Properties(
-      base::Bind(&FakeBluetoothGattCharacteristicClient::OnPropertyChanged,
-                 weak_ptr_factory_.GetWeakPtr(),
-                 dbus::ObjectPath(heart_rate_control_point_path_))));
+  heart_rate_control_point_properties_.reset(new Properties(base::BindRepeating(
+      &FakeBluetoothGattCharacteristicClient::OnPropertyChanged,
+      weak_ptr_factory_.GetWeakPtr(),
+      dbus::ObjectPath(heart_rate_control_point_path_))));
   heart_rate_control_point_properties_->uuid.ReplaceValue(
       kHeartRateControlPointUUID);
   heart_rate_control_point_properties_->service.ReplaceValue(service_path);
diff --git a/device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_client.cc b/device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_client.cc
index df5f8e3..86ff2d0 100644
--- a/device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_client.cc
+++ b/device/bluetooth/dbus/fake_bluetooth_gatt_descriptor_client.cc
@@ -162,8 +162,8 @@
   }
 
   Properties* properties = new Properties(
-      base::Bind(&FakeBluetoothGattDescriptorClient::OnPropertyChanged,
-                 weak_ptr_factory_.GetWeakPtr(), object_path));
+      base::BindRepeating(&FakeBluetoothGattDescriptorClient::OnPropertyChanged,
+                          weak_ptr_factory_.GetWeakPtr(), object_path));
   properties->uuid.ReplaceValue(uuid);
   properties->characteristic.ReplaceValue(characteristic_path);
 
diff --git a/device/bluetooth/dbus/fake_bluetooth_input_client.cc b/device/bluetooth/dbus/fake_bluetooth_input_client.cc
index 9d72a0de2..ace8245 100644
--- a/device/bluetooth/dbus/fake_bluetooth_input_client.cc
+++ b/device/bluetooth/dbus/fake_bluetooth_input_client.cc
@@ -75,8 +75,8 @@
     return;
 
   std::unique_ptr<Properties> properties = std::make_unique<Properties>(
-      base::Bind(&FakeBluetoothInputClient::OnPropertyChanged,
-                 base::Unretained(this), object_path));
+      base::BindRepeating(&FakeBluetoothInputClient::OnPropertyChanged,
+                          base::Unretained(this), object_path));
 
   // The LegacyAutopair and DisplayPinCode devices represent a typical mouse
   // and keyboard respectively, so mark them as ReconnectMode "any". The
diff --git a/device/bluetooth/dbus/fake_bluetooth_media_transport_client.cc b/device/bluetooth/dbus/fake_bluetooth_media_transport_client.cc
index 990f9fe5..76983fe 100644
--- a/device/bluetooth/dbus/fake_bluetooth_media_transport_client.cc
+++ b/device/bluetooth/dbus/fake_bluetooth_media_transport_client.cc
@@ -166,9 +166,9 @@
             << " is created for endpoint " << endpoint_path.value();
 
     // Sets the fake property set with default values.
-    std::unique_ptr<Properties> properties(new Properties(
-        base::Bind(&FakeBluetoothMediaTransportClient::OnPropertyChanged,
-                   base::Unretained(this))));
+    std::unique_ptr<Properties> properties(new Properties(base::BindRepeating(
+        &FakeBluetoothMediaTransportClient::OnPropertyChanged,
+        base::Unretained(this))));
     properties->device.ReplaceValue(ObjectPath(kTransportDevicePath));
     properties->uuid.ReplaceValue(
         BluetoothMediaClient::kBluetoothAudioSinkUUID);
diff --git a/docs/memory-infra/memory_benchmarks.md b/docs/memory-infra/memory_benchmarks.md
index 35599e13..a61bc57 100644
--- a/docs/memory-infra/memory_benchmarks.md
+++ b/docs/memory-infra/memory_benchmarks.md
@@ -173,8 +173,9 @@
 * **Benchmark**: The name of the benchmark to run. If you are interested in
   memory try `system_health.memory_mobile` or `system_health.memory_desktop`
   as appropriate.
-* **Story** (optional): A pattern passed to Telemetry's `--story-filter`
-  option to only run stories that match the pattern.
+* **Story** (optional): A pattern (Python regular expression) passed to
+  Telemetry's `--story-filter` option to only run stories that match the
+  pattern.
 * **Extra Test Arguments** (optional): Additional command line arguments for
   Telemetry's `run_benchmark`. Of note, if you are interested in running a
   small but representative sample of system health stories you can pass
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 0415e25..fdcdc30 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -837,6 +837,25 @@
     kBindBufferRange
   };
 
+  // Helper class to ensure that GLES2DecoderImpl::Destroy() is always called
+  // unless we specifically call OnSuccess().
+  class DestroyOnFailure {
+   public:
+    DestroyOnFailure(GLES2DecoderImpl* decoder) : decoder_(decoder) {}
+    ~DestroyOnFailure() {
+      if (!success_)
+        decoder_->Destroy(has_context_);
+    }
+
+    void OnSuccess() { success_ = true; }
+    void LoseContext() { has_context_ = false; }
+
+   private:
+    GLES2DecoderImpl* decoder_ = nullptr;
+    bool success_ = false;
+    bool has_context_ = true;
+  };
+
   const char* GetCommandName(unsigned int command_id) const;
 
   // Initialize or re-initialize the shader translator.
@@ -3539,6 +3558,10 @@
   surfaceless_ = surface->IsSurfaceless() && !offscreen;
 
   set_initialized();
+  // At this point we are partially initialized and must Destroy() in any
+  // failure case.
+  DestroyOnFailure destroy_on_failure(this);
+
   gpu_state_tracer_ = GPUStateTracer::Create(&state_);
 
   if (group_->gpu_preferences().enable_gpu_debugging)
@@ -3581,7 +3604,6 @@
       feature_info_->feature_flags().is_swiftshader_for_webgl) {
     // Must not destroy ContextGroup if it is not initialized.
     group_ = nullptr;
-    Destroy(true);
     LOG(ERROR) << "ContextResult::kFatalFailure: "
                   "fail_if_major_perf_caveat + swiftshader";
     return gpu::ContextResult::kFatalFailure;
@@ -3591,7 +3613,6 @@
   if (attrib_helper.context_type == CONTEXT_TYPE_WEBGL2_COMPUTE) {
     // Must not destroy ContextGroup if it is not initialized.
     group_ = nullptr;
-    Destroy(true);
     LOG(ERROR)
         << "ContextResult::kFatalFailure: "
            "webgl2-compute is not supported on validating command decoder.";
@@ -3603,7 +3624,6 @@
   if (result != gpu::ContextResult::kSuccess) {
     // Must not destroy ContextGroup if it is not initialized.
     group_ = nullptr;
-    Destroy(true);
     return result;
   }
   CHECK_GL_ERROR();
@@ -3630,7 +3650,6 @@
     }
 
     if (!supported) {
-      Destroy(true);
       LOG(ERROR) << "ContextResult::kFatalFailure: "
                     "native gmb format not supported";
       return gpu::ContextResult::kFatalFailure;
@@ -4007,7 +4026,6 @@
     // of the frame buffers is okay.
     if (!ResizeOffscreenFramebuffer(
             gfx::Size(state_.viewport_width, state_.viewport_height))) {
-      Destroy(true);
       LOG(ERROR) << "ContextResult::kFatalFailure: "
                     "Could not allocate offscreen buffer storage.";
       return gpu::ContextResult::kFatalFailure;
@@ -4023,7 +4041,6 @@
       if (offscreen_saved_frame_buffer_->CheckStatus() !=
           GL_FRAMEBUFFER_COMPLETE) {
         bool was_lost = CheckResetStatus();
-        Destroy(true);
         LOG(ERROR) << (was_lost ? "ContextResult::kTransientFailure: "
                                 : "ContextResult::kFatalFailure: ")
                    << "Offscreen saved FBO was incomplete.";
@@ -4117,9 +4134,11 @@
     LOG(ERROR)
         << "  GLES2DecoderImpl: Context reset detected after initialization.";
     group_->LoseContexts(error::kUnknown);
+    destroy_on_failure.LoseContext();
     return gpu::ContextResult::kTransientFailure;
   }
 
+  destroy_on_failure.OnSuccess();
   return gpu::ContextResult::kSuccess;
 }
 
@@ -6501,11 +6520,7 @@
     service_id = GetBackbufferServiceId();
   }
 
-  if (workarounds().do_extra_flush_around_bindframebuffer)
-    api()->glFlushFn();
   api()->glBindFramebufferEXTFn(target, service_id);
-  if (workarounds().do_extra_flush_around_bindframebuffer)
-    api()->glFlushFn();
   OnFboChanged();
 }
 
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
index 801d75f..98f0a80 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
@@ -434,13 +434,9 @@
     GLenum target,
     GLuint framebuffer) {
   CheckErrorCallbackState();
-  if (feature_info_->workarounds().do_extra_flush_around_bindframebuffer)
-    api()->glFlushFn();
   api()->glBindFramebufferEXTFn(
       target, GetFramebufferServiceID(api(), framebuffer, &framebuffer_id_map_,
                                       bind_generates_resource_));
-  if (feature_info_->workarounds().do_extra_flush_around_bindframebuffer)
-    api()->glFlushFn();
   if (CheckErrorCallbackState()) {
     return error::kNoError;
   }
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
index 3118624..44fb80e 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
@@ -518,7 +518,8 @@
   gpu::ContextResult result = decoder_->Initialize(
       surface_, context_, false, DisallowedFeatures(), attribs);
   if (result != gpu::ContextResult::kSuccess) {
-    decoder_->Destroy(false /* have_context */);
+    // GLES2CmdDecoder::Destroy should be handled by Initialize in all failure
+    // cases.
     decoder_.reset();
     group_->Destroy(mock_decoder_.get(), false);
     return result;
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json
index 14156bee..12c8271 100644
--- a/gpu/config/gpu_driver_bug_list.json
+++ b/gpu/config/gpu_driver_bug_list.json
@@ -3463,22 +3463,6 @@
       ]
     },
     {
-      "id": 325,
-      "cr_bugs": [1018028],
-      "description": "Do extra flush before and after BindFrameBuffer call",
-      "os": {
-        "type": "win"
-      },
-      "driver_vendor": ".*Intel.*",
-      "driver_version": {
-        "op": "<",
-        "value": "24.20.100.6286"
-      },
-      "features": [
-        "do_extra_flush_around_bindframebuffer"
-      ]
-    },
-    {
       "id": 326,
       "description": "Migrating OpenGL contexts between low- and high-power GPUs is unreliable on Mac NVIDIA laptops",
       "cr_bugs": [681341],
diff --git a/gpu/config/gpu_workaround_list.txt b/gpu/config/gpu_workaround_list.txt
index a164fe5..7075196 100644
--- a/gpu/config/gpu_workaround_list.txt
+++ b/gpu/config/gpu_workaround_list.txt
@@ -117,5 +117,4 @@
 disable_half_float_for_gmb
 prefer_draw_to_copy
 remove_dynamic_indexing_of_swizzled_vector
-do_extra_flush_around_bindframebuffer
 disable_dual_source_blending_support
diff --git a/gpu/vulkan/features.gni b/gpu/vulkan/features.gni
index d55edde..015bad2 100644
--- a/gpu/vulkan/features.gni
+++ b/gpu/vulkan/features.gni
@@ -9,4 +9,9 @@
 declare_args() {
   # Enable experimental vulkan backend.
   enable_vulkan = is_linux || is_android || is_fuchsia
+
+  # Enable swiftshader vulkan. Disabling it can save build time, however
+  # --use-vulkan=swiftshader and some tests which using swiftshader vulan will
+  # not work.
+  enable_swiftshader_vulkan = true
 }
diff --git a/gpu/vulkan/x/BUILD.gn b/gpu/vulkan/x/BUILD.gn
index 4a1158c..2ea73efd 100644
--- a/gpu/vulkan/x/BUILD.gn
+++ b/gpu/vulkan/x/BUILD.gn
@@ -38,9 +38,11 @@
     "//gpu/vulkan",
   ]
 
-  # Vulkan Swiftshader can only be built on Linux.
-  # TODO(samans): Support more platforms. https://crbug.com/963988
-  data_deps = [
-    "//third_party/swiftshader/src/Vulkan:swiftshader_libvulkan",
-  ]
+  if (enable_swiftshader_vulkan) {
+    # Vulkan Swiftshader can only be built on Linux.
+    # TODO(samans): Support more platforms. https://crbug.com/963988
+    data_deps = [
+      "//third_party/swiftshader/src/Vulkan:swiftshader_libvulkan",
+    ]
+  }
 }
diff --git a/headless/app/headless_shell_switches.cc b/headless/app/headless_shell_switches.cc
index 6b2c5f4..c91c5fbc 100644
--- a/headless/app/headless_shell_switches.cc
+++ b/headless/app/headless_shell_switches.cc
@@ -22,6 +22,11 @@
 // Enable crash reporter for headless.
 const char kEnableCrashReporter[] = "enable-crash-reporter";
 
+// If enabled, generate a tagged (accessible) file when printing to PDF.
+// The plan is for this to go away once tagged PDFs become the default.
+// See https://crbug.com/607777
+const char kExportTaggedPDF[] = "export-tagged-pdf";
+
 // Disable crash reporter for headless. It is enabled by default in official
 // builds.
 const char kDisableCrashReporter[] = "disable-crash-reporter";
diff --git a/headless/app/headless_shell_switches.h b/headless/app/headless_shell_switches.h
index 1e69ba64..aeb3a14 100644
--- a/headless/app/headless_shell_switches.h
+++ b/headless/app/headless_shell_switches.h
@@ -20,6 +20,7 @@
 HEADLESS_EXPORT extern const char kDumpDom[];
 HEADLESS_EXPORT extern const char kEnableBeginFrameControl[];
 HEADLESS_EXPORT extern const char kEnableCrashReporter[];
+HEADLESS_EXPORT extern const char kExportTaggedPDF[];
 HEADLESS_EXPORT extern const char kHideScrollbars[];
 HEADLESS_EXPORT extern const char kPasswordStore[];
 HEADLESS_EXPORT extern const char kPrintToPDF[];
diff --git a/headless/lib/browser/headless_content_browser_client.cc b/headless/lib/browser/headless_content_browser_client.cc
index aac5672..3612acbb 100644
--- a/headless/lib/browser/headless_content_browser_client.cc
+++ b/headless/lib/browser/headless_content_browser_client.cc
@@ -190,6 +190,9 @@
     command_line->AppendSwitch(::switches::kEnableCrashReporter);
 #endif  // defined(HEADLESS_USE_BREAKPAD)
 
+  if (old_command_line.HasSwitch(switches::kExportTaggedPDF))
+    command_line->AppendSwitch(switches::kExportTaggedPDF);
+
   // If we're spawning a renderer, then override the language switch.
   std::string process_type =
       command_line->GetSwitchValueASCII(::switches::kProcessType);
diff --git a/headless/lib/renderer/headless_print_render_frame_helper_delegate.cc b/headless/lib/renderer/headless_print_render_frame_helper_delegate.cc
index 7d8ab3f3..253e685 100644
--- a/headless/lib/renderer/headless_print_render_frame_helper_delegate.cc
+++ b/headless/lib/renderer/headless_print_render_frame_helper_delegate.cc
@@ -3,6 +3,8 @@
 // found in the LICENSE file.
 
 #include "headless/lib/renderer/headless_print_render_frame_helper_delegate.h"
+#include "base/command_line.h"
+#include "headless/app/headless_shell_switches.h"
 
 #include "third_party/blink/public/web/web_element.h"
 
@@ -23,6 +25,11 @@
   return false;
 }
 
+bool HeadlessPrintRenderFrameHelperDelegate::ShouldGenerateTaggedPDF() {
+  return base::CommandLine::ForCurrentProcess()->HasSwitch(
+      headless::switches::kExportTaggedPDF);
+}
+
 bool HeadlessPrintRenderFrameHelperDelegate::OverridePrint(
     blink::WebLocalFrame* frame) {
   return false;
diff --git a/headless/lib/renderer/headless_print_render_frame_helper_delegate.h b/headless/lib/renderer/headless_print_render_frame_helper_delegate.h
index c5c070d..707e849 100644
--- a/headless/lib/renderer/headless_print_render_frame_helper_delegate.h
+++ b/headless/lib/renderer/headless_print_render_frame_helper_delegate.h
@@ -19,6 +19,7 @@
  private:
   // printing::PrintRenderFrameHelper::Delegate:
   bool IsPrintPreviewEnabled() override;
+  bool ShouldGenerateTaggedPDF() override;
   bool OverridePrint(blink::WebLocalFrame* frame) override;
   blink::WebElement GetPdfElement(blink::WebLocalFrame* frame) override;
 
diff --git a/ios/chrome/browser/infobars/infobar_badge_tab_helper.h b/ios/chrome/browser/infobars/infobar_badge_tab_helper.h
index 5dfa75c..ef3d0129 100644
--- a/ios/chrome/browser/infobars/infobar_badge_tab_helper.h
+++ b/ios/chrome/browser/infobars/infobar_badge_tab_helper.h
@@ -111,6 +111,8 @@
   InfobarAcceptanceObserver infobar_accept_observer_;
   // The infobar manager observer.
   InfobarManagerObserver infobar_manager_observer_;
+  // The WebState this TabHelper is scoped to.
+  web::WebState* web_state_;
   // Map storing the badge models for each InfobarType.
   std::map<InfobarType, InfobarBadgeModel*> infobar_badge_models_;
 
diff --git a/ios/chrome/browser/infobars/infobar_badge_tab_helper.mm b/ios/chrome/browser/infobars/infobar_badge_tab_helper.mm
index 7ca81b4b..bf10263e 100644
--- a/ios/chrome/browser/infobars/infobar_badge_tab_helper.mm
+++ b/ios/chrome/browser/infobars/infobar_badge_tab_helper.mm
@@ -31,7 +31,8 @@
 
 InfobarBadgeTabHelper::InfobarBadgeTabHelper(web::WebState* web_state)
     : infobar_accept_observer_(this),
-      infobar_manager_observer_(this, web_state, &infobar_accept_observer_) {}
+      infobar_manager_observer_(this, web_state, &infobar_accept_observer_),
+      web_state_(web_state) {}
 
 InfobarBadgeTabHelper::~InfobarBadgeTabHelper() = default;
 
@@ -55,13 +56,15 @@
 void InfobarBadgeTabHelper::UpdateBadgeForInfobarBannerPresented(
     InfobarType infobar_type) {
   infobar_badge_models_[infobar_type].badgeState |= BadgeStatePresented;
-  [delegate_ updateInfobarBadge:infobar_badge_models_[infobar_type]];
+  [delegate_ updateInfobarBadge:infobar_badge_models_[infobar_type]
+                    forWebState:web_state_];
 }
 
 void InfobarBadgeTabHelper::UpdateBadgeForInfobarBannerDismissed(
     InfobarType infobar_type) {
   infobar_badge_models_[infobar_type].badgeState &= ~BadgeStatePresented;
-  [delegate_ updateInfobarBadge:infobar_badge_models_[infobar_type]];
+  [delegate_ updateInfobarBadge:infobar_badge_models_[infobar_type]
+                    forWebState:web_state_];
 }
 
 NSArray<id<BadgeItem>>* InfobarBadgeTabHelper::GetInfobarBadgeItems() {
@@ -81,14 +84,14 @@
   InfobarBadgeModel* new_badge =
       [[InfobarBadgeModel alloc] initWithInfobarType:infobar_type];
   infobar_badge_models_[infobar_type] = new_badge;
-  [delegate_ addInfobarBadge:new_badge];
+  [delegate_ addInfobarBadge:new_badge forWebState:web_state_];
 }
 
 void InfobarBadgeTabHelper::ResetStateForRemovedInfobar(
     InfobarType infobar_type) {
   InfobarBadgeModel* removed_badge = infobar_badge_models_[infobar_type];
   infobar_badge_models_[infobar_type] = nil;
-  [delegate_ removeInfobarBadge:removed_badge];
+  [delegate_ removeInfobarBadge:removed_badge forWebState:web_state_];
 }
 
 void InfobarBadgeTabHelper::OnInfobarAcceptanceStateChanged(
@@ -100,7 +103,7 @@
   } else {
     item.badgeState &= ~BadgeStateAccepted;
   }
-  [delegate_ updateInfobarBadge:item];
+  [delegate_ updateInfobarBadge:item forWebState:web_state_];
 }
 
 #pragma mark - InfobarBadgeTabHelper::InfobarAcceptanceObserver
diff --git a/ios/chrome/browser/infobars/infobar_badge_tab_helper_delegate.h b/ios/chrome/browser/infobars/infobar_badge_tab_helper_delegate.h
index d08b595..64bfb589 100644
--- a/ios/chrome/browser/infobars/infobar_badge_tab_helper_delegate.h
+++ b/ios/chrome/browser/infobars/infobar_badge_tab_helper_delegate.h
@@ -9,15 +9,24 @@
 
 @protocol BadgeItem;
 
+namespace web {
+class WebState;
+}
+
 // Delegate used by InfobarBadgeTabHelper to manage the Infobar badges.
 @protocol InfobarBadgeTabHelperDelegate
 
-// Asks the delegate to add a badge with the configuration of |badgeItem|.
-- (void)addInfobarBadge:(id<BadgeItem>)badgeItem;
-// Asks the delegate to remove a badge matching the badgeType of |badgeItem|.
-- (void)removeInfobarBadge:(id<BadgeItem>)badgeItem;
-// Asks the delegate to update the configuration of |badgeItem|.
-- (void)updateInfobarBadge:(id<BadgeItem>)badgeItem;
+// Asks the delegate to add a badge with the configuration of |badgeItem| for
+// |webState|.
+- (void)addInfobarBadge:(id<BadgeItem>)badgeItem
+            forWebState:(web::WebState*)webState;
+// Asks the delegate to remove a badge matching the badgeType of |badgeItem| for
+// |webState|.
+- (void)removeInfobarBadge:(id<BadgeItem>)badgeItem
+               forWebState:(web::WebState*)webState;
+// Asks the delegate to update the configuration of |badgeItem| for |webState|.
+- (void)updateInfobarBadge:(id<BadgeItem>)badgeItem
+               forWebState:(web::WebState*)webState;
 
 @end
 
diff --git a/ios/chrome/browser/infobars/test/fake_infobar_badge_tab_helper_delegate.mm b/ios/chrome/browser/infobars/test/fake_infobar_badge_tab_helper_delegate.mm
index f41d626f..24083c12 100644
--- a/ios/chrome/browser/infobars/test/fake_infobar_badge_tab_helper_delegate.mm
+++ b/ios/chrome/browser/infobars/test/fake_infobar_badge_tab_helper_delegate.mm
@@ -27,15 +27,18 @@
 
 #pragma mark - InfobarBadgeTabHelperDelegate
 
-- (void)addInfobarBadge:(id<BadgeItem>)badgeItem {
+- (void)addInfobarBadge:(id<BadgeItem>)badgeItem
+            forWebState:(web::WebState*)webState {
   _badgeItems[badgeItem.badgeType] = badgeItem;
 }
 
-- (void)removeInfobarBadge:(id<BadgeItem>)badgeItem {
+- (void)removeInfobarBadge:(id<BadgeItem>)badgeItem
+               forWebState:(web::WebState*)webState {
   _badgeItems[badgeItem.badgeType] = nil;
 }
 
-- (void)updateInfobarBadge:(id<BadgeItem>)badgeItem {
+- (void)updateInfobarBadge:(id<BadgeItem>)badgeItem
+               forWebState:(web::WebState*)webState {
 }
 
 @end
diff --git a/ios/chrome/browser/ui/badges/badge_mediator.mm b/ios/chrome/browser/ui/badges/badge_mediator.mm
index 0cfaada..888eb43 100644
--- a/ios/chrome/browser/ui/badges/badge_mediator.mm
+++ b/ios/chrome/browser/ui/badges/badge_mediator.mm
@@ -242,12 +242,24 @@
 
 #pragma mark - InfobarBadgeTabHelperDelegate
 
-- (void)addInfobarBadge:(id<BadgeItem>)badgeItem {
+- (void)addInfobarBadge:(id<BadgeItem>)badgeItem
+            forWebState:(web::WebState*)webState {
+  if (webState != self.webStateList->GetActiveWebState()) {
+    // Don't add badge if |badgeItem| is not coming from the currently active
+    // WebState.
+    return;
+  }
   [self.badges addObject:badgeItem];
   [self updateBadgesShown];
 }
 
-- (void)removeInfobarBadge:(id<BadgeItem>)badgeItem {
+- (void)removeInfobarBadge:(id<BadgeItem>)badgeItem
+               forWebState:(web::WebState*)webState {
+  if (webState != self.webStateList->GetActiveWebState()) {
+    // Don't remove badge if |badgeItem| is not coming from the currently active
+    // WebState.
+    return;
+  }
   for (id<BadgeItem> item in self.badges) {
     if (item.badgeType == badgeItem.badgeType) {
       [self.badges removeObject:item];
@@ -257,7 +269,13 @@
   }
 }
 
-- (void)updateInfobarBadge:(id<BadgeItem>)badgeItem {
+- (void)updateInfobarBadge:(id<BadgeItem>)badgeItem
+               forWebState:(web::WebState*)webState {
+  if (webState != self.webStateList->GetActiveWebState()) {
+    // Don't update badge if |badgeItem| is not coming from the currently active
+    // WebState.
+    return;
+  }
   for (id<BadgeItem> item in self.badges) {
     if (item.badgeType == badgeItem.badgeType) {
       item.badgeState = badgeItem.badgeState;
diff --git a/ios/chrome/browser/ui/badges/badge_mediator_unittest.mm b/ios/chrome/browser/ui/badges/badge_mediator_unittest.mm
index 8aea99c7..b4eda88 100644
--- a/ios/chrome/browser/ui/badges/badge_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/badges/badge_mediator_unittest.mm
@@ -217,6 +217,23 @@
   EXPECT_FALSE(badge_consumer_.displayedBadge);
 }
 
+// Test that the BadgeMediator does not inform its consumer of a new infobar if
+// the added infobar came from an inactive WebState.
+TEST_P(BadgeMediatorTest,
+       BadgeMediatorTestSwitchWebStateAndAddInfobarToInactiveWebState) {
+  InsertActivatedWebState(/*index=*/0);
+  AddInfobar(kFirstInfobarType);
+  ASSERT_TRUE(badge_consumer_.displayedBadge);
+  EXPECT_EQ(badge_consumer_.displayedBadge.badgeType,
+            BadgeType::kBadgeTypePasswordSave);
+  InsertActivatedWebState(/*index=*/1);
+  std::unique_ptr<InfoBarIOS> added_infobar =
+      FakeInfobarIOS::Create(kSecondInfobarType, /*has_badge=*/true);
+  InfoBarManagerImpl::FromWebState(web_state_list_.GetWebStateAt(0))
+      ->AddInfoBar(std::move(added_infobar));
+  EXPECT_FALSE(badge_consumer_.displayedBadge);
+}
+
 // Test that the BadgeMediator updates the badge when it is accepted.
 TEST_P(BadgeMediatorTest, BadgeMediatorTestAcceptedBadge) {
   InsertActivatedWebState(/*index=*/0);
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn
index 735af1f..8d514c8 100644
--- a/media/base/BUILD.gn
+++ b/media/base/BUILD.gn
@@ -588,6 +588,14 @@
   if (is_linux || is_win) {
     sources += [ "keyboard_event_counter_unittest.cc" ]
   }
+  if (is_win) {
+    sources += [ "win/dxgi_device_scope_handle_unittest.cc" ]
+    deps += [ "//media/base/win:media_foundation_util" ]
+    libs = [
+      "d3d11.lib",
+      "mfplat.lib",
+    ]
+  }
 }
 
 source_set("perftests") {
diff --git a/media/base/win/dxgi_device_scope_handle_unittest.cc b/media/base/win/dxgi_device_scope_handle_unittest.cc
new file mode 100644
index 0000000..a5fc44d3
--- /dev/null
+++ b/media/base/win/dxgi_device_scope_handle_unittest.cc
@@ -0,0 +1,78 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <d3d11.h>
+#include <mfapi.h>
+
+#include "media/base/test_helpers.h"
+#include "media/base/win/mf_helpers.h"
+#include "media/base/win/mf_initializer.h"
+
+namespace media {
+
+using Microsoft::WRL::ComPtr;
+
+class DXGIDeviceScopedHandleTest : public testing::Test {
+ public:
+  DXGIDeviceScopedHandleTest() = default;
+  ~DXGIDeviceScopedHandleTest() override = default;
+
+ protected:
+  void SetUp() override {
+    ASSERT_TRUE(InitializeMediaFoundation());
+
+    // Get a shared DXGI Device Manager from Media Foundation.
+    ASSERT_HRESULT_SUCCEEDED(
+        MFLockDXGIDeviceManager(&device_reset_token_, &dxgi_device_man_));
+
+    // |dxgi_device_man_| does not create the device, creates Direct3D device.
+    ComPtr<ID3D11Device> d3d11_device;
+    UINT creation_flags =
+        (D3D11_CREATE_DEVICE_VIDEO_SUPPORT | D3D11_CREATE_DEVICE_BGRA_SUPPORT |
+         D3D11_CREATE_DEVICE_PREVENT_INTERNAL_THREADING_OPTIMIZATIONS);
+    static const D3D_FEATURE_LEVEL feature_levels[] = {
+        D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1,
+        D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_3,  D3D_FEATURE_LEVEL_9_2,
+        D3D_FEATURE_LEVEL_9_1};
+    ASSERT_HRESULT_SUCCEEDED(
+        D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, 0, creation_flags,
+                          feature_levels, ARRAYSIZE(feature_levels),
+                          D3D11_SDK_VERSION, &d3d11_device, nullptr, nullptr));
+
+    ComPtr<ID3D10Multithread> multithreaded_device;
+    ASSERT_HRESULT_SUCCEEDED(d3d11_device.As(&multithreaded_device));
+    multithreaded_device->SetMultithreadProtected(TRUE);
+
+    // Set Direct3D device to the device manager.
+    ASSERT_HRESULT_SUCCEEDED(
+        dxgi_device_man_->ResetDevice(d3d11_device.Get(), device_reset_token_));
+  }
+
+  void TearDown() override {
+    ASSERT_HRESULT_SUCCEEDED(MFUnlockDXGIDeviceManager());
+  }
+
+  Microsoft::WRL::ComPtr<IMFDXGIDeviceManager> dxgi_device_man_ = nullptr;
+  UINT device_reset_token_ = 0;
+};
+
+TEST_F(DXGIDeviceScopedHandleTest, UseDXGIDeviceScopedHandle) {
+  {
+    // Create DXGIDeviceScopedHandle in an inner scope without LockDevice call.
+    mf::DXGIDeviceScopedHandle device_handle_1(dxgi_device_man_.Get());
+  }
+  {
+    // Create DXGIDeviceScopedHandle in an inner scope with LockDevice call.
+    mf::DXGIDeviceScopedHandle device_handle_2(dxgi_device_man_.Get());
+    ComPtr<ID3D11Device> device2;
+    ASSERT_HRESULT_SUCCEEDED(
+        device_handle_2.LockDevice(IID_PPV_ARGS(&device2)));
+  }
+  // Use the device in an outer scope.
+  mf::DXGIDeviceScopedHandle device_handle_3(dxgi_device_man_.Get());
+  ComPtr<ID3D11Device> device3;
+  ASSERT_HRESULT_SUCCEEDED(device_handle_3.LockDevice(IID_PPV_ARGS(&device3)));
+}
+
+}  // namespace media
\ No newline at end of file
diff --git a/media/base/win/mf_helpers.cc b/media/base/win/mf_helpers.cc
index cb331bb44..f1e770e 100644
--- a/media/base/win/mf_helpers.cc
+++ b/media/base/win/mf_helpers.cc
@@ -60,6 +60,34 @@
   CHECK(SUCCEEDED(hr));
 }
 
+DXGIDeviceScopedHandle::DXGIDeviceScopedHandle(
+    IMFDXGIDeviceManager* device_manager)
+    : device_manager_(device_manager) {}
+
+DXGIDeviceScopedHandle::~DXGIDeviceScopedHandle() {
+  if (device_handle_ != INVALID_HANDLE_VALUE) {
+    HRESULT hr = device_manager_->CloseDeviceHandle(device_handle_);
+    CHECK(SUCCEEDED(hr));
+    device_handle_ = INVALID_HANDLE_VALUE;
+  }
+}
+
+HRESULT DXGIDeviceScopedHandle::LockDevice(REFIID riid, void** device_out) {
+  HRESULT hr;
+  if (device_handle_ == INVALID_HANDLE_VALUE) {
+    hr = device_manager_->OpenDeviceHandle(&device_handle_);
+    if (FAILED(hr)) {
+      return hr;
+    }
+  }
+  // see
+  // https://docs.microsoft.com/en-us/windows/win32/api/mfobjects/nf-mfobjects-imfdxgidevicemanager-lockdevice
+  // for details of LockDevice call.
+  hr = device_manager_->LockDevice(device_handle_, riid, device_out,
+                                   /*block=*/FALSE);
+  return hr;
+}
+
 }  // namespace mf
 
 }  // namespace media
diff --git a/media/base/win/mf_helpers.h b/media/base/win/mf_helpers.h
index 56b661d..3289b106 100644
--- a/media/base/win/mf_helpers.h
+++ b/media/base/win/mf_helpers.h
@@ -71,6 +71,21 @@
   DISALLOW_COPY_AND_ASSIGN(MediaBufferScopedPointer);
 };
 
+// Wrap around the usage of device handle from |device_manager|.
+class MF_INITIALIZER_EXPORT DXGIDeviceScopedHandle {
+ public:
+  explicit DXGIDeviceScopedHandle(IMFDXGIDeviceManager* device_manager);
+
+  ~DXGIDeviceScopedHandle();
+
+  HRESULT LockDevice(REFIID riid, void** device_out);
+
+ private:
+  Microsoft::WRL::ComPtr<IMFDXGIDeviceManager> device_manager_;
+
+  HANDLE device_handle_ = INVALID_HANDLE_VALUE;
+};
+
 }  // namespace mf
 
 }  // namespace media
diff --git a/net/cookies/cookie_store_unittest.h b/net/cookies/cookie_store_unittest.h
index 8e9a5be..847ee04f 100644
--- a/net/cookies/cookie_store_unittest.h
+++ b/net/cookies/cookie_store_unittest.h
@@ -779,31 +779,31 @@
   EXPECT_TRUE(this->SetCookie(cs, url1, "foo"));
   EXPECT_EQ("foo", this->GetCookies(cs, url1));
 
-  // Regression tests for https://crbug.com/601786
+  // Cookies with neither name nor value (e.g. `Set-Cookie: =`) are ignored.
   GURL url2("http://foo2.bar.com");
   EXPECT_TRUE(this->SetCookie(cs, url2, "foo"));
-  EXPECT_TRUE(this->SetCookie(cs, url2, "\t"));
-  EXPECT_EQ("", this->GetCookies(cs, url2));
+  EXPECT_FALSE(this->SetCookie(cs, url2, "\t"));
+  EXPECT_EQ("foo", this->GetCookies(cs, url2));
 
   GURL url3("http://foo3.bar.com");
   EXPECT_TRUE(this->SetCookie(cs, url3, "foo"));
-  EXPECT_TRUE(this->SetCookie(cs, url3, "="));
-  EXPECT_EQ("", this->GetCookies(cs, url3));
+  EXPECT_FALSE(this->SetCookie(cs, url3, "="));
+  EXPECT_EQ("foo", this->GetCookies(cs, url3));
 
   GURL url4("http://foo4.bar.com");
   EXPECT_TRUE(this->SetCookie(cs, url4, "foo"));
-  EXPECT_TRUE(this->SetCookie(cs, url4, ""));
-  EXPECT_EQ("", this->GetCookies(cs, url4));
+  EXPECT_FALSE(this->SetCookie(cs, url4, ""));
+  EXPECT_EQ("foo", this->GetCookies(cs, url4));
 
   GURL url5("http://foo5.bar.com");
   EXPECT_TRUE(this->SetCookie(cs, url5, "foo"));
-  EXPECT_TRUE(this->SetCookie(cs, url5, "; bar"));
-  EXPECT_EQ("", this->GetCookies(cs, url5));
+  EXPECT_FALSE(this->SetCookie(cs, url5, "; bar"));
+  EXPECT_EQ("foo", this->GetCookies(cs, url5));
 
   GURL url6("http://foo6.bar.com");
   EXPECT_TRUE(this->SetCookie(cs, url6, "foo"));
-  EXPECT_TRUE(this->SetCookie(cs, url6, " "));
-  EXPECT_EQ("", this->GetCookies(cs, url6));
+  EXPECT_FALSE(this->SetCookie(cs, url6, " "));
+  EXPECT_EQ("foo", this->GetCookies(cs, url6));
 #endif
 }
 
diff --git a/net/cookies/cookie_util.cc b/net/cookies/cookie_util.cc
index ebb3cd6..5f48629 100644
--- a/net/cookies/cookie_util.cc
+++ b/net/cookies/cookie_util.cc
@@ -104,10 +104,10 @@
     const base::Optional<url::Origin>& initiator) {
   if (site_for_cookies.IsFirstParty(url)) {
     CookieOptions::SameSiteCookieContext same_site_type;
+    // Create a SiteForCookies object from the initiator so that we can reuse
+    // IsFirstParty().
     if (!initiator ||
-        registry_controlled_domains::SameDomainOrHost(
-            url, initiator.value(),
-            registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES)) {
+        SiteForCookies::FromOrigin(initiator.value()).IsFirstParty(url)) {
       same_site_type = CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT;
     } else {
       same_site_type = CookieOptions::SameSiteCookieContext::SAME_SITE_LAX;
diff --git a/net/cookies/parsed_cookie.cc b/net/cookies/parsed_cookie.cc
index 810343e..64e5ea6e 100644
--- a/net/cookies/parsed_cookie.cc
+++ b/net/cookies/parsed_cookie.cc
@@ -361,13 +361,9 @@
   // Then we can log any unexpected terminators.
   std::string::const_iterator end = FindFirstTerminator(cookie_line);
 
-  // For an empty |cookie_line|, add an empty-key with an empty value, which
-  // has the effect of clearing any prior setting of the empty-key. This is done
-  // to match the behavior of other browsers. See https://crbug.com/601786.
-  if (it == end) {
-    pairs_.push_back(TokenValuePair("", ""));
+  // Exit early for an empty cookie string.
+  if (it == end)
     return;
-  }
 
   for (int pair_num = 0; it != end; ++pair_num) {
     TokenValuePair pair;
@@ -412,9 +408,16 @@
     // OK, we're finished with a Token/Value.
     pair.second = std::string(value_start, value_end);
 
+    // Ignore cookies with neither name nor value.
+    if (pair_num == 0 && (pair.first.empty() && pair.second.empty())) {
+      pairs_.clear();
+      break;
+    }
+
     // From RFC2109: "Attributes (names) (attr) are case-insensitive."
     if (pair_num != 0)
       pair.first = base::ToLowerASCII(pair.first);
+
     // Ignore Set-Cookie directives contaning control characters. See
     // http://crbug.com/238041.
     if (!IsValidCookieAttributeValue(pair.first) ||
diff --git a/net/cookies/parsed_cookie_unittest.cc b/net/cookies/parsed_cookie_unittest.cc
index d2f6b73..72dbc994 100644
--- a/net/cookies/parsed_cookie_unittest.cc
+++ b/net/cookies/parsed_cookie_unittest.cc
@@ -18,28 +18,14 @@
   EXPECT_EQ("b", pc.Value());
 }
 
-// De facto standard behavior, per https://crbug.com/601786.
 TEST(ParsedCookieTest, TestEmpty) {
-  const struct {
-    const char* cookie;
-    const char* expected_path;
-    bool expect_secure;
-  } kTestCookieLines[]{{"", "", false},     {"     ", "", false},
-                       {"=;", "", false},   {"=; path=/; secure;", "/", true},
-                       {"= ;", "", false},  {"= ; path=/; secure;", "/", true},
-                       {" =;", "", false},  {" =; path=/; secure;", "/", true},
-                       {" = ;", "", false}, {" = ; path=/; secure;", "/", true},
-                       {" ;", "", false},   {" ; path=/; secure;", "/", true},
-                       {";", "", false},    {"; path=/; secure;", "/", true},
-                       {"\t;", "", false},  {"\t; path=/; secure;", "/", true}};
+  const char* kTestCookieLines[]{"",    "     ", "=",     "=;",  " =;",
+                                 "= ;", " = ;",  ";",     " ;",  " ; ",
+                                 "\t",  "\t;",   "\t=\t", "\t=", "=\t"};
 
-  for (const auto& test : kTestCookieLines) {
-    ParsedCookie pc(test.cookie);
-    EXPECT_TRUE(pc.IsValid());
-    EXPECT_EQ("", pc.Name());
-    EXPECT_EQ("", pc.Value());
-    EXPECT_EQ(test.expected_path, pc.Path());
-    EXPECT_EQ(test.expect_secure, pc.IsSecure());
+  for (const char* test : kTestCookieLines) {
+    ParsedCookie pc(test);
+    EXPECT_FALSE(pc.IsValid());
   }
 }
 
@@ -284,13 +270,13 @@
 }
 
 TEST(ParsedCookieTest, SetNameAndValue) {
-  ParsedCookie empty((std::string()));
-  EXPECT_TRUE(empty.IsValid());
-  EXPECT_TRUE(empty.SetDomain("foobar.com"));
-  EXPECT_TRUE(empty.SetName("name"));
-  EXPECT_TRUE(empty.SetValue("value"));
-  EXPECT_EQ("name=value; domain=foobar.com", empty.ToCookieLine());
-  EXPECT_TRUE(empty.IsValid());
+  ParsedCookie cookie("a=b");
+  EXPECT_TRUE(cookie.IsValid());
+  EXPECT_TRUE(cookie.SetDomain("foobar.com"));
+  EXPECT_TRUE(cookie.SetName("name"));
+  EXPECT_TRUE(cookie.SetValue("value"));
+  EXPECT_EQ("name=value; domain=foobar.com", cookie.ToCookieLine());
+  EXPECT_TRUE(cookie.IsValid());
 
   // We don't test
   //   ParsedCookie invalid("@foo=bar");
diff --git a/net/quic/quic_test_packet_maker.cc b/net/quic/quic_test_packet_maker.cc
index 22e5150d..79b932f 100644
--- a/net/quic/quic_test_packet_maker.cc
+++ b/net/quic/quic_test_packet_maker.cc
@@ -206,6 +206,27 @@
   return BuildPacket();
 }
 
+std::unique_ptr<quic::QuicReceivedPacket>
+QuicTestPacketMaker::MakeStreamsBlockedPacket(
+    uint64_t num,
+    bool include_version,
+    quic::QuicStreamCount stream_count,
+    bool unidirectional) {
+  InitializeHeader(num, include_version);
+  AddQuicStreamsBlockedFrame(1, stream_count, unidirectional);
+  return BuildPacket();
+}
+
+std::unique_ptr<quic::QuicReceivedPacket>
+QuicTestPacketMaker::MakeMaxStreamsPacket(uint64_t num,
+                                          bool include_version,
+                                          quic::QuicStreamCount stream_count,
+                                          bool unidirectional) {
+  InitializeHeader(num, include_version);
+  AddQuicMaxStreamsFrame(1, stream_count, unidirectional);
+  return BuildPacket();
+}
+
 std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeRstPacket(
     uint64_t num,
     bool include_version,
@@ -237,27 +258,6 @@
 }
 
 std::unique_ptr<quic::QuicReceivedPacket>
-QuicTestPacketMaker::MakeStreamsBlockedPacket(
-    uint64_t num,
-    bool include_version,
-    quic::QuicStreamCount stream_count,
-    bool unidirectional) {
-  InitializeHeader(num, include_version);
-  AddQuicStreamsBlockedFrame(1, stream_count, unidirectional);
-  return BuildPacket();
-}
-
-std::unique_ptr<quic::QuicReceivedPacket>
-QuicTestPacketMaker::MakeMaxStreamsPacket(uint64_t num,
-                                          bool include_version,
-                                          quic::QuicStreamCount stream_count,
-                                          bool unidirectional) {
-  InitializeHeader(num, include_version);
-  AddQuicMaxStreamsFrame(1, stream_count, unidirectional);
-  return BuildPacket();
-}
-
-std::unique_ptr<quic::QuicReceivedPacket>
 QuicTestPacketMaker::MakeRstAndDataPacket(
     uint64_t num,
     bool include_version,
@@ -665,28 +665,6 @@
   return BuildPacket();
 }
 
-spdy::SpdySerializedFrame QuicTestPacketMaker::MakeSpdyHeadersFrame(
-    quic::QuicStreamId stream_id,
-    bool fin,
-    spdy::SpdyPriority priority,
-    spdy::SpdyHeaderBlock headers,
-    quic::QuicStreamId parent_stream_id) {
-  spdy::SpdyHeadersIR headers_frame(stream_id, std::move(headers));
-  headers_frame.set_fin(fin);
-  headers_frame.set_weight(spdy::Spdy3PriorityToHttp2Weight(priority));
-  headers_frame.set_has_priority(true);
-
-  if (client_headers_include_h2_stream_dependency_) {
-    headers_frame.set_parent_stream_id(parent_stream_id);
-    headers_frame.set_exclusive(true);
-  } else {
-    headers_frame.set_parent_stream_id(0);
-    headers_frame.set_exclusive(false);
-  }
-
-  return spdy_request_framer_.SerializeFrame(headers_frame);
-}
-
 std::unique_ptr<quic::QuicReceivedPacket>
 QuicTestPacketMaker::MakePushPromisePacket(
     uint64_t packet_number,
@@ -730,8 +708,6 @@
   return BuildPacket();
 }
 
-// If |offset| is provided, will use the value when creating the packet.
-// Will also update the value after packet creation.
 std::unique_ptr<quic::QuicReceivedPacket>
 QuicTestPacketMaker::MakeResponseHeadersPacket(
     uint64_t packet_number,
@@ -766,6 +742,149 @@
   return BuildPacket();
 }
 
+std::unique_ptr<quic::QuicReceivedPacket>
+QuicTestPacketMaker::MakeInitialSettingsPacket(uint64_t packet_number) {
+  InitializeHeader(packet_number, /*should_include_version*/ true);
+
+  if (!quic::VersionUsesHttp3(version_.transport_version)) {
+    spdy::SpdySettingsIR settings_frame;
+    settings_frame.AddSetting(spdy::SETTINGS_MAX_HEADER_LIST_SIZE,
+                              kQuicMaxHeaderListSize);
+    settings_frame.AddSetting(quic::SETTINGS_QPACK_BLOCKED_STREAMS,
+                              quic::kDefaultMaximumBlockedStreams);
+    spdy::SpdySerializedFrame spdy_frame(
+        spdy_request_framer_.SerializeFrame(settings_frame));
+    AddQuicStreamFrame(
+        GetHeadersStreamId(), false,
+        quiche::QuicheStringPiece(spdy_frame.data(), spdy_frame.size()));
+    return BuildPacket();
+  }
+
+  MaybeAddHttp3SettingsFrames();
+
+  return BuildPacket();
+}
+
+std::unique_ptr<quic::QuicReceivedPacket>
+QuicTestPacketMaker::MakePriorityPacket(uint64_t packet_number,
+                                        bool should_include_version,
+                                        quic::QuicStreamId id,
+                                        quic::QuicStreamId parent_stream_id,
+                                        spdy::SpdyPriority priority) {
+  InitializeHeader(packet_number, should_include_version);
+
+  if (!client_headers_include_h2_stream_dependency_ ||
+      quic::VersionUsesHttp3(version_.transport_version)) {
+    // TODO(rch): both stream_dependencies and priority frames need to be
+    // supported in IETF QUIC.
+    parent_stream_id = 0;
+  }
+  int weight = spdy::Spdy3PriorityToHttp2Weight(priority);
+  bool exclusive = client_headers_include_h2_stream_dependency_;
+
+  if (!VersionUsesHttp3(version_.transport_version)) {
+    spdy::SpdyPriorityIR priority_frame(id, parent_stream_id, weight,
+                                        exclusive);
+    spdy::SpdySerializedFrame spdy_frame(
+        spdy_request_framer_.SerializeFrame(priority_frame));
+    AddQuicStreamFrame(
+        GetHeadersStreamId(), false,
+        quiche::QuicheStringPiece(spdy_frame.data(), spdy_frame.size()));
+
+    return BuildPacket();
+  }
+
+  quic::PriorityFrame frame;
+  frame.weight = weight;
+  frame.exclusive = true;
+  frame.prioritized_element_id = id;
+  frame.element_dependency_id = parent_stream_id;
+  frame.dependency_type = quic::REQUEST_STREAM;
+  frame.prioritized_type =
+      quic::QuicUtils::IsServerInitiatedStreamId(version_.transport_version, id)
+          ? quic::PUSH_STREAM
+          : quic::REQUEST_STREAM;
+  std::unique_ptr<char[]> buffer;
+  quic::QuicByteCount frame_length =
+      quic::HttpEncoder::SerializePriorityFrame(frame, &buffer);
+  std::string priority_data = std::string(buffer.get(), frame_length);
+  AddQuicStreamFrame(2, false, priority_data);
+
+  return BuildPacket();
+}
+
+std::unique_ptr<quic::QuicReceivedPacket>
+QuicTestPacketMaker::MakeAckAndMultiplePriorityFramesPacket(
+    uint64_t packet_number,
+    bool should_include_version,
+    uint64_t largest_received,
+    uint64_t smallest_received,
+    uint64_t least_unacked,
+    const std::vector<Http2StreamDependency>& priority_frames) {
+  InitializeHeader(packet_number, should_include_version);
+
+  AddQuicAckFrame(largest_received, smallest_received);
+
+  const bool exclusive = client_headers_include_h2_stream_dependency_;
+  std::string coalesced_data;
+  for (const Http2StreamDependency& info : priority_frames) {
+    spdy::SpdyPriorityIR priority_frame(
+        info.stream_id, info.parent_stream_id,
+        spdy::Spdy3PriorityToHttp2Weight(info.spdy_priority), exclusive);
+    auto spdy_frame = spdy_request_framer_.SerializeFrame(priority_frame);
+    coalesced_data += std::string(spdy_frame.data(), spdy_frame.size());
+  }
+  AddQuicStreamFrame(quic::VersionUsesHttp3(version_.transport_version)
+                         ? GetFirstBidirectionalStreamId()
+                         : GetHeadersStreamId(),
+                     false, coalesced_data);
+
+  return BuildPacket();
+}
+
+std::unique_ptr<quic::QuicReceivedPacket>
+QuicTestPacketMaker::MakeRetransmissionPacket(uint64_t original_packet_number,
+                                              uint64_t new_packet_number,
+                                              bool should_include_version) {
+  DCHECK(save_packet_frames_);
+  InitializeHeader(new_packet_number, should_include_version);
+  return BuildPacketImpl(
+      saved_frames_[quic::QuicPacketNumber(original_packet_number)], nullptr);
+}
+
+void QuicTestPacketMaker::RemoveSavedStreamFrames(
+    quic::QuicStreamId stream_id) {
+  for (auto& kv : saved_frames_) {
+    auto it = kv.second.begin();
+    while (it != kv.second.end()) {
+      if (it->type == quic::STREAM_FRAME &&
+          it->stream_frame.stream_id == stream_id) {
+        it = kv.second.erase(it);
+      } else {
+        ++it;
+      }
+    }
+  }
+}
+
+void QuicTestPacketMaker::SetEncryptionLevel(quic::EncryptionLevel level) {
+  encryption_level_ = level;
+  switch (level) {
+    case quic::ENCRYPTION_INITIAL:
+      long_header_type_ = quic::INITIAL;
+      break;
+    case quic::ENCRYPTION_ZERO_RTT:
+      long_header_type_ = quic::ZERO_RTT_PROTECTED;
+      break;
+    case quic::ENCRYPTION_FORWARD_SECURE:
+      long_header_type_ = quic::INVALID_PACKET_TYPE;
+      break;
+    default:
+      QUIC_BUG << quic::EncryptionLevelToString(level);
+      long_header_type_ = quic::INVALID_PACKET_TYPE;
+  }
+}
+
 spdy::SpdyHeaderBlock QuicTestPacketMaker::GetRequestHeaders(
     const std::string& method,
     const std::string& scheme,
@@ -804,6 +923,70 @@
   return headers;
 }
 
+void QuicTestPacketMaker::Reset() {
+  stream_offsets_.clear();
+}
+
+std::string QuicTestPacketMaker::QpackEncodeHeaders(
+    quic::QuicStreamId stream_id,
+    spdy::SpdyHeaderBlock headers,
+    size_t* encoded_data_length) {
+  DCHECK(quic::VersionUsesHttp3(version_.transport_version));
+  std::string data;
+
+  std::string encoded_headers =
+      qpack_encoder_.EncodeHeaderList(stream_id, headers, nullptr);
+
+  // Generate HEADERS frame header.
+  std::unique_ptr<char[]> headers_frame_header;
+  const size_t headers_frame_header_length =
+      quic::HttpEncoder::SerializeHeadersFrameHeader(encoded_headers.size(),
+                                                     &headers_frame_header);
+
+  // Possible add a PUSH stream type.
+  if (!quic::QuicUtils::IsBidirectionalStreamId(stream_id) &&
+      stream_offsets_[stream_id] == 0) {
+    // Push stream type header
+    data += "\x01";
+  }
+
+  // Add the HEADERS frame header.
+  data += std::string(headers_frame_header.get(), headers_frame_header_length);
+  // Add the HEADERS frame payload.
+  data += encoded_headers;
+
+  // Compute the total data length.
+  if (encoded_data_length) {
+    *encoded_data_length = data.length();
+  }
+  return data;
+}
+
+void QuicTestPacketMaker::InitializeHeader(uint64_t packet_number,
+                                           bool should_include_version) {
+  header_.destination_connection_id = DestinationConnectionId();
+  header_.destination_connection_id_included = HasDestinationConnectionId();
+  header_.source_connection_id = SourceConnectionId();
+  header_.source_connection_id_included = HasSourceConnectionId();
+  header_.reset_flag = false;
+  header_.version_flag = ShouldIncludeVersion(should_include_version);
+  if (quic::VersionHasIetfInvariantHeader(version_.transport_version)) {
+    header_.form = header_.version_flag ? quic::IETF_QUIC_LONG_HEADER_PACKET
+                                        : quic::IETF_QUIC_SHORT_HEADER_PACKET;
+  }
+  header_.long_packet_type = long_header_type_;
+  header_.packet_number_length = GetPacketNumberLength();
+  header_.packet_number = quic::QuicPacketNumber(packet_number);
+  if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
+      header_.version_flag) {
+    if (long_header_type_ == quic::INITIAL) {
+      header_.retry_token_length_length =
+          quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
+    }
+    header_.length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_2;
+  }
+}
+
 void QuicTestPacketMaker::AddQuicPaddingFrame() {
   quic::QuicPaddingFrame padding_frame;
   frames_.push_back(quic::QuicFrame(padding_frame));
@@ -1022,172 +1205,26 @@
   return encrypted.Clone();
 }
 
-void QuicTestPacketMaker::InitializeHeader(uint64_t packet_number,
-                                           bool should_include_version) {
-  header_.destination_connection_id = DestinationConnectionId();
-  header_.destination_connection_id_included = HasDestinationConnectionId();
-  header_.source_connection_id = SourceConnectionId();
-  header_.source_connection_id_included = HasSourceConnectionId();
-  header_.reset_flag = false;
-  header_.version_flag = ShouldIncludeVersion(should_include_version);
-  if (quic::VersionHasIetfInvariantHeader(version_.transport_version)) {
-    header_.form = header_.version_flag ? quic::IETF_QUIC_LONG_HEADER_PACKET
-                                        : quic::IETF_QUIC_SHORT_HEADER_PACKET;
-  }
-  header_.long_packet_type = long_header_type_;
-  header_.packet_number_length = GetPacketNumberLength();
-  header_.packet_number = quic::QuicPacketNumber(packet_number);
-  if (quic::QuicVersionHasLongHeaderLengths(version_.transport_version) &&
-      header_.version_flag) {
-    if (long_header_type_ == quic::INITIAL) {
-      header_.retry_token_length_length =
-          quic::VARIABLE_LENGTH_INTEGER_LENGTH_1;
-    }
-    header_.length_length = quic::VARIABLE_LENGTH_INTEGER_LENGTH_2;
-  }
-}
+spdy::SpdySerializedFrame QuicTestPacketMaker::MakeSpdyHeadersFrame(
+    quic::QuicStreamId stream_id,
+    bool fin,
+    spdy::SpdyPriority priority,
+    spdy::SpdyHeaderBlock headers,
+    quic::QuicStreamId parent_stream_id) {
+  spdy::SpdyHeadersIR headers_frame(stream_id, std::move(headers));
+  headers_frame.set_fin(fin);
+  headers_frame.set_weight(spdy::Spdy3PriorityToHttp2Weight(priority));
+  headers_frame.set_has_priority(true);
 
-std::unique_ptr<quic::QuicReceivedPacket>
-QuicTestPacketMaker::MakeInitialSettingsPacket(uint64_t packet_number) {
-  InitializeHeader(packet_number, /*should_include_version*/ true);
-
-  if (!quic::VersionUsesHttp3(version_.transport_version)) {
-    spdy::SpdySettingsIR settings_frame;
-    settings_frame.AddSetting(spdy::SETTINGS_MAX_HEADER_LIST_SIZE,
-                              kQuicMaxHeaderListSize);
-    settings_frame.AddSetting(quic::SETTINGS_QPACK_BLOCKED_STREAMS,
-                              quic::kDefaultMaximumBlockedStreams);
-    spdy::SpdySerializedFrame spdy_frame(
-        spdy_request_framer_.SerializeFrame(settings_frame));
-    AddQuicStreamFrame(
-        GetHeadersStreamId(), false,
-        quiche::QuicheStringPiece(spdy_frame.data(), spdy_frame.size()));
-    return BuildPacket();
+  if (client_headers_include_h2_stream_dependency_) {
+    headers_frame.set_parent_stream_id(parent_stream_id);
+    headers_frame.set_exclusive(true);
+  } else {
+    headers_frame.set_parent_stream_id(0);
+    headers_frame.set_exclusive(false);
   }
 
-  MaybeAddHttp3SettingsFrames();
-
-  return BuildPacket();
-}
-
-std::unique_ptr<quic::QuicReceivedPacket>
-QuicTestPacketMaker::MakePriorityPacket(uint64_t packet_number,
-                                        bool should_include_version,
-                                        quic::QuicStreamId id,
-                                        quic::QuicStreamId parent_stream_id,
-                                        spdy::SpdyPriority priority) {
-  InitializeHeader(packet_number, should_include_version);
-
-  if (!client_headers_include_h2_stream_dependency_ ||
-      quic::VersionUsesHttp3(version_.transport_version)) {
-    // TODO(rch): both stream_dependencies and priority frames need to be
-    // supported in IETF QUIC.
-    parent_stream_id = 0;
-  }
-  int weight = spdy::Spdy3PriorityToHttp2Weight(priority);
-  bool exclusive = client_headers_include_h2_stream_dependency_;
-
-  if (!VersionUsesHttp3(version_.transport_version)) {
-    spdy::SpdyPriorityIR priority_frame(id, parent_stream_id, weight,
-                                        exclusive);
-    spdy::SpdySerializedFrame spdy_frame(
-        spdy_request_framer_.SerializeFrame(priority_frame));
-    AddQuicStreamFrame(
-        GetHeadersStreamId(), false,
-        quiche::QuicheStringPiece(spdy_frame.data(), spdy_frame.size()));
-
-    return BuildPacket();
-  }
-
-  quic::PriorityFrame frame;
-  frame.weight = weight;
-  frame.exclusive = true;
-  frame.prioritized_element_id = id;
-  frame.element_dependency_id = parent_stream_id;
-  frame.dependency_type = quic::REQUEST_STREAM;
-  frame.prioritized_type =
-      quic::QuicUtils::IsServerInitiatedStreamId(version_.transport_version, id)
-          ? quic::PUSH_STREAM
-          : quic::REQUEST_STREAM;
-  std::unique_ptr<char[]> buffer;
-  quic::QuicByteCount frame_length =
-      quic::HttpEncoder::SerializePriorityFrame(frame, &buffer);
-  std::string priority_data = std::string(buffer.get(), frame_length);
-  AddQuicStreamFrame(2, false, priority_data);
-
-  return BuildPacket();
-}
-
-std::unique_ptr<quic::QuicReceivedPacket>
-QuicTestPacketMaker::MakeAckAndMultiplePriorityFramesPacket(
-    uint64_t packet_number,
-    bool should_include_version,
-    uint64_t largest_received,
-    uint64_t smallest_received,
-    uint64_t least_unacked,
-    const std::vector<Http2StreamDependency>& priority_frames) {
-  InitializeHeader(packet_number, should_include_version);
-
-  AddQuicAckFrame(largest_received, smallest_received);
-
-  const bool exclusive = client_headers_include_h2_stream_dependency_;
-  std::string coalesced_data;
-  for (const Http2StreamDependency& info : priority_frames) {
-    spdy::SpdyPriorityIR priority_frame(
-        info.stream_id, info.parent_stream_id,
-        spdy::Spdy3PriorityToHttp2Weight(info.spdy_priority), exclusive);
-    auto spdy_frame = spdy_request_framer_.SerializeFrame(priority_frame);
-    coalesced_data += std::string(spdy_frame.data(), spdy_frame.size());
-  }
-  AddQuicStreamFrame(quic::VersionUsesHttp3(version_.transport_version)
-                         ? GetFirstBidirectionalStreamId()
-                         : GetHeadersStreamId(),
-                     false, coalesced_data);
-
-  return BuildPacket();
-}
-
-std::unique_ptr<quic::QuicReceivedPacket>
-QuicTestPacketMaker::MakeRetransmissionPacket(uint64_t original_packet_number,
-                                              uint64_t new_packet_number,
-                                              bool should_include_version) {
-  DCHECK(save_packet_frames_);
-  InitializeHeader(new_packet_number, should_include_version);
-  return BuildPacketImpl(
-      saved_frames_[quic::QuicPacketNumber(original_packet_number)], nullptr);
-}
-
-void QuicTestPacketMaker::RemoveSavedStreamFrames(
-    quic::QuicStreamId stream_id) {
-  for (auto& kv : saved_frames_) {
-    auto it = kv.second.begin();
-    while (it != kv.second.end()) {
-      if (it->type == quic::STREAM_FRAME &&
-          it->stream_frame.stream_id == stream_id) {
-        it = kv.second.erase(it);
-      } else {
-        ++it;
-      }
-    }
-  }
-}
-
-void QuicTestPacketMaker::SetEncryptionLevel(quic::EncryptionLevel level) {
-  encryption_level_ = level;
-    switch (level) {
-      case quic::ENCRYPTION_INITIAL:
-        long_header_type_ = quic::INITIAL;
-        break;
-      case quic::ENCRYPTION_ZERO_RTT:
-        long_header_type_ = quic::ZERO_RTT_PROTECTED;
-        break;
-      case quic::ENCRYPTION_FORWARD_SECURE:
-        long_header_type_ = quic::INVALID_PACKET_TYPE;
-        break;
-      default:
-        QUIC_BUG << quic::EncryptionLevelToString(level);
-        long_header_type_ = quic::INVALID_PACKET_TYPE;
-    }
+  return spdy_request_framer_.SerializeFrame(headers_frame);
 }
 
 bool QuicTestPacketMaker::ShouldIncludeVersion(bool include_version) const {
@@ -1197,53 +1234,6 @@
   return include_version;
 }
 
-std::string QuicTestPacketMaker::MaybePrependErrorCode(
-    const std::string& quic_error_details,
-    quic::QuicErrorCode quic_error_code) const {
-  if (!quic::VersionHasIetfQuicFrames(version_.transport_version) ||
-      quic_error_code == quic::QUIC_IETF_GQUIC_ERROR_MISSING) {
-    // QUIC_IETF_GQUIC_ERROR_MISSING means not to encode the error value.
-    return quic_error_details;
-  }
-  return base::StrCat(
-      {base::NumberToString(quic_error_code), ":", quic_error_details});
-}
-
-std::string QuicTestPacketMaker::QpackEncodeHeaders(
-    quic::QuicStreamId stream_id,
-    spdy::SpdyHeaderBlock headers,
-    size_t* encoded_data_length) {
-  DCHECK(quic::VersionUsesHttp3(version_.transport_version));
-  std::string data;
-
-  std::string encoded_headers =
-      qpack_encoder_.EncodeHeaderList(stream_id, headers, nullptr);
-
-  // Generate HEADERS frame header.
-  std::unique_ptr<char[]> headers_frame_header;
-  const size_t headers_frame_header_length =
-      quic::HttpEncoder::SerializeHeadersFrameHeader(encoded_headers.size(),
-                                                     &headers_frame_header);
-
-  // Possible add a PUSH stream type.
-  if (!quic::QuicUtils::IsBidirectionalStreamId(stream_id) &&
-      stream_offsets_[stream_id] == 0) {
-    // Push stream type header
-    data += "\x01";
-  }
-
-  // Add the HEADERS frame header.
-  data += std::string(headers_frame_header.get(), headers_frame_header_length);
-  // Add the HEADERS frame payload.
-  data += encoded_headers;
-
-  // Compute the total data length.
-  if (encoded_data_length) {
-    *encoded_data_length = data.length();
-  }
-  return data;
-}
-
 quic::QuicPacketNumberLength QuicTestPacketMaker::GetPacketNumberLength()
     const {
   if (version_.transport_version > quic::QUIC_VERSION_43 &&
@@ -1287,10 +1277,6 @@
   return quic::CONNECTION_ID_ABSENT;
 }
 
-void QuicTestPacketMaker::Reset() {
-  stream_offsets_.clear();
-}
-
 quic::QuicStreamId QuicTestPacketMaker::GetFirstBidirectionalStreamId() const {
   return quic::QuicUtils::GetFirstBidirectionalStreamId(
       version_.transport_version, perspective_);
diff --git a/net/quic/quic_test_packet_maker.h b/net/quic/quic_test_packet_maker.h
index be29b0b..fd27253 100644
--- a/net/quic/quic_test_packet_maker.h
+++ b/net/quic/quic_test_packet_maker.h
@@ -60,11 +60,14 @@
   std::unique_ptr<quic::QuicReceivedPacket> MakeConnectivityProbingPacket(
       uint64_t num,
       bool include_version);
+
   std::unique_ptr<quic::QuicReceivedPacket> MakePingPacket(
       uint64_t num,
       bool include_version);
+
   std::unique_ptr<quic::QuicReceivedPacket> MakeDummyCHLOPacket(
       uint64_t packet_num);
+
   std::unique_ptr<quic::QuicReceivedPacket> MakeAckAndPingPacket(
       uint64_t num,
       bool include_version,
@@ -122,6 +125,7 @@
       uint64_t smallest_received,
       uint64_t least_unacked,
       bool send_feedback);
+
   std::unique_ptr<quic::QuicReceivedPacket> MakeAckAndRstPacket(
       uint64_t num,
       bool include_version,
@@ -132,6 +136,7 @@
       uint64_t least_unacked,
       bool send_feedback,
       bool include_stop_sending_if_v99);
+
   std::unique_ptr<quic::QuicReceivedPacket> MakeRstAckAndConnectionClosePacket(
       uint64_t num,
       bool include_version,
@@ -142,6 +147,7 @@
       uint64_t least_unacked,
       quic::QuicErrorCode quic_error,
       const std::string& quic_error_details);
+
   std::unique_ptr<quic::QuicReceivedPacket> MakeRstAndConnectionClosePacket(
       uint64_t num,
       bool include_version,
@@ -149,6 +155,7 @@
       quic::QuicRstStreamErrorCode error_code,
       quic::QuicErrorCode quic_error,
       const std::string& quic_error_details);
+
   std::unique_ptr<quic::QuicReceivedPacket> MakeDataRstAndConnectionClosePacket(
       uint64_t num,
       bool include_version,
@@ -158,6 +165,7 @@
       quic::QuicRstStreamErrorCode error_code,
       quic::QuicErrorCode quic_error,
       const std::string& quic_error_details);
+
   std::unique_ptr<quic::QuicReceivedPacket>
   MakeDataRstAckAndConnectionClosePacket(
       uint64_t num,
@@ -171,6 +179,7 @@
       uint64_t least_unacked,
       quic::QuicErrorCode quic_error,
       const std::string& quic_error_details);
+
   std::unique_ptr<quic::QuicReceivedPacket> MakeAckAndConnectionClosePacket(
       uint64_t num,
       bool include_version,
@@ -180,21 +189,25 @@
       quic::QuicErrorCode quic_error,
       const std::string& quic_error_details,
       uint64_t frame_type);
+
   std::unique_ptr<quic::QuicReceivedPacket> MakeConnectionClosePacket(
       uint64_t num,
       bool include_version,
       quic::QuicErrorCode quic_error,
       const std::string& quic_error_details);
+
   std::unique_ptr<quic::QuicReceivedPacket> MakeGoAwayPacket(
       uint64_t num,
       quic::QuicErrorCode error_code,
       std::string reason_phrase);
+
   std::unique_ptr<quic::QuicReceivedPacket> MakeAckPacket(
       uint64_t packet_number,
       uint64_t largest_received,
       uint64_t smallest_received,
       uint64_t least_unacked,
       bool send_feedback);
+
   std::unique_ptr<quic::QuicReceivedPacket> MakeAckPacket(
       uint64_t packet_number,
       uint64_t first_received,
@@ -202,12 +215,14 @@
       uint64_t smallest_received,
       uint64_t least_unacked,
       bool send_feedback);
+
   std::unique_ptr<quic::QuicReceivedPacket> MakeDataPacket(
       uint64_t packet_number,
       quic::QuicStreamId stream_id,
       bool should_include_version,
       bool fin,
       quiche::QuicheStringPiece data);
+
   std::unique_ptr<quic::QuicReceivedPacket> MakeAckAndDataPacket(
       uint64_t packet_number,
       bool include_version,
@@ -335,6 +350,9 @@
                                  size_t* encoded_data_length);
 
  private:
+  // Initialize header of next packet to build.
+  void InitializeHeader(uint64_t packet_number, bool should_include_version);
+
   // Add frames to current packet.
   void AddQuicPaddingFrame();
   void AddQuicPingFrame();
@@ -374,17 +392,15 @@
                           quic::QuicStreamOffset offset,
                           quic::QuicPacketLength data_length);
 
-  // Build frame using |header_|, |frames_|, and |data_producer_|,
+  // Build packet using |header_|, |frames_|, and |data_producer_|,
   // and clear |frames_| and |data_producer_| afterwards.
   std::unique_ptr<quic::QuicReceivedPacket> BuildPacket();
 
-  // Build frame using |header_|, |frames|, and |data_producer|.
+  // Build packet using |header_|, |frames|, and |data_producer|.
   std::unique_ptr<quic::QuicReceivedPacket> BuildPacketImpl(
       const quic::QuicFrames& frames,
       quic::QuicStreamFrameDataProducer* data_producer);
 
-  void InitializeHeader(uint64_t packet_number, bool should_include_version);
-
   spdy::SpdySerializedFrame MakeSpdyHeadersFrame(
       quic::QuicStreamId stream_id,
       bool fin,
@@ -394,11 +410,6 @@
 
   bool ShouldIncludeVersion(bool include_version) const;
 
-  // This mirrors quic_framer.cc::{anonymous namespace}::GenerateErrorString()
-  // behavior.
-  std::string MaybePrependErrorCode(const std::string& quic_error_details,
-                                    quic::QuicErrorCode quic_error_code) const;
-
   quic::QuicPacketNumberLength GetPacketNumberLength() const;
 
   quic::QuicConnectionId DestinationConnectionId() const;
diff --git a/printing/BUILD.gn b/printing/BUILD.gn
index 89002848..1491e10 100644
--- a/printing/BUILD.gn
+++ b/printing/BUILD.gn
@@ -117,6 +117,7 @@
     "//printing/common",
     "//skia",
     "//third_party/icu",
+    "//ui/accessibility",
     "//ui/gfx",
     "//ui/gfx/geometry",
     "//url",
diff --git a/printing/DEPS b/printing/DEPS
index 41732d72..71708c2 100644
--- a/printing/DEPS
+++ b/printing/DEPS
@@ -5,6 +5,7 @@
   "+third_party/icu/source/common/unicode",
   "+third_party/icu/source/i18n/unicode",
   "+third_party/skia",
+  "+ui/accessibility",
   "+ui/android",
   "+ui/aura",
   "+ui/base/resource",
diff --git a/printing/common/BUILD.gn b/printing/common/BUILD.gn
index 4143ca72..029a42e5 100644
--- a/printing/common/BUILD.gn
+++ b/printing/common/BUILD.gn
@@ -14,6 +14,7 @@
     "//base",
     "//printing:printing_export",
     "//skia",
+    "//ui/accessibility",
   ]
 
   defines = [ "PRINTING_IMPLEMENTATION" ]
diff --git a/printing/common/metafile_utils.cc b/printing/common/metafile_utils.cc
index eae01fb..24278c28 100644
--- a/printing/common/metafile_utils.cc
+++ b/printing/common/metafile_utils.cc
@@ -11,6 +11,10 @@
 #include "third_party/skia/include/core/SkPictureRecorder.h"
 #include "third_party/skia/include/core/SkTime.h"
 #include "third_party/skia/include/docs/SkPDFDocument.h"
+#include "ui/accessibility/ax_node.h"
+#include "ui/accessibility/ax_node_data.h"
+#include "ui/accessibility/ax_tree.h"
+#include "ui/accessibility/ax_tree_update.h"
 
 namespace {
 
@@ -38,11 +42,94 @@
   return rec.finishRecordingAsPicture();
 }
 
+// Convert an AXNode into a SkPDF::StructureElementNode in order to make a
+// tagged (accessible) PDF. Returns true on success and false if we don't
+// have enough data to build a valid tree.
+bool RecursiveBuildStructureTree(const ui::AXNode* ax_node,
+                                 SkPDF::StructureElementNode* tag) {
+  bool valid = false;
+
+  tag->fNodeId = ax_node->GetIntAttribute(ax::mojom::IntAttribute::kDOMNodeId);
+  switch (ax_node->data().role) {
+    case ax::mojom::Role::kRootWebArea:
+      tag->fType = SkPDF::DocumentStructureType::kDocument;
+      break;
+    case ax::mojom::Role::kParagraph:
+      tag->fType = SkPDF::DocumentStructureType::kP;
+      break;
+    case ax::mojom::Role::kGenericContainer:
+      tag->fType = SkPDF::DocumentStructureType::kDiv;
+      break;
+    case ax::mojom::Role::kHeading:
+      // TODO(dmazzoni): heading levels. https://crbug.com/1039816
+      tag->fType = SkPDF::DocumentStructureType::kH;
+      break;
+    case ax::mojom::Role::kList:
+      tag->fType = SkPDF::DocumentStructureType::kL;
+      break;
+    case ax::mojom::Role::kListMarker:
+      tag->fType = SkPDF::DocumentStructureType::kLbl;
+      break;
+    case ax::mojom::Role::kListItem:
+      tag->fType = SkPDF::DocumentStructureType::kLI;
+      break;
+    case ax::mojom::Role::kTable:
+      tag->fType = SkPDF::DocumentStructureType::kTable;
+      break;
+    case ax::mojom::Role::kRow:
+      tag->fType = SkPDF::DocumentStructureType::kTR;
+      break;
+    case ax::mojom::Role::kColumnHeader:
+    case ax::mojom::Role::kRowHeader:
+      tag->fType = SkPDF::DocumentStructureType::kTH;
+      break;
+    case ax::mojom::Role::kCell:
+      tag->fType = SkPDF::DocumentStructureType::kTD;
+      break;
+    case ax::mojom::Role::kFigure:
+    case ax::mojom::Role::kImage:
+      tag->fType = SkPDF::DocumentStructureType::kFigure;
+      break;
+    case ax::mojom::Role::kStaticText:
+      // Currently we're only marking text content, so we can't generate
+      // a nonempty structure tree unless we have at least one kStaticText
+      // node in the tree.
+      tag->fType = SkPDF::DocumentStructureType::kNonStruct;
+      valid = true;
+      break;
+    default:
+      tag->fType = SkPDF::DocumentStructureType::kNonStruct;
+  }
+
+  tag->fChildCount = ax_node->GetUnignoredChildCount();
+  // Allocated here, cleaned up in DestroyStructureElementNodeTree().
+  SkPDF::StructureElementNode* children =
+      new SkPDF::StructureElementNode[tag->fChildCount];
+  tag->fChildren = children;
+  for (size_t i = 0; i < tag->fChildCount; i++) {
+    bool success = RecursiveBuildStructureTree(
+        ax_node->GetUnignoredChildAtIndex(i), &children[i]);
+    if (success)
+      valid = true;
+  }
+
+  return valid;
+}
+
+void DestroyStructureElementNodeTree(SkPDF::StructureElementNode* node) {
+  for (size_t i = 0; i < node->fChildCount; i++) {
+    DestroyStructureElementNodeTree(
+        const_cast<SkPDF::StructureElementNode*>(&node->fChildren[i]));
+  }
+  delete[] node->fChildren;
+}
+
 }  // namespace
 
 namespace printing {
 
 sk_sp<SkDocument> MakePdfDocument(const std::string& creator,
+                                  const ui::AXTreeUpdate& accessibility_tree,
                                   SkWStream* stream) {
   SkPDF::Metadata metadata;
   SkTime::DateTime now = TimeToSkTime(base::Time::Now());
@@ -56,7 +143,17 @@
       base::FeatureList::IsEnabled(printing::features::kHarfBuzzPDFSubsetter)
           ? SkPDF::Metadata::kHarfbuzz_Subsetter
           : SkPDF::Metadata::kSfntly_Subsetter;
-  return SkPDF::MakeDocument(stream, metadata);
+
+  SkPDF::StructureElementNode tag_root = {};
+  if (!accessibility_tree.nodes.empty()) {
+    ui::AXTree tree(accessibility_tree);
+    if (RecursiveBuildStructureTree(tree.root(), &tag_root))
+      metadata.fStructureElementTreeRoot = &tag_root;
+  }
+
+  sk_sp<SkDocument> document = SkPDF::MakeDocument(stream, metadata);
+  DestroyStructureElementNodeTree(&tag_root);
+  return document;
 }
 
 sk_sp<SkData> SerializeOopPicture(SkPicture* pic, void* ctx) {
diff --git a/printing/common/metafile_utils.h b/printing/common/metafile_utils.h
index efda850..5796754 100644
--- a/printing/common/metafile_utils.h
+++ b/printing/common/metafile_utils.h
@@ -14,6 +14,7 @@
 #include "third_party/skia/include/core/SkRefCnt.h"
 #include "third_party/skia/include/core/SkSerialProcs.h"
 #include "third_party/skia/include/core/SkStream.h"
+#include "ui/accessibility/ax_tree_update_forward.h"
 
 namespace printing {
 
@@ -34,6 +35,7 @@
 using SerializationContext = ContentToProxyIdMap;
 
 sk_sp<SkDocument> MakePdfDocument(const std::string& creator,
+                                  const ui::AXTreeUpdate& accessibility_tree,
                                   SkWStream* stream);
 
 SkSerialProcs SerializationProcs(SerializationContext* ctx);
diff --git a/printing/metafile_skia.cc b/printing/metafile_skia.cc
index e14acb4..8e2a9a7 100644
--- a/printing/metafile_skia.cc
+++ b/printing/metafile_skia.cc
@@ -178,7 +178,7 @@
   cc::PlaybackParams::CustomDataRasterCallback custom_callback;
   switch (data_->type) {
     case SkiaDocumentType::PDF:
-      doc = MakePdfDocument(printing::GetAgent(), &stream);
+      doc = MakePdfDocument(printing::GetAgent(), accessibility_tree_, &stream);
       break;
     case SkiaDocumentType::MSKP:
       SkSerialProcs procs = SerializationProcs(&data_->subframe_content_info);
diff --git a/printing/metafile_skia.h b/printing/metafile_skia.h
index 26b9049..f2fb34f 100644
--- a/printing/metafile_skia.h
+++ b/printing/metafile_skia.h
@@ -16,6 +16,7 @@
 #include "printing/common/metafile_utils.h"
 #include "printing/metafile.h"
 #include "skia/ext/platform_canvas.h"
+#include "ui/accessibility/ax_tree_update.h"
 
 #if defined(OS_WIN)
 #include <windows.h>
@@ -95,6 +96,11 @@
   int GetDocumentCookie() const;
   const ContentToProxyIdMap& GetSubframeContentInfo() const;
 
+  const ui::AXTreeUpdate& accessibility_tree() const {
+    return accessibility_tree_;
+  }
+  ui::AXTreeUpdate& accessibility_tree() { return accessibility_tree_; }
+
  private:
   FRIEND_TEST_ALL_PREFIXES(MetafileSkiaTest, TestFrameContent);
 
@@ -111,6 +117,8 @@
 
   std::unique_ptr<MetafileSkiaData> data_;
 
+  ui::AXTreeUpdate accessibility_tree_;
+
   DISALLOW_COPY_AND_ASSIGN(MetafileSkia);
 };
 
diff --git a/remoting/host/mac/permission_wizard.mm b/remoting/host/mac/permission_wizard.mm
index c6be685..60a043e 100644
--- a/remoting/host/mac/permission_wizard.mm
+++ b/remoting/host/mac/permission_wizard.mm
@@ -228,9 +228,12 @@
   _instructionText.editable = NO;
   _instructionText.preferredMaxLayoutWidth = 400;
 
+  NSString* appPath = [[NSBundle mainBundle] bundlePath];
+  NSImage* iconImage = [[NSWorkspace sharedWorkspace] iconForFile:appPath];
+  [iconImage setSize:NSMakeSize(64, 64)];
   NSImageView* icon = [[[NSImageView alloc] init] autorelease];
   icon.translatesAutoresizingMaskIntoConstraints = NO;
-  icon.image = [[NSApplication sharedApplication] applicationIconImage];
+  icon.image = iconImage;
 
   _cancelButton = [[[NSButton alloc] init] autorelease];
   _cancelButton.translatesAutoresizingMaskIntoConstraints = NO;
@@ -285,7 +288,7 @@
   iconAndTextStack.alignment = NSLayoutAttributeTop;
   [iconAndTextStack addView:icon inGravity:NSStackViewGravityLeading];
   [iconAndTextStack addView:_instructionText
-                  inGravity:NSStackViewGravityLeading];
+                  inGravity:NSStackViewGravityCenter];
 
   NSStackView* buttonsStack = [[[NSStackView alloc] init] autorelease];
   buttonsStack.translatesAutoresizingMaskIntoConstraints = NO;
@@ -297,10 +300,17 @@
   [buttonsStack addView:_nextButton inGravity:NSStackViewGravityTrailing];
   [buttonsStack addView:_okButton inGravity:NSStackViewGravityTrailing];
 
+  // Prevent buttonsStack from expanding vertically. This fixes incorrect
+  // vertical placement of OK button in All Set page
+  // (http://crbug.com/1032157). The parent NSStackView was expanding this
+  // view instead of adding space between the gravity-areas.
+  [buttonsStack setHuggingPriority:NSLayoutPriorityDefaultHigh
+                    forOrientation:NSLayoutConstraintOrientationVertical];
+
   NSStackView* mainStack = [[[NSStackView alloc] init] autorelease];
   mainStack.translatesAutoresizingMaskIntoConstraints = NO;
   mainStack.orientation = NSUserInterfaceLayoutOrientationVertical;
-  mainStack.spacing = 20;
+  mainStack.spacing = 12;
   [mainStack addView:iconAndTextStack inGravity:NSStackViewGravityTop];
   [mainStack addView:buttonsStack inGravity:NSStackViewGravityBottom];
 
diff --git a/sandbox/linux/services/libc_interceptor.cc b/sandbox/linux/services/libc_interceptor.cc
index edc7f91..2f0df72 100644
--- a/sandbox/linux/services/libc_interceptor.cc
+++ b/sandbox/linux/services/libc_interceptor.cc
@@ -37,7 +37,6 @@
 // they fork. (This means that it'll be incorrect for global constructor
 // functions and before ZygoteMain is called - beware).
 bool g_am_zygote_or_renderer = false;
-bool g_use_localtime_override = true;
 int g_backchannel_fd = -1;
 
 base::LazyInstance<std::set<std::string>>::Leaky g_timezones =
@@ -222,7 +221,7 @@
 NO_SANITIZE("cfi-icall")
 __attribute__((__visibility__("default"))) struct tm* localtime_override(
     const time_t* timep) {
-  if (g_am_zygote_or_renderer && g_use_localtime_override) {
+  if (g_am_zygote_or_renderer) {
     static struct tm time_struct;
     static char timezone_string[64];
     ProxyLocaltimeCallToBrowser(*timep, &time_struct, timezone_string,
@@ -248,7 +247,7 @@
 NO_SANITIZE("cfi-icall")
 __attribute__((__visibility__("default"))) struct tm* localtime64_override(
     const time_t* timep) {
-  if (g_am_zygote_or_renderer && g_use_localtime_override) {
+  if (g_am_zygote_or_renderer) {
     static struct tm time_struct;
     static char timezone_string[64];
     ProxyLocaltimeCallToBrowser(*timep, &time_struct, timezone_string,
@@ -275,7 +274,7 @@
 __attribute__((__visibility__("default"))) struct tm* localtime_r_override(
     const time_t* timep,
     struct tm* result) {
-  if (g_am_zygote_or_renderer && g_use_localtime_override) {
+  if (g_am_zygote_or_renderer) {
     ProxyLocaltimeCallToBrowser(*timep, result, nullptr, 0);
     return result;
   }
@@ -299,7 +298,7 @@
 __attribute__((__visibility__("default"))) struct tm* localtime64_r_override(
     const time_t* timep,
     struct tm* result) {
-  if (g_am_zygote_or_renderer && g_use_localtime_override) {
+  if (g_am_zygote_or_renderer) {
     ProxyLocaltimeCallToBrowser(*timep, result, nullptr, 0);
     return result;
   }
@@ -315,10 +314,6 @@
   return res;
 }
 
-void SetUseLocaltimeOverride(bool enable) {
-  g_use_localtime_override = enable;
-}
-
 void SetAmZygoteOrRenderer(bool enable, int backchannel_fd) {
   g_am_zygote_or_renderer = enable;
   g_backchannel_fd = backchannel_fd;
diff --git a/sandbox/linux/services/libc_interceptor.h b/sandbox/linux/services/libc_interceptor.h
index 50bc3ce..a43460e 100644
--- a/sandbox/linux/services/libc_interceptor.h
+++ b/sandbox/linux/services/libc_interceptor.h
@@ -34,9 +34,8 @@
 // to the parent over the IPC back-channel (see
 // https://chromium.googlesource.com/chromium/src/+/master/docs/linux/sandbox_ipc.md)
 // or use dlsym with RTLD_NEXT to resolve the symbol, ignoring any symbols in
-// the current module. Use SetUseLocaltimeOverride() and SetAmZygoteOrRenderer()
-// below to control the mode of operation, which defaults using the dlsym
-// approach.
+// the current module. Use SetAmZygoteOrRenderer() below to control the mode of
+// operation, which defaults using the dlsym approach.
 //
 // Other avenues:
 //
@@ -61,11 +60,6 @@
     base::PickleIterator iter,
     const std::vector<base::ScopedFD>& fds);
 
-// On Linux, localtime is overridden to use a synchronous IPC to the browser
-// process to determine the locale. This can be disabled, which causes
-// localtime to use UTC instead. https://crbug.com/772503.
-SANDBOX_EXPORT void SetUseLocaltimeOverride(bool enable);
-
 // Turns on/off the libc interception. Called by the zygote and inherited by it
 // children. |backchannel_fd| must be the fd to use for proxying calls.
 SANDBOX_EXPORT void SetAmZygoteOrRenderer(bool enable, int backchannel_fd);
diff --git a/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc b/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc
index 4c70809e..c599471 100644
--- a/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc
+++ b/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc
@@ -163,7 +163,6 @@
     case SandboxType::kPpapi:
       return std::make_unique<PpapiProcessPolicy>();
     case SandboxType::kUtility:
-    case SandboxType::kProfiling:
       return std::make_unique<UtilityProcessPolicy>();
     case SandboxType::kCdm:
       return std::make_unique<CdmProcessPolicy>();
@@ -220,7 +219,6 @@
     case SandboxType::kIme:
 #endif  // defined(OS_CHROMEOS)
     case SandboxType::kAudio:
-    case SandboxType::kProfiling:
     case SandboxType::kNetwork:
     case SandboxType::kUtility:
     case SandboxType::kNoSandbox:
diff --git a/services/service_manager/sandbox/mac/sandbox_mac.mm b/services/service_manager/sandbox/mac/sandbox_mac.mm
index 1a88e28..13f4917 100644
--- a/services/service_manager/sandbox/mac/sandbox_mac.mm
+++ b/services/service_manager/sandbox/mac/sandbox_mac.mm
@@ -254,7 +254,6 @@
     case service_manager::SandboxType::kPpapi:
       profile += service_manager::kSeatbeltPolicyString_ppapi;
       break;
-    case service_manager::SandboxType::kProfiling:
     case service_manager::SandboxType::kUtility:
       profile += service_manager::kSeatbeltPolicyString_utility;
       break;
diff --git a/services/service_manager/sandbox/sandbox_type.cc b/services/service_manager/sandbox/sandbox_type.cc
index 34a35b59..4a577a81 100644
--- a/services/service_manager/sandbox/sandbox_type.cc
+++ b/services/service_manager/sandbox/sandbox_type.cc
@@ -36,7 +36,6 @@
     case SandboxType::kPpapi:
     case SandboxType::kCdm:
     case SandboxType::kPdfCompositor:
-    case SandboxType::kProfiling:
 #if defined(OS_FUCHSIA)
     case SandboxType::kWebContext:
 #endif
@@ -83,7 +82,6 @@
     case SandboxType::kNetwork:
     case SandboxType::kCdm:
     case SandboxType::kPdfCompositor:
-    case SandboxType::kProfiling:
     case SandboxType::kAudio:
 #if defined(OS_WIN)
     case SandboxType::kXrCompositing:
@@ -162,8 +160,6 @@
       return switches::kCdmSandbox;
     case SandboxType::kPdfCompositor:
       return switches::kPdfCompositorSandbox;
-    case SandboxType::kProfiling:
-      return switches::kProfilingSandbox;
     case SandboxType::kUtility:
       return switches::kUtilitySandbox;
     case SandboxType::kAudio:
@@ -212,8 +208,6 @@
     return SandboxType::kCdm;
   if (sandbox_string == switches::kPdfCompositorSandbox)
     return SandboxType::kPdfCompositor;
-  if (sandbox_string == switches::kProfilingSandbox)
-    return SandboxType::kProfiling;
 #if defined(OS_WIN)
   if (sandbox_string == switches::kXrCompositingSandbox)
     return SandboxType::kXrCompositing;
diff --git a/services/service_manager/sandbox/sandbox_type.h b/services/service_manager/sandbox/sandbox_type.h
index 40dacf66..f9d8486 100644
--- a/services/service_manager/sandbox/sandbox_type.h
+++ b/services/service_manager/sandbox/sandbox_type.h
@@ -61,9 +61,6 @@
   // The pdf compositor service process.
   kPdfCompositor,
 
-  // The profiling service process.
-  kProfiling,
-
   // The audio service process.
   kAudio,
 
diff --git a/services/service_manager/sandbox/switches.cc b/services/service_manager/sandbox/switches.cc
index 1ba3b59..0b43b8a 100644
--- a/services/service_manager/sandbox/switches.cc
+++ b/services/service_manager/sandbox/switches.cc
@@ -27,7 +27,6 @@
 const char kUtilitySandbox[] = "utility";
 const char kCdmSandbox[] = "cdm";
 const char kPdfCompositorSandbox[] = "pdf_compositor";
-const char kProfilingSandbox[] = "profiling";
 const char kAudioSandbox[] = "audio";
 
 #if defined(OS_WIN)
diff --git a/services/service_manager/sandbox/switches.h b/services/service_manager/sandbox/switches.h
index 00555ced..3e08da1 100644
--- a/services/service_manager/sandbox/switches.h
+++ b/services/service_manager/sandbox/switches.h
@@ -26,7 +26,6 @@
 SERVICE_MANAGER_SANDBOX_EXPORT extern const char kUtilitySandbox[];
 SERVICE_MANAGER_SANDBOX_EXPORT extern const char kCdmSandbox[];
 SERVICE_MANAGER_SANDBOX_EXPORT extern const char kPdfCompositorSandbox[];
-SERVICE_MANAGER_SANDBOX_EXPORT extern const char kProfilingSandbox[];
 SERVICE_MANAGER_SANDBOX_EXPORT extern const char kAudioSandbox[];
 
 #if defined(OS_WIN)
diff --git a/testing/platform_test.h b/testing/platform_test.h
index f993864d..15782b0 100644
--- a/testing/platform_test.h
+++ b/testing/platform_test.h
@@ -17,7 +17,7 @@
 // the #ifdefs and add a platform_test_<platform>.cc implementation file.
 class PlatformTest : public testing::Test {
  public:
-  virtual ~PlatformTest();
+  ~PlatformTest() override;
 
  protected:
   PlatformTest();
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py b/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
index d22d56f..049a243 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
@@ -108,10 +108,7 @@
         assert False, "Blink does not support/accept IDL void type."
 
     if real_type.type_definition_object is not None:
-        type_def_obj = real_type.type_definition_object
-        blink_impl_type = (
-            type_def_obj.code_generator_info.receiver_implemented_as
-            or name_style.class_(type_def_obj.identifier))
+        blink_impl_type = blink_class_name(real_type.type_definition_object)
         return TypeInfo(
             blink_impl_type,
             member_fmt="Member<{}>",
@@ -137,7 +134,12 @@
         return TypeInfo("ScriptPromise", ref_fmt="{}&")
 
     if real_type.is_union:
-        return TypeInfo("ToBeImplementedUnion")
+        def_obj = real_type.union_definition_object
+        blink_impl_type = blink_class_name(def_obj)
+        return TypeInfo(
+            blink_impl_type,
+            ref_fmt="{}&",
+            is_nullable=def_obj.does_include_nullable_type)
 
     if real_type.is_nullable:
         inner_type = blink_type_info(real_type.inner_type)
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py b/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py
index a32880d..d5ba21f2 100644
--- a/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py
+++ b/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py
@@ -595,6 +595,5 @@
             self._db.register(
                 DatabaseBody.Kind.UNION,
                 Union(
-                    Identifier(key),  # dummy identifier
                     union_types=union_types,
                     typedef_backrefs=grouped_typedefs.get(key, [])))
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py b/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py
index 0b5fdfe..bc9c736 100644
--- a/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py
+++ b/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py
@@ -517,6 +517,15 @@
         """
         return None
 
+    @property
+    def union_definition_object(self):
+        """
+        Returns an object that represents an union or None.
+
+        Note that a returned object is not an IdlType.  It's of type Union.
+        """
+        return None
+
     def _format_syntactic_form(self, syntactic_form_inner):
         """Helper function to implement |syntactic_form|."""
         optional_form = 'optional ' if self.is_optional else ''
@@ -1078,6 +1087,7 @@
             debug_info=debug_info,
             pass_key=pass_key)
         self._member_types = tuple(member_types)
+        self._union_definition_object = None
 
     def __eq__(self, other):
         """
@@ -1148,6 +1158,17 @@
 
         return set(flatten(self))
 
+    @property
+    def union_definition_object(self):
+        return self._union_definition_object
+
+    def set_union_definition_object(self, union_definition_object):
+        # In Python2, we need to avoid circular imports.
+        from .union import Union
+        assert isinstance(union_definition_object, Union)
+        assert self._union_definition_object is None
+        self._union_definition_object = union_definition_object
+
 
 class NullableType(IdlType):
     """https://heycam.github.io/webidl/#idl-nullable-type"""
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/union.py b/third_party/blink/renderer/bindings/scripts/web_idl/union.py
index 02f00b1..ab587da 100644
--- a/third_party/blink/renderer/bindings/scripts/web_idl/union.py
+++ b/third_party/blink/renderer/bindings/scripts/web_idl/union.py
@@ -2,6 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+from .composition_parts import Identifier
+from .composition_parts import WithCodeGeneratorInfo
 from .composition_parts import WithComponent
 from .composition_parts import WithDebugInfo
 from .composition_parts import WithIdentifier
@@ -9,7 +11,8 @@
 from .typedef import Typedef
 
 
-class Union(WithIdentifier, WithComponent, WithDebugInfo):
+class Union(WithIdentifier, WithCodeGeneratorInfo, WithComponent,
+            WithDebugInfo):
     """
     Union class makes a group of union types with the same flattened member
     types and the same result whether it includes a nullable type or not.
@@ -28,7 +31,7 @@
     expected to define an implementation class for each Union instance.
     """
 
-    def __init__(self, identifier, union_types, typedef_backrefs):
+    def __init__(self, union_types, typedef_backrefs):
         """
         Args:
             union_types: Union types of which this object consists.  All types
@@ -56,6 +59,7 @@
             assert union_type.flattened_member_types == flattened_members
             assert (union_type.does_include_nullable_type ==
                     does_include_nullable_type)
+            union_type.set_union_definition_object(self)
             for direct_member in union_type.member_types:
                 if direct_member.is_nullable:
                     nullable_members.add(direct_member)
@@ -76,8 +80,15 @@
         for idl_type in flattened_members:
             idl_type.apply_to_all_composing_elements(collect_components)
 
+        type_names = sorted(
+            [idl_type.type_name for idl_type in flattened_members])
+        if does_include_nullable_type:
+            type_names.append('Null')
+        identifier = Identifier('Or'.join(type_names))
+
         WithIdentifier.__init__(self, identifier)
-        WithComponent.__init__(self, sorted(components))
+        WithCodeGeneratorInfo.__init__(self, readonly=True)
+        WithComponent.__init__(self, sorted(components), readonly=True)
         WithDebugInfo.__init__(self)
 
         # Sort improves reproducibility.
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc
index 52e970a..6664bb4 100644
--- a/third_party/blink/renderer/core/animation/animation.cc
+++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -157,7 +157,6 @@
                      AnimationTimeline* timeline,
                      AnimationEffect* content)
     : ContextLifecycleObserver(execution_context),
-      internal_play_state_(kIdle),
       reported_play_state_(kIdle),
       playback_rate_(1),
       start_time_(),
@@ -165,7 +164,6 @@
       sequence_number_(NextSequenceNumber()),
       content_(content),
       timeline_(timeline),
-      paused_(false),
       is_paused_for_testing_(false),
       is_composited_animation_disabled_for_testing_(false),
       pending_pause_(false),
@@ -177,8 +175,6 @@
       compositor_state_(nullptr),
       compositor_pending_(false),
       compositor_group_(0),
-      current_time_pending_(false),
-      state_is_being_updated_(false),
       effect_suppressed_(false) {
   if (content_) {
     if (content_->GetAnimation()) {
@@ -259,17 +255,10 @@
       ResolvePromiseMaybeAsync(ready_promise_.Get());
   }
 
-  // TODO(crbug.com/960944): Deprecate use of legacy flags.
-  if (PlayStateInternal() == kIdle)
-    paused_ = true;
-  current_time_pending_ = false;
-  internal_play_state_ = kUnset;
-
   // Update the finished state.
   UpdateFinishedState(UpdateType::kDiscontinuous, NotificationType::kAsync);
 
   SetCompositorPending(/*effect_changed=*/false);
-  internal_play_state_ = CalculateExtendedPlayState();
 
   // Notify of potential state change.
   NotifyProbe();
@@ -303,71 +292,6 @@
     SetOutdated();
 }
 
-// TODO(crbug.com/960944): Deprecate. This method is only called by methods that
-// are pending refactoring to align with the web-animation spec.
-void Animation::SetCurrentTimeInternal(double new_current_time,
-                                       TimingUpdateReason reason) {
-  DCHECK(std::isfinite(new_current_time));
-
-  bool outdated = false;
-  bool is_limited = Limited(new_current_time);
-  bool is_held = paused_ || !playback_rate_ || is_limited || !start_time_;
-  if (is_held) {
-    // We only need to update the animation if the seek changes the hold time.
-    if (!hold_time_ || hold_time_ != new_current_time)
-      outdated = true;
-    hold_time_ = new_current_time;
-    if (paused_ || !playback_rate_) {
-      start_time_ = base::nullopt;
-    } else if (is_limited && !start_time_ &&
-               reason == kTimingUpdateForAnimationFrame) {
-      start_time_ = CalculateStartTime(new_current_time);
-    }
-  } else {
-    hold_time_ = base::nullopt;
-    start_time_ = CalculateStartTime(new_current_time);
-    finished_ = false;
-    outdated = true;
-  }
-
-  previous_current_time_ = base::nullopt;
-
-  if (outdated) {
-    SetOutdated();
-  }
-}
-
-// Update timing to reflect updated animation clock due to tick
-void Animation::UpdateCurrentTimingState(TimingUpdateReason reason) {
-  bool idle = internal_play_state_ == kIdle;
-  bool has_active_timeline = timeline_ && timeline_->IsActive();
-  if (idle || !has_active_timeline || !playback_rate_)
-    return;
-
-  if (hold_time_) {
-    base::Optional<double> new_current_time = hold_time_;
-    if (internal_play_state_ == kFinished && start_time_ && timeline_) {
-      // Add hystersis due to floating point error accumulation
-      base::Optional<double> current_time = CalculateCurrentTime();
-      DCHECK(current_time);
-      if (!Limited(current_time.value() + 0.001 * playback_rate_)) {
-        // The current time became unlimited, eg. due to a backwards
-        // seek of the timeline.
-        new_current_time = current_time;
-      } else if (!Limited(hold_time_)) {
-        // The hold time became unlimited, eg. due to the effect
-        // becoming longer.
-        new_current_time =
-            clampTo<double>(current_time.value(), 0, EffectEnd());
-      }
-    }
-    DCHECK(new_current_time);
-    SetCurrentTimeInternal(new_current_time.value(), reason);
-  } else if (Limited(CalculateCurrentTime())) {
-    hold_time_ = playback_rate_ < 0 ? 0 : EffectEnd();
-  }
-}
-
 double Animation::startTime(bool& is_null) const {
   base::Optional<double> result = startTime();
   is_null = !result;
@@ -504,15 +428,6 @@
     compositor_state_->start_time = start_time_;
   }
 
-  // Avoid marking this animation as outdated needlessly when a start time is
-  // notified.  TODO(crbug.com/960944): Remove the need for clearing the
-  // outdated flag once PlayStateUpdateScope and UpdateCurrentTimingState have
-  // been removed.
-  ClearOutdated();
-
-  // TODO(crbug.com/960944): deprecate use of these flags.
-  internal_play_state_ = CalculateExtendedPlayState();
-
   // Notify of change to play state.
   NotifyProbe();
 }
@@ -525,7 +440,6 @@
   DCHECK(start_time_ || hold_time_);
   DCHECK(pending_play_);
   pending_play_ = false;
-  current_time_pending_ = false;
 
   // Update hold and start time.
   if (hold_time_) {
@@ -584,9 +498,6 @@
 // Refer to step 7 'pending pause task' in
 // https://drafts.csswg.org/web-animations-1/#pausing-an-animation-section
 void Animation::CommitPendingPause(double ready_time) {
-  // TODO(crbug.com/960944): Deprecate.
-  internal_play_state_ = kUnset;
-
   DCHECK(pending_pause_);
   pending_pause_ = false;
 
@@ -709,11 +620,6 @@
     hold_time_ = previous_current_time;
   }
 
-  // TODO(crbug.com/960944): prune use of legacy flags.
-  paused_ = hold_time_.has_value();
-  current_time_pending_ = false;
-  internal_play_state_ = kUnset;
-
   // 7. If animation has a pending play task or a pending pause task, cancel
   //    that task and resolve animation’s current ready promise with animation.
   if (pending()) {
@@ -729,9 +635,6 @@
   //    synchronously notify flag set to false (async).
   UpdateFinishedState(UpdateType::kDiscontinuous, NotificationType::kAsync);
 
-  // TODO(crbug.com/960944): prune use of legacy flags.
-  internal_play_state_ = CalculateExtendedPlayState();
-
   // Update user agent.
   base::Optional<double> new_current_time = CurrentTimeInternal();
   if (previous_current_time != new_current_time) {
@@ -784,9 +687,6 @@
 
   SetCompositorPending(/*effect_change=*/true);
 
-  // TODO(crbug.com/960944): Deprecate use of these flags.
-  internal_play_state_ = CalculateExtendedPlayState();
-
   // Notify of a potential state change.
   NotifyProbe();
 }
@@ -809,25 +709,6 @@
   }
 }
 
-// TODO(crbug.com/960944): Deprecate.
-Animation::AnimationPlayState Animation::PlayStateInternal() const {
-  DCHECK_NE(internal_play_state_, kUnset);
-  return internal_play_state_;
-}
-
-// TODO(crbug.com/960944): Deprecate.
-Animation::AnimationPlayState Animation::CalculateExtendedPlayState() const {
-  if (paused_ && !current_time_pending_)
-    return kPaused;
-  if (internal_play_state_ == kIdle)
-    return kIdle;
-  if (current_time_pending_ || (!start_time_ && playback_rate_ != 0))
-    return kPending;
-  if (Limited())
-    return kFinished;
-  return kRunning;
-}
-
 // https://drafts.csswg.org/web-animations/#play-states
 Animation::AnimationPlayState Animation::CalculateAnimationPlayState() const {
   // 1. All of the following conditions are true:
@@ -865,11 +746,26 @@
 
 // https://drafts.csswg.org/web-animations-1/#reset-an-animations-pending-tasks.
 void Animation::ResetPendingTasks() {
-  ApplyPendingPlaybackRate();
-  pending_pause_ = false;
+  // 1. If animation does not have a pending play task or a pending pause task,
+  //    abort this procedure.
+  if (!pending())
+    return;
+
+  // 2. If animation has a pending play task, cancel that task.
+  // 3. If animation has a pending pause task, cancel that task.
   pending_play_ = false;
-  // TODO(crbug.com/960944): Fix handling of ready promise to align with the
-  // web-animtions spec.
+  pending_pause_ = false;
+
+  // 4. Apply any pending playback rate on animation.
+  ApplyPendingPlaybackRate();
+
+  // 5. Reject animation’s current ready promise with a DOMException named
+  //    "AbortError".
+  // 6. Let animation’s current ready promise be the result of creating a new
+  //    resolved Promise object with value animation in the relevant Realm of
+  //    animation.
+  if (ready_promise_)
+    RejectAndResetPromiseMaybeAsync(ready_promise_.Get());
 }
 
 // ----------------------------------------------
@@ -930,10 +826,6 @@
   pending_pause_ = true;
   pending_play_ = false;
 
-  // TODO(crbug.com/958433): Deprecate.
-  paused_ = true;
-  internal_play_state_ = kUnset;
-
   SetOutdated();
   SetCompositorPending(false);
 
@@ -942,9 +834,6 @@
   //    notify flag set to false.
   UpdateFinishedState(UpdateType::kContinuous, NotificationType::kAsync);
 
-  // TODO(crbug.com/958433): Deprecate.
-  internal_play_state_ = CalculateExtendedPlayState();
-
   NotifyProbe();
 }
 
@@ -1061,9 +950,6 @@
   // 8. Schedule a task to run as soon as animation is ready.
   pending_play_ = true;
   finished_ = false;
-  // TODO(crbug.com/960944): Deprecate paused_ and internal_play_state_ flags.
-  paused_ = false;
-  internal_play_state_ = kUnset;
   SetOutdated();
   SetCompositorPending(/*effect_changed=*/false);
 
@@ -1073,9 +959,6 @@
   // Boolean valued arguments replaced with enumerated values for clarity.
   UpdateFinishedState(UpdateType::kContinuous, NotificationType::kAsync);
 
-  // TODO(crbug.com/960944): Deprecate.
-  internal_play_state_ = CalculateExtendedPlayState();
-
   // Notify change to pending play or finished state.
   NotifyProbe();
 }
@@ -1111,19 +994,14 @@
   if (pending_playback_rate_.value() == -0)
     pending_playback_rate_ = 0;
 
-  // TODO(crbug.com/960944): Deprecate use of this flag.
-  current_time_pending_ = true;
-
   // 4. Run the steps to play an animation for animation with the auto-rewind
   //    flag set to true.
   //    If the steps to play an animation throw an exception, set animation’s
   //    pending playback rate to original pending playback rate and propagate
   //    the exception.
   PlayInternal(AutoRewind::kEnabled, exception_state);
-  if (exception_state.HadException()) {
+  if (exception_state.HadException())
     pending_playback_rate_ = original_pending_playback_rate;
-    current_time_pending_ = false;
-  }
 }
 
 // ----------------------------------------------
@@ -1166,15 +1044,8 @@
       ResolvePromiseMaybeAsync(ready_promise_.Get());
   }
 
-  // TODO(crbug.com/960944): Cleanup use of legacy flags.
-  paused_ = false;
-  current_time_pending_ = false;
-  internal_play_state_ = kUnset;
-  ResetPendingTasks();
-
   SetOutdated();
   UpdateFinishedState(UpdateType::kDiscontinuous, NotificationType::kSync);
-  internal_play_state_ = CalculateExtendedPlayState();
 
   // Notify of change to finished state.
   NotifyProbe();
@@ -1285,9 +1156,6 @@
 
   // 3. Create an AnimationPlaybackEvent, finishEvent.
   QueueFinishedEvent();
-
-  // TODO(crbug.com/960944) Deprecate following flags.
-  internal_play_state_ = kFinished;
 }
 
 // https://drafts.csswg.org/web-animations/#setting-the-playback-rate-of-an-animation
@@ -1365,8 +1233,6 @@
     // Run the procedure to play an animation for animation with the
     // auto-rewind flag set to false.
     case kRunning:
-      // TODO(crbug.com/960944): Deprecate use of current_time_pending_ flag.
-      current_time_pending_ = true;
       PlayInternal(AutoRewind::kDisabled, exception_state);
       break;
 
@@ -1419,8 +1285,6 @@
 }
 
 void Animation::ContextDestroyed(ExecutionContext*) {
-  PlayStateUpdateScope update_scope(*this, kTimingUpdateOnDemand);
-
   finished_ = true;
   pending_finished_event_ = nullptr;
 }
@@ -1534,6 +1398,9 @@
   if (EffectivePlaybackRate() == 0)
     reasons |= CompositorAnimations::kInvalidAnimationOrEffect;
 
+  if (!CurrentTimeInternal())
+    reasons |= CompositorAnimations::kInvalidAnimationOrEffect;
+
   // Cannot composite an infinite duration animation with a negative playback
   // rate. TODO(crbug.com/1029167): Fix calculation of compositor timing to
   // enable compositing provided the iteration duration is finite. Having an
@@ -1596,18 +1463,16 @@
     }
   } else {
     base::Optional<double> current_time = CurrentTimeInternal();
-    if (current_time) {
-      time_offset =
-          reversed ? EffectEnd() - current_time.value() : current_time.value();
-      time_offset = time_offset / fabs(EffectivePlaybackRate());
-    } else {
-      time_offset = NullValue();
-    }
+    DCHECK(current_time);
+    time_offset =
+        reversed ? EffectEnd() - current_time.value() : current_time.value();
+    time_offset = time_offset / fabs(EffectivePlaybackRate());
   }
 
   DCHECK(!start_time || !IsNull(start_time.value()));
   DCHECK_NE(compositor_group_, 0);
   DCHECK(To<KeyframeEffect>(content_.Get()));
+  DCHECK(std::isfinite(time_offset));
   To<KeyframeEffect>(content_.Get())
       ->StartAnimationOnCompositor(compositor_group_, start_time, time_offset,
                                    EffectivePlaybackRate());
@@ -1791,18 +1656,8 @@
 }
 
 void Animation::cancel() {
-  // TODO(crbug.com/916117): Get rid of internal_play_state_.
-  internal_play_state_ = kUnset;
   AnimationPlayState initial_play_state = CalculateAnimationPlayState();
   if (initial_play_state != kIdle) {
-    if (pending()) {
-      // TODO(crbug.com/916117): Rejecting the ready promise should be performed
-      // inside reset pending tasks once aligned with the spec.
-      // TODO(crbug.com/1013351): Add test for rejection and reset of cancel
-      // promise. Requires further cleanup of PlayStateUpdateScope.
-      if (ready_promise_)
-        RejectAndResetPromiseMaybeAsync(ready_promise_.Get());
-    }
     ResetPendingTasks();
 
     if (finished_promise_) {
@@ -1832,12 +1687,6 @@
   hold_time_ = base::nullopt;
   start_time_ = base::nullopt;
 
-  // TODO(crbug.com/958433): Phase out the use of these variables, which are not
-  // in the spec.
-  paused_ = false;
-  internal_play_state_ = kIdle;
-  current_time_pending_ = false;
-
   // Apply changes synchronously.
   SetCompositorPending(/*effect_changed=*/false);
   SetOutdated();
@@ -1849,17 +1698,6 @@
   NotifyProbe();
 }
 
-void Animation::BeginUpdatingState() {
-  // Nested calls are not allowed!
-  DCHECK(!state_is_being_updated_);
-  state_is_being_updated_ = true;
-}
-
-void Animation::EndUpdatingState() {
-  DCHECK(state_is_being_updated_);
-  state_is_being_updated_ = false;
-}
-
 void Animation::CreateCompositorAnimation() {
   if (Platform::Current()->IsThreadedAnimationEnabled() &&
       !compositor_animation_) {
@@ -1922,80 +1760,6 @@
       monotonic_time, group);
 }
 
-Animation::PlayStateUpdateScope::PlayStateUpdateScope(
-    Animation& animation,
-    TimingUpdateReason reason,
-    CompositorPendingChange compositor_pending_change)
-    : animation_(animation),
-      initial_play_state_(animation_->PlayStateInternal()),
-      compositor_pending_change_(compositor_pending_change) {
-  DCHECK_NE(initial_play_state_, kUnset);
-  animation_->BeginUpdatingState();
-  animation_->UpdateCurrentTimingState(reason);
-}
-
-Animation::PlayStateUpdateScope::~PlayStateUpdateScope() {
-  AnimationPlayState old_play_state = initial_play_state_;
-  AnimationPlayState new_play_state = animation_->CalculateExtendedPlayState();
-  animation_->internal_play_state_ = new_play_state;
-
-  // Ordering is important, the ready promise should resolve/reject before
-  // the finished promise.
-  if (animation_->ready_promise_ && new_play_state != old_play_state) {
-    // Transitioning to an idle state is handled in cancel().
-    DCHECK(new_play_state != kIdle);
-
-    if (old_play_state == kPending) {
-      animation_->ResetPendingTasks();
-      if (animation_->ready_promise_->GetState() == AnimationPromise::kPending)
-        animation_->ResolvePromiseMaybeAsync(animation_->ready_promise_.Get());
-    } else if (new_play_state == kPending) {
-      if (animation_->ready_promise_->GetState() != AnimationPromise::kPending)
-        animation_->ready_promise_->Reset();
-    }
-  }
-
-  if (animation_->finished_promise_ && new_play_state != old_play_state) {
-    // Transitioning to an idle state is handled in cancel().
-    DCHECK(new_play_state != kIdle);
-
-    if (new_play_state == kFinished) {
-      animation_->ResetPendingTasks();
-      animation_->ResolvePromiseMaybeAsync(animation_->finished_promise_.Get());
-    } else if (old_play_state == kFinished) {
-      animation_->finished_promise_->Reset();
-    }
-  }
-
-  if (old_play_state != new_play_state &&
-      (old_play_state == kIdle || new_play_state == kIdle)) {
-    animation_->SetOutdated();
-  }
-
-#if DCHECK_IS_ON()
-  // Verify that current time is up to date.
-  animation_->CurrentTimeInternal();
-#endif
-
-  switch (compositor_pending_change_) {
-    case kSetCompositorPending:
-      animation_->SetCompositorPending();
-      break;
-    case kSetCompositorPendingWithEffectChanged:
-      animation_->SetCompositorPending(true);
-      break;
-    case kDoNotSetCompositorPending:
-      break;
-    default:
-      NOTREACHED();
-      break;
-  }
-  animation_->EndUpdatingState();
-
-  // Play state may have changed.
-  animation_->NotifyProbe();
-}
-
 void Animation::AddedEventListener(
     const AtomicString& event_type,
     RegisteredEventListener& registered_listener) {
diff --git a/third_party/blink/renderer/core/animation/animation.h b/third_party/blink/renderer/core/animation/animation.h
index e6609f5..e43616ab 100644
--- a/third_party/blink/renderer/core/animation/animation.h
+++ b/third_party/blink/renderer/core/animation/animation.h
@@ -247,14 +247,8 @@
                           RegisteredEventListener&) override;
 
  private:
-  // TODO(crbug.com/960944): Deprecate. This version of the play state is not to
-  // spec due to the inclusion of a 'pending' state. Whether or not an animation
-  // is pending is separate from the actual play state.
-  AnimationPlayState PlayStateInternal() const;
-
   base::Optional<double> CurrentTimeInternal() const;
   void SetCurrentTimeInternal(double new_current_time);
-  void SetCurrentTimeInternal(double new_current_time, TimingUpdateReason);
 
   void ClearOutdated();
   void ForceServiceOnNextFrame();
@@ -268,21 +262,9 @@
   double EffectivePlaybackRate() const;
   void ApplyPendingPlaybackRate();
 
-  // https://drafts.csswg.org/web-animations/#play-states
-  // Per spec the viable states are: idle, running, paused and finished.
-  // Our implementation has an additional state called 'pending' which serves a
-  // similar purpose to micro-tasks in the spec. This additional state is for
-  // internal flow control only and should not be reported via
-  // animation.playState.
-  // TODO(crbug.com/958433): Deprecate this method in favor of the
-  // spec-compliant GetPlayState().
-  AnimationPlayState CalculateExtendedPlayState() const;
-
   base::Optional<double> CalculateStartTime(double current_time) const;
   base::Optional<double> CalculateCurrentTime() const;
 
-  void UpdateCurrentTimingState(TimingUpdateReason);
-
   void BeginUpdatingState();
   void EndUpdatingState();
 
@@ -335,11 +317,6 @@
 
   String id_;
 
-  // Extended play state with additional pending state for managing timing of
-  // micro-tasks.
-  // TODO(crbug.com/958433): Phase out this version of the play state. Should
-  // just need the reported play state.
-  AnimationPlayState internal_play_state_;
   // Extended play state reported to dev tools. This play state has an
   // additional pending state that is not part of the spec by expected by dev
   // tools.
@@ -364,8 +341,7 @@
   Member<Document> document_;
   Member<AnimationTimeline> timeline_;
 
-  // Reflects all pausing, including via pauseForTesting().
-  bool paused_;
+  // Testing flags.
   bool is_paused_for_testing_;
   bool is_composited_animation_disabled_for_testing_;
 
@@ -417,21 +393,6 @@
     kDoNotSetCompositorPending,
   };
 
-  class PlayStateUpdateScope {
-    STACK_ALLOCATED();
-
-   public:
-    PlayStateUpdateScope(Animation&,
-                         TimingUpdateReason,
-                         CompositorPendingChange = kSetCompositorPending);
-    ~PlayStateUpdateScope();
-
-   private:
-    Member<Animation> animation_;
-    AnimationPlayState initial_play_state_;
-    CompositorPendingChange compositor_pending_change_;
-  };
-
   // CompositorAnimation objects need to eagerly sever their connection to their
   // Animation delegate; use a separate 'holder' on-heap object to accomplish
   // that.
@@ -468,9 +429,6 @@
 
   Member<CompositorAnimationHolder> compositor_animation_;
 
-  bool current_time_pending_;
-  bool state_is_being_updated_;
-
   bool effect_suppressed_;
 
   FRIEND_TEST_ALL_PREFIXES(AnimationAnimationTestCompositeAfterPaint,
diff --git a/third_party/blink/renderer/core/content_capture/content_capture_manager.cc b/third_party/blink/renderer/core/content_capture/content_capture_manager.cc
index c0e166ff..d403eced 100644
--- a/third_party/blink/renderer/core/content_capture/content_capture_manager.cc
+++ b/third_party/blink/renderer/core/content_capture/content_capture_manager.cc
@@ -5,7 +5,6 @@
 #include "third_party/blink/renderer/core/content_capture/content_capture_manager.h"
 
 #include "third_party/blink/renderer/core/content_capture/sent_nodes.h"
-#include "third_party/blink/renderer/core/dom/dom_node_ids.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/layout/layout_text.h"
 
@@ -20,14 +19,13 @@
 
 ContentCaptureManager::~ContentCaptureManager() = default;
 
-DOMNodeId ContentCaptureManager::GetNodeId(Node& node) {
+void ContentCaptureManager::ScheduleTaskIfNeeded() {
   if (first_node_holder_created_) {
     ScheduleTask(ContentCaptureTask::ScheduleReason::kContentChange);
   } else {
     ScheduleTask(ContentCaptureTask::ScheduleReason::kFirstContentChange);
     first_node_holder_created_ = true;
   }
-  return DOMNodeIds::IdForNode(&node);
 }
 
 void ContentCaptureManager::ScheduleTask(
diff --git a/third_party/blink/renderer/core/content_capture/content_capture_manager.h b/third_party/blink/renderer/core/content_capture/content_capture_manager.h
index 9d374aa..00a2e596 100644
--- a/third_party/blink/renderer/core/content_capture/content_capture_manager.h
+++ b/third_party/blink/renderer/core/content_capture/content_capture_manager.h
@@ -24,11 +24,8 @@
   explicit ContentCaptureManager(LocalFrame& local_frame_root);
   virtual ~ContentCaptureManager();
 
-  // Creates and returns NodeHolder for the given |node|, and schedules
-  // ContentCaptureTask if it isn't already scheduled.
-  // Can't use const Node& for parameter, because |node| is passed to
-  // DOMNodeIds::IdForNode(Node*).
-  DOMNodeId GetNodeId(Node& node);
+  // Schedules ContentCaptureTask if it isn't already scheduled.
+  void ScheduleTaskIfNeeded();
 
   // Invokes when the |node_holder| asscociated LayoutText will be destroyed.
   void OnLayoutTextWillBeDestroyed(const Node& node);
diff --git a/third_party/blink/renderer/core/content_capture/content_capture_test.cc b/third_party/blink/renderer/core/content_capture/content_capture_test.cc
index 930c048..614eee7 100644
--- a/third_party/blink/renderer/core/content_capture/content_capture_test.cc
+++ b/third_party/blink/renderer/core/content_capture/content_capture_test.cc
@@ -8,6 +8,7 @@
 #include "third_party/blink/public/web/web_content_capture_client.h"
 #include "third_party/blink/public/web/web_content_holder.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h"
+#include "third_party/blink/renderer/core/dom/dom_node_ids.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/dom/node.h"
 #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
@@ -192,7 +193,8 @@
     Element* div_element = GetElementById("d1");
     div_element->appendChild(element);
     UpdateAllLifecyclePhasesForTest();
-    created_node_id_ = GetContentCaptureManager()->GetNodeId(*node);
+    GetContentCaptureManager()->ScheduleTaskIfNeeded();
+    created_node_id_ = DOMNodeIds::IdForNode(node);
     Vector<DOMNodeId> captured_content{created_node_id_};
     content_capture_manager_->GetContentCaptureTask()
         ->SetCapturedContentForTesting(captured_content);
@@ -268,7 +270,8 @@
       CHECK(layout_object);
       CHECK(layout_object->IsText());
       nodes_.push_back(node);
-      node_ids_.push_back(GetContentCaptureManager()->GetNodeId(*node));
+      GetContentCaptureManager()->ScheduleTaskIfNeeded();
+      node_ids_.push_back(DOMNodeIds::IdForNode(node));
     }
   }
 
diff --git a/third_party/blink/renderer/core/css/css_gradient_value.cc b/third_party/blink/renderer/core/css/css_gradient_value.cc
index 9df4ac3..e4b4c49 100644
--- a/third_party/blink/renderer/core/css/css_gradient_value.cc
+++ b/third_party/blink/renderer/core/css/css_gradient_value.cc
@@ -390,7 +390,8 @@
 
   const float first_offset = stops.front().offset;
   const float last_offset = stops.back().offset;
-  const float span = last_offset - first_offset;
+  const float span =
+      std::min(last_offset - first_offset, std::numeric_limits<float>::max());
 
   if (fabs(span) < std::numeric_limits<float>::epsilon()) {
     // All stops are coincident -> use a single clamped offset value.
@@ -410,7 +411,9 @@
   DCHECK_GT(span, 0);
 
   for (wtf_size_t i = 0; i < stops.size(); ++i) {
-    const float normalized_offset = (stops[i].offset - first_offset) / span;
+    const auto relative_offset = std::min(stops[i].offset - first_offset,
+                                          std::numeric_limits<float>::max()),
+               normalized_offset = relative_offset / span;
 
     // stop offsets should be monotonically increasing in [0 , 1]
     DCHECK_GE(normalized_offset, 0);
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
index 943773e9..e61bc58 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
@@ -17,6 +17,7 @@
 #include "third_party/blink/renderer/core/dom/node_computed_style.h"
 #include "third_party/blink/renderer/core/editing/ephemeral_range.h"
 #include "third_party/blink/renderer/core/editing/finder/text_finder.h"
+#include "third_party/blink/renderer/core/editing/markers/document_marker_controller.h"
 #include "third_party/blink/renderer/core/editing/visible_units.h"
 #include "third_party/blink/renderer/core/frame/find_in_page.h"
 #include "third_party/blink/renderer/core/frame/frame_test_helpers.h"
@@ -340,6 +341,84 @@
 }
 
 TEST_F(DisplayLockContextTest,
+       ActivatableLockedElementTickmarksAreAtLockedRoots) {
+  ResizeAndFocus();
+  SetHtmlInnerHTML(R"HTML(
+    <style>
+    body {
+      margin: 0;
+      padding: 0;
+    }
+    .small {
+      width: 100px;
+      height: 100px;
+    }
+    .medium {
+      width: 150px;
+      height: 150px;
+    }
+    .large {
+      width: 200px;
+      height: 200px;
+    }
+    </style>
+    <body>
+      testing
+      <div id="container1" class=small>testing</div>
+      <div id="container2" class=medium>testing</div>
+      <div id="container3" class=large>
+        <div id="container4" class=medium>testing</div>
+      </div>
+      <div id="container5" class=small>testing</div>
+    </body>
+  )HTML");
+
+  const String search_text = "testing";
+  DisplayLockTestFindInPageClient client;
+  client.SetFrame(LocalMainFrame());
+
+  auto* container1 = GetDocument().getElementById("container1");
+  auto* container2 = GetDocument().getElementById("container2");
+  auto* container3 = GetDocument().getElementById("container3");
+  auto* container4 = GetDocument().getElementById("container4");
+  auto* container5 = GetDocument().getElementById("container5");
+  LockElement(*container5, false /* activatable */);
+  LockElement(*container4, true /* activatable */);
+  LockElement(*container3, true /* activatable */);
+  LockElement(*container2, true /* activatable */);
+  LockElement(*container1, true /* activatable */);
+
+  EXPECT_TRUE(container1->GetDisplayLockContext()->IsLocked());
+  EXPECT_TRUE(container2->GetDisplayLockContext()->IsLocked());
+  EXPECT_TRUE(container3->GetDisplayLockContext()->IsLocked());
+  EXPECT_TRUE(container4->GetDisplayLockContext()->IsLocked());
+  EXPECT_TRUE(container5->GetDisplayLockContext()->IsLocked());
+
+  // Do a find-in-page.
+  Find(search_text, client);
+  // "testing" outside of the container divs, and 3 inside activatable divs.
+  EXPECT_EQ(4, client.Count());
+
+  auto tick_rects = GetDocument().Markers().LayoutRectsForTextMatchMarkers();
+  ASSERT_EQ(4u, tick_rects.size());
+
+  // Sort the layout rects by y coordinate for deterministic checks below.
+  std::sort(tick_rects.begin(), tick_rects.end(),
+            [](const IntRect& a, const IntRect& b) { return a.Y() < b.Y(); });
+
+  int y_offset = tick_rects[0].Height();
+
+  // The first tick rect will be based on the text itself, so we don't need to
+  // check that. The next three should be the small, medium and large rects,
+  // since those are the locked roots.
+  EXPECT_EQ(IntRect(0, y_offset, 100, 100), tick_rects[1]);
+  y_offset += tick_rects[1].Height();
+  EXPECT_EQ(IntRect(0, y_offset, 150, 150), tick_rects[2]);
+  y_offset += tick_rects[2].Height();
+  EXPECT_EQ(IntRect(0, y_offset, 200, 200), tick_rects[3]);
+}
+
+TEST_F(DisplayLockContextTest,
        FindInPageWhileLockedContentChangesDoesNotCrash) {
   ResizeAndFocus();
   SetHtmlInnerHTML(R"HTML(
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 8acb6bc..aa0a07a9 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -3107,6 +3107,7 @@
 
   if (LocalFrameView* frame_view_anchored = View())
     frame_view_anchored->PerformScrollAnchoringAdjustments();
+  PerformScrollSnappingTasks();
 
   if (status == IsForcedLayout && frame_view)
     frame_view->DidFinishForcedLayout();
@@ -7565,6 +7566,13 @@
   return *snap_coordinator_;
 }
 
+void Document::PerformScrollSnappingTasks() {
+  SnapCoordinator& snap_coordinator = GetSnapCoordinator();
+  snap_coordinator.UpdateAllSnapContainerDataIfNeeded();
+  if (RuntimeEnabledFeatures::ScrollSnapAfterLayoutEnabled())
+    snap_coordinator.ResnapAllContainersIfNeeded();
+}
+
 void Document::SetContextFeatures(ContextFeatures& features) {
   context_features_ = &features;
 }
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index fa1bae91b..8f0d109 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -1370,6 +1370,7 @@
   int NodeCount() const { return node_count_; }
 
   SnapCoordinator& GetSnapCoordinator();
+  void PerformScrollSnappingTasks();
 
   void DidEnforceInsecureRequestPolicy();
   void DidEnforceInsecureNavigationsSet();
diff --git a/third_party/blink/renderer/core/editing/iterators/text_iterator.cc b/third_party/blink/renderer/core/editing/iterators/text_iterator.cc
index 5218159..49379b5 100644
--- a/third_party/blink/renderer/core/editing/iterators/text_iterator.cc
+++ b/third_party/blink/renderer/core/editing/iterators/text_iterator.cc
@@ -176,9 +176,11 @@
   if (!behavior.EntersTextControls() && IsTextControl(node))
     return false;
 
-  if (auto* element = DynamicTo<Element>(node)) {
-    if (auto* context = element->GetDisplayLockContext()) {
-      return context->IsActivatable(DisplayLockActivationReason::kSelection);
+  if (!behavior.IgnoresDisplayLock()) {
+    if (auto* element = DynamicTo<Element>(node)) {
+      if (auto* context = element->GetDisplayLockContext()) {
+        return context->IsActivatable(DisplayLockActivationReason::kSelection);
+      }
     }
   }
   return true;
@@ -310,7 +312,14 @@
       node_ = nullptr;
       return;
     }
+
+    // If an element is locked, we shouldn't recurse down into its children
+    // since they might not have up-to-date layout. In particular, they might
+    // not have the NG offset mapping which is required. The display lock can
+    // still be bypassed by marking the iterator behavior to ignore display
+    // lock.
     const bool locked =
+        !behavior_.IgnoresDisplayLock() &&
         DisplayLockUtilities::NearestLockedInclusiveAncestor(*node_);
 
     LayoutObject* layout_object = node_->GetLayoutObject();
diff --git a/third_party/blink/renderer/core/editing/iterators/text_iterator_behavior.cc b/third_party/blink/renderer/core/editing/iterators/text_iterator_behavior.cc
index 222626f..98cabe8 100644
--- a/third_party/blink/renderer/core/editing/iterators/text_iterator_behavior.cc
+++ b/third_party/blink/renderer/core/editing/iterators/text_iterator_behavior.cc
@@ -130,6 +130,12 @@
   behavior_.values_.bits.suppresses_newline_emission = value;
   return *this;
 }
+
+TextIteratorBehavior::Builder&
+TextIteratorBehavior::Builder::SetIgnoresDisplayLock(bool value) {
+  behavior_.values_.bits.ignores_display_lock = value;
+  return *this;
+}
 // -
 TextIteratorBehavior::TextIteratorBehavior(const TextIteratorBehavior& other) =
     default;
diff --git a/third_party/blink/renderer/core/editing/iterators/text_iterator_behavior.h b/third_party/blink/renderer/core/editing/iterators/text_iterator_behavior.h
index 0ff7f22..f198a7a 100644
--- a/third_party/blink/renderer/core/editing/iterators/text_iterator_behavior.h
+++ b/third_party/blink/renderer/core/editing/iterators/text_iterator_behavior.h
@@ -71,6 +71,8 @@
   bool SuppressesExtraNewlineEmission() const {
     return values_.bits.suppresses_newline_emission;
   }
+
+  bool IgnoresDisplayLock() const { return values_.bits.ignores_display_lock; }
   static TextIteratorBehavior EmitsObjectReplacementCharacterBehavior();
   static TextIteratorBehavior IgnoresStyleVisibilityBehavior();
   static TextIteratorBehavior DefaultRangeLengthBehavior();
@@ -100,6 +102,7 @@
       bool does_not_emit_space_beyond_range_end : 1;
       bool skips_unselectable_content : 1;
       bool suppresses_newline_emission : 1;
+      bool ignores_display_lock : 1;
     } bits;
   } values_;
 };
@@ -133,6 +136,7 @@
   Builder& SetDoesNotEmitSpaceBeyondRangeEnd(bool);
   Builder& SetSkipsUnselectableContent(bool);
   Builder& SetSuppressesExtraNewlineEmission(bool);
+  Builder& SetIgnoresDisplayLock(bool);
 
  private:
   TextIteratorBehavior behavior_;
diff --git a/third_party/blink/renderer/core/editing/iterators/text_iterator_test.cc b/third_party/blink/renderer/core/editing/iterators/text_iterator_test.cc
index 1bfddc2c..d349b2b 100644
--- a/third_party/blink/renderer/core/editing/iterators/text_iterator_test.cc
+++ b/third_party/blink/renderer/core/editing/iterators/text_iterator_test.cc
@@ -1034,7 +1034,7 @@
 TEST_P(TextIteratorTest, IterateWithLockedSubtree) {
   SetBodyContent("<div id='parent'>foo<div id='locked'>text</div>bar</div>");
   auto* locked = GetDocument().getElementById("locked");
-  locked->setAttribute("rendersubtree", "invisible activatable");
+  locked->setAttribute("rendersubtree", "invisible");
   GetDocument().UpdateStyleAndLayout();
   auto* parent = GetDocument().getElementById("parent");
   const Position start_position = Position::FirstPositionInNode(*parent);
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
index 5df64a5..46a5bcb84 100644
--- a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
+++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
@@ -173,10 +173,16 @@
     const EphemeralRange& range,
     TextMatchMarker::MatchStatus match_status) {
   DCHECK(!document_->NeedsLayoutTreeUpdate());
-  AddMarkerInternal(range, [match_status](int start_offset, int end_offset) {
-    return MakeGarbageCollected<TextMatchMarker>(start_offset, end_offset,
-                                                 match_status);
-  });
+  AddMarkerInternal(
+      range,
+      [match_status](int start_offset, int end_offset) {
+        return MakeGarbageCollected<TextMatchMarker>(start_offset, end_offset,
+                                                     match_status);
+      },
+      // Since we've already determined to have a match in the given range (via
+      // FindBuffer), we can ignore the display lock for the purposes of finding
+      // where to put the marker.
+      TextIteratorBehavior::Builder().SetIgnoresDisplayLock(true).Build());
   // Don't invalidate tickmarks here. TextFinder invalidates tickmarks using a
   // throttling algorithm. crbug.com/6819.
 }
@@ -258,8 +264,10 @@
 
 void DocumentMarkerController::AddMarkerInternal(
     const EphemeralRange& range,
-    std::function<DocumentMarker*(int, int)> create_marker_from_offsets) {
-  for (TextIterator marked_text(range.StartPosition(), range.EndPosition());
+    std::function<DocumentMarker*(int, int)> create_marker_from_offsets,
+    const TextIteratorBehavior& iterator_behavior) {
+  for (TextIterator marked_text(range.StartPosition(), range.EndPosition(),
+                                iterator_behavior);
        !marked_text.AtEnd(); marked_text.Advance()) {
     const int start_offset_in_current_container =
         marked_text.StartOffsetInCurrentContainer();
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller.h b/third_party/blink/renderer/core/editing/markers/document_marker_controller.h
index 64274cd..bb13c084 100644
--- a/third_party/blink/renderer/core/editing/markers/document_marker_controller.h
+++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller.h
@@ -166,7 +166,8 @@
  private:
   void AddMarkerInternal(
       const EphemeralRange&,
-      std::function<DocumentMarker*(int, int)> create_marker_from_offsets);
+      std::function<DocumentMarker*(int, int)> create_marker_from_offsets,
+      const TextIteratorBehavior& iterator_behavior = {});
   void AddMarkerToNode(const Text&, DocumentMarker*);
 
   using MarkerLists = HeapVector<Member<DocumentMarkerList>,
diff --git a/third_party/blink/renderer/core/editing/markers/text_match_marker_list_impl.cc b/third_party/blink/renderer/core/editing/markers/text_match_marker_list_impl.cc
index 767ba9fe..f9c8599d 100644
--- a/third_party/blink/renderer/core/editing/markers/text_match_marker_list_impl.cc
+++ b/third_party/blink/renderer/core/editing/markers/text_match_marker_list_impl.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/editing/markers/text_match_marker_list_impl.h"
 
+#include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h"
 #include "third_party/blink/renderer/core/dom/node.h"
 #include "third_party/blink/renderer/core/dom/range.h"
 #include "third_party/blink/renderer/core/editing/ephemeral_range.h"
@@ -11,6 +12,7 @@
 #include "third_party/blink/renderer/core/editing/visible_units.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/local_frame_view.h"
+#include "third_party/blink/renderer/core/layout/layout_object.h"
 
 namespace blink {
 
@@ -19,14 +21,32 @@
 }
 
 static void UpdateMarkerLayoutRect(const Node& node, TextMatchMarker& marker) {
-  const Position start_position(node, marker.StartOffset());
-  const Position end_position(node, marker.EndOffset());
-  EphemeralRange range(start_position, end_position);
-
   DCHECK(node.GetDocument().GetFrame());
   LocalFrameView* frame_view = node.GetDocument().GetFrame()->View();
 
   DCHECK(frame_view);
+
+  // If we have a locked ancestor, then the only reliable place to have a marker
+  // is at the locked root rect, since the elements under a locked root might
+  // not have up-to-date layout information.
+  if (auto* locked_root =
+          DisplayLockUtilities::HighestLockedInclusiveAncestor(node)) {
+    if (auto* locked_root_layout_object = locked_root->GetLayoutObject()) {
+      marker.SetRect(frame_view->FrameToDocument(
+          PhysicalRect(locked_root_layout_object->AbsoluteBoundingBoxRect())));
+    } else {
+      // If the locked root doesn't have a layout object, then we don't have the
+      // information needed to place the tickmark. Set the marker rect to an
+      // empty rect.
+      marker.SetRect(PhysicalRect());
+    }
+    return;
+  }
+
+  const Position start_position(node, marker.StartOffset());
+  const Position end_position(node, marker.EndOffset());
+  EphemeralRange range(start_position, end_position);
+
   marker.SetRect(
       frame_view->FrameToDocument(PhysicalRect(ComputeTextRect(range))));
 }
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index ae8df17..32c645b 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -1837,11 +1837,6 @@
           this->GetScrollingCoordinator()) {
     scrolling_coordinator->NotifyGeometryChanged(this);
   }
-  SnapCoordinator& snap_coordinator =
-      frame_->GetDocument()->GetSnapCoordinator();
-  snap_coordinator.UpdateAllSnapContainerData();
-  if (RuntimeEnabledFeatures::ScrollSnapAfterLayoutEnabled())
-    snap_coordinator.ReSnapAllContainers();
 
   SendResizeEventIfNeeded();
 }
@@ -2378,6 +2373,8 @@
     frame_view.PerformScrollAnchoringAdjustments();
   });
 
+  frame_->GetDocument()->PerformScrollSnappingTasks();
+
   EnqueueScrollEvents();
 
   frame_->GetPage()->GetValidationMessageClient().LayoutOverlay();
diff --git a/third_party/blink/renderer/core/frame/root_frame_viewport.cc b/third_party/blink/renderer/core/frame/root_frame_viewport.cc
index 1efda8d..30da154a 100644
--- a/third_party/blink/renderer/core/frame/root_frame_viewport.cc
+++ b/third_party/blink/renderer/core/frame/root_frame_viewport.cc
@@ -672,6 +672,22 @@
   return LayoutViewport().SetTargetSnapAreaElementIds(snap_target_ids);
 }
 
+bool RootFrameViewport::SnapContainerDataNeedsUpdate() const {
+  return LayoutViewport().SnapContainerDataNeedsUpdate();
+}
+
+void RootFrameViewport::SetSnapContainerDataNeedsUpdate(bool needs_update) {
+  LayoutViewport().SetSnapContainerDataNeedsUpdate(needs_update);
+}
+
+bool RootFrameViewport::NeedsResnap() const {
+  return LayoutViewport().NeedsResnap();
+}
+
+void RootFrameViewport::SetNeedsResnap(bool needs_resnap) {
+  LayoutViewport().SetNeedsResnap(needs_resnap);
+}
+
 base::Optional<FloatPoint> RootFrameViewport::GetSnapPositionAndSetTarget(
     const cc::SnapSelectionStrategy& strategy) {
   return LayoutViewport().GetSnapPositionAndSetTarget(strategy);
diff --git a/third_party/blink/renderer/core/frame/root_frame_viewport.h b/third_party/blink/renderer/core/frame/root_frame_viewport.h
index f9a4456..824fe35 100644
--- a/third_party/blink/renderer/core/frame/root_frame_viewport.h
+++ b/third_party/blink/renderer/core/frame/root_frame_viewport.h
@@ -122,9 +122,16 @@
                                       unsigned = 0) const final;
   scoped_refptr<base::SingleThreadTaskRunner> GetTimerTaskRunner() const final;
   ScrollbarTheme& GetPageScrollbarTheme() const override;
+
+  // RootFrameViewport delegates these scroll-snap methods to its layout
+  // viewport.
   const cc::SnapContainerData* GetSnapContainerData() const override;
   void SetSnapContainerData(base::Optional<cc::SnapContainerData>) override;
   bool SetTargetSnapAreaElementIds(cc::TargetSnapAreaElementIds) override;
+  bool SnapContainerDataNeedsUpdate() const override;
+  void SetSnapContainerDataNeedsUpdate(bool) override;
+  bool NeedsResnap() const override;
+  void SetNeedsResnap(bool) override;
   base::Optional<FloatPoint> GetSnapPositionAndSetTarget(
       const cc::SnapSelectionStrategy& strategy) override;
 
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 93da5c3..0f2a685 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
@@ -55,9 +55,11 @@
   return FormControlState(GetElement().checked() ? "on" : "off");
 }
 
-void BaseCheckableInputType::RestoreFormControlState(
+bool BaseCheckableInputType::RestoreFormControlState(
     const FormControlState& state) {
+  bool old_checked = GetElement().checked();
   GetElement().setChecked(state[0] == "on");
+  return old_checked != GetElement().checked();
 }
 
 void BaseCheckableInputType::AppendToFormData(FormData& form_data) const {
diff --git a/third_party/blink/renderer/core/html/forms/base_checkable_input_type.h b/third_party/blink/renderer/core/html/forms/base_checkable_input_type.h
index d9696d3..8b5fc1b 100644
--- a/third_party/blink/renderer/core/html/forms/base_checkable_input_type.h
+++ b/third_party/blink/renderer/core/html/forms/base_checkable_input_type.h
@@ -57,7 +57,7 @@
  private:
   InputTypeView* CreateView() override;
   FormControlState SaveFormControlState() const final;
-  void RestoreFormControlState(const FormControlState&) final;
+  bool RestoreFormControlState(const FormControlState&) final;
   void AppendToFormData(FormData&) const final;
   void HandleKeypressEvent(KeyboardEvent&) final;
   bool CanSetStringValue() const final;
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 5e07aa0..83eb6be1 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
@@ -116,9 +116,11 @@
   return state;
 }
 
-void FileInputType::RestoreFormControlState(const FormControlState& state) {
+bool FileInputType::RestoreFormControlState(const FormControlState& state) {
+  // Check if the state is broken.
+  // See File::AppendToControlState() and File::CreateFromControlState().
   if (state.ValueSize() % 3)
-    return;
+    return false;
   HeapVector<Member<File>> file_vector =
       CreateFilesFrom<File*, HeapVector<Member<File>>>(
           state, &File::CreateFromControlState);
@@ -126,6 +128,9 @@
   for (const auto& file : file_vector)
     file_list->Append(file);
   SetFilesAndDispatchEvents(file_list);
+  // This function always returns false because SetFilesAndDispatchEvents()
+  // dispatches events if files are changed.
+  return false;
 }
 
 void FileInputType::AppendToFormData(FormData& form_data) const {
diff --git a/third_party/blink/renderer/core/html/forms/file_input_type.h b/third_party/blink/renderer/core/html/forms/file_input_type.h
index 256a752..9cb288b 100644
--- a/third_party/blink/renderer/core/html/forms/file_input_type.h
+++ b/third_party/blink/renderer/core/html/forms/file_input_type.h
@@ -67,7 +67,7 @@
   InputTypeView* CreateView() override;
   const AtomicString& FormControlType() const override;
   FormControlState SaveFormControlState() const override;
-  void RestoreFormControlState(const FormControlState&) override;
+  bool RestoreFormControlState(const FormControlState&) override;
   void AppendToFormData(FormData&) const override;
   bool ValueMissing(const String&) const override;
   String ValueMissingText() const override;
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 052cab5..c3ebbea 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
@@ -584,9 +584,10 @@
 }
 
 void HTMLInputElement::RestoreFormControlState(const FormControlState& state) {
-  input_type_view_->RestoreFormControlState(state);
-  state_restored_ = true;
-  QueueInputAndChangeEvents();
+  if (input_type_view_->RestoreFormControlState(state)) {
+    state_restored_ = true;
+    QueueInputAndChangeEvents();
+  }
 }
 
 bool HTMLInputElement::CanStartSelection() 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 68ec949..a94e7f8 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
@@ -1187,6 +1187,13 @@
   if (items_size == 0)
     return;
 
+  Vector<bool> old_selection(items_size);
+  for (wtf_size_t i = 0; i < items_size; ++i) {
+    if (auto* option = DynamicTo<HTMLOptionElement>(items[i].Get()))
+      old_selection[i] = option->Selected();
+    else
+      old_selection[i] = false;
+  }
   SelectOption(nullptr, kDeselectOtherOptionsFlag);
 
   // The saved state should have at least one value and an index.
@@ -1237,7 +1244,15 @@
   }
 
   SetNeedsValidityCheck();
-  QueueInputAndChangeEvents();
+
+  for (wtf_size_t i = 0; i < items_size; ++i) {
+    if (auto* option = DynamicTo<HTMLOptionElement>(items[i].Get())) {
+      if (old_selection[i] != option->Selected()) {
+        QueueInputAndChangeEvents();
+        break;
+      }
+    }
+  }
 }
 
 void HTMLSelectElement::ParseMultipleAttribute(const AtomicString& value) {
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 d73223d..d93d48dd 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
@@ -94,6 +94,8 @@
 
 void HTMLTextAreaElement::RestoreFormControlState(
     const FormControlState& state) {
+  if (EqualIgnoringNullity(value(), state[0]))
+    return;
   // We don't add kDispatchInputAndChangeEvent to setValue(), and we
   // post tasks to dispatch events instead. This function can be called
   // while we should not dispatch any events.
diff --git a/third_party/blink/renderer/core/html/forms/input_type_view.cc b/third_party/blink/renderer/core/html/forms/input_type_view.cc
index ed41b3c..5eada37 100644
--- a/third_party/blink/renderer/core/html/forms/input_type_view.cc
+++ b/third_party/blink/renderer/core/html/forms/input_type_view.cc
@@ -177,8 +177,10 @@
   return FormControlState(current_value);
 }
 
-void InputTypeView::RestoreFormControlState(const FormControlState& state) {
+bool InputTypeView::RestoreFormControlState(const FormControlState& state) {
+  String old_value = GetElement().value();
   GetElement().setValue(state[0]);
+  return !EqualIgnoringNullity(old_value, GetElement().value());
 }
 
 bool InputTypeView::HasBadInput() const {
diff --git a/third_party/blink/renderer/core/html/forms/input_type_view.h b/third_party/blink/renderer/core/html/forms/input_type_view.h
index ef47dea..5a190e03 100644
--- a/third_party/blink/renderer/core/html/forms/input_type_view.h
+++ b/third_party/blink/renderer/core/html/forms/input_type_view.h
@@ -128,7 +128,9 @@
   virtual void EnsurePrimaryContent() {}
   virtual bool HasFallbackContent() const { return false; }
   virtual FormControlState SaveFormControlState() const;
-  virtual void RestoreFormControlState(const FormControlState&);
+  // Should return |true| if the value is changed and the callsite needs to
+  // dispatch 'input' and 'change' events.
+  virtual bool RestoreFormControlState(const FormControlState&);
 
   // Validation functions
   virtual bool HasBadInput() const;
diff --git a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
index 4e2cada7..a30cb0a2 100644
--- a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
+++ b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
@@ -527,16 +527,18 @@
     edit->ReadOnlyStateChanged();
 }
 
-void MultipleFieldsTemporalInputTypeView::RestoreFormControlState(
+bool MultipleFieldsTemporalInputTypeView::RestoreFormControlState(
     const FormControlState& state) {
   DateTimeEditElement* edit = GetDateTimeEditElement();
   if (!edit)
-    return;
+    return false;
+  String old_value = GetElement().value();
   DateTimeFieldsState date_time_fields_state =
       DateTimeFieldsState::RestoreFormControlState(state);
   edit->SetValueAsDateTimeFieldsState(date_time_fields_state);
   GetElement().SetNonAttributeValue(input_type_->SanitizeValue(edit->Value()));
   UpdateClearButtonVisibility();
+  return !EqualIgnoringNullity(old_value, GetElement().value());
 }
 
 FormControlState MultipleFieldsTemporalInputTypeView::SaveFormControlState()
diff --git a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.h b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.h
index 7ec1c40..4e21fa2 100644
--- a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.h
+++ b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.h
@@ -107,7 +107,7 @@
   void MinOrMaxAttributeChanged() final;
   void ReadonlyAttributeChanged() final;
   void RequiredAttributeChanged() final;
-  void RestoreFormControlState(const FormControlState&) final;
+  bool RestoreFormControlState(const FormControlState&) final;
   FormControlState SaveFormControlState() const final;
   void DidSetValue(const String&, bool value_changed) final;
   void StepAttributeChanged() final;
diff --git a/third_party/blink/renderer/core/html/forms/password_input_type.cc b/third_party/blink/renderer/core/html/forms/password_input_type.cc
index 171ce120..aa054d4 100644
--- a/third_party/blink/renderer/core/html/forms/password_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/password_input_type.cc
@@ -69,9 +69,10 @@
   return FormControlState();
 }
 
-void PasswordInputType::RestoreFormControlState(const FormControlState&) {
+bool PasswordInputType::RestoreFormControlState(const FormControlState&) {
   // Should never save/restore password fields.
   NOTREACHED();
+  return false;
 }
 
 bool PasswordInputType::ShouldRespectListAttribute() {
diff --git a/third_party/blink/renderer/core/html/forms/password_input_type.h b/third_party/blink/renderer/core/html/forms/password_input_type.h
index 10804fb4..9195e2ae 100644
--- a/third_party/blink/renderer/core/html/forms/password_input_type.h
+++ b/third_party/blink/renderer/core/html/forms/password_input_type.h
@@ -47,7 +47,7 @@
   const AtomicString& FormControlType() const override;
   bool ShouldSaveAndRestoreFormControlState() const override;
   FormControlState SaveFormControlState() const override;
-  void RestoreFormControlState(const FormControlState&) override;
+  bool RestoreFormControlState(const FormControlState&) override;
   bool ShouldRespectListAttribute() override;
 
   bool NeedsContainer() const override;
diff --git a/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css b/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css
index 7ba4b2ba..475e503 100644
--- a/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css
+++ b/third_party/blink/renderer/core/html/forms/resources/calendar_picker_refresh.css
@@ -41,7 +41,7 @@
 }
 
 .calendar-navigation-button:hover {
-  background-color: #E5E5E5;
+  background-color: rgba(0, 117, 255, 0.3);
 }
 
 .calendar-navigation-button:disabled {
@@ -92,7 +92,7 @@
   border: 1px solid transparent !important;
   border-radius: 2px;
   color: #767676;
-  padding: 1px;
+  padding: 1px !important;
   text-align: center;
 }
 
@@ -103,28 +103,21 @@
 .day-cell.highlighted,
 .month-button.highlighted,
 .week-number-cell.highlighted {
-  background-color: #E5E5E5;
+  background-color: rgba(0, 117, 255, 0.3);
 }
 
 .day-cell.selected,
 .month-button.selected,
 .week-number-cell.selected {
-  background-color: #CECECE;
+  background-color: #0075FF;
+  color: #FFFFFF;
   font-weight: bold;
 }
 
 .day-cell.highlighted.today,
 .day-cell.today,
 .month-button.today {
-  background-color: #6E6E6E;
-  border: 0;
-  color: #FFFFFF;
-  font-weight: bold;
-}
-
-.day-cell.selected.today,
-.month-button.selected.today {
-  border: 2px solid #CECECE !important;
+  border-color: #767676 !important;
 }
 
 .day-cell.disabled,
@@ -148,7 +141,7 @@
 }
 
 .today-button-refresh:hover {
-  background-color: #E5E5E5;
+  background-color: rgba(0, 117, 255, 0.3);
 }
 
 .today-button-refresh:disabled {
@@ -272,14 +265,7 @@
   .day-cell.highlighted.today,
   .day-cell.today,
   .month-button.today {
-    background-color: Highlight;
-    border: 2px solid Window !important;
-    color: Window;
-  }
-
-  .day-cell.selected.today,
-  .month-button.selected.today {
-    border: 1px solid Window !important;
+    border-color: WindowText !important;
   }
 
   .day-cell.disabled,
diff --git a/third_party/blink/renderer/core/html/forms/resources/color_picker.css b/third_party/blink/renderer/core/html/forms/resources/color_picker.css
index ed9cc009..7ce1de1 100644
--- a/third_party/blink/renderer/core/html/forms/resources/color_picker.css
+++ b/third_party/blink/renderer/core/html/forms/resources/color_picker.css
@@ -16,12 +16,12 @@
   background: #FFFFFF;
   display: flex;
   flex-direction: column;
-  height: 304px;
+  height: 250px;
   width: 232px;
 }
 
 visual-color-picker {
-  height: 59%;
+  height: 71.5%;
   min-height: 0;
 }
 
@@ -167,31 +167,6 @@
   width: 172px;
 }
 
-submission-controls {
-  align-items: center;
-  border-top: 1px solid #CECECE;
-  display: flex;
-  flex-direction: row;
-  height: 13%;
-  min-height: 0;
-}
-
-#submission-controls-padding {
-  height: 100%;
-  width: 84%;
-}
-
-submission-button {
-  padding: 3%;
-  text-align: center;
-  width: 8%;
-}
-
-submission-button:hover {
-  background-color: #F3F3F3;
-  border-radius: 2px;
-}
-
 @media (forced-colors: active) {
   color-viewer {
     forced-color-adjust: none;
diff --git a/third_party/blink/renderer/core/html/forms/resources/color_picker.js b/third_party/blink/renderer/core/html/forms/resources/color_picker.js
index a91dcc3..e02931ec 100644
--- a/third_party/blink/renderer/core/html/forms/resources/color_picker.js
+++ b/third_party/blink/renderer/core/html/forms/resources/color_picker.js
@@ -425,14 +425,11 @@
     super();
 
     this.selectedColor_ = initialColor;
+    this.colorWhenOpened_ = initialColor;
 
     this.visualColorPicker_ = new VisualColorPicker(initialColor);
     this.manualColorPicker_ = new ManualColorPicker(initialColor);
-    this.submissionControls_ = new SubmissionControls(
-        this.onSubmitButtonClick_, this.onCancelButtonClick_);
-    this.append(
-        this.visualColorPicker_, this.manualColorPicker_,
-        this.submissionControls_);
+    this.append(this.visualColorPicker_, this.manualColorPicker_);
 
     this.visualColorPicker_.addEventListener(
         'visual-color-picker-initialized', this.initializeListeners_);
@@ -480,6 +477,9 @@
       this.processingManualColorChange_ = true;
       this.visualColorPicker_.color = newColor;
       this.processingManualColorChange_ = false;
+
+      const selectedValue = newColor.asHex();
+      window.pagePopupController.setValue(selectedValue);
     }
   }
 
@@ -492,6 +492,9 @@
       if (!this.processingManualColorChange_) {
         this.selectedColor = newColor;
         this.manualColorPicker_.color = newColor;
+
+        const selectedValue = newColor.asHex();
+        window.pagePopupController.setValue(selectedValue);
       } else {
         // We are making a visual color change in response to a manual color
         // change. So we do not overwrite the manually specified values and do
@@ -506,10 +509,16 @@
   onKeyDown_ = (event) => {
     switch(event.key) {
       case 'Enter':
-        this.submissionControls_.submitButton.click();
+        window.pagePopupController.closePopup();
         break;
       case 'Escape':
-        this.submissionControls_.cancelButton.click();
+        if (this.selectedColor.equals(this.colorWhenOpened_)) {
+          window.pagePopupController.closePopup();
+        } else {
+          this.manualColorPicker_.dispatchEvent(new CustomEvent(
+              'manual-color-change',
+              {bubbles: true, detail: {color: this.colorWhenOpened_}}));
+        }
         break;
       case 'Tab':
         event.preventDefault();
@@ -539,21 +548,6 @@
         'color-value-container:not(.hidden-color-value-container) > input,' +
         '[tabindex]:not([tabindex=\'-1\'])'));
   }
-
-  static get COMMIT_DELAY_MS() {
-    return 100;
-  }
-
-  onSubmitButtonClick_ = () => {
-    const selectedValue = this.selectedColor_.asHex();
-    window.setTimeout(function() {
-      window.pagePopupController.setValueAndClosePopup(0, selectedValue);
-    }, ColorPicker.COMMIT_DELAY_MS);
-  };
-
-  onCancelButtonClick_ = () => {
-    window.pagePopupController.closePopup();
-  };
 }
 window.customElements.define('color-picker', ColorPicker);
 
@@ -1873,65 +1867,3 @@
   }
 }
 window.customElements.define('channel-label', ChannelLabel);
-
-/**
- * SubmissionControls: Provides functionality to submit or discard a change.
- */
-class SubmissionControls extends HTMLElement {
-  /**
-   * @param {function} submitCallback executed if the submit button is clicked
-   * @param {function} cancelCallback executed if the cancel button is clicked
-   */
-  constructor(submitCallback, cancelCallback) {
-    super();
-
-    const padding = document.createElement('span');
-    padding.setAttribute('id', 'submission-controls-padding');
-    this.append(padding);
-
-    this.submitButton_ = new SubmissionButton(
-        submitCallback,
-        '<svg width="14" height="10" viewBox="0 0 14 10" fill="none" ' +
-            'xmlns="http://www.w3.org/2000/svg"><path d="M13.3516 ' +
-            '1.35156L5 9.71094L0.648438 5.35156L1.35156 4.64844L5 ' +
-            '8.28906L12.6484 0.648438L13.3516 1.35156Z" fill="WindowText"/></svg>');
-    this.cancelButton_ = new SubmissionButton(
-        cancelCallback,
-        '<svg width="14" height="14" viewBox="0 0 14 14" fill="none" ' +
-            'xmlns="http://www.w3.org/2000/svg"><path d="M7.71094 7L13.1016 ' +
-            '12.3984L12.3984 13.1016L7 7.71094L1.60156 13.1016L0.898438 ' +
-            '12.3984L6.28906 7L0.898438 1.60156L1.60156 0.898438L7 ' +
-            '6.28906L12.3984 0.898438L13.1016 1.60156L7.71094 7Z" ' +
-            'fill="WindowText"/></svg>');
-    this.append(this.submitButton_, this.cancelButton_);
-  }
-
-  get submitButton() {
-    return this.submitButton_;
-  }
-
-  get cancelButton() {
-    return this.cancelButton_;
-  }
-}
-window.customElements.define('submission-controls', SubmissionControls);
-
-/**
- * SubmissionButton: Button with a custom look that can be clicked for
- *                   a submission action.
- */
-class SubmissionButton extends HTMLElement {
-  /**
-   * @param {function} clickCallback executed when the button is clicked
-   * @param {string} htmlString custom look for the button
-   */
-  constructor(clickCallback, htmlString) {
-    super();
-
-    this.setAttribute('tabIndex', '0');
-    this.innerHTML = htmlString;
-
-    this.addEventListener('click', clickCallback);
-  }
-}
-window.customElements.define('submission-button', SubmissionButton);
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 ebd30d8..cc2c67a 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
@@ -52,16 +52,17 @@
 }
 
 .time-cell:hover {
-  background: #E5E5E5;
+  background-color: rgba(0, 117, 255, 0.3);
 }
 
 .time-cell.selected {
-  background-color: #CECECE;
+  background-color: #0075FF;
+  color: #FFFFFF;
   font-weight: bold;
 }
 
 .time-column:focus .time-cell.selected {
-  border-color: highlight;
+  border-color: #101010;
 }
 
 .submission-controls {
@@ -91,11 +92,11 @@
 }
 
 .submission-button:hover {
-  background-color: #E5E5E5;
+  background-color: rgba(0, 117, 255, 0.3);
 }
 
 .submission-button:focus {
-  border-color: highlight;
+  border-color: #101010;
   outline: none;
 }
 
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index 7b9cef8e..985ecec8 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -473,7 +473,6 @@
     const ComputedStyle& old_style) {
   DCHECK(Style());
   SnapCoordinator& snap_coordinator = GetDocument().GetSnapCoordinator();
-
   // scroll-snap-type and scroll-padding invalidate the snap container.
   if (old_style.GetScrollSnapType() != StyleRef().GetScrollSnapType() ||
       old_style.ScrollPaddingBottom() != StyleRef().ScrollPaddingBottom() ||
diff --git a/third_party/blink/renderer/core/layout/layout_box_model_object.cc b/third_party/blink/renderer/core/layout/layout_box_model_object.cc
index 5094150a..f53a7f9 100644
--- a/third_party/blink/renderer/core/layout/layout_box_model_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_box_model_object.cc
@@ -718,8 +718,14 @@
     // resolve the block-size of the descendant, except when in quirks mode.
     // Flexboxes follow strict behavior even in quirks mode, though.
     if (!GetDocument().InQuirksMode() ||
-        cb->IsFlexibleBoxIncludingDeprecatedAndNG())
+        cb->IsFlexibleBoxIncludingDeprecatedAndNG()) {
+      if (this_box &&
+          this_box->HasOverrideContainingBlockContentLogicalHeight()) {
+        return this_box->OverrideContainingBlockContentLogicalHeight() ==
+               LayoutUnit(-1);
+      }
       return !cb->HasDefiniteLogicalHeight();
+    }
   }
 
   return false;
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc
index 722664c..e9082e4 100644
--- a/third_party/blink/renderer/core/layout/layout_text.cc
+++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -29,6 +29,7 @@
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
 #include "third_party/blink/renderer/core/content_capture/content_capture_manager.h"
+#include "third_party/blink/renderer/core/dom/dom_node_ids.h"
 #include "third_party/blink/renderer/core/dom/text.h"
 #include "third_party/blink/renderer/core/editing/ephemeral_range.h"
 #include "third_party/blink/renderer/core/editing/frame_selection.h"
@@ -2471,8 +2472,13 @@
 
 DOMNodeId LayoutText::EnsureNodeId() {
   if (node_id_ == kInvalidDOMNodeId) {
-    if (auto* content_capture_manager = GetContentCaptureManager())
-      node_id_ = content_capture_manager->GetNodeId(*GetNode());
+    auto* content_capture_manager = GetContentCaptureManager();
+    if (content_capture_manager)
+      content_capture_manager->ScheduleTaskIfNeeded();
+
+    // If either content capture or accessibility are enabled, store a node ID.
+    if (content_capture_manager || GetDocument().ExistingAXObjectCache())
+      node_id_ = DOMNodeIds::IdForNode(GetNode());
   }
   return node_id_;
 }
diff --git a/third_party/blink/renderer/core/page/print_context_test.cc b/third_party/blink/renderer/core/page/print_context_test.cc
index cd38040..7c9e9d9 100644
--- a/third_party/blink/renderer/core/page/print_context_test.cc
+++ b/third_party/blink/renderer/core/page/print_context_test.cc
@@ -48,6 +48,10 @@
   void onDrawAnnotation(const SkRect& rect,
                         const char key[],
                         SkData* value) override {
+    // Ignore PDF node key annotations, defined in SkPDFDocument.cpp.
+    if (0 == strcmp(key, "PDF_Node_Key"))
+      return;
+
     if (rect.width() == 0 && rect.height() == 0) {
       SkPoint point = getTotalMatrix().mapXY(rect.x(), rect.y());
       Operation operation = {kDrawPoint,
diff --git a/third_party/blink/renderer/core/page/scrolling/snap_coordinator.cc b/third_party/blink/renderer/core/page/scrolling/snap_coordinator.cc
index 7b510bc..407e72c 100644
--- a/third_party/blink/renderer/core/page/scrolling/snap_coordinator.cc
+++ b/third_party/blink/renderer/core/page/scrolling/snap_coordinator.cc
@@ -84,8 +84,6 @@
 //   A1 A2   A3      +---+   A3
 //                   |   |
 //                   A1  A2
-// The snap container data does not need to be updated because it will be
-// updated at the end of the layout.
 void SnapCoordinator::AddSnapContainer(LayoutBox& snap_container) {
   snap_containers_.insert(&snap_container);
 
@@ -107,6 +105,15 @@
   }
   for (auto* snap_area : snap_areas_to_reassign)
     snap_area->SetSnapContainer(&snap_container);
+
+  // The new snap container will not have attached its ScrollableArea yet, so we
+  // cannot invalidate the snap container data at this point. However, the snap
+  // container data is set to needing an update by default, so we only need to
+  // update the flag for the ancestor.
+  if (snap_areas_to_reassign.size()) {
+    ancestor_snap_container->GetScrollableArea()
+        ->SetSnapContainerDataNeedsUpdate(true);
+  }
 }
 
 void SnapCoordinator::RemoveSnapContainer(LayoutBox& snap_container) {
@@ -119,8 +126,8 @@
   // - If it is detached, then we simply clear its snap areas since they will be
   // detached as well.
   if (ancestor_snap_container) {
-    // No need to update the ancestor's snap container data because it will be
-    // updated at the end of the layout.
+    ancestor_snap_container->GetScrollableArea()
+        ->SetSnapContainerDataNeedsUpdate(true);
     snap_container.ReassignSnapAreas(*ancestor_snap_container);
   } else {
     DCHECK(!snap_container.Parent());
@@ -141,12 +148,14 @@
       snap_container.GetDocument().documentElement())
     return;
 
+  PaintLayerScrollableArea* scrollable_area =
+      snap_container.GetScrollableArea();
   // Per specification snap positions only affect *scroll containers* [1]. So if
   // the layout box is not a scroll container we ignore it here even if it has
   // non-none scroll-snap-type. Note that in blink, existence of scrollable area
   // directly maps to being a scroll container in the specification. [1]
   // https://drafts.csswg.org/css-scroll-snap/#overview
-  if (!snap_container.GetScrollableArea()) {
+  if (!scrollable_area) {
     DCHECK(!snap_containers_.Contains(&snap_container));
     return;
   }
@@ -157,9 +166,7 @@
   // subtree for whom it is the nearest ancestor scroll container per spec [1].
   //
   // [1] https://drafts.csswg.org/css-scroll-snap/#overview
-
-  // TODO(sunyunjia): Only update when the localframe doesn't need layout.
-  UpdateSnapContainerData(snap_container);
+  scrollable_area->SetSnapContainerDataNeedsUpdate(true);
 }
 
 void SnapCoordinator::SnapAreaDidChange(LayoutBox& snap_area,
@@ -169,7 +176,7 @@
       scroll_snap_align.alignment_block == cc::SnapAlignment::kNone) {
     snap_area.SetSnapContainer(nullptr);
     if (old_container)
-      UpdateSnapContainerData(*old_container);
+      old_container->GetScrollableArea()->SetSnapContainerDataNeedsUpdate(true);
     return;
   }
 
@@ -181,18 +188,21 @@
     snap_area.SetSnapContainer(new_container);
     // TODO(sunyunjia): consider keep the SnapAreas in a map so it is
     // easier to update.
-    // TODO(sunyunjia): Only update when the localframe doesn't need layout.
-    UpdateSnapContainerData(*new_container);
+    new_container->GetScrollableArea()->SetSnapContainerDataNeedsUpdate(true);
     if (old_container && old_container != new_container)
-      UpdateSnapContainerData(*old_container);
+      old_container->GetScrollableArea()->SetSnapContainerDataNeedsUpdate(true);
   }
 }
 
-void SnapCoordinator::ReSnapAllContainers() {
+void SnapCoordinator::ResnapAllContainersIfNeeded() {
   for (const auto* container : snap_containers_) {
+    if (!container->GetScrollableArea()->NeedsResnap())
+      continue;
+
     auto* scrollable_area = ScrollableArea::GetForScrolling(container);
     ScrollOffset initial_offset = scrollable_area->GetScrollOffset();
     scrollable_area->SnapAfterLayout();
+    container->GetScrollableArea()->SetNeedsResnap(false);
 
     // If this is the first time resnapping all containers then this means this
     // is the initial layout. We record whenever the initial scroll offset
@@ -209,9 +219,11 @@
   did_first_resnap_all_containers_ = true;
 }
 
-void SnapCoordinator::UpdateAllSnapContainerData() {
-  for (auto* container : snap_containers_)
-    UpdateSnapContainerData(*container);
+void SnapCoordinator::UpdateAllSnapContainerDataIfNeeded() {
+  for (auto* container : snap_containers_) {
+    if (container->GetScrollableArea()->SnapContainerDataNeedsUpdate())
+      UpdateSnapContainerData(*container);
+  }
 }
 
 void SnapCoordinator::UpdateSnapContainerData(LayoutBox& snap_container) {
@@ -219,6 +231,7 @@
       ScrollableArea::GetForScrolling(&snap_container);
   const auto* old_snap_container_data = scrollable_area->GetSnapContainerData();
   auto snap_type = GetPhysicalSnapType(snap_container);
+  scrollable_area->SetSnapContainerDataNeedsUpdate(false);
 
   // Scrollers that don't have any snap areas assigned to them and don't snap
   // require no further processing. These are the most common types and thus
@@ -228,7 +241,6 @@
 
   cc::SnapContainerData snap_container_data(snap_type);
 
-  DCHECK(scrollable_area);
   DCHECK(snap_containers_.Contains(&snap_container));
 
   // When snap type is 'none' we don't perform any snapping so there is no need
@@ -306,11 +318,12 @@
     }
     snap_container_data.SetTargetSnapAreaElementIds(new_target_ids);
   }
-
   if (!old_snap_container_data ||
       *old_snap_container_data != snap_container_data) {
     snap_container.SetNeedsPaintPropertyUpdate();
     scrollable_area->SetSnapContainerData(snap_container_data);
+    // If the snap container data changed then we need to resnap.
+    scrollable_area->SetNeedsResnap(true);
   }
 }
 
diff --git a/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h b/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h
index dd73625..11d6a5c 100644
--- a/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h
+++ b/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h
@@ -49,15 +49,17 @@
   cc::SnapAreaData CalculateSnapAreaData(const LayoutBox& snap_area,
                                          const LayoutBox& snap_container);
 
-  // Called by LocalFrameView::PerformPostLayoutTasks(), so that the snap data
-  // are updated whenever a layout happens.
-  void UpdateAllSnapContainerData();
-  void UpdateSnapContainerData(LayoutBox&);
+  // Called by Document::PerformScrollSnappingTasks() whenever a style or layout
+  // change happens. This will update all snap container data that was affected
+  // by the style/layout change.
+  void UpdateAllSnapContainerDataIfNeeded();
 
   // Resnaps all snap containers to their current snap target, or to the
   // closest snap point if there is no target (e.g. on the initial layout or if
   // the previous snapped target was removed).
-  void ReSnapAllContainers();
+  void ResnapAllContainersIfNeeded();
+
+  void UpdateSnapContainerData(LayoutBox&);
 
 #ifndef NDEBUG
   void ShowSnapAreaMap();
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
index d4a189e..154cd338 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
@@ -1101,7 +1101,9 @@
   } else if (!HasScrollbar() && resizer_will_change) {
     Layer()->DirtyStackingContextZOrderLists();
   }
-
+  // The snap container data will be updated at the end of the layout update. If
+  // the data changes, then this will try to re-snap.
+  SetSnapContainerDataNeedsUpdate(true);
   {
     // Hits in
     // compositing/overflow/automatically-opt-into-composited-scrolling-after-style-change.html.
@@ -1179,8 +1181,7 @@
   // Recalculate the snap container data since the scrolling behaviour for this
   // layout box changed (i.e. it either became the layout viewport or it
   // is no longer the layout viewport).
-  GetLayoutBox()->GetDocument().GetSnapCoordinator().UpdateSnapContainerData(
-      *GetLayoutBox());
+  SetSnapContainerDataNeedsUpdate(true);
 }
 
 bool PaintLayerScrollableArea::ShouldPerformScrollAnchoring() const {
@@ -1759,6 +1760,23 @@
   return false;
 }
 
+bool PaintLayerScrollableArea::SnapContainerDataNeedsUpdate() const {
+  return RareData() ? RareData()->snap_container_data_needs_update_ : false;
+}
+
+void PaintLayerScrollableArea::SetSnapContainerDataNeedsUpdate(
+    bool needs_update) {
+  EnsureRareData().snap_container_data_needs_update_ = needs_update;
+}
+
+bool PaintLayerScrollableArea::NeedsResnap() const {
+  return RareData() ? RareData()->needs_resnap_ : false;
+}
+
+void PaintLayerScrollableArea::SetNeedsResnap(bool needs_resnap) {
+  EnsureRareData().needs_resnap_ = needs_resnap;
+}
+
 base::Optional<FloatPoint>
 PaintLayerScrollableArea::GetSnapPositionAndSetTarget(
     const cc::SnapSelectionStrategy& strategy) {
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
index 1994ae9..6a225418 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
@@ -77,6 +77,8 @@
 
   StickyConstraintsMap sticky_constraints_map_;
   base::Optional<cc::SnapContainerData> snap_container_data_;
+  bool snap_container_data_needs_update_ = true;
+  bool needs_resnap_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(PaintLayerScrollableAreaRareData);
 };
@@ -570,6 +572,10 @@
   const cc::SnapContainerData* GetSnapContainerData() const override;
   void SetSnapContainerData(base::Optional<cc::SnapContainerData>) override;
   bool SetTargetSnapAreaElementIds(cc::TargetSnapAreaElementIds) override;
+  bool SnapContainerDataNeedsUpdate() const override;
+  void SetSnapContainerDataNeedsUpdate(bool) override;
+  bool NeedsResnap() const override;
+  void SetNeedsResnap(bool) override;
 
   base::Optional<FloatPoint> GetSnapPositionAndSetTarget(
       const cc::SnapSelectionStrategy& strategy) override;
diff --git a/third_party/blink/renderer/core/scroll/scrollable_area.h b/third_party/blink/renderer/core/scroll/scrollable_area.h
index e34eecd..31754ea 100644
--- a/third_party/blink/renderer/core/scroll/scrollable_area.h
+++ b/third_party/blink/renderer/core/scroll/scrollable_area.h
@@ -151,6 +151,10 @@
   virtual bool SetTargetSnapAreaElementIds(cc::TargetSnapAreaElementIds) {
     return false;
   }
+  virtual bool SnapContainerDataNeedsUpdate() const { return false; }
+  virtual void SetSnapContainerDataNeedsUpdate(bool) {}
+  virtual bool NeedsResnap() const { return false; }
+  virtual void SetNeedsResnap(bool) {}
   void SnapAfterScrollbarScrolling(ScrollbarOrientation);
 
   // SnapAtCurrentPosition(), SnapForEndPosition(), SnapForDirection(), and
diff --git a/third_party/blink/renderer/modules/cache_storage/cache.cc b/third_party/blink/renderer/modules/cache_storage/cache.cc
index df15771..b31fc7f 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache.cc
+++ b/third_party/blink/renderer/modules/cache_storage/cache.cc
@@ -90,12 +90,12 @@
   if (!RuntimeEnabledFeatures::CacheStorageCodeCacheHintEnabled(context))
     return CodeCachePolicy::kAuto;
 
-  // We should never see an opaque response here.  We should have bailed out
-  // from generating code cache when we failed to determine its mime type.
   // It's important we don't look at the header hint for opaque responses since
   // it could leak cross-origin information.
-  DCHECK_NE(response->GetResponse()->GetType(),
-            network::mojom::FetchResponseType::kOpaque);
+  if (response->GetResponse()->GetType() ==
+      network::mojom::FetchResponseType::kOpaque) {
+    return CodeCachePolicy::kAuto;
+  }
 
   String header_name(
       features::kCacheStorageCodeCacheHintHeaderName.Get().data());
@@ -445,6 +445,10 @@
     fetch_api_request_ = request->CreateFetchAPIRequest();
     fetch_api_response_ = response->PopulateFetchAPIResponse(request->url());
     url_ = fetch_api_request_->url;
+    opaque_mode_ = fetch_api_response_->response_type ==
+                           network::mojom::FetchResponseType::kOpaque
+                       ? V8CodeCache::OpaqueMode::kOpaque
+                       : V8CodeCache::OpaqueMode::kNotOpaque;
   }
   ~CodeCacheHandleCallbackForPut() override = default;
 
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
index bf7ad06..2c79825c 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
@@ -1632,12 +1632,17 @@
                              NotShared<DOMArrayBufferView>(array_buffer_view),
                              color_settings);
   }
+  if (size_in_bytes > std::numeric_limits<unsigned int>::max()) {
+    exception_state.ThrowRangeError(
+        "Buffer size exceeds maximum heap object size.");
+    return nullptr;
+  }
   DOMArrayBuffer* array_buffer = DOMArrayBuffer::Create(contents);
 
   ImageData* imageData = ImageData::Create(
       image_data_rect.Size(),
       NotShared<DOMUint8ClampedArray>(DOMUint8ClampedArray::Create(
-          array_buffer, 0, array_buffer->DeprecatedByteLengthAsUnsigned())),
+          array_buffer, 0, static_cast<unsigned int>(size_in_bytes))),
       color_settings);
 
   if (!IsPaint2D()) {
diff --git a/third_party/blink/renderer/modules/encoding/text_decoder.cc b/third_party/blink/renderer/modules/encoding/text_decoder.cc
index 4294ad8e..3aeed93 100644
--- a/third_party/blink/renderer/modules/encoding/text_decoder.cc
+++ b/third_party/blink/renderer/modules/encoding/text_decoder.cc
@@ -85,9 +85,14 @@
   if (input.IsArrayBufferView()) {
     const char* start = static_cast<const char*>(
         input.GetAsArrayBufferView().View()->BaseAddress());
-    uint32_t length =
-        input.GetAsArrayBufferView().View()->deprecatedByteLengthAsUnsigned();
-    return decode(start, length, options, exception_state);
+    size_t length = input.GetAsArrayBufferView().View()->byteLengthAsSizeT();
+    if (length > std::numeric_limits<uint32_t>::max()) {
+      exception_state.ThrowRangeError(
+          "Buffer size exceeds maximum heap object size.");
+      return String();
+    }
+    return decode(start, static_cast<uint32_t>(length), options,
+                  exception_state);
   }
   DCHECK(input.IsArrayBuffer());
   const char* start =
diff --git a/third_party/blink/renderer/modules/encoding/text_decoder_stream.cc b/third_party/blink/renderer/modules/encoding/text_decoder_stream.cc
index 9ceea47..6b516a6 100644
--- a/third_party/blink/renderer/modules/encoding/text_decoder_stream.cc
+++ b/third_party/blink/renderer/modules/encoding/text_decoder_stream.cc
@@ -54,9 +54,15 @@
     if (bufferSource.IsArrayBufferView()) {
       const auto* view = bufferSource.GetAsArrayBufferView().View();
       const char* start = static_cast<const char*>(view->BaseAddress());
-      uint32_t length = view->deprecatedByteLengthAsUnsigned();
-      DecodeAndEnqueue(start, length, WTF::FlushBehavior::kDoNotFlush,
-                       controller, exception_state);
+      size_t length = view->byteLengthAsSizeT();
+      if (length > std::numeric_limits<uint32_t>::max()) {
+        exception_state.ThrowRangeError(
+            "Buffer size exceeds maximum heap object size.");
+        return ScriptPromise();
+      }
+      DecodeAndEnqueue(start, static_cast<uint32_t>(length),
+                       WTF::FlushBehavior::kDoNotFlush, controller,
+                       exception_state);
       return ScriptPromise::CastUndefined(script_state_);
     }
     DCHECK(bufferSource.IsArrayBuffer());
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
index ef4780d..57a27fe 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
@@ -294,7 +294,7 @@
 }
 
 RTCRtpHeaderExtensionParameters* ToRtpHeaderExtensionParameters(
-    const webrtc::RtpHeaderExtensionParameters& webrtc_header) {
+    const webrtc::RtpExtension& webrtc_header) {
   RTCRtpHeaderExtensionParameters* header =
       RTCRtpHeaderExtensionParameters::Create();
   header->setUri(webrtc_header.uri.c_str());
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.h b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.h
index f9accd0..9538b5b 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.h
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.h
@@ -32,7 +32,7 @@
 webrtc::RtpEncodingParameters ToRtpEncodingParameters(
     const RTCRtpEncodingParameters*);
 RTCRtpHeaderExtensionParameters* ToRtpHeaderExtensionParameters(
-    const webrtc::RtpHeaderExtensionParameters& headers);
+    const webrtc::RtpExtension& headers);
 RTCRtpCodecParameters* ToRtpCodecParameters(
     const webrtc::RtpCodecParameters& codecs);
 
diff --git a/third_party/blink/renderer/platform/wtf/allocator/partitions.cc b/third_party/blink/renderer/platform/wtf/allocator/partitions.cc
index cde5716..fc22b7d94 100644
--- a/third_party/blink/renderer/platform/wtf/allocator/partitions.cc
+++ b/third_party/blink/renderer/platform/wtf/allocator/partitions.cc
@@ -36,7 +36,6 @@
 #include "base/allocator/partition_allocator/partition_alloc.h"
 #include "base/allocator/partition_allocator/partition_root_base.h"
 #include "base/debug/alias.h"
-#include "base/lazy_instance.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/partition_allocator.h"
 #include "third_party/blink/renderer/platform/wtf/wtf.h"
 
@@ -45,63 +44,54 @@
 const char* const Partitions::kAllocatedObjectPoolName =
     "partition_alloc/allocated_objects";
 
-static base::LazyInstance<base::subtle::SpinLock>::Leaky initialization_lock_ =
-    LAZY_INSTANCE_INITIALIZER;
 bool Partitions::initialized_ = false;
 
-// These statics are inlined, so cannot be LazyInstances. We create
-// LazyInstances below, and then set the pointers correctly in Initialize().
+// These statics are inlined, so cannot be LazyInstances. We create the values,
+// and then set the pointers correctly in Initialize().
 base::PartitionRootGeneric* Partitions::fast_malloc_root_ = nullptr;
 base::PartitionRootGeneric* Partitions::array_buffer_root_ = nullptr;
 base::PartitionRootGeneric* Partitions::buffer_root_ = nullptr;
 base::PartitionRoot* Partitions::layout_root_ = nullptr;
 
-static base::LazyInstance<base::PartitionAllocatorGeneric>::Leaky
-    lazy_fast_malloc = LAZY_INSTANCE_INITIALIZER;
-static base::LazyInstance<base::PartitionAllocatorGeneric>::Leaky
-    lazy_array_buffer = LAZY_INSTANCE_INITIALIZER;
-static base::LazyInstance<base::PartitionAllocatorGeneric>::Leaky lazy_buffer =
-    LAZY_INSTANCE_INITIALIZER;
-static base::LazyInstance<base::SizeSpecificPartitionAllocator<1024>>::Leaky
-    lazy_layout = LAZY_INSTANCE_INITIALIZER;
-
+// static
 void Partitions::Initialize() {
-  base::subtle::SpinLock::Guard guard(initialization_lock_.Get());
+  static bool initialized = InitializeOnce();
+  DCHECK(initialized);
+}
 
-  if (!initialized_) {
-    base::PartitionAllocatorGeneric* fast_malloc_allocator =
-        lazy_fast_malloc.Pointer();
-    base::PartitionAllocatorGeneric* array_buffer_allocator =
-        lazy_array_buffer.Pointer();
-    base::PartitionAllocatorGeneric* buffer_allocator = lazy_buffer.Pointer();
-    base::SizeSpecificPartitionAllocator<1024>* layout_allocator =
-        lazy_layout.Pointer();
+// static
+bool Partitions::InitializeOnce() {
+  static base::PartitionAllocatorGeneric fast_malloc_allocator{};
+  static base::PartitionAllocatorGeneric array_buffer_allocator{};
+  static base::PartitionAllocatorGeneric buffer_allocator{};
+  static base::SizeSpecificPartitionAllocator<1024> layout_allocator{};
 
-    base::PartitionAllocGlobalInit(&Partitions::HandleOutOfMemory);
-    fast_malloc_allocator->init();
-    array_buffer_allocator->init();
-    buffer_allocator->init();
-    layout_allocator->init();
+  base::PartitionAllocGlobalInit(&Partitions::HandleOutOfMemory);
 
-    fast_malloc_root_ = fast_malloc_allocator->root();
-    array_buffer_root_ = array_buffer_allocator->root();
-    buffer_root_ = buffer_allocator->root();
-    layout_root_ = layout_allocator->root();
+  fast_malloc_allocator.init();
+  array_buffer_allocator.init();
+  buffer_allocator.init();
+  layout_allocator.init();
 
-    initialized_ = true;
-  }
+  fast_malloc_root_ = fast_malloc_allocator.root();
+  array_buffer_root_ = array_buffer_allocator.root();
+  buffer_root_ = buffer_allocator.root();
+  layout_root_ = layout_allocator.root();
+
+  initialized_ = true;
+  return initialized_;
 }
 
 // static
 void Partitions::StartPeriodicReclaim(
     scoped_refptr<base::SequencedTaskRunner> task_runner) {
   CHECK(IsMainThread());
-  if (!initialized_)
-    return;
+  DCHECK(initialized_);
 
   base::PartitionAllocMemoryReclaimer::Instance()->Start(task_runner);
 }
 
+// static
 void Partitions::DumpMemoryStats(
     bool is_light_dump,
     base::PartitionStatsDumper* partition_stats_dumper) {
@@ -141,6 +131,7 @@
 
 }  // namespace
 
+// static
 size_t Partitions::TotalSizeOfCommittedPages() {
   DCHECK(initialized_);
   size_t total_size = 0;
@@ -151,6 +142,7 @@
   return total_size;
 }
 
+// static
 size_t Partitions::TotalActiveBytes() {
   LightPartitionStatsDumperImpl dumper;
   WTF::Partitions::DumpMemoryStats(true, &dumper);
@@ -212,35 +204,43 @@
               << base::GetAllocPageErrorCode() << ")";
 }
 
+// static
 void* Partitions::BufferMalloc(size_t n, const char* type_name) {
   return BufferPartition()->Alloc(n, type_name);
 }
 
+// static
 void* Partitions::BufferTryRealloc(void* p, size_t n, const char* type_name) {
   return BufferPartition()->TryRealloc(p, n, type_name);
 }
 
+// static
 void Partitions::BufferFree(void* p) {
   BufferPartition()->Free(p);
 }
 
+// static
 size_t Partitions::BufferActualSize(size_t n) {
   return BufferPartition()->ActualSize(n);
 }
 
+// static
 void* Partitions::FastMalloc(size_t n, const char* type_name) {
   return FastMallocPartition()->Alloc(n, type_name);
 }
 
+// static
 void* Partitions::FastZeroedMalloc(size_t n, const char* type_name) {
   return FastMallocPartition()->AllocFlags(base::PartitionAllocZeroFill, n,
                                            type_name);
 }
 
+// static
 void Partitions::FastFree(void* p) {
   FastMallocPartition()->Free(p);
 }
 
+// static
 void Partitions::HandleOutOfMemory() {
   volatile size_t total_usage = TotalSizeOfCommittedPages();
   uint32_t alloc_page_error_code = base::GetAllocPageErrorCode();
diff --git a/third_party/blink/renderer/platform/wtf/allocator/partitions.h b/third_party/blink/renderer/platform/wtf/allocator/partitions.h
index 48e833a..4660baf 100644
--- a/third_party/blink/renderer/platform/wtf/allocator/partitions.h
+++ b/third_party/blink/renderer/platform/wtf/allocator/partitions.h
@@ -50,6 +50,7 @@
   // memory snapshots.
   static const char* const kAllocatedObjectPoolName;
 
+  // Should be called on the thread which is or will become the main one.
   static void Initialize();
   static void StartPeriodicReclaim(
       scoped_refptr<base::SequencedTaskRunner> task_runner);
@@ -98,8 +99,9 @@
     return fast_malloc_root_;
   }
 
-  static bool initialized_;
+  static bool InitializeOnce();
 
+  static bool initialized_;
   // See Allocator.md for a description of these partitions.
   static base::PartitionRootGeneric* fast_malloc_root_;
   static base::PartitionRootGeneric* array_buffer_root_;
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
index 3c31098..e3e8ba09 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
+++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -454,3 +454,5 @@
 
 # MathML depends on LayoutNG.
 crbug.com/6606 external/wpt/mathml/* [ Skip ]
+
+crbug.com/1034944 webexposed/global-interface-listing.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 2fbe7b0..a9c6d453 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1326,7 +1326,6 @@
 crbug.com/845235 virtual/layout_ng_flex_box/css3/flexbox/minimum-size-image.html [ Failure ]
 crbug.com/845235 virtual/layout_ng_flex_box/css3/flexbox/negative-overflow.html [ Failure ]
 crbug.com/845235 virtual/layout_ng_flex_box/css3/flexbox/overflow-auto-resizes-correctly.html [ Failure ]
-crbug.com/845235 virtual/layout_ng_flex_box/css3/flexbox/percentage-height-replaced-element.html [ Failure ]
 crbug.com/845235 virtual/layout_ng_flex_box/css3/flexbox/relpos-with-percentage-top.html [ Failure ]
 crbug.com/845235 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flexbox_inline.html [ Failure ]
 crbug.com/845235 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/flex-aspect-ratio-img-column-004.html [ Failure ]
@@ -3678,6 +3677,7 @@
 crbug.com/1035708 external/wpt/css/css-pseudo/grammar-error-001.html [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 [ Win7 ] external/wpt/pointerevents/pointerevent_touch-action-inherit_child-auto-child-none_touch.html [ Timeout ]
 crbug.com/626703 [ Mac ] external/wpt/css/css-text-decor/text-decoration-subelements-002.html [ Failure ]
 crbug.com/626703 [ Win ] external/wpt/css/css-text-decor/text-decoration-subelements-002.html [ Failure ]
 crbug.com/626703 [ Win7 ] external/wpt/content-security-policy/object-src/object-src-no-url-allowed.html [ Timeout ]
@@ -3872,7 +3872,6 @@
 crbug.com/626703 [ Linux ] external/wpt/shadow-dom/directionality-002.tentative.html [ Failure ]
 crbug.com/626703 [ Mac ] external/wpt/shadow-dom/directionality-002.tentative.html [ Failure ]
 crbug.com/626703 [ Win ] external/wpt/shadow-dom/directionality-002.tentative.html [ Failure ]
-crbug.com/626703 [ Mac10.10 ] external/wpt/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.13 ] wpt_internal/display-lock/rendersubtree/activation/selection.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/css/css-lists/li-value-reversed-005.html [ Failure ]
 crbug.com/626703 [ Mac ] external/wpt/css/css-lists/li-value-reversed-005.html [ Failure ]
@@ -7051,7 +7050,6 @@
 # Sheriff 2019-11-29
 crbug.com/1019079 virtual/gpu/fast/canvas/OffscreenCanvas-placeholder-createImageBitmap.html [ Pass Failure ]
 crbug.com/1019079 fast/canvas/OffscreenCanvas-placeholder-createImageBitmap.html [ Pass Failure ]
-crbug.com/1027435 [ Mac ] external/wpt/html/cross-origin-opener-policy/popup-none.https.html [ Pass Timeout ]
 crbug.com/1027434 external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html [ Pass Timeout ]
 crbug.com/1027434 virtual/not-site-per-process/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html [ Pass Timeout ]
 
@@ -7152,7 +7150,6 @@
 crbug.com/1036626 http/tests/devtools/tracing/tracing-record-input-events.js [ Pass Failure ]
 crbug.com/1036626 virtual/threaded/http/tests/devtools/tracing/tracing-record-input-events.js [ Pass Failure ]
 crbug.com/1036054 [ Mac10.13 ] virtual/threaded/fast/scroll-snap/snap-to-area-with-fractional-offset.html [ Pass Timeout ]
-crbug.com/960944 animations/web-animations/animation-state-changes-positive-playback-rate.html [ Pass Failure ]
 crbug.com/1033381 synthetic_gestures/smooth-scroll-tiny-delta.html [ Pass Crash ]
 
 # Sheriff 2019-12-27
diff --git a/third_party/blink/web_tests/animations/composition/color-composition.html b/third_party/blink/web_tests/animations/composition/color-composition.html
deleted file mode 100644
index 1973a02..0000000
--- a/third_party/blink/web_tests/animations/composition/color-composition.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<meta charset="UTF-8">
-<style>
-.target {
-  width: 40px;
-  height: 40px;
-  background-color: black;
-}
-.expected {
-  background-color: green;
-}
-</style>
-<body>
-<script src="../interpolation/resources/interpolation-test.js"></script>
-<script>
-assertComposition({
-  property: 'color',
-  underlying: 'rgb(50, 50, 50)',
-  addFrom: 'rgb(10, 10, 10)',
-  replaceTo: 'rgb(30, 30, 30)',
-}, [
-  {at: 0, is: 'rgb(60, 60, 60)'},
-  {at: 0.2, is: 'rgb(54, 54, 54)'},
-  {at: 1, is: 'rgb(30, 30, 30)'},
-  {at: 1.2, is: 'rgb(24, 24, 24)'},
-  {at: 1.5, is: 'rgb(15, 15, 15)'},
-]);
-
-assertComposition({
-  property: 'color',
-  underlying: 'rgb(60, 60, 60)',
-  addFrom: 'rgb(0, 0, 0)',
-  replaceTo: 'rgb(50, 50, 50)',
-}, [
-  {at: 0, is: 'rgb(60, 60, 60)'},
-  {at: 0.5, is: 'rgb(55, 55, 55)'},
-  {at: 1, is: 'rgb(50, 50, 50)'},
-  {at: 1.2, is: 'rgb(48, 48, 48)'},
-  {at: 1.5, is: 'rgb(45, 45, 45)'},
-]);
-</script>
-</body>
diff --git a/third_party/blink/web_tests/animations/composition/flex-basis-composition.html b/third_party/blink/web_tests/animations/composition/flex-basis-composition.html
deleted file mode 100644
index 52fb0e5..0000000
--- a/third_party/blink/web_tests/animations/composition/flex-basis-composition.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!DOCTYPE html>
-<meta charset="UTF-8">
-<body>
-<script src="../interpolation/resources/interpolation-test.js"></script>
-<script>
-assertComposition({
-  property: 'flex-basis',
-  underlying: '50px',
-  addFrom: '100px',
-  addTo: '200px',
-}, [
-  {at: -0.3, is: '120px'},
-  {at: 0, is: '150px'},
-  {at: 0.5, is: '200px'},
-  {at: 1, is: '250px'},
-  {at: 1.5, is: '300px'},
-]);
-
-assertComposition({
-  property: 'flex-basis',
-  underlying: '100px',
-  addFrom: '10px',
-  addTo: '2px',
-}, [
-  {at: -0.5, is: '114px'},
-  {at: 0, is: '110px'},
-  {at: 0.5, is: '106px'},
-  {at: 1, is: '102px'},
-  {at: 1.5, is: '98px'}, // Value clamping should happen after composition.
-]);
-
-assertComposition({
-  property: 'flex-basis',
-  underlying: '10%',
-  addFrom: '100px',
-  addTo: '20%',
-}, [
-  {at: -0.3, is: 'calc(130px + 4%)'},
-  {at: 0, is: 'calc(100px + 10%)'},
-  {at: 0.5, is: 'calc(50px + 20%)'},
-  {at: 1, is: '30%'},
-  {at: 1.5, is: 'calc(-50px + 40%)'},
-]);
-
-assertComposition({
-  property: 'flex-basis',
-  underlying: '50px',
-  addFrom: '100px',
-  replaceTo: '200px',
-}, [
-  {at: -0.3, is: '135px'},
-  {at: 0, is: '150px'},
-  {at: 0.5, is: '175px'},
-  {at: 1, is: '200px'},
-  {at: 1.5, is: '225px'},
-]);
-
-assertComposition({
-  property: 'flex-basis',
-  underlying: '100px',
-  addFrom: '100px',
-  addTo: 'auto',
-}, [
-  {at: -0.3, is: '200px'},
-  {at: 0, is: '200px'},
-  {at: 0.5, is: 'auto'},
-  {at: 1, is: 'auto'},
-  {at: 1.5, is: 'auto'},
-]);
-</script>
-</body>
diff --git a/third_party/blink/web_tests/animations/web-animations/animation-state-changes-positive-playback-rate.html b/third_party/blink/web_tests/animations/web-animations/animation-state-changes-positive-playback-rate.html
index 533ef73..9fd29693 100644
--- a/third_party/blink/web_tests/animations/web-animations/animation-state-changes-positive-playback-rate.html
+++ b/third_party/blink/web_tests/animations/web-animations/animation-state-changes-positive-playback-rate.html
@@ -61,14 +61,14 @@
 test(function(t) {
   var animation = createRunningAnimation(t);
   assert_times_equal(animation.startTime, document.timeline.currentTime - animation.currentTime);
-  assert_equals(animation.currentTime, 0);
+  assert_times_equal(animation.currentTime, 0);
   assert_equals(animation.playState, 'running');
 }, "Play state is running after playing and setting start time of a canceled animation");
 
 test(function(t) {
   var animation = createPausedAnimation(t);
   assert_equals(animation.startTime, null);
-  assert_equals(animation.currentTime, 0);
+  assert_times_equal(animation.currentTime, 0);
   assert_equals(animation.playState, 'paused');
 }, "Play state is paused after pausing and setting current time of a canceled animation");
 
@@ -206,13 +206,20 @@
   assert_equals(animation.playState, 'running');
 }, "Setting startTime on a pending starttime animation");
 
-test(function(t) {
+promise_test(async (t) => {
   var animation = createRunningAnimation(t);
+  assert_false(animation.pending);
+  // Advance the animation from the start boundary. Otherwise the test is
+  // prone to flaking. The initial value of current time is 0 +/- epsilon. If
+  // negative, the hold time is reset and a pending play is triggered, clamped
+  // to the starting boundary per spec. Conversely, if the animation is playing
+  // and current time is within bounds, then play is a no-op.
+  await waitForAnimationFrames(1);
   var startTime = animation.startTime;
   var currentTime = animation.currentTime;
   animation.play();
-  assert_equals(animation.startTime, startTime);
-  assert_equals(animation.currentTime, currentTime);
+  assert_times_equal(animation.startTime, startTime);
+  assert_times_equal(animation.currentTime, currentTime);
   assert_false(animation.pending);
   assert_equals(animation.playState, 'running');
 }, "Setting play() on a running animation");
@@ -221,7 +228,7 @@
   var animation = createRunningAnimation(t);
   animation.pause();
   assert_not_equals(animation.startTime, null);
-  assert_equals(animation.currentTime, 0);
+  assert_times_equal(animation.currentTime, 0);
   assert_true(animation.pending);
   assert_equals(animation.playState, 'paused');
   animation.ready.then(t.step_func_done(() => {
@@ -251,14 +258,20 @@
 
 test(function(t) {
   var animation = createRunningAnimation(t);
+  // Ensure the current time is precisely zero. We create a non-pending running
+  // animation by explicitly setting the start time to the timeline time. This
+  // is insufficient to ensure that we are precisely on the starting boundary
+  // due to floating point precision errors. If the resulting value of current
+  // time is slightly greater than zero, rather than snapping to the end point,
+  // the animation will simply reverse direction per spec.
+  animation.currentTime = 0;
   animation.reverse();
   assert_equals(animation.startTime, null);
-  assert_equals(animation.currentTime, 100000);
+  assert_times_equal(animation.currentTime, 100000);
   assert_true(animation.pending);
   assert_equals(animation.playState, 'running');
 }, "Setting reverse() on a running animation");
 
-
 test(function(t) {
   var animation = createRunningAnimation(t);
   animation.currentTime = 1000;
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
index bac8b7d..75e660f 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -36757,6 +36757,18 @@
      {}
     ]
    ],
+   "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html": [
+    [
+     "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html",
+     [
+      [
+       "/css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-color/border-bottom-color.xht": [
     [
      "css/css-color/border-bottom-color.xht",
@@ -135834,6 +135846,18 @@
    "css/css-color-adjust/parsing/color-scheme-valid-expected.txt": [
     []
    ],
+   "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-ref.html": [
+    []
+   ],
+   "css/css-color-adjust/rendering/dark-color-scheme/support/assert-preferred-dark.css": [
+    []
+   ],
+   "css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-ref.html": [
+    []
+   ],
+   "css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame.html": [
+    []
+   ],
    "css/css-color/LICENSE": [
     []
    ],
@@ -160713,43 +160737,151 @@
    "html/cross-origin-opener-policy/coop-sandbox.https.html.headers": [
     []
    ],
+   "html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html.headers": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html.headers": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html.headers": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html.headers": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.headers": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.headers": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html.headers": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html.headers": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html.headers": [
+    []
+   ],
    "html/cross-origin-opener-policy/no-https-expected.txt": [
     []
    ],
    "html/cross-origin-opener-policy/no-https.html.headers": [
     []
    ],
+   "html/cross-origin-opener-policy/popup-meta-http-equiv.https.html.headers": [
+    []
+   ],
    "html/cross-origin-opener-policy/popup-none.https-expected.txt": [
     []
    ],
    "html/cross-origin-opener-policy/popup-redirect-cache.https.html.headers": [
     []
    ],
+   "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html.headers": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html.headers": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html.headers": [
+    []
+   ],
    "html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html.headers": [
     []
    ],
    "html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https-expected.txt": [
     []
    ],
-   "html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.headers": [
+   "html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.headers": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html.headers": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-same-origin-with-same-site.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html.headers": [
     []
    ],
    "html/cross-origin-opener-policy/popup-same-origin.https-expected.txt": [
     []
    ],
-   "html/cross-origin-opener-policy/popup-same-origin.https.html.headers": [
-    []
-   ],
    "html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https-expected.txt": [
     []
    ],
-   "html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.headers": [
-    []
-   ],
    "html/cross-origin-opener-policy/popup-same-site.https-expected.txt": [
     []
    ],
-   "html/cross-origin-opener-policy/popup-same-site.https.html.headers": [
+   "html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html.headers": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/popup-unspecified-with-same-site.https-expected.txt": [
+    []
+   ],
+   "html/cross-origin-opener-policy/resources/call-functionCalledByOpenee.html": [
     []
    ],
    "html/cross-origin-opener-policy/resources/common.js": [
@@ -163770,15 +163902,9 @@
    "html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-simple-success.https.html.headers": [
     []
    ],
-   "html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-extra-expected.txt": [
-    []
-   ],
    "html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window-expected.txt": [
     []
    ],
-   "html/infrastructure/safe-passing-of-structured-data/structuredclone_0-expected.txt": [
-    []
-   ],
    "html/infrastructure/safe-passing-of-structured-data/transfer-errors.window-expected.txt": [
     []
    ],
@@ -175074,6 +175200,18 @@
    "service-workers/service-worker/resources/opaque-response-preloaded-xhr.html": [
     []
    ],
+   "service-workers/service-worker/resources/opaque-script-frame.html": [
+    []
+   ],
+   "service-workers/service-worker/resources/opaque-script-large.js": [
+    []
+   ],
+   "service-workers/service-worker/resources/opaque-script-small.js": [
+    []
+   ],
+   "service-workers/service-worker/resources/opaque-script-sw.js": [
+    []
+   ],
    "service-workers/service-worker/resources/other.html": [
     []
    ],
@@ -175995,30 +176133,6 @@
    "streams/transform-streams/properties.any.worker-expected.txt": [
     []
    ],
-   "streams/writable-streams/brand-checks.any-expected.txt": [
-    []
-   ],
-   "streams/writable-streams/brand-checks.any.serviceworker-expected.txt": [
-    []
-   ],
-   "streams/writable-streams/brand-checks.any.sharedworker-expected.txt": [
-    []
-   ],
-   "streams/writable-streams/brand-checks.any.worker-expected.txt": [
-    []
-   ],
-   "streams/writable-streams/close.any-expected.txt": [
-    []
-   ],
-   "streams/writable-streams/close.any.serviceworker-expected.txt": [
-    []
-   ],
-   "streams/writable-streams/close.any.sharedworker-expected.txt": [
-    []
-   ],
-   "streams/writable-streams/close.any.worker-expected.txt": [
-    []
-   ],
    "streams/writable-streams/constructor.any-expected.txt": [
     []
    ],
@@ -212278,6 +212392,12 @@
      {}
     ]
    ],
+   "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-root-background.html": [
+    [
+     "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-root-background.html",
+     {}
+    ]
+   ],
    "css/css-color/animation/color-interpolation.html": [
     [
      "css/css-color/animation/color-interpolation.html",
@@ -247449,14 +247569,6 @@
      {}
     ]
    ],
-   "fetch/metadata/appcache.tentative.https.sub.html": [
-    [
-     "fetch/metadata/appcache.tentative.https.sub.html",
-     {
-      "timeout": "long"
-     }
-    ]
-   ],
    "fetch/metadata/download.tentative.https.sub.html": [
     [
      "fetch/metadata/download.tentative.https.sub.html",
@@ -250709,6 +250821,66 @@
      {}
     ]
    ],
+   "html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html": [
+    [
+     "html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html": [
+    [
+     "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html": [
+    [
+     "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html": [
+    [
+     "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html": [
+    [
+     "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html": [
+    [
+     "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html": [
+    [
+     "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html": [
+    [
+     "html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html": [
+    [
+     "html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html": [
+    [
+     "html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html",
+     {}
+    ]
+   ],
    "html/cross-origin-opener-policy/no-https.html": [
     [
      "html/cross-origin-opener-policy/no-https.html",
@@ -250717,12 +250889,6 @@
      }
     ]
    ],
-   "html/cross-origin-opener-policy/popup-none.https.html": [
-    [
-     "html/cross-origin-opener-policy/popup-none.https.html",
-     {}
-    ]
-   ],
    "html/cross-origin-opener-policy/popup-redirect-cache.https.html": [
     [
      "html/cross-origin-opener-policy/popup-redirect-cache.https.html",
@@ -250731,33 +250897,81 @@
      }
     ]
    ],
+   "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html": [
+    [
+     "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html": [
+    [
+     "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html": [
+    [
+     "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html",
+     {}
+    ]
+   ],
    "html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html": [
     [
      "html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html",
      {}
     ]
    ],
-   "html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html": [
+   "html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html": [
     [
-     "html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html",
+     "html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html",
      {}
     ]
    ],
-   "html/cross-origin-opener-policy/popup-same-origin.https.html": [
+   "html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html": [
     [
-     "html/cross-origin-opener-policy/popup-same-origin.https.html",
+     "html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html",
      {}
     ]
    ],
-   "html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html": [
+   "html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html": [
     [
-     "html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html",
+     "html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html",
      {}
     ]
    ],
-   "html/cross-origin-opener-policy/popup-same-site.https.html": [
+   "html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https.html": [
     [
-     "html/cross-origin-opener-policy/popup-same-site.https.html",
+     "html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html": [
+    [
+     "html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html": [
+    [
+     "html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https.html": [
+    [
+     "html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https.html": [
+    [
+     "html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https.html",
+     {}
+    ]
+   ],
+   "html/cross-origin-opener-policy/popup-unspecified-with-same-site.https.html": [
+    [
+     "html/cross-origin-opener-policy/popup-unspecified-with-same-site.https.html",
      {}
     ]
    ],
@@ -300294,6 +300508,12 @@
      {}
     ]
    ],
+   "service-workers/service-worker/opaque-script.https.html": [
+    [
+     "service-workers/service-worker/opaque-script.https.html",
+     {}
+    ]
+   ],
    "service-workers/service-worker/performance-timeline.https.html": [
     [
      "service-workers/service-worker/performance-timeline.https.html",
@@ -375461,6 +375681,30 @@
    "5fb481783f0134b3b233ceb17ea4a0897eeee403",
    "testharness"
   ],
+  "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background-ref.html": [
+   "8cc4618ede4af030adc8fe5f119deccf3c2e3882",
+   "support"
+  ],
+  "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-iframe-background.html": [
+   "ee0f006b5b25702f0b2c485c46e7b8ef6788147c",
+   "reftest"
+  ],
+  "css/css-color-adjust/rendering/dark-color-scheme/color-scheme-root-background.html": [
+   "a6363971819a44e4bfc29891cbf51af6d24d1279",
+   "testharness"
+  ],
+  "css/css-color-adjust/rendering/dark-color-scheme/support/assert-preferred-dark.css": [
+   "73671b8a819ed81958b4359a1a3904f86cc98ec6",
+   "support"
+  ],
+  "css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame-ref.html": [
+   "0975119f56eee163041d58b96b80bd57173c44a9",
+   "support"
+  ],
+  "css/css-color-adjust/rendering/dark-color-scheme/support/dark-frame.html": [
+   "11f88db4a0b3e94d620b5a92314c88040210cfae",
+   "support"
+  ],
   "css/css-color/LICENSE": [
    "d47f50cca8a2d9dc40dee384ae256f8aecf44e0a",
    "support"
@@ -451565,10 +451809,6 @@
    "34864d4a4b6bd911f496026ada7bdc41ba3a6905",
    "support"
   ],
-  "fetch/metadata/appcache.tentative.https.sub.html": [
-   "3dc47c696fb87ead0ef808b99b7e6e52cff01ebe",
-   "testharness"
-  ],
   "fetch/metadata/download.tentative.https.sub.html": [
    "6f2a0434d497f695a44cc0d8972083d7cfa194c9",
    "testharness"
@@ -451630,7 +451870,7 @@
    "testharness"
   ],
   "fetch/metadata/portal.tentative.https.sub.html": [
-   "4e50b6b24b356dac6c6c7f5b7d17b7f4f01431c1",
+   "96067ae82ab7838784f6350dda7cee7840e277f8",
    "testharness"
   ],
   "fetch/metadata/prefetch.tentative.https.sub.html": [
@@ -451734,7 +451974,7 @@
    "support"
   ],
   "fetch/metadata/resources/record-header.py": [
-   "3bfb1fcdfaab6f166149b5a451f58e82bbc48531",
+   "364c800a19ce6f2060a97019d222acbf71045e93",
    "support"
   ],
   "fetch/metadata/resources/redirectTestHelper.sub.js": [
@@ -456606,11 +456846,11 @@
    "support"
   ],
   "html/cross-origin-opener-policy/coep-navigate-popup.https-expected.txt": [
-   "6e7f6000788e5608abc228f08a3ea4efa1f59b44",
+   "d9c62f210493f525df32e97eeeeff2f3c4c732e0",
    "support"
   ],
   "html/cross-origin-opener-policy/coep-navigate-popup.https.html": [
-   "21320a61b2eaa8b17cbb518d2028a5dce4134bf7",
+   "faa2793e5faaa81d4d819110ec1045dac9d9cde0",
    "testharness"
   ],
   "html/cross-origin-opener-policy/coep-navigate-popup.https.html.headers": [
@@ -456618,11 +456858,11 @@
    "support"
   ],
   "html/cross-origin-opener-policy/coep-redirect.https-expected.txt": [
-   "faa2c84f0aba957cf77f69e3affa823b82e0ccc1",
+   "e9b52b67bfb7f2d36dbb0f0620fd59fb74952702",
    "support"
   ],
   "html/cross-origin-opener-policy/coep-redirect.https.html": [
-   "73f07ddef88877aacf36ea43d47cc7aee85e5508",
+   "2727013783fa3d3c6a26f6746c1a0c28c59fdf19",
    "testharness"
   ],
   "html/cross-origin-opener-policy/coep-redirect.https.html.headers": [
@@ -456630,11 +456870,11 @@
    "support"
   ],
   "html/cross-origin-opener-policy/coep.https-expected.txt": [
-   "1bafd5c64254df00d9681048d3e2e3c3d6904a98",
+   "047797b928685a3ea285074a8e19337c8dbb1ada",
    "support"
   ],
   "html/cross-origin-opener-policy/coep.https.html": [
-   "64994cdfb76f18cb11c42cc8258209fcfd1091e3",
+   "de1dd56d9d55e5e3f1de62b16058139204c2e098",
    "testharness"
   ],
   "html/cross-origin-opener-policy/coep.https.html.headers": [
@@ -456646,11 +456886,11 @@
    "support"
   ],
   "html/cross-origin-opener-policy/coop-navigated-popup.https.html": [
-   "9a92dd9bde885e9e3ee19c6e4ef93a0e7b82e418",
+   "3c6019ace0b308562cca08d6d6bfd6484882e1db",
    "testharness"
   ],
   "html/cross-origin-opener-policy/coop-navigated-popup.https.html.headers": [
-   "a19f4400cea33a60c99807330704a23ee363b146",
+   "d83ed86fb9b5d159b9f380424887402edc96cb75",
    "support"
   ],
   "html/cross-origin-opener-policy/coop-sandbox.https-expected.txt": [
@@ -456658,33 +456898,149 @@
    "support"
   ],
   "html/cross-origin-opener-policy/coop-sandbox.https.html": [
-   "e471b1eda2ef28a1022e86a9d254608d02578e55",
+   "fc16c186cadf44bd1639d0eacf610e7781bc02bd",
    "testharness"
   ],
   "html/cross-origin-opener-policy/coop-sandbox.https.html.headers": [
    "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
    "support"
   ],
+  "html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https-expected.txt": [
+   "6d6f5a8a39f9067791a50196efee7c192501a9d3",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html": [
+   "73ef1ea29a2e91f0e4f9a9867081fe8aa5a9c81b",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https-expected.txt": [
+   "d32242d56b241f89bca2069fd7d61c3430b192dd",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html": [
+   "a8b6d543cd018b06b962b4ad1ef41b8c043ae496",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html.headers": [
+   "a19f4400cea33a60c99807330704a23ee363b146",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https-expected.txt": [
+   "cba1078fac2abf01e803cf457749dda42c72719d",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html": [
+   "aaaae2dc31799bc46d58424133edb47a8b31794c",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html.headers": [
+   "a19f4400cea33a60c99807330704a23ee363b146",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https-expected.txt": [
+   "5800c6926081f9401f3d9a3ac477020f9b3c1082",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html": [
+   "fd58b06f783966f2ad24c2c2443c422fce2e94d0",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html.headers": [
+   "a19f4400cea33a60c99807330704a23ee363b146",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https-expected.txt": [
+   "8378675c31168bc2069059b273bcb2a2a2eeea62",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html": [
+   "7330ff75bcff697490ee248f938bdbb9c79f6b88",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html.headers": [
+   "ab7b28948150ff64101ef080b0d9c7cc9a6a34d2",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https-expected.txt": [
+   "9f6a422bd55948d64dabc1ed820f318aaa2065d5",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html": [
+   "01cc6719fd3a202514444765ff6a4e4d2153f2f1",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.headers": [
+   "ab7b28948150ff64101ef080b0d9c7cc9a6a34d2",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https-expected.txt": [
+   "9074e943550e1ad52d363680e32af7c6ee8b19e6",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html": [
+   "b1a664dd9a5b8e8dd4cf561a31f85e8f2e88ae2d",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.headers": [
+   "ab7b28948150ff64101ef080b0d9c7cc9a6a34d2",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https-expected.txt": [
+   "f4b869b13751d1bcfaa135ed97cc0b90de380c24",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html": [
+   "d0fc7c79841eab57d810566e4eedc3e4f338d954",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html.headers": [
+   "34bd099a302f893f92586241ea38aac812bf28d0",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https-expected.txt": [
+   "238602183d4a112b593ef9fde6a2cedc01a150d4",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html": [
+   "67d2523e28d9af525449a192f659d5be1768532c",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html.headers": [
+   "34bd099a302f893f92586241ea38aac812bf28d0",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https-expected.txt": [
+   "36b770971ed575bb987ae8bc2403079da52469ae",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html": [
+   "78b7ca8fcad0f5a68dbf3fefd3d1945564783fad",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html.headers": [
+   "34bd099a302f893f92586241ea38aac812bf28d0",
+   "support"
+  ],
   "html/cross-origin-opener-policy/no-https-expected.txt": [
    "9cd8ef4d5ac82b925031ad0a6bfe876cd26e05fc",
    "support"
   ],
   "html/cross-origin-opener-policy/no-https.html": [
-   "014ba1f333b5e254609819bd99618ebcc6b7391b",
+   "f4e926b2eb2838c443f2e8f4d3bc024e719039a7",
    "testharness"
   ],
   "html/cross-origin-opener-policy/no-https.html.headers": [
    "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
    "support"
   ],
+  "html/cross-origin-opener-policy/popup-meta-http-equiv.https.html.headers": [
+   "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
+   "support"
+  ],
   "html/cross-origin-opener-policy/popup-none.https-expected.txt": [
    "441401ec1eb68b9cc27167f78234bb99231dfaab",
    "support"
   ],
-  "html/cross-origin-opener-policy/popup-none.https.html": [
-   "62633457d3f57135658fb4bdf959fce278dc9851",
-   "testharness"
-  ],
   "html/cross-origin-opener-policy/popup-redirect-cache.https.html": [
    "0524878a03a8d3764c63b77b5c8c4f1453c5a288",
    "testharness"
@@ -456693,8 +457049,44 @@
    "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
    "support"
   ],
+  "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https-expected.txt": [
+   "21a13c3c4e2714cf1489b46a3c6ee4c403c0c4dd",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html": [
+   "cea3788ba83d41a97b3b59bd2744db079f272a45",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html.headers": [
+   "d83ed86fb9b5d159b9f380424887402edc96cb75",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https-expected.txt": [
+   "2fc12a7ebd137f8bbb59db0d642512437231c84e",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html": [
+   "a50231f82287b03d15c186472767c215035886f6",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html.headers": [
+   "d83ed86fb9b5d159b9f380424887402edc96cb75",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https-expected.txt": [
+   "001f3bbdff9f6d878fc4b5a496089ce8fc1f977a",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html": [
+   "53b4263a70fd41bd044440abeddce3b9585e5850",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html.headers": [
+   "d83ed86fb9b5d159b9f380424887402edc96cb75",
+   "support"
+  ],
   "html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html": [
-   "65ec3b26aa0c6e7e5df857bde88f67d394af2e9e",
+   "d4005ac20d8d7d9b215fe73785d9a1a3466fcef3",
    "testharness"
   ],
   "html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html.headers": [
@@ -456705,48 +457097,108 @@
    "559011a753fb7333312e49f7d67b4dfa3a7c7137",
    "support"
   ],
-  "html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html": [
-   "2f8ebc3be3fcc7e23e64c95d5ceaaf83dfa1f67f",
+  "html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https-expected.txt": [
+   "269243a55ba2a61110b354e34b0c7cf7ecfcc715",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html": [
+   "9f7d27b3c8dc381f893c6ccf84c463db7f503f9b",
    "testharness"
   ],
-  "html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.headers": [
-   "a19f4400cea33a60c99807330704a23ee363b146",
+  "html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.headers": [
+   "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https-expected.txt": [
+   "cc419c0cd22cc7f46bf9c703b252d6c5500aafb5",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html": [
+   "c84219a80f5c83ca6e4dc244406db9f05461fa83",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html.headers": [
+   "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-same-origin-with-same-site.https-expected.txt": [
+   "4dec82fe2014cbd8ad4e30bf0baf1d4e2ad27497",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html": [
+   "b875cc2e0e4abbc215be36111a22414f72126138",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html.headers": [
+   "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
    "support"
   ],
   "html/cross-origin-opener-policy/popup-same-origin.https-expected.txt": [
    "0d082385b18e4696af0a53b727bec932fb86af6b",
    "support"
   ],
-  "html/cross-origin-opener-policy/popup-same-origin.https.html": [
-   "964011ff7621155446925010c143b025954a5a61",
-   "testharness"
-  ],
-  "html/cross-origin-opener-policy/popup-same-origin.https.html.headers": [
-   "46ad58d83bf6e98913ca4c564b7acb8f19fa0093",
-   "support"
-  ],
   "html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https-expected.txt": [
    "2dfbfd706e72c10acd53822964ef477939ea1385",
    "support"
   ],
-  "html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html": [
-   "18ee909d1865567706674b75b40a6615ef75908c",
-   "testharness"
-  ],
-  "html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.headers": [
-   "ab7b28948150ff64101ef080b0d9c7cc9a6a34d2",
-   "support"
-  ],
   "html/cross-origin-opener-policy/popup-same-site.https-expected.txt": [
    "dd1e4548e8bd75f0610ce3fa58abc128264755c0",
    "support"
   ],
-  "html/cross-origin-opener-policy/popup-same-site.https.html": [
-   "9a0db2765daeb445a892a8ece7347c6b97f24917",
+  "html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https-expected.txt": [
+   "7b65f9dcae0b2235ab125df57140d08468f55706",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https.html": [
+   "5cbf5b4c20c9b89c5cf946ebeea1733fbfb57c2c",
    "testharness"
   ],
-  "html/cross-origin-opener-policy/popup-same-site.https.html.headers": [
-   "34bd099a302f893f92586241ea38aac812bf28d0",
+  "html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https-expected.txt": [
+   "e3c145272eb286e80430522070b5937e6039a419",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html": [
+   "f8a4ebe71288d6071f3d644607132a32b0c63f79",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html.headers": [
+   "073ce7adfbd81cb7c0b2f91f96c8349b6677f26c",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https-expected.txt": [
+   "92e7b753fd95de3fb8257dd291b21795a8e0c9f8",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html": [
+   "e38acf4fcb1e1d0b039894013ab56e011c5efa8f",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https-expected.txt": [
+   "33d61be1206ab235f54bd81b345c67b20741f9fd",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https.html": [
+   "d89398cd653de327a10ff53b58b29a62e422ffb8",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https-expected.txt": [
+   "627aa8ae561d3b6b0ac82b2a8f7355cd533aaa66",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https.html": [
+   "cb6fc02ac171f606cb00a315d327062d13f32e91",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/popup-unspecified-with-same-site.https-expected.txt": [
+   "ff97a46be8fe358d7232ba585ba9980940346202",
+   "support"
+  ],
+  "html/cross-origin-opener-policy/popup-unspecified-with-same-site.https.html": [
+   "6e0edfa04233865f802a12a3ad3c4f26d50866f7",
+   "testharness"
+  ],
+  "html/cross-origin-opener-policy/resources/call-functionCalledByOpenee.html": [
+   "d0ff0b723e0f31c6ed635db95851769a598ce2a1",
    "support"
   ],
   "html/cross-origin-opener-policy/resources/common.js": [
@@ -457882,11 +458334,11 @@
    "support"
   ],
   "html/dom/idlharness.worker-expected.txt": [
-   "88f80ee37ace8c1b006bd7fd398cb365f3f24869",
+   "f03700f7dd9306e7cd01749ebf4b44ff35cf3a72",
    "support"
   ],
   "html/dom/idlharness.worker.js": [
-   "b720d54f3d953633bd7abd1e73097a31a369e825",
+   "feddaf54c9235dbb766f79990f729c8e441cbbec",
    "testharness"
   ],
   "html/dom/interfaces.https-expected.txt": [
@@ -461981,10 +462433,6 @@
    "63b60e490f47f4db77d33d7a4ca2f5b9a4181de8",
    "support"
   ],
-  "html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-extra-expected.txt": [
-   "72f317b89191fad830d3d08f48551b8af0ed9aff",
-   "support"
-  ],
   "html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-extra.html": [
    "5ff10cbc10e8f39a80d25ad5db323e3746bf0bcc",
    "testharness"
@@ -462009,10 +462457,6 @@
    "b976d5b212652bf763b4a6039a70c26758c84ccf",
    "testharness"
   ],
-  "html/infrastructure/safe-passing-of-structured-data/structuredclone_0-expected.txt": [
-   "2cd6f082563f537886db9dbb182516880e16a512",
-   "support"
-  ],
   "html/infrastructure/safe-passing-of-structured-data/structuredclone_0.html": [
    "fbb48db03838addca28181629070d57b1ea81f24",
    "testharness"
@@ -505798,7 +506242,7 @@
    "support"
   ],
   "resources/chromium/nfc-mock.js": [
-   "5cac21bc076f4166ef1b3d14860d69c9f14aedbe",
+   "be86dedd4d8877dcb01ade039c95cbb8f7acc99f",
    "support"
   ],
   "resources/chromium/sensor.mojom.js": [
@@ -508345,6 +508789,10 @@
    "417aa4ebec8380ec778bbe42f3ee8fb45649292f",
    "testharness"
   ],
+  "service-workers/service-worker/opaque-script.https.html": [
+   "7d2121855dfa17649b81fd96aad03d93e85be22b",
+   "testharness"
+  ],
   "service-workers/service-worker/performance-timeline.https.html": [
    "1fe19da53be6c460cae5f069794bbdee3f4a0da8",
    "testharness"
@@ -509321,6 +509769,22 @@
    "f31ac9b5c4ce372b182d53dd6690f1c3b498ecd1",
    "support"
   ],
+  "service-workers/service-worker/resources/opaque-script-frame.html": [
+   "a57aacec7c6f32d9c321b99057032947c877e4b8",
+   "support"
+  ],
+  "service-workers/service-worker/resources/opaque-script-large.js": [
+   "7e1c598efc5cf15f23789fefa0993e1d07ac214e",
+   "support"
+  ],
+  "service-workers/service-worker/resources/opaque-script-small.js": [
+   "8b890985752fd01d47d8cb553d6dad945dbc00bb",
+   "support"
+  ],
+  "service-workers/service-worker/resources/opaque-script-sw.js": [
+   "4d882c617d8dc6b790a51b82f3edeb65e7f18d22",
+   "support"
+  ],
   "service-workers/service-worker/resources/other.html": [
    "b9f3504387722c4583a0904cb7b7f7a4f9706b71",
    "support"
@@ -511921,50 +512385,18 @@
    "ed04b3c0a17fcd9902054e0d844171b9baa41c18",
    "testharness"
   ],
-  "streams/writable-streams/brand-checks.any-expected.txt": [
-   "bd75d6787a2ffbb88a6cfb3ea018def0366ed7ea",
-   "support"
-  ],
   "streams/writable-streams/brand-checks.any.js": [
    "17179e7936eda23a284e447bf9b877270016931d",
    "testharness"
   ],
-  "streams/writable-streams/brand-checks.any.serviceworker-expected.txt": [
-   "bd75d6787a2ffbb88a6cfb3ea018def0366ed7ea",
-   "support"
-  ],
-  "streams/writable-streams/brand-checks.any.sharedworker-expected.txt": [
-   "bd75d6787a2ffbb88a6cfb3ea018def0366ed7ea",
-   "support"
-  ],
-  "streams/writable-streams/brand-checks.any.worker-expected.txt": [
-   "bd75d6787a2ffbb88a6cfb3ea018def0366ed7ea",
-   "support"
-  ],
   "streams/writable-streams/byte-length-queuing-strategy.any.js": [
    "5edd41cc31d8d76d2cc91d7c5b2e850dc9ee43f1",
    "testharness"
   ],
-  "streams/writable-streams/close.any-expected.txt": [
-   "1ec4c49d5b6830bb7aa0f3bd7bc9fa723fdd7e9f",
-   "support"
-  ],
   "streams/writable-streams/close.any.js": [
    "0762b83e5d1476c5e70d89957e784fc9d2f80cd0",
    "testharness"
   ],
-  "streams/writable-streams/close.any.serviceworker-expected.txt": [
-   "1ec4c49d5b6830bb7aa0f3bd7bc9fa723fdd7e9f",
-   "support"
-  ],
-  "streams/writable-streams/close.any.sharedworker-expected.txt": [
-   "1ec4c49d5b6830bb7aa0f3bd7bc9fa723fdd7e9f",
-   "support"
-  ],
-  "streams/writable-streams/close.any.worker-expected.txt": [
-   "1ec4c49d5b6830bb7aa0f3bd7bc9fa723fdd7e9f",
-   "support"
-  ],
   "streams/writable-streams/constructor.any-expected.txt": [
    "408fdc9f5c05ed1571438cc6197bc5e34a7a7992",
    "support"
@@ -512002,7 +512434,7 @@
    "testharness"
   ],
   "streams/writable-streams/properties.any-expected.txt": [
-   "8a7f4cbe4b06d1fe3a541e9443b59cb08bce36eb",
+   "0f5ae376b2a4a05a01690bbe9b0d462e2b8d6374",
    "support"
   ],
   "streams/writable-streams/properties.any.js": [
@@ -512010,15 +512442,15 @@
    "testharness"
   ],
   "streams/writable-streams/properties.any.serviceworker-expected.txt": [
-   "8a7f4cbe4b06d1fe3a541e9443b59cb08bce36eb",
+   "0f5ae376b2a4a05a01690bbe9b0d462e2b8d6374",
    "support"
   ],
   "streams/writable-streams/properties.any.sharedworker-expected.txt": [
-   "8a7f4cbe4b06d1fe3a541e9443b59cb08bce36eb",
+   "0f5ae376b2a4a05a01690bbe9b0d462e2b8d6374",
    "support"
   ],
   "streams/writable-streams/properties.any.worker-expected.txt": [
-   "8a7f4cbe4b06d1fe3a541e9443b59cb08bce36eb",
+   "0f5ae376b2a4a05a01690bbe9b0d462e2b8d6374",
    "support"
   ],
   "streams/writable-streams/reentrant-strategy.any.js": [
@@ -520226,7 +520658,7 @@
    "testharness"
   ],
   "trusted-types/TrustedTypePolicyFactory-createPolicy-createXYZTests.tentative.html": [
-   "8608bcc24fed0fb050925bd52830db38082ae3b1",
+   "a78b3dbf0fd7a9532a45957970076cce16819231",
    "testharness"
   ],
   "trusted-types/TrustedTypePolicyFactory-createPolicy-cspTests-noNamesGiven.tentative.html": [
@@ -520398,7 +520830,7 @@
    "support"
   ],
   "trusted-types/support/helper.sub.js": [
-   "d13ad567a726f39299a7e7f58aeffec4ba90a908",
+   "20f56c3cbc7af094a7fd8db5d73b546804f8e9d0",
    "support"
   ],
   "trusted-types/support/navigation-report-only-support.html": [
@@ -525818,7 +526250,7 @@
    "testharness"
   ],
   "web-nfc/NDEFRecord_constructor.https.html": [
-   "2da7ca91078aa5ec8232f5347fb276618dad3c3c",
+   "0e0f1a771394570747117980c824c133ca3b060d",
    "testharness"
   ],
   "web-nfc/NDEFWriter-document-hidden-manual.https-expected.txt": [
@@ -525830,11 +526262,11 @@
    "manual"
   ],
   "web-nfc/NDEFWriter_push.https-expected.txt": [
-   "7c6b03b096f78c198b0d95dd4f6b87bc62ed011e",
+   "2b865d488d162b408d186028f09fabfbc2aabb32",
    "support"
   ],
   "web-nfc/NDEFWriter_push.https.html": [
-   "cb6b3941410035c5c5736e13d59fbbfb85f0d4cc",
+   "bf7c1f86ad0b4fdf066b4bc4584f9409d840d823",
    "testharness"
   ],
   "web-nfc/OWNERS": [
diff --git a/third_party/blink/web_tests/external/wpt/cookies/http-state/general-tests-expected.txt b/third_party/blink/web_tests/external/wpt/cookies/http-state/general-tests-expected.txt
index 4d33a0e..330d8936 100644
--- a/third_party/blink/web_tests/external/wpt/cookies/http-state/general-tests-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/cookies/http-state/general-tests-expected.txt
@@ -18,14 +18,14 @@
 PASS 0017 - Keep order if comma-separated.
 PASS 0018 - Ignore keys after semicolon.
 PASS 0019 - Ignore attributes after semicolon.
-FAIL 0020 - Ignore cookies without key and value. assert_equals: expected "a=b; c=d" but got "a=b; ; c=d"
+PASS 0020 - Ignore cookies without key and value.
 FAIL 0021 - Ignore cookie without key in all 'Set-Cookie'. assert_equals: expected "a=b; c=d" but got "a=b; x; c=d"
 PASS 0022 - Set cookie without value in all 'Set-Cookie'.
-PASS 0023 - Ignore cookies without '=' in all 'Set-Cookie'.
-PASS 0024 - Ignore malformed cookies in all 'Set-Cookie'.
-PASS 0025 - Ignore cookies with ';' in all 'Set-Cookie'.
-PASS 0026 - Ignore malformed cookies in all 'Set-Cookie' v2.
+FAIL 0023 - Ignore cookies without '=' in all 'Set-Cookie'. assert_equals: expected "" but got "foo"
+FAIL 0024 - Ignore malformed cookies in all 'Set-Cookie'. assert_equals: expected "" but got "foo"
+FAIL 0025 - Ignore cookies with ';' in all 'Set-Cookie'. assert_equals: expected "" but got "foo"
+FAIL 0026 - Ignore malformed cookies in all 'Set-Cookie' v2. assert_equals: expected "" but got "foo"
 FAIL 0027 - Ignore malformed cookies in all 'Set-Cookie' v3. assert_equals: expected "" but got "bar"
-FAIL 0028 - [INVALID EXPECTATION] Ignore malformed cookies in all 'Set-Cookie' v4. assert_equals: expected "Set-Cookie: foo\nSet-Cookie:" but got ""
+FAIL 0028 - Ignore malformed cookies in all 'Set-Cookie' v4. assert_equals: expected "" but got "foo"
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/cookies/http-state/general-tests.html b/third_party/blink/web_tests/external/wpt/cookies/http-state/general-tests.html
index c8b7ea4..d80527f9 100644
--- a/third_party/blink/web_tests/external/wpt/cookies/http-state/general-tests.html
+++ b/third_party/blink/web_tests/external/wpt/cookies/http-state/general-tests.html
@@ -49,8 +49,7 @@
         {file: "0025", name: "Ignore cookies with ';' in all 'Set-Cookie'."},
         {file: "0026", name: "Ignore malformed cookies in all 'Set-Cookie' v2."},
         {file: "0027", name: "Ignore malformed cookies in all 'Set-Cookie' v3."},
-        // TODO(fhorschig): Ask about 0028's expectations ... should be empty?
-        {file: "0028", name: "[INVALID EXPECTATION] Ignore malformed cookies in all 'Set-Cookie' v4."},
+        {file: "0028", name: "Ignore malformed cookies in all 'Set-Cookie' v4."},
       ];
 
       for (const i in TEST_CASES) {
diff --git a/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/cookie-http-state-template.js b/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/cookie-http-state-template.js
index 62459f059..b2af226e 100644
--- a/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/cookie-http-state-template.js
+++ b/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/cookie-http-state-template.js
@@ -39,7 +39,7 @@
   name = name || "";
   expiry_date = expiry_date || "Thu, 01 Jan 1970 00:00:00 UTC";
   path = path || getLocalResourcesPath();
-  document.cookie = name + "=; expires=" + expiry_date + "; path=" + path + ";";
+  document.cookie = name + "=value; expires=" + expiry_date + "; path=" + path + ";";
 }
 
 /* Captures a snapshot of cookies with |parse| and allows to diff it with a
diff --git a/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/test-files/0026-test b/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/test-files/0026-test
index 609c668..5ac72745 100644
--- a/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/test-files/0026-test
+++ b/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/test-files/0026-test
@@ -1,2 +1,2 @@
 Set-Cookie: foo
-Set-Cookie:
+Set-Cookie:    
diff --git a/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/test-files/0028-expected b/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/test-files/0028-expected
index 609c668..e69de29 100644
--- a/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/test-files/0028-expected
+++ b/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/test-files/0028-expected
@@ -1,2 +0,0 @@
-Set-Cookie: foo
-Set-Cookie:
diff --git a/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/test-files/0028-test b/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/test-files/0028-test
index 609c668..fea1e1a 100644
--- a/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/test-files/0028-test
+++ b/third_party/blink/web_tests/external/wpt/cookies/http-state/resources/test-files/0028-test
@@ -1,2 +1,2 @@
 Set-Cookie: foo
-Set-Cookie:
+Set-Cookie: 	
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/animation/color-composition.html b/third_party/blink/web_tests/external/wpt/css/css-color/animation/color-composition.html
new file mode 100644
index 0000000..c3e4818
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/animation/color-composition.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>color composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-color/#the-color-property">
+<meta name="assert" content="color supports animation by computed value type">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<style>
+.target {
+  width: 40px;
+  height: 40px;
+  background-color: black;
+}
+.expected {
+  background-color: green;
+}
+</style>
+
+<body>
+<script>
+test_composition({
+  property: 'color',
+  underlying: 'rgb(50, 50, 50)',
+  addFrom: 'rgb(10, 10, 10)',
+  replaceTo: 'rgb(30, 30, 30)',
+}, [
+  {at: 0, expect: 'rgb(60, 60, 60)'},
+  {at: 0.2, expect: 'rgb(54, 54, 54)'},
+  {at: 1, expect: 'rgb(30, 30, 30)'},
+  {at: 1.2, expect: 'rgb(24, 24, 24)'},
+  {at: 1.5, expect: 'rgb(15, 15, 15)'},
+]);
+
+test_composition({
+  property: 'color',
+  underlying: 'rgb(60, 60, 60)',
+  addFrom: 'rgb(0, 0, 0)',
+  replaceTo: 'rgb(50, 50, 50)',
+}, [
+  {at: 0, expect: 'rgb(60, 60, 60)'},
+  {at: 0.5, expect: 'rgb(55, 55, 55)'},
+  {at: 1, expect: 'rgb(50, 50, 50)'},
+  {at: 1.2, expect: 'rgb(48, 48, 48)'},
+  {at: 1.5, expect: 'rgb(45, 45, 45)'},
+]);
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/animation/flex-basis-composition.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/animation/flex-basis-composition.html
new file mode 100644
index 0000000..122761e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/animation/flex-basis-composition.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>flex-basis composition</title>
+<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#flex-basis-property">
+<meta name="assert" content="flex-basis supports animation by computed value type">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+<body>
+<script>
+test_composition({
+  property: 'flex-basis',
+  underlying: '50px',
+  addFrom: '100px',
+  addTo: '200px',
+}, [
+  {at: -0.3, expect: '120px'},
+  {at: 0, expect: '150px'},
+  {at: 0.5, expect: '200px'},
+  {at: 1, expect: '250px'},
+  {at: 1.5, expect: '300px'},
+]);
+
+test_composition({
+  property: 'flex-basis',
+  underlying: '100px',
+  addFrom: '10px',
+  addTo: '2px',
+}, [
+  {at: -0.5, expect: '114px'},
+  {at: 0, expect: '110px'},
+  {at: 0.5, expect: '106px'},
+  {at: 1, expect: '102px'},
+  {at: 1.5, expect: '98px'}, // Value clamping should happen after composition.
+]);
+
+test_composition({
+  property: 'flex-basis',
+  underlying: '10%',
+  addFrom: '100px',
+  addTo: '20%',
+}, [
+  {at: -0.3, expect: 'calc(130px + 4%)'},
+  {at: 0, expect: 'calc(100px + 10%)'},
+  {at: 0.5, expect: 'calc(50px + 20%)'},
+  {at: 1, expect: '30%'},
+  {at: 1.5, expect: 'calc(-50px + 40%)'},
+]);
+
+test_composition({
+  property: 'flex-basis',
+  underlying: '50px',
+  addFrom: '100px',
+  replaceTo: '200px',
+}, [
+  {at: -0.3, expect: '135px'},
+  {at: 0, expect: '150px'},
+  {at: 0.5, expect: '175px'},
+  {at: 1, expect: '200px'},
+  {at: 1.5, expect: '225px'},
+]);
+
+test_composition({
+  property: 'flex-basis',
+  underlying: '100px',
+  addFrom: '100px',
+  addTo: 'auto',
+}, [
+  {at: -0.3, expect: '200px'},
+  {at: 0, expect: '200px'},
+  {at: 0.5, expect: 'auto'},
+  {at: 1, expect: 'auto'},
+  {at: 1.5, expect: 'auto'},
+]);
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution-expected.txt
deleted file mode 100644
index 29efcb5..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution-expected.txt
+++ /dev/null
@@ -1,189 +0,0 @@
-This is a testharness.js-based test.
-FAIL .grid 1 assert_equals: 
-<div class="grid alignContentSpaceBetween" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 260 but got 40
-FAIL .grid 2 assert_equals: 
-<div class="grid alignContentSpaceAround" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="55" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="55" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="205" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="205" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 55 but got 0
-FAIL .grid 3 assert_equals: 
-<div class="grid alignContentSpaceEvenly" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="73" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="73" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="187" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="187" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 73 but got 0
-PASS .grid 4
-FAIL .grid 5 assert_equals: 
-<div class="grid alignContentSpaceBetween" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 130 but got 40
-FAIL .grid 6 assert_equals: 
-<div class="grid alignContentSpaceAround" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="230" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="230" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 30 but got 0
-FAIL .grid 7 assert_equals: 
-<div class="grid alignContentSpaceEvenly" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="45" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="45" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="215" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="215" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 45 but got 0
-PASS .grid 8
-FAIL .grid 9 assert_equals: 
-<div class="grid alignContentSpaceBetween" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="87" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="87" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="173" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="173" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="20" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 87 but got 40
-FAIL .grid 10 assert_equals: 
-<div class="grid alignContentSpaceAround" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="18" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="18" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="93" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="93" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="168" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="168" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="243" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="20" data-offset-y="243" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 18 but got 0
-FAIL .grid 11 assert_equals: 
-<div class="grid alignContentSpaceEvenly" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="28" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="28" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="96" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="96" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="164" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="164" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="232" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="20" data-offset-y="232" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 28 but got 0
-PASS .grid 12
-FAIL .grid 13 assert_equals: 
-<div class="grid alignContentSpaceBetween directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 260 but got 40
-FAIL .grid 14 assert_equals: 
-<div class="grid alignContentSpaceAround directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="55" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="55" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="205" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="205" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 55 but got 0
-FAIL .grid 15 assert_equals: 
-<div class="grid alignContentSpaceEvenly directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="73" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="73" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="187" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="187" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 73 but got 0
-PASS .grid 16
-FAIL .grid 17 assert_equals: 
-<div class="grid alignContentSpaceBetween directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 130 but got 40
-FAIL .grid 18 assert_equals: 
-<div class="grid alignContentSpaceAround directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="230" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="230" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 30 but got 0
-FAIL .grid 19 assert_equals: 
-<div class="grid alignContentSpaceEvenly directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="45" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="45" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="215" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="215" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 45 but got 0
-PASS .grid 20
-FAIL .grid 21 assert_equals: 
-<div class="grid alignContentSpaceBetween directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="87" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="87" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="173" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="173" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="180" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="160" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 87 but got 40
-FAIL .grid 22 assert_equals: 
-<div class="grid alignContentSpaceAround directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="18" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="18" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="93" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="93" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="168" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="168" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="180" data-offset-y="243" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="160" data-offset-y="243" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 18 but got 0
-FAIL .grid 23 assert_equals: 
-<div class="grid alignContentSpaceEvenly directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="28" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="28" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="96" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="96" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="164" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="164" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="180" data-offset-y="232" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="160" data-offset-y="232" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-offsetTop expected 28 but got 0
-PASS .grid 24
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution-vertical-lr-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution-vertical-lr-expected.txt
deleted file mode 100644
index 82b19bbb..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution-vertical-lr-expected.txt
+++ /dev/null
@@ -1,207 +0,0 @@
-This is a testharness.js-based test.
-FAIL .grid 1 assert_equals: 
-<div class="grid alignContentSpaceBetween verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 360 but got 40
-FAIL .grid 2 assert_equals: 
-<div class="grid alignContentSpaceAround verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="80" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="80" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="280" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="280" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 80 but got 0
-FAIL .grid 3 assert_equals: 
-<div class="grid alignContentSpaceEvenly verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="107" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="107" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="253" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="253" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 107 but got 0
-PASS .grid 4
-FAIL .grid 5 assert_equals: 
-<div class="grid alignContentSpaceBetween verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 180 but got 40
-FAIL .grid 6 assert_equals: 
-<div class="grid alignContentSpaceAround verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="47" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="47" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="313" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="313" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 47 but got 0
-FAIL .grid 7 assert_equals: 
-<div class="grid alignContentSpaceEvenly verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="70" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="70" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="290" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="290" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 70 but got 0
-FAIL .grid 8 assert_equals: 
-<div class="grid stretchedGrid alignContentStretch verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="133" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="133" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="267" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="267" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
-    </div>
-width expected 133 but got 134
-FAIL .grid 9 assert_equals: 
-<div class="grid alignContentSpaceBetween verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="120" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="120" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="240" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="240" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 120 but got 40
-FAIL .grid 10 assert_equals: 
-<div class="grid alignContentSpaceAround verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="30" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="30" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="130" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="130" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="230" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="230" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="330" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="330" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 30 but got 0
-FAIL .grid 11 assert_equals: 
-<div class="grid alignContentSpaceEvenly verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="48" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="48" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="136" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="136" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="224" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="224" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="312" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="312" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 48 but got 0
-PASS .grid 12
-FAIL .grid 13 assert_equals: 
-<div class="grid alignContentSpaceBetween verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 360 but got 40
-FAIL .grid 14 assert_equals: 
-<div class="grid alignContentSpaceAround verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="80" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="80" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="280" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="280" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 80 but got 0
-FAIL .grid 15 assert_equals: 
-<div class="grid alignContentSpaceEvenly verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="107" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="107" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="253" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="253" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 107 but got 0
-PASS .grid 16
-FAIL .grid 17 assert_equals: 
-<div class="grid alignContentSpaceBetween verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 180 but got 40
-FAIL .grid 18 assert_equals: 
-<div class="grid alignContentSpaceAround verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="47" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="47" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="313" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="313" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 47 but got 0
-FAIL .grid 19 assert_equals: 
-<div class="grid alignContentSpaceEvenly verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="70" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="70" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="290" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="290" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 70 but got 0
-FAIL .grid 20 assert_equals: 
-<div class="grid stretchedGrid alignContentStretch verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="133" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="133" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="267" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="267" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
-    </div>
-width expected 133 but got 134
-FAIL .grid 21 assert_equals: 
-<div class="grid alignContentSpaceBetween verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="120" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="120" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="240" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="240" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 120 but got 40
-FAIL .grid 22 assert_equals: 
-<div class="grid alignContentSpaceAround verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="30" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="30" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="130" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="130" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="230" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="230" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="330" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="330" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 30 but got 0
-FAIL .grid 23 assert_equals: 
-<div class="grid alignContentSpaceEvenly verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="48" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="48" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="136" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="136" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="224" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="224" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="312" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="312" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 48 but got 0
-PASS .grid 24
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution-vertical-lr.html b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution-vertical-lr.html
deleted file mode 100644
index 8217f4d..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution-vertical-lr.html
+++ /dev/null
@@ -1,358 +0,0 @@
-<meta charset="utf-8">
-<title>CSS Grid Layout Test: aligned content distribution for vertical lr</title>
-<link rel="author" title="Rossana Monteriso" href="mailto:rmonteriso@igalia.com">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#distribution-values">
-<meta name="assert" content="This test checks that the align-content property is applied correctly when using content-distribution values for the vertical-lr writing mode.">
-<meta name="flags" content="ahem">
-<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
-<link rel="stylesheet" href="/css/support/grid.css">
-
-<style>
-
-.grid {
-    grid-auto-columns: 20px;
-    grid-auto-rows: 40px;
-    position: relative;
-    width: 400px;
-    height: 300px;
-}
-
-.stretchedGrid {
-    grid-auto-rows: auto;
-}
-
-.thirdRowFirstColumn {
-  background-color: green;
-  grid-column: 1;
-  grid-row: 3;
-}
-
-.fourthRowFirstColumn {
-  background-color: deepskyblue;
-  grid-column: 1;
-  grid-row: 4;
-}
-
-.fourthRowSecondColumn {
-  background-color: maroon;
-  grid-column: 2;
-  grid-row: 4;
-}
-
-.thirdRowFirstColumn {
-    background-color: green;
-    grid-column: 1;
-    grid-row: 3;
-}
-
-.fourthRowFirstColumn {
-    background-color: deepskyblue;
-    grid-column: 1;
-    grid-row: 4;
-}
-
-.fourthRowSecondColumn {
-    background-color: maroon;
-    grid-column: 2;
-  	grid-row: 4;
-}
-
-</style>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/check-layout-th.js"></script>
-
-<body onload="checkLayout('.grid')">
-
-<p>This test checks that the align-content property is applied correctly when using content-distribution values in vertical-lr writing mode.</p>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="80" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="80" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="280" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="280" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="107" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="107" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="253" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="253" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="200" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="200" data-offset-y="0" data-expected-width="200" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="200" data-offset-y="20" data-expected-width="200" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="47" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="47" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="313" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="313" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="70" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="70" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="290" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="290" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="133" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="133" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="267" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="267" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="120" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="120" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="240" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="240" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="30" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="30" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="130" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="130" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="230" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="230" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="330" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="330" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="48" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="48" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="136" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="136" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="224" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="224" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="312" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="312" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch verticalLR" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="100" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="100" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="200" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="300" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="300" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
-    </div>
-</div>
-
-<!-- RTL direction. -->
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="80" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="80" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="280" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="280" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="107" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="107" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="253" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="253" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="200" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="200" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="200" data-offset-y="280" data-expected-width="200" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="200" data-offset-y="260" data-expected-width="200" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="47" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="47" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="313" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="313" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="70" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="70" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="290" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="290" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="133" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="133" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="267" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="267" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="120" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="120" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="240" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="240" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="30" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="30" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="130" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="130" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="230" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="230" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="330" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="330" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="48" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="48" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="136" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="136" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="224" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="224" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="312" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="312" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch verticalLR directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="100" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="100" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="200" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="200" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="300" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="300" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
-    </div>
-</div>
-</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution-vertical-rl-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution-vertical-rl-expected.txt
deleted file mode 100644
index 732395093..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution-vertical-rl-expected.txt
+++ /dev/null
@@ -1,207 +0,0 @@
-This is a testharness.js-based test.
-FAIL .grid 1 assert_equals: 
-<div class="grid alignContentSpaceBetween verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 0 but got 320
-FAIL .grid 2 assert_equals: 
-<div class="grid alignContentSpaceAround verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="280" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="280" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="80" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="80" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 280 but got 360
-FAIL .grid 3 assert_equals: 
-<div class="grid alignContentSpaceEvenly verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="253" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="253" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="107" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="107" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 253 but got 360
-PASS .grid 4
-FAIL .grid 5 assert_equals: 
-<div class="grid alignContentSpaceBetween verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 180 but got 320
-FAIL .grid 6 assert_equals: 
-<div class="grid alignContentSpaceAround verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="313" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="313" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="47" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="47" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 313 but got 360
-FAIL .grid 7 assert_equals: 
-<div class="grid alignContentSpaceEvenly verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="290" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="290" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="70" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="70" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 290 but got 360
-FAIL .grid 8 assert_equals: 
-<div class="grid stretchedGrid alignContentStretch verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="267" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="267" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="133" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="133" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
-    </div>
-width expected 133 but got 134
-FAIL .grid 9 assert_equals: 
-<div class="grid alignContentSpaceBetween verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="240" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="240" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="120" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="120" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 240 but got 320
-FAIL .grid 10 assert_equals: 
-<div class="grid alignContentSpaceAround verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="330" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="330" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="230" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="230" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="130" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="130" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="30" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="30" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 330 but got 360
-FAIL .grid 11 assert_equals: 
-<div class="grid alignContentSpaceEvenly verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="312" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="312" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="224" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="224" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="136" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="136" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="48" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="48" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 312 but got 360
-PASS .grid 12
-FAIL .grid 13 assert_equals: 
-<div class="grid alignContentSpaceBetween verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 0 but got 320
-FAIL .grid 14 assert_equals: 
-<div class="grid alignContentSpaceAround verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="280" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="280" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="80" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="80" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 280 but got 360
-FAIL .grid 15 assert_equals: 
-<div class="grid alignContentSpaceEvenly verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="253" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="253" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="107" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="107" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 253 but got 360
-PASS .grid 16
-FAIL .grid 17 assert_equals: 
-<div class="grid alignContentSpaceBetween verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 180 but got 320
-FAIL .grid 18 assert_equals: 
-<div class="grid alignContentSpaceAround verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="313" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="313" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="47" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="47" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 313 but got 360
-FAIL .grid 19 assert_equals: 
-<div class="grid alignContentSpaceEvenly verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="290" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="290" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="70" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="70" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 290 but got 360
-FAIL .grid 20 assert_equals: 
-<div class="grid stretchedGrid alignContentStretch verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="267" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="267" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="133" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="133" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
-    </div>
-width expected 133 but got 134
-FAIL .grid 21 assert_equals: 
-<div class="grid alignContentSpaceBetween verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="240" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="240" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="120" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="120" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 240 but got 320
-FAIL .grid 22 assert_equals: 
-<div class="grid alignContentSpaceAround verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="330" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="330" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="230" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="230" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="130" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="130" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="30" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="30" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 330 but got 360
-FAIL .grid 23 assert_equals: 
-<div class="grid alignContentSpaceEvenly verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="312" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="312" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="224" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="224" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="136" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="136" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="48" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="48" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-offsetLeft expected 312 but got 360
-PASS .grid 24
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution-vertical-rl.html b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution-vertical-rl.html
deleted file mode 100644
index 096e3fd6..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution-vertical-rl.html
+++ /dev/null
@@ -1,358 +0,0 @@
-<meta charset="utf-8">
-<title>CSS Grid Layout Test: aligned content distribution for vertical rl</title>
-<link rel="author" title="Rossana Monteriso" href="mailto:rmonteriso@igalia.com">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#distribution-values">
-<meta name="assert" content="This test checks that the align-content property is applied correctly when using content-distribution values for the vertical-rl writing mode.">
-<meta name="flags" content="ahem">
-<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
-<link rel="stylesheet" href="/css/support/grid.css">
-
-<style>
-
-.grid {
-    grid-auto-columns: 20px;
-    grid-auto-rows: 40px;
-    position: relative;
-    width: 400px;
-    height: 300px;
-}
-
-.stretchedGrid {
-    grid-auto-rows: auto;
-}
-
-.thirdRowFirstColumn {
-  background-color: green;
-  grid-column: 1;
-  grid-row: 3;
-}
-
-.fourthRowFirstColumn {
-  background-color: deepskyblue;
-  grid-column: 1;
-  grid-row: 4;
-}
-
-.fourthRowSecondColumn {
-  background-color: maroon;
-  grid-column: 2;
-  grid-row: 4;
-}
-
-.thirdRowFirstColumn {
-    background-color: green;
-    grid-column: 1;
-    grid-row: 3;
-}
-
-.fourthRowFirstColumn {
-    background-color: deepskyblue;
-    grid-column: 1;
-    grid-row: 4;
-}
-
-.fourthRowSecondColumn {
-    background-color: maroon;
-    grid-column: 2;
-  	grid-row: 4;
-}
-
-</style>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/check-layout-th.js"></script>
-
-<body onload="checkLayout('.grid')">
-
-<p>This test checks that the align-content property is applied correctly when using content-distribution values for vertical-rl mode.</p>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="280" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="280" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="80" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="80" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="253" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="253" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="107" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="107" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="200" data-offset-y="0" data-expected-width="200" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="200" data-offset-y="20" data-expected-width="200" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="200" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="313" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="313" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="47" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="47" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="290" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="290" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="70" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="70" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="267" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="267" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="133" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="133" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="133" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="240" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="240" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="120" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="120" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="330" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="330" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="230" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="230" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="130" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="130" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="30" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="30" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="312" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="312" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="224" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="224" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="136" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="136" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="48" data-offset-y="0" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="48" data-offset-y="20" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch verticalRL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="300" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="300" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="200" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="200" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="100" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="100" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="0" data-offset-y="20" data-expected-width="100" data-expected-height="20"></div>
-    </div>
-</div>
-
-<!-- RTL direction. -->
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="280" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="280" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="80" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="80" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="253" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="253" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="107" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="107" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="200" data-offset-y="280" data-expected-width="200" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="200" data-offset-y="260" data-expected-width="200" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="200" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="200" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="313" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="313" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="47" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="47" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="290" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="290" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="180" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="70" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="70" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="267" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="267" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="133" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="133" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="133" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="133" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="360" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="360" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="240" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="240" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="120" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="120" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="330" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="330" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="230" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="230" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="130" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="130" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="30" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="30" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="312" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="312" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="224" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="224" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="136" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="136" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="48" data-offset-y="280" data-expected-width="40" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="48" data-offset-y="260" data-expected-width="40" data-expected-height="20"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch verticalRL directionRTL" data-expected-width="400" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="300" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
-        <div class="firstRowSecondColumn" data-offset-x="300" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
-        <div class="secondRowFirstColumn" data-offset-x="200" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
-        <div class="secondRowSecondColumn" data-offset-x="200" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="100" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="100" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="100" data-expected-height="20"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="0" data-offset-y="260" data-expected-width="100" data-expected-height="20"></div>
-    </div>
-</div>
-</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution.html b/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution.html
deleted file mode 100644
index 7b66ddb..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/alignment/grid-align-content-distribution.html
+++ /dev/null
@@ -1,358 +0,0 @@
-<meta charset="utf-8">
-<title>CSS Grid Layout Test: aligned content distribution</title>
-<link rel="author" title="Rossana Monteriso" href="mailto:rmonteriso@igalia.com">
-<link rel="help" href="https://drafts.csswg.org/css-align-3/#distribution-values">
-<meta name="assert" content="This test checks that the align-content property is applied correctly when using content-distribution values.">
-<meta name="flags" content="ahem">
-<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
-<link rel="stylesheet" href="/css/support/grid.css">
-
-<style>
-
-.grid {
-    grid-auto-columns: 20px;
-    grid-auto-rows: 40px;
-    position: relative;
-    width: 200px;
-    height: 300px;
-}
-
-.stretchedGrid {
-    grid-auto-rows: auto;
-}
-
-.thirdRowFirstColumn {
-  background-color: green;
-  grid-column: 1;
-  grid-row: 3;
-}
-
-.fourthRowFirstColumn {
-  background-color: deepskyblue;
-  grid-column: 1;
-  grid-row: 4;
-}
-
-.fourthRowSecondColumn {
-  background-color: maroon;
-  grid-column: 2;
-  grid-row: 4;
-}
-
-.thirdRowFirstColumn {
-    background-color: green;
-    grid-column: 1;
-    grid-row: 3;
-}
-
-.fourthRowFirstColumn {
-    background-color: deepskyblue;
-    grid-column: 1;
-    grid-row: 4;
-}
-
-.fourthRowSecondColumn {
-    background-color: maroon;
-    grid-column: 2;
-  	grid-row: 4;
-}
-
-</style>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/check-layout-th.js"></script>
-
-<body onload="checkLayout('.grid')">
-
-<p>This test checks that the align-content property is applied correctly when using content-distribution values.</p>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="55" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="55" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="205" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="205" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="73" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="73" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="187" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="187" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="150"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="0" data-expected-width="20" data-expected-height="150"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="150" data-expected-width="20" data-expected-height="150"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="150" data-expected-width="20" data-expected-height="150"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="230" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="230" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="45" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="45" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="215" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="215" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="100"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="0" data-expected-width="20" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="100" data-expected-width="20" data-expected-height="100"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="100" data-expected-width="20" data-expected-height="100"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="100"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="200" data-expected-width="20" data-expected-height="100"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="87" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="87" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="173" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="173" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="20" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="18" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="18" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="93" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="93" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="168" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="168" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="243" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="20" data-offset-y="243" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="28" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="28" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="96" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="96" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="164" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="164" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="232" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="20" data-offset-y="232" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="75"></div>
-        <div class="firstRowSecondColumn" data-offset-x="20" data-offset-y="0" data-expected-width="20" data-expected-height="75"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="75" data-expected-width="20" data-expected-height="75"></div>
-        <div class="secondRowSecondColumn" data-offset-x="20" data-offset-y="75" data-expected-width="20" data-expected-height="75"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="0" data-offset-y="150" data-expected-width="20" data-expected-height="75"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="20" data-offset-y="150" data-expected-width="20" data-expected-height="75"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="0" data-offset-y="225" data-expected-width="20" data-expected-height="75"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="20" data-offset-y="225" data-expected-width="20" data-expected-height="75"></div>
-    </div>
-</div>
-
-<!-- RTL direction. -->
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="55" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="55" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="205" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="205" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="73" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="73" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="187" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="187" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="150"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="0" data-expected-width="20" data-expected-height="150"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="150" data-expected-width="20" data-expected-height="150"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="150" data-expected-width="20" data-expected-height="150"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="30" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="230" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="230" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="45" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="45" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="130" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="215" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="215" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="100"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="0" data-expected-width="20" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="100" data-expected-width="20" data-expected-height="100"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="100" data-expected-width="20" data-expected-height="100"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="200" data-expected-width="20" data-expected-height="100"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="200" data-expected-width="20" data-expected-height="100"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-between'</p>
-    <div class="grid alignContentSpaceBetween directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="87" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="87" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="173" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="173" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="180" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="160" data-offset-y="260" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-around'</p>
-    <div class="grid alignContentSpaceAround directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="18" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="18" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="93" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="93" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="168" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="168" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="180" data-offset-y="243" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="160" data-offset-y="243" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'space-evenly'</p>
-    <div class="grid alignContentSpaceEvenly directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="28" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="28" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="96" data-expected-width="20" data-expected-height="40"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="96" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="164" data-expected-width="20" data-expected-height="40"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="164" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="180" data-offset-y="232" data-expected-width="20" data-expected-height="40"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="160" data-offset-y="232" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'stretch'</p>
-    <div class="grid stretchedGrid alignContentStretch directionRTL" data-expected-width="200" data-expected-height="300">
-        <div class="firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="75"></div>
-        <div class="firstRowSecondColumn" data-offset-x="160" data-offset-y="0" data-expected-width="20" data-expected-height="75"></div>
-        <div class="secondRowFirstColumn" data-offset-x="180" data-offset-y="75" data-expected-width="20" data-expected-height="75"></div>
-        <div class="secondRowSecondColumn" data-offset-x="160" data-offset-y="75" data-expected-width="20" data-expected-height="75"></div>
-        <div class="thirdRowFirstColumn" data-offset-x="180" data-offset-y="150" data-expected-width="20" data-expected-height="75"></div>
-        <div class="thirdRowSecondColumn" data-offset-x="160" data-offset-y="150" data-expected-width="20" data-expected-height="75"></div>
-        <div class="fourthRowFirstColumn" data-offset-x="180" data-offset-y="225" data-expected-width="20" data-expected-height="75"></div>
-        <div class="fourthRowSecondColumn" data-offset-x="160" data-offset-y="225" data-expected-width="20" data-expected-height="75"></div>
-    </div>
-</div>
-</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align.html
new file mode 100644
index 0000000..3be68fe
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-align.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html>
+<title>
+  Updating the snap alignment of a snap container's content should make the snap
+  container resnap accordingly.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-scroll-snap/#re-snap" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+div {
+  position: absolute;
+  margin: 0;
+}
+
+#scroller {
+  height: 200px;
+  width: 200px;
+  overflow: hidden;
+  scroll-snap-type: both mandatory;
+}
+
+#initial-target {
+  width: 300px;
+  height: 300px;
+  top: 100px;
+  left: 100px;
+  background-color: green;
+  scroll-snap-align: start;
+}
+
+#other-target {
+  width: 300px;
+  height: 300px;
+  top: 300px;
+  left: 300px;
+  background-color: red;
+  scroll-snap-align: start;
+}
+
+.area {
+  width: 2000px;
+  height: 2000px;
+}
+
+.snap-area {
+  scroll-snap-align: start !important;
+}
+</style>
+
+<div id="scroller">
+  <div class="area"></div>
+  <div id="initial-target"></div>
+  <div id="other-target"></div>
+</div>
+
+<script>
+const initial_target = document.getElementById("initial-target");
+const other_target = document.getElementById("other-target");
+const scroller = document.getElementById("scroller");
+
+function cleanup() {
+  initial_target.style.setProperty("scroll-snap-align", "start");
+  other_target.style.setProperty("scroll-snap-align", "start");
+  initial_target.removeAttribute("class");
+}
+
+test(t => {
+  t.add_cleanup(cleanup);
+  scroller.scrollTo(0,0);
+  assert_equals(scroller.scrollTop, 100);
+  assert_equals(scroller.scrollLeft, 100);
+
+  initial_target.style.setProperty("scroll-snap-align", "end");
+  // target.top + target.height - scroller.height
+  assert_equals(scroller.scrollTop, 200);
+  assert_equals(scroller.scrollLeft, 200);
+}, "Changing the current target's snap alignment should make the scroller"
++ " resnap to it even if another snap position is closer to the current offset");
+
+test(t => {
+  t.add_cleanup(cleanup);
+  scroller.scrollTo(0,0);
+  assert_equals(scroller.scrollTop, 100);
+  assert_equals(scroller.scrollLeft, 100);
+
+  initial_target.style.setProperty("scroll-snap-align", "none");
+  assert_equals(scroller.scrollTop, 300);
+  assert_equals(scroller.scrollLeft, 300);
+}, "Removing the current target's snap alignment should make the scroller"
++ " resnap to a new snap area.");
+
+test(t => {
+  t.add_cleanup(cleanup);
+  initial_target.style.setProperty("scroll-snap-align", "none");
+  other_target.style.setProperty("scroll-snap-align", "none");
+
+  scroller.scrollTo(0,0);
+  assert_equals(scroller.scrollTop, 0);
+  assert_equals(scroller.scrollLeft, 0);
+
+  initial_target.style.setProperty("scroll-snap-align", "start");
+  assert_equals(scroller.scrollTop, 100);
+  assert_equals(scroller.scrollLeft, 100);
+}, "Changing an element snap alignment from none to start should make the"
++ "scroller resnap.");
+
+test(t => {
+  t.add_cleanup(cleanup);
+  initial_target.style.setProperty("scroll-snap-align", "none");
+  other_target.style.setProperty("scroll-snap-align", "none");
+
+  scroller.scrollTo(0,0);
+  assert_equals(scroller.scrollTop, 0);
+  assert_equals(scroller.scrollLeft, 0);
+
+  initial_target.classList.add("snap-area");
+  assert_equals(scroller.scrollTop, 100);
+  assert_equals(scroller.scrollLeft, 100);
+}, "Changing an element snap alignment from none to start by adding a class"
++ " should make the scroller resnap.");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-type.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-type.html
new file mode 100644
index 0000000..70774b3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/snap-after-relayout/changing-scroll-snap-type.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<title>
+  Updating the scroll-snap-type of a snap container should make it resnap accordingly.
+</title>
+<link rel="help" href="https://drafts.csswg.org/css-scroll-snap/#re-snap" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+div {
+  position: absolute;
+  margin: 0;
+}
+
+#scroller {
+  height: 500px;
+  width: 500px;
+  overflow: hidden;
+  scroll-snap-type: none;
+}
+
+#y-target {
+  width: 300px;
+  height: 300px;
+  top: 100px;
+  left: 0;
+  background-color: green;
+  scroll-snap-align: start none;
+}
+
+#x-target {
+  width: 300px;
+  height: 300px;
+  top: 0;
+  left: 100px;
+  background-color: red;
+  scroll-snap-align: none start;
+}
+
+.area {
+  width: 2000px;
+  height: 2000px;
+}
+</style>
+
+<div id="scroller">
+  <div class="area"></div>
+  <div id="x-target"></div>
+  <div id="y-target"></div>
+</div>
+
+<script>
+const x_target = document.getElementById("x_target");
+const y_target = document.getElementById("y_target");
+const scroller = document.getElementById("scroller");
+
+function cleanup() {
+  scroller.style.setProperty("scroll-snap-type", "none");
+}
+
+test(t => {
+  t.add_cleanup(cleanup);
+  scroller.scrollTo(0,0);
+  assert_equals(scroller.scrollTop, 0);
+  assert_equals(scroller.scrollLeft, 0);
+
+  scroller.style.setProperty("scroll-snap-type", "y mandatory");
+  assert_equals(scroller.scrollTop, 100);
+  assert_equals(scroller.scrollLeft, 0);
+}, "Changing the scroller's snap type to y should make it resnap on the y-axis.");
+
+test(t => {
+  t.add_cleanup(cleanup);
+  scroller.scrollTo(0,0);
+  assert_equals(scroller.scrollTop, 0);
+  assert_equals(scroller.scrollLeft, 0);
+
+  scroller.style.setProperty("scroll-snap-type", "x mandatory");
+  assert_equals(scroller.scrollLeft, 100);
+  assert_equals(scroller.scrollTop, 0);
+}, "Changing the scroller's snap type to x should make it resnap on the x-axis.");
+
+
+test(t => {
+  t.add_cleanup(cleanup);
+  scroller.scrollTo(0,0);
+  assert_equals(scroller.scrollTop, 0);
+  assert_equals(scroller.scrollLeft, 0);
+
+  scroller.style.setProperty("scroll-snap-type", "x mandatory");
+  assert_equals(scroller.scrollLeft, 100);
+  assert_equals(scroller.scrollTop, 0);
+
+  scroller.style.setProperty("scroll-snap-type", "y mandatory");
+  assert_equals(scroller.scrollTop, 100);
+}, "Changing the scroller's snap type axis should make it resnap.");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/record-header.py b/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/record-header.py
index 3bfb1fcd..364c800a 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/record-header.py
+++ b/third_party/blink/web_tests/external/wpt/fetch/metadata/resources/record-header.py
@@ -99,8 +99,13 @@
       file.close()
       return video
 
-    ## Return a valid style content and Content-Type ##
-    if key.startswith("style") or key.startswith("embed") or key.startswith("object"):
+    ## Return valid style content and Content-Type ##
+    if key.startswith("style"):
+      response.headers.set("Content-Type", "text/css")
+      return "div { }"
+
+    ## Return a valid embed/object content and Content-Type ##
+    if key.startswith("embed") or key.startswith("object"):
       response.headers.set("Content-Type", "text/html")
       return "<html>EMBED!</html>"
 
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-navigate-popup.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-navigate-popup.https-expected.txt
index 6e7f600078..d9c62f2 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-navigate-popup.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-navigate-popup.https-expected.txt
@@ -7,9 +7,9 @@
 FAIL Popup navigating to same-site with coop/no coep assert_equals: expected "" but got "Popup-navigating-to-same-site-with-coop/no-coep"
 FAIL Popup navigating to same-origin with no coop/no coep assert_equals: expected "" but got "Popup-navigating-to-same-origin-with-no-coop/no-coep"
 FAIL Popup navigating to same-site with no coop/no coep assert_equals: expected "" but got "Popup-navigating-to-same-site-with-no-coop/no-coep"
-PASS Popup navigating to same-origin with coop unsafe-inherit/coep
-FAIL Popup navigating to same-site with coop unsafe-inherit/coep assert_equals: expected "" but got "Popup-navigating-to-same-site-with-coop-unsafe-inherit/coep"
-FAIL Popup navigating to same-origin with coop unsafe-inherit/no coep assert_equals: expected "" but got "Popup-navigating-to-same-origin-with-coop-unsafe-inherit/no-coep"
-FAIL Popup navigating to same-site with coop unsafe-inherit/no coep assert_equals: expected "" but got "Popup-navigating-to-same-site-with-coop-unsafe-inherit/no-coep"
+PASS Popup navigating to same-origin with coop unsafe-none/coep
+FAIL Popup navigating to same-site with coop unsafe-none/coep assert_equals: expected "" but got "Popup-navigating-to-same-site-with-coop-unsafe-none/coep"
+FAIL Popup navigating to same-origin with coop unsafe-none/no coep assert_equals: expected "" but got "Popup-navigating-to-same-origin-with-coop-unsafe-none/no-coep"
+FAIL Popup navigating to same-site with coop unsafe-none/no coep assert_equals: expected "" but got "Popup-navigating-to-same-site-with-coop-unsafe-none/no-coep"
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-navigate-popup.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-navigate-popup.https.html
index 21320a61..faa2793e 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-navigate-popup.https.html
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-navigate-popup.https.html
@@ -32,14 +32,14 @@
     "opener": false
   },
   {
-    "title": "coop unsafe-inherit/coep",
-    "coop": "unsafe-inherit",
+    "title": "coop unsafe-none/coep",
+    "coop": "unsafe-none",
     "coep": "require-corp",
     "opener": true
   },
   {
-    "title": "coop unsafe-inherit/no coep",
-    "coop": "unsafe-inherit",
+    "title": "coop unsafe-none/no coep",
+    "coop": "unsafe-none",
     "coep": "",
     "opener": false
   }
@@ -53,9 +53,9 @@
 
     async_test(t => {
       // For each test we open a COOP: same-origin/COEP: require-corp document in a popup and then
-      // navigate that to either a same-origin or same-site document whose COOP and COEP are set as
-      // per the top-most array. We then verify that this document has the correct opener for its
-      // specific setup.
+      // navigate that to either a same-origin (site=="same-origin") or same-site (site=="same-site")
+      // document whose COOP and COEP are set as per the top-most array. We then verify that this
+      // document has the correct opener for its specific setup.
       url_test(t, `${SAME_ORIGIN.origin}/html/cross-origin-opener-policy/resources/coop-coep.py?coop=same-origin&coep=require-corp&navigate=${encodeURIComponent(navigateURL)}`, channel, opener);
     }, title);
   });
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-redirect.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-redirect.https-expected.txt
index faa2c84f..e9b52b6 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-redirect.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-redirect.https-expected.txt
@@ -3,7 +3,7 @@
 FAIL Redirect from coop/coep to no coop/coep assert_equals: expected "" but got "Redirect-from-coop/coep-to-no-coop/coep"
 FAIL Redirect from no coop/no coep to coop/coep assert_equals: expected "" but got "Redirect-from-no-coop/no-coep-to-coop/coep"
 FAIL Redirect from coop/no coep to coop/coep assert_equals: expected "" but got "Redirect-from-coop/no-coep-to-coop/coep"
-PASS Redirect from coop unsafe-inherit/coep to coop/coep
-PASS Redirect from coop unsafe-inherit/coep to coop unsafe-inherit/coep
+PASS Redirect from coop unsafe-none/coep to coop/coep
+PASS Redirect from coop unsafe-none/coep to coop unsafe-inherit/coep
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-redirect.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-redirect.https.html
index 73f07dd..2727013 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-redirect.https.html
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep-redirect.https.html
@@ -1,5 +1,6 @@
 <!doctype html>
 <title>Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy: redirects</title>
+<meta content=timeout value=long>
 <script src=/resources/testharness.js></script>
 <script src=/resources/testharnessreport.js></script>
 <script src="/common/get-host-info.sub.js"></script>
@@ -41,18 +42,18 @@
     "opener": false
   },
   {
-    "title": "coop unsafe-inherit/coep to coop/coep",
-    "redirectCOOP": "unsafe-inherit",
+    "title": "coop unsafe-none/coep to coop/coep",
+    "redirectCOOP": "unsafe-none",
     "redirectCOEP": "require-corp",
     "coop": "same-origin",
     "coep": "require-corp",
     "opener": true
   },
   {
-    "title": "coop unsafe-inherit/coep to coop unsafe-inherit/coep",
-    "redirectCOOP": "unsafe-inherit",
+    "title": "coop unsafe-none/coep to coop unsafe-inherit/coep",
+    "redirectCOOP": "unsafe-none",
     "redirectCOEP": "require-corp",
-    "coop": "unsafe-inherit",
+    "coop": "unsafe-none",
     "coep": "require-corp",
     "opener": true
   }
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep.https-expected.txt
index 1bafd5c6..047797b 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep.https-expected.txt
@@ -1,12 +1,12 @@
 This is a testharness.js-based test.
 PASS Same-origin popup with coop/coep
-FAIL Same-site popup with coop/coep assert_equals: expected "" but got "same-site-popup-with-coop/coep"
-PASS Same-origin popup with coop unsafe-inherit/coep
-FAIL Same-site popup with coop unsafe-inherit/coep assert_equals: expected "" but got "same-site-popup-with-coop-unsafe-inherit/coep"
-FAIL Same-origin popup with coop unsafe-inherit without coep assert_equals: expected "" but got "popup-with-coop-unsafe-inherit-without-coep"
-FAIL Same-site popup with coop unsafe-inherit without coep assert_equals: expected "" but got "same-site-popup-with-coop-unsafe-inherit-without-coep"
+FAIL historical: "same-site" popup with coop/coep assert_equals: expected "" but got "same-site-popup-with-coop/coep"
+PASS Same-origin popup with coop unsafe-none/coep
+FAIL historical: "same-site" popup with coop unsafe-none/coep assert_equals: expected "" but got "same-site-popup-with-coop-unsafe-none/coep"
+FAIL Same-origin popup with coop unsafe-none without coep assert_equals: expected "" but got "popup-with-coop-unsafe-none-without-coep"
+FAIL historical: "same-site" popup with coop unsafe-none without coep assert_equals: expected "" but got "same-site-popup-with-coop-unsafe-none-without-coep"
 FAIL Same-origin popup without coep assert_equals: expected "" but got "popup-without-coep"
-FAIL Same-site popup without coep assert_equals: expected "" but got "same-site-popup-without-coep"
+FAIL historical: "same-site" popup without coep assert_equals: expected "" but got "same-site-popup-without-coep"
 FAIL Bonus: window.crossOriginIsolated assert_true: expected true got undefined
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep.https.html
index 64994cdf..de1dd56d 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep.https.html
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coep.https.html
@@ -1,5 +1,6 @@
 <!doctype html>
 <title>Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy</title>
+<meta content=timeout value=long>
 <script src=/resources/testharness.js></script>
 <script src=/resources/testharnessreport.js></script>
 <script src="/common/get-host-info.sub.js"></script>
@@ -13,14 +14,14 @@
     "opener": true
   },
   {
-    "title": "popup with coop unsafe-inherit/coep",
-    "coop": "unsafe-inherit",
+    "title": "popup with coop unsafe-none/coep",
+    "coop": "unsafe-none",
     "coep": "require-corp",
     "opener": true
   },
   {
-    "title": "popup with coop unsafe-inherit without coep",
-    "coop": "unsafe-inherit",
+    "title": "popup with coop unsafe-none without coep",
+    "coop": "unsafe-none",
     "coep": "",
     "opener": false
   },
@@ -35,10 +36,10 @@
     coop_coep_test(t, SAME_ORIGIN, variant.coop, variant.coep, variant.title.replace(/ /g,"-"), variant.opener);
   }, `Same-origin ${variant.title}`);
 
-  // This seems useful to test, CROSS_SITE is probably too redundant though.
+  // "same-site" is a historical value, equivalent to "unsafe-none"
   async_test(t => {
     coop_coep_test(t, SAME_SITE, variant.coop, variant.coep, `same-site-${variant.title.replace(/ /g,"-")}`, false);
-  }, `Same-site ${variant.title}`);
+  }, `historical: "same-site" ${variant.title}`);
 });
 
 test(() => {
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-navigated-popup.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-navigated-popup.https.html
index 9a92dd9..3c6019a 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-navigated-popup.https.html
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-navigated-popup.https.html
@@ -1,7 +1,7 @@
 <!doctype html>
 <title>Cross-Origin-Opener-Policy: a navigated popup</title>
 <!-- In particular this is different from coep-navigate-popup.https.html as this document initiates
-     the navigation (and uses unsafe-allow-outgoing and no COEP as without that it cannot be
+     the navigation (and uses same-origin-allow-popups and no COEP as without that it cannot be
      observed). COOP should work identically, but implementations might have used the wrong
      authority. -->
 <script src=/resources/testharness.js></script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-navigated-popup.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-navigated-popup.https.html.headers
index a19f4400..d83ed86 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-navigated-popup.https.html.headers
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-navigated-popup.https.html.headers
@@ -1 +1 @@
-Cross-Origin-Opener-Policy: same-origin unsafe-allow-outgoing
+Cross-Origin-Opener-Policy: same-origin-allow-popups
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-sandbox.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-sandbox.https.html
index e471b1e..fc16c18 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-sandbox.https.html
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/coop-sandbox.https.html
@@ -15,8 +15,10 @@
 const popup = window.open("resources/coop-coep.py?coop=same-origin&coep=&channel=${channel.name}");
 <\/script>`;
   document.body.append(frame);
-  t.step_timeout(() => {
-    t.done()
-  }, 500);
+  window.onload = t.step_func(() => {
+    t.step_timeout(() => {
+      t.done()
+    }, 1500);
+  });
 });
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https-expected.txt
new file mode 100644
index 0000000..6d6f5a8a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+PASS Popup navigating to same-origin with coop unsafe-inherit/coep
+FAIL Popup navigating to same-site with coop unsafe-inherit/coep assert_equals: expected "" but got "Popup-navigating-to-same-site-with-coop-unsafe-inherit/coep"
+FAIL Popup navigating to same-origin with coop unsafe-inherit/no coep assert_equals: expected "" but got "Popup-navigating-to-same-origin-with-coop-unsafe-inherit/no-coep"
+FAIL Popup navigating to same-site with coop unsafe-inherit/no coep assert_equals: expected "" but got "Popup-navigating-to-same-site-with-coop-unsafe-inherit/no-coep"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html
new file mode 100644
index 0000000..73ef1ea
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/coep-navigate-popup-unsafe-inherit.https.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<title>Historical: Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy: a navigating popup</title>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+<script>
+[
+  {
+    "title": "coop unsafe-inherit/coep",
+    "coop": "unsafe-inherit", // historical value, equivalent to "unsafe-none"
+    "coep": "require-corp",
+    "opener": true
+  },
+  {
+    "title": "coop unsafe-inherit/no coep",
+    "coop": "unsafe-inherit", // historical value, equivalent to "unsafe-none"
+    "coep": "",
+    "opener": false
+  }
+].forEach(variant => {
+  ["same-origin", "same-site"].forEach(site => {
+    const title = `Popup navigating to ${site} with ${variant.title}`;
+    const channel = title.replace(/ /g,"-");
+    const navigateHost = site === "same-origin" ? SAME_ORIGIN : SAME_SITE;
+    const navigateURL = `${navigateHost.origin}/html/cross-origin-opener-policy/resources/coop-coep.py?coop=${variant.coop}&coep=${variant.coep}&channel=${channel}`;
+    const opener = site === "same-origin" ? variant.opener : false;
+
+    async_test(t => {
+      // For each test we open a COOP: same-origin/COEP: require-corp document in a popup and then
+      // navigate that to either a document with same origin (site=="same-origin") or
+      // not-same-origin (site=="same-site") whose COOP and COEP are set as per the top-most array.
+      // We then verify that this document has the correct opener for its specific setup.
+      url_test(t, `${SAME_ORIGIN.origin}/html/cross-origin-opener-policy/resources/coop-coep.py?coop=same-origin&coep=require-corp&navigate=${encodeURIComponent(navigateURL)}`, channel, opener);
+    }, title);
+  });
+});
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https-expected.txt
new file mode 100644
index 0000000..d32242d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS same-origin unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: ""
+PASS same-origin unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: "unsafe-none"
+PASS same-origin unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: "jibberish"
+PASS same-origin unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: "same-site"
+PASS same-origin unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS same-origin unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL same-origin unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "same-origin unsafe-allow-outgoing_to_CROSS_ORIGIN_same-origin"
+FAIL same-origin unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "same-origin unsafe-allow-outgoing_to_CROSS_ORIGIN_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html
new file mode 100644
index 0000000..a8b6d54
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [CROSS_ORIGIN, "", true],
+  [CROSS_ORIGIN, "unsafe-none", true],
+  [CROSS_ORIGIN, "jibberish", true],
+  [CROSS_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-origin", false],
+  [CROSS_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin unsafe-allow-outgoing", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html.headers
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.headers
rename to third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-cross-origin.https.html.headers
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https-expected.txt
new file mode 100644
index 0000000..cba1078
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS same-origin unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: ""
+PASS same-origin unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: "unsafe-none"
+PASS same-origin unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: "jibberish"
+PASS same-origin unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: "same-site"
+PASS same-origin unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS same-origin unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL same-origin unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "same-origin unsafe-allow-outgoing_to_SAME_ORIGIN_same-origin"
+FAIL same-origin unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "same-origin unsafe-allow-outgoing_to_SAME_ORIGIN_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html
new file mode 100644
index 0000000..aaaae2d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [SAME_ORIGIN, "", true],
+  [SAME_ORIGIN, "unsafe-none", true],
+  [SAME_ORIGIN, "jibberish", true],
+  [SAME_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-origin", false],
+  [SAME_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin unsafe-allow-outgoing", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html.headers
similarity index 100%
copy from third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.headers
copy to third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-origin.https.html.headers
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https-expected.txt
new file mode 100644
index 0000000..5800c692
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS same-origin unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: ""
+PASS same-origin unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: "unsafe-none"
+PASS same-origin unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: "jibberish"
+PASS same-origin unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: "same-site"
+PASS same-origin unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS same-origin unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL same-origin unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "same-origin unsafe-allow-outgoing_to_SAME_SITE_same-origin"
+FAIL same-origin unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "same-origin unsafe-allow-outgoing_to_SAME_SITE_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html
new file mode 100644
index 0000000..fd58b06
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [SAME_SITE, "", true],
+  [SAME_SITE, "unsafe-none", true],
+  [SAME_SITE, "jibberish", true],
+  [SAME_SITE, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-origin", false],
+  [SAME_SITE, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin unsafe-allow-outgoing", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html.headers
similarity index 100%
copy from third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html.headers
copy to third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-origin-unsafe-allow-outgoing-with-same-site.https.html.headers
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https-expected.txt
new file mode 100644
index 0000000..8378675
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS same-site unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: ""
+PASS same-site unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: "unsafe-none"
+PASS same-site unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: "jibberish"
+PASS same-site unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: "same-site"
+PASS same-site unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS same-site unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL same-site unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "same-site unsafe-allow-outgoing_to_CROSS_ORIGIN_same-origin"
+FAIL same-site unsafe-allow-outgoing document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "same-site unsafe-allow-outgoing_to_CROSS_ORIGIN_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html
new file mode 100644
index 0000000..7330ff75
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [CROSS_ORIGIN, "", true],
+  [CROSS_ORIGIN, "unsafe-none", true],
+  [CROSS_ORIGIN, "jibberish", true],
+  [CROSS_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-origin", false],
+  [CROSS_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-site unsafe-allow-outgoing", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html.headers
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.headers
rename to third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-cross-origin.https.html.headers
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https-expected.txt
new file mode 100644
index 0000000..9f6a422
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS same-site unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: ""
+PASS same-site unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: "unsafe-none"
+PASS same-site unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: "jibberish"
+PASS same-site unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: "same-site"
+PASS same-site unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS same-site unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL same-site unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "same-site unsafe-allow-outgoing_to_SAME_ORIGIN_same-origin"
+FAIL same-site unsafe-allow-outgoing document opening popup to https://web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "same-site unsafe-allow-outgoing_to_SAME_ORIGIN_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html
new file mode 100644
index 0000000..01cc6719
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [SAME_ORIGIN, "", true],
+  [SAME_ORIGIN, "unsafe-none", true],
+  [SAME_ORIGIN, "jibberish", true],
+  [SAME_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-origin", false],
+  [SAME_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-site unsafe-allow-outgoing", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.headers
similarity index 100%
copy from third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.headers
copy to third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-origin.https.html.headers
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https-expected.txt
new file mode 100644
index 0000000..9074e94
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS same-site unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: ""
+PASS same-site unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: "unsafe-none"
+PASS same-site unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: "jibberish"
+PASS same-site unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: "same-site"
+PASS same-site unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS same-site unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL same-site unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "same-site unsafe-allow-outgoing_to_SAME_SITE_same-origin"
+FAIL same-site unsafe-allow-outgoing document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "same-site unsafe-allow-outgoing_to_SAME_SITE_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html
new file mode 100644
index 0000000..b1a664d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [SAME_SITE, "", true],
+  [SAME_SITE, "unsafe-none", true],
+  [SAME_SITE, "jibberish", true],
+  [SAME_SITE, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-origin", false],
+  [SAME_SITE, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-site unsafe-allow-outgoing", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.headers
similarity index 100%
copy from third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html.headers
copy to third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-unsafe-allow-outgoing-with-same-site.https.html.headers
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https-expected.txt
new file mode 100644
index 0000000..f4b869b1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS same-site document opening popup to https://not-web-platform.test:8444 with COOP: ""
+PASS same-site document opening popup to https://not-web-platform.test:8444 with COOP: "unsafe-none"
+PASS same-site document opening popup to https://not-web-platform.test:8444 with COOP: "jibberish"
+PASS same-site document opening popup to https://not-web-platform.test:8444 with COOP: "same-site"
+PASS same-site document opening popup to https://not-web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS same-site document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL same-site document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "same-site_to_CROSS_ORIGIN_same-origin"
+FAIL same-site document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "same-site_to_CROSS_ORIGIN_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html
new file mode 100644
index 0000000..d0fc7c79
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [CROSS_ORIGIN, "", true],
+  [CROSS_ORIGIN, "unsafe-none", true],
+  [CROSS_ORIGIN, "jibberish", true],
+  [CROSS_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-origin", false],
+  [CROSS_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-site", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html.headers
similarity index 100%
copy from third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site.https.html.headers
copy to third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-cross-origin.https.html.headers
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https-expected.txt
new file mode 100644
index 0000000..2386021
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS same-site document opening popup to https://web-platform.test:8444 with COOP: ""
+PASS same-site document opening popup to https://web-platform.test:8444 with COOP: "unsafe-none"
+PASS same-site document opening popup to https://web-platform.test:8444 with COOP: "jibberish"
+PASS same-site document opening popup to https://web-platform.test:8444 with COOP: "same-site"
+PASS same-site document opening popup to https://web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS same-site document opening popup to https://web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL same-site document opening popup to https://web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "same-site_to_SAME_ORIGIN_same-origin"
+FAIL same-site document opening popup to https://web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "same-site_to_SAME_ORIGIN_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html
new file mode 100644
index 0000000..67d2523
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [SAME_ORIGIN, "", true],
+  [SAME_ORIGIN, "unsafe-none", true],
+  [SAME_ORIGIN, "jibberish", true],
+  [SAME_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-origin", false],
+  [SAME_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-site", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html.headers
similarity index 100%
copy from third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site.https.html.headers
copy to third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-origin.https.html.headers
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https-expected.txt
new file mode 100644
index 0000000..36b7709
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS same-site document opening popup to https://www1.web-platform.test:8444 with COOP: ""
+PASS same-site document opening popup to https://www1.web-platform.test:8444 with COOP: "unsafe-none"
+PASS same-site document opening popup to https://www1.web-platform.test:8444 with COOP: "jibberish"
+PASS same-site document opening popup to https://www1.web-platform.test:8444 with COOP: "same-site"
+PASS same-site document opening popup to https://www1.web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS same-site document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL same-site document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "same-site_to_SAME_SITE_same-origin"
+FAIL same-site document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "same-site_to_SAME_SITE_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html
new file mode 100644
index 0000000..78b7ca8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="../resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [SAME_SITE, "", true],
+  [SAME_SITE, "unsafe-none", true],
+  [SAME_SITE, "jibberish", true],
+  [SAME_SITE, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-origin", false],
+  [SAME_SITE, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-site", tests); // historical value, equivalent to "unsafe-none"
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html.headers
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site.https.html.headers
rename to third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/historical/popup-same-site-with-same-site.https.html.headers
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/no-https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/no-https.html
index 014ba1f..f4e926b2 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/no-https.html
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/no-https.html
@@ -5,15 +5,14 @@
 <script src=/resources/testharnessreport.js></script>
 <script>
 async_test(t => {
-  const popup = window.open("/common/blank.html");
-  assert_equals(window, popup.opener);
-
-  t.step_timeout(() => {
-    assert_false(popup.closed);
-    assert_equals(popup.location.pathname, "/common/blank.html");
+  const popup = window.open("resources/call-functionCalledByOpenee.html");
+  t.add_cleanup(() => {
     popup.close();
-    t.done();
-  }, 500);
+  });
+  window.functionCalledByOpenee = t.step_func_done(() => {
+    assert_false(popup.closed);
+  });
+  assert_equals(window, popup.opener);
 }, "Cross-Origin-Opener-Policy only works over secure contexts");
 
 test(() => {
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-meta-http-equiv.https.html.headers
similarity index 100%
copy from third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin.https.html.headers
copy to third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-meta-http-equiv.https.html.headers
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-none.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-none.https.html
deleted file mode 100644
index 6263345..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-none.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="resources/common.js"></script>
-
-<div id=log></div>
-<script>
-
-let tests = [
-  // popup Origin, popup COOP, expect opener
-  [SAME_ORIGIN, "", true],
-  [SAME_ORIGIN, "jibberish", true],
-  [SAME_ORIGIN, "same-site", false],
-  [SAME_ORIGIN, "same-site unsafe-allow-outgoing", false],
-  [SAME_ORIGIN, "same-origin", false],
-  [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-
-  [SAME_SITE, "", true],
-  [SAME_SITE, "jibberish", true],
-  [SAME_SITE, "same-site", false],
-  [SAME_SITE, "same-site unsafe-allow-outgoing", false],
-  [SAME_SITE, "same-origin", false],
-  [SAME_SITE, "same-origin unsafe-allow-outgoing", false],
-
-  [CROSS_ORIGIN, "", true],
-  [CROSS_ORIGIN, "jibberish", true],
-  [CROSS_ORIGIN, "same-site", false],
-  [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", false],
-  [CROSS_ORIGIN, "same-origin", false],
-  [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-];
-
-run_coop_tests("none", tests);
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https-expected.txt
new file mode 100644
index 0000000..21a13c3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS same-origin-allow-popups document opening popup to https://not-web-platform.test:8444 with COOP: ""
+PASS same-origin-allow-popups document opening popup to https://not-web-platform.test:8444 with COOP: "unsafe-none"
+PASS same-origin-allow-popups document opening popup to https://not-web-platform.test:8444 with COOP: "jibberish"
+PASS same-origin-allow-popups document opening popup to https://not-web-platform.test:8444 with COOP: "same-site"
+PASS same-origin-allow-popups document opening popup to https://not-web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS same-origin-allow-popups document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL same-origin-allow-popups document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "same-origin-allow-popups_to_CROSS_ORIGIN_same-origin"
+FAIL same-origin-allow-popups document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "same-origin-allow-popups_to_CROSS_ORIGIN_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html
new file mode 100644
index 0000000..cea3788b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [CROSS_ORIGIN, "", true],
+  [CROSS_ORIGIN, "unsafe-none", true],
+  [CROSS_ORIGIN, "jibberish", true],
+  [CROSS_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-origin", false],
+  [CROSS_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin-allow-popups", tests);
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html.headers
new file mode 100644
index 0000000..d83ed86
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-cross-origin.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: same-origin-allow-popups
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https-expected.txt
new file mode 100644
index 0000000..2fc12a7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS same-origin-allow-popups document opening popup to https://web-platform.test:8444 with COOP: ""
+PASS same-origin-allow-popups document opening popup to https://web-platform.test:8444 with COOP: "unsafe-none"
+PASS same-origin-allow-popups document opening popup to https://web-platform.test:8444 with COOP: "jibberish"
+PASS same-origin-allow-popups document opening popup to https://web-platform.test:8444 with COOP: "same-site"
+PASS same-origin-allow-popups document opening popup to https://web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS same-origin-allow-popups document opening popup to https://web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL same-origin-allow-popups document opening popup to https://web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "same-origin-allow-popups_to_SAME_ORIGIN_same-origin"
+PASS same-origin-allow-popups document opening popup to https://web-platform.test:8444 with COOP: "same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html
new file mode 100644
index 0000000..a50231f8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [SAME_ORIGIN, "", true],
+  [SAME_ORIGIN, "unsafe-none", true],
+  [SAME_ORIGIN, "jibberish", true],
+  [SAME_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-origin", false],
+  [SAME_ORIGIN, "same-origin-allow-popups", true],
+];
+
+run_coop_tests("same-origin-allow-popups", tests);
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html.headers
new file mode 100644
index 0000000..d83ed86
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-origin.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: same-origin-allow-popups
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https-expected.txt
new file mode 100644
index 0000000..001f3bbd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS same-origin-allow-popups document opening popup to https://www1.web-platform.test:8444 with COOP: ""
+PASS same-origin-allow-popups document opening popup to https://www1.web-platform.test:8444 with COOP: "unsafe-none"
+PASS same-origin-allow-popups document opening popup to https://www1.web-platform.test:8444 with COOP: "jibberish"
+PASS same-origin-allow-popups document opening popup to https://www1.web-platform.test:8444 with COOP: "same-site"
+PASS same-origin-allow-popups document opening popup to https://www1.web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS same-origin-allow-popups document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL same-origin-allow-popups document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "same-origin-allow-popups_to_SAME_SITE_same-origin"
+FAIL same-origin-allow-popups document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "same-origin-allow-popups_to_SAME_SITE_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html
new file mode 100644
index 0000000..53b4263
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [SAME_SITE, "", true],
+  [SAME_SITE, "unsafe-none", true],
+  [SAME_SITE, "jibberish", true],
+  [SAME_SITE, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-origin", false],
+  [SAME_SITE, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin-allow-popups", tests);
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html.headers
new file mode 100644
index 0000000..d83ed86
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-allow-popups-with-same-site.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: same-origin-allow-popups
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html
index 65ec3b26..d4005ac 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-non-initial-about-blank.https.html
@@ -6,10 +6,12 @@
 async_test(t => {
   const popup = window.open("resources/coop-coep.py?coop=same-origin&coep=&navigate=about:blank");
   assert_equals(window, popup.opener);
-  t.step_timeout(() => {
-    assert_equals(popup.location.href, "about:blank");
-    popup.close();
-    t.done();
-  }, 500);
+  window.onload = t.step_func(() => {
+    t.step_timeout(() => {
+      assert_equals(popup.location.href, "about:blank");
+      popup.close();
+      t.done();
+    }, 1500);
+  });
 }, "Navigating a popup to about:blank");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html
deleted file mode 100644
index 2f8ebc3..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-unsafe-allow-outgoing.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="resources/common.js"></script>
-
-<div id=log></div>
-<script>
-
-let tests = [
-  // popup Origin, popup COOP, expect opener
-  [SAME_ORIGIN, "", true],
-  [SAME_ORIGIN, "jibberish", true],
-  [SAME_ORIGIN, "same-site", false],
-  [SAME_ORIGIN, "same-site unsafe-allow-outgoing", false],
-  [SAME_ORIGIN, "same-origin", false],
-  [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", true],
-
-  [SAME_SITE, "", true],
-  [SAME_SITE, "jibberish", true],
-  [SAME_SITE, "same-site", false],
-  [SAME_SITE, "same-site unsafe-allow-outgoing", false],
-  [SAME_SITE, "same-origin", false],
-  [SAME_SITE, "same-origin unsafe-allow-outgoing", false],
-
-  [CROSS_ORIGIN, "", true],
-  [CROSS_ORIGIN, "jibberish", true],
-  [CROSS_ORIGIN, "same-site", false],
-  [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", false],
-  [CROSS_ORIGIN, "same-origin", false],
-  [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-];
-
-run_coop_tests("same-origin_unsafe-allow-outgoing", tests);
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https-expected.txt
new file mode 100644
index 0000000..269243a55
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL same-origin document opening popup to https://not-web-platform.test:8444 with COOP: "" assert_equals: expected "" but got "same-origin_to_CROSS_ORIGIN_"
+FAIL same-origin document opening popup to https://not-web-platform.test:8444 with COOP: "unsafe-none" assert_equals: expected "" but got "same-origin_to_CROSS_ORIGIN_unsafe-none"
+FAIL same-origin document opening popup to https://not-web-platform.test:8444 with COOP: "jibberish" assert_equals: expected "" but got "same-origin_to_CROSS_ORIGIN_jibberish"
+FAIL same-origin document opening popup to https://not-web-platform.test:8444 with COOP: "same-site" assert_equals: expected "" but got "same-origin_to_CROSS_ORIGIN_same-site"
+FAIL same-origin document opening popup to https://not-web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing" assert_equals: expected "" but got "same-origin_to_CROSS_ORIGIN_same-site-unsafe-allow-outgoing"
+FAIL same-origin document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing" assert_equals: expected "" but got "same-origin_to_CROSS_ORIGIN_same-origin-unsafe-allow-outgoing"
+FAIL same-origin document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "same-origin_to_CROSS_ORIGIN_same-origin"
+FAIL same-origin document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "same-origin_to_CROSS_ORIGIN_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html
new file mode 100644
index 0000000..9f7d27b3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [CROSS_ORIGIN, "", false],
+  [CROSS_ORIGIN, "unsafe-none", false],
+  [CROSS_ORIGIN, "jibberish", false],
+  [CROSS_ORIGIN, "same-site", false], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", false], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", false], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-origin", false],
+  [CROSS_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin", tests);
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.headers
similarity index 100%
copy from third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin.https.html.headers
copy to third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-cross-origin.https.html.headers
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https-expected.txt
new file mode 100644
index 0000000..cc419c0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL same-origin document opening popup to https://web-platform.test:8444 with COOP: "" assert_equals: expected "" but got "same-origin_to_SAME_ORIGIN_"
+FAIL same-origin document opening popup to https://web-platform.test:8444 with COOP: "unsafe-none" assert_equals: expected "" but got "same-origin_to_SAME_ORIGIN_unsafe-none"
+FAIL same-origin document opening popup to https://web-platform.test:8444 with COOP: "jibberish" assert_equals: expected "" but got "same-origin_to_SAME_ORIGIN_jibberish"
+FAIL same-origin document opening popup to https://web-platform.test:8444 with COOP: "same-site" assert_equals: expected "" but got "same-origin_to_SAME_ORIGIN_same-site"
+FAIL same-origin document opening popup to https://web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing" assert_equals: expected "" but got "same-origin_to_SAME_ORIGIN_same-site-unsafe-allow-outgoing"
+FAIL same-origin document opening popup to https://web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing" assert_equals: expected "" but got "same-origin_to_SAME_ORIGIN_same-origin-unsafe-allow-outgoing"
+PASS same-origin document opening popup to https://web-platform.test:8444 with COOP: "same-origin"
+FAIL same-origin document opening popup to https://web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "same-origin_to_SAME_ORIGIN_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html
new file mode 100644
index 0000000..c84219a80
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [SAME_ORIGIN, "", false],
+  [SAME_ORIGIN, "unsafe-none", false],
+  [SAME_ORIGIN, "jibberish", false],
+  [SAME_ORIGIN, "same-site", false], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-site unsafe-allow-outgoing", false], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", false], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-origin", true],
+  [SAME_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin", tests);
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html.headers
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin.https.html.headers
rename to third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-origin.https.html.headers
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https-expected.txt
new file mode 100644
index 0000000..4dec82fe
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL same-origin document opening popup to https://www1.web-platform.test:8444 with COOP: "" assert_equals: expected "" but got "same-origin_to_SAME_SITE_"
+FAIL same-origin document opening popup to https://www1.web-platform.test:8444 with COOP: "unsafe-none" assert_equals: expected "" but got "same-origin_to_SAME_SITE_unsafe-none"
+FAIL same-origin document opening popup to https://www1.web-platform.test:8444 with COOP: "jibberish" assert_equals: expected "" but got "same-origin_to_SAME_SITE_jibberish"
+FAIL same-origin document opening popup to https://www1.web-platform.test:8444 with COOP: "same-site" assert_equals: expected "" but got "same-origin_to_SAME_SITE_same-site"
+FAIL same-origin document opening popup to https://www1.web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing" assert_equals: expected "" but got "same-origin_to_SAME_SITE_same-site-unsafe-allow-outgoing"
+FAIL same-origin document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing" assert_equals: expected "" but got "same-origin_to_SAME_SITE_same-origin-unsafe-allow-outgoing"
+FAIL same-origin document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "same-origin_to_SAME_SITE_same-origin"
+FAIL same-origin document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "same-origin_to_SAME_SITE_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html
new file mode 100644
index 0000000..b875cc2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [SAME_SITE, "", false],
+  [SAME_SITE, "unsafe-none", false],
+  [SAME_SITE, "jibberish", false],
+  [SAME_SITE, "same-site", false], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-site unsafe-allow-outgoing", false], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-origin unsafe-allow-outgoing", false], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-origin", false],
+  [SAME_SITE, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("same-origin", tests);
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html.headers
similarity index 100%
copy from third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin.https.html.headers
copy to third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin-with-same-site.https.html.headers
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin.https.html
deleted file mode 100644
index 964011ff..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-origin.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="resources/common.js"></script>
-
-<div id=log></div>
-<script>
-
-let tests = [
-  // popup Origin, popup COOP, expect opener
-  [SAME_ORIGIN, "", false],
-  [SAME_ORIGIN, "jibberish", false],
-  [SAME_ORIGIN, "same-site", false],
-  [SAME_ORIGIN, "same-site unsafe-allow-outgoing", false],
-  [SAME_ORIGIN, "same-origin", true],
-  [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-
-  [SAME_SITE, "", false],
-  [SAME_SITE, "jibberish", false],
-  [SAME_SITE, "same-site", false],
-  [SAME_SITE, "same-site unsafe-allow-outgoing", false],
-  [SAME_SITE, "same-origin", false],
-  [SAME_SITE, "same-origin unsafe-allow-outgoing", false],
-
-  [CROSS_ORIGIN, "", false],
-  [CROSS_ORIGIN, "jibberish", false],
-  [CROSS_ORIGIN, "same-site", false],
-  [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", false],
-  [CROSS_ORIGIN, "same-origin", false],
-  [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-];
-
-run_coop_tests("same-origin", tests);
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html
deleted file mode 100644
index 18ee909..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site-unsafe-allow-outgoing.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="resources/common.js"></script>
-
-<div id=log></div>
-<script>
-
-let tests = [
-  // popup Origin, popup COOP, expect opener
-  [SAME_ORIGIN, "", true],
-  [SAME_ORIGIN, "jibberish", true],
-  [SAME_ORIGIN, "same-site", false],
-  [SAME_ORIGIN, "same-site unsafe-allow-outgoing", true],
-  [SAME_ORIGIN, "same-origin", false],
-  [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-
-  [SAME_SITE, "", true],
-  [SAME_SITE, "jibberish", true],
-  [SAME_SITE, "same-site", false],
-  [SAME_SITE, "same-site unsafe-allow-outgoing", true],
-  [SAME_SITE, "same-origin", false],
-  [SAME_SITE, "same-origin unsafe-allow-outgoing", false],
-
-  [CROSS_ORIGIN, "", true],
-  [CROSS_ORIGIN, "jibberish", true],
-  [CROSS_ORIGIN, "same-site", false],
-  [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", false],
-  [CROSS_ORIGIN, "same-origin", false],
-  [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-];
-
-run_coop_tests("same-site_unsafe-allow-outgoing", tests);
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site.https.html
deleted file mode 100644
index 9a0db27..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-same-site.https.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src="/common/get-host-info.sub.js"></script>
-<script src="resources/common.js"></script>
-
-<div id=log></div>
-<script>
-
-let tests = [
-  // popup Origin, popup COOP, expect opener
-  [SAME_ORIGIN, "", false],
-  [SAME_ORIGIN, "jibberish", false],
-  [SAME_ORIGIN, "same-site", true],
-  [SAME_ORIGIN, "same-site unsafe-allow-outgoing", false],
-  [SAME_ORIGIN, "same-origin", false],
-  [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-
-  [SAME_SITE, "", false],
-  [SAME_SITE, "jibberish", false],
-  [SAME_SITE, "same-site", true],
-  [SAME_SITE, "same-site unsafe-allow-outgoing", false],
-  [SAME_SITE, "same-origin", false],
-  [SAME_SITE, "same-origin unsafe-allow-outgoing", false],
-
-  [CROSS_ORIGIN, "", false],
-  [CROSS_ORIGIN, "jibberish", false],
-  [CROSS_ORIGIN, "same-site", false],
-  [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", false],
-  [CROSS_ORIGIN, "same-origin", false],
-  [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", false],
-];
-
-run_coop_tests("same-site", tests);
-
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https-expected.txt
new file mode 100644
index 0000000..7b65f9dc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS unsafe-none document opening popup to https://not-web-platform.test:8444 with COOP: ""
+PASS unsafe-none document opening popup to https://not-web-platform.test:8444 with COOP: "unsafe-none"
+PASS unsafe-none document opening popup to https://not-web-platform.test:8444 with COOP: "jibberish"
+PASS unsafe-none document opening popup to https://not-web-platform.test:8444 with COOP: "same-site"
+PASS unsafe-none document opening popup to https://not-web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS unsafe-none document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL unsafe-none document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "unsafe-none_to_CROSS_ORIGIN_same-origin"
+FAIL unsafe-none document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "unsafe-none_to_CROSS_ORIGIN_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https.html
new file mode 100644
index 0000000..5cbf5b4c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-cross-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [CROSS_ORIGIN, "", true],
+  [CROSS_ORIGIN, "unsafe-none", true],
+  [CROSS_ORIGIN, "jibberish", true],
+  [CROSS_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-origin", false],
+  [CROSS_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("unsafe-none", tests);
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https-expected.txt
new file mode 100644
index 0000000..e3c14527
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS unsafe-none document opening popup to https://web-platform.test:8444 with COOP: ""
+PASS unsafe-none document opening popup to https://web-platform.test:8444 with COOP: "unsafe-none"
+PASS unsafe-none document opening popup to https://web-platform.test:8444 with COOP: "jibberish"
+PASS unsafe-none document opening popup to https://web-platform.test:8444 with COOP: "same-site"
+PASS unsafe-none document opening popup to https://web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS unsafe-none document opening popup to https://web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL unsafe-none document opening popup to https://web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "unsafe-none_to_SAME_ORIGIN_same-origin"
+FAIL unsafe-none document opening popup to https://web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "unsafe-none_to_SAME_ORIGIN_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html
new file mode 100644
index 0000000..f8a4ebe71
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [SAME_ORIGIN, "", true],
+  [SAME_ORIGIN, "unsafe-none", true],
+  [SAME_ORIGIN, "jibberish", true],
+  [SAME_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-origin", false],
+  [SAME_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("unsafe-none", tests);
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html.headers b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html.headers
new file mode 100644
index 0000000..073ce7a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-origin.https.html.headers
@@ -0,0 +1 @@
+Cross-Origin-Opener-Policy: unsafe-none
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https-expected.txt
new file mode 100644
index 0000000..92e7b75
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS unsafe-none document opening popup to https://www1.web-platform.test:8444 with COOP: ""
+PASS unsafe-none document opening popup to https://www1.web-platform.test:8444 with COOP: "unsafe-none"
+PASS unsafe-none document opening popup to https://www1.web-platform.test:8444 with COOP: "jibberish"
+PASS unsafe-none document opening popup to https://www1.web-platform.test:8444 with COOP: "same-site"
+PASS unsafe-none document opening popup to https://www1.web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS unsafe-none document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL unsafe-none document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "unsafe-none_to_SAME_SITE_same-origin"
+FAIL unsafe-none document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "unsafe-none_to_SAME_SITE_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html
new file mode 100644
index 0000000..e38acf4f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unsafe-none-with-same-site.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [SAME_SITE, "", true],
+  [SAME_SITE, "unsafe-none", true],
+  [SAME_SITE, "jibberish", true],
+  [SAME_SITE, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-origin", false],
+  [SAME_SITE, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("unsafe-none", tests);
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https-expected.txt
new file mode 100644
index 0000000..33d61be
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS unspecified document opening popup to https://not-web-platform.test:8444 with COOP: ""
+PASS unspecified document opening popup to https://not-web-platform.test:8444 with COOP: "unsafe-none"
+PASS unspecified document opening popup to https://not-web-platform.test:8444 with COOP: "jibberish"
+PASS unspecified document opening popup to https://not-web-platform.test:8444 with COOP: "same-site"
+PASS unspecified document opening popup to https://not-web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS unspecified document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL unspecified document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "unspecified_to_CROSS_ORIGIN_same-origin"
+FAIL unspecified document opening popup to https://not-web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "unspecified_to_CROSS_ORIGIN_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https.html
new file mode 100644
index 0000000..d89398c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-cross-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [CROSS_ORIGIN, "", true],
+  [CROSS_ORIGIN, "unsafe-none", true],
+  [CROSS_ORIGIN, "jibberish", true],
+  [CROSS_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [CROSS_ORIGIN, "same-origin", false],
+  [CROSS_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("unspecified", tests);
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https-expected.txt
new file mode 100644
index 0000000..627aa8ae
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS unspecified document opening popup to https://web-platform.test:8444 with COOP: ""
+PASS unspecified document opening popup to https://web-platform.test:8444 with COOP: "unsafe-none"
+PASS unspecified document opening popup to https://web-platform.test:8444 with COOP: "jibberish"
+PASS unspecified document opening popup to https://web-platform.test:8444 with COOP: "same-site"
+PASS unspecified document opening popup to https://web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS unspecified document opening popup to https://web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL unspecified document opening popup to https://web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "unspecified_to_SAME_ORIGIN_same-origin"
+FAIL unspecified document opening popup to https://web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "unspecified_to_SAME_ORIGIN_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https.html
new file mode 100644
index 0000000..cb6fc02a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-same-origin.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [SAME_ORIGIN, "", true],
+  [SAME_ORIGIN, "unsafe-none", true],
+  [SAME_ORIGIN, "jibberish", true],
+  [SAME_ORIGIN, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_ORIGIN, "same-origin", false],
+  [SAME_ORIGIN, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("unspecified", tests);
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-same-site.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-same-site.https-expected.txt
new file mode 100644
index 0000000..ff97a46
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-same-site.https-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS unspecified document opening popup to https://www1.web-platform.test:8444 with COOP: ""
+PASS unspecified document opening popup to https://www1.web-platform.test:8444 with COOP: "unsafe-none"
+PASS unspecified document opening popup to https://www1.web-platform.test:8444 with COOP: "jibberish"
+PASS unspecified document opening popup to https://www1.web-platform.test:8444 with COOP: "same-site"
+PASS unspecified document opening popup to https://www1.web-platform.test:8444 with COOP: "same-site unsafe-allow-outgoing"
+PASS unspecified document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin unsafe-allow-outgoing"
+FAIL unspecified document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin" assert_equals: expected "" but got "unspecified_to_SAME_SITE_same-origin"
+FAIL unspecified document opening popup to https://www1.web-platform.test:8444 with COOP: "same-origin-allow-popups" assert_equals: expected "" but got "unspecified_to_SAME_SITE_same-origin-allow-popups"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-same-site.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-same-site.https.html
new file mode 100644
index 0000000..6e0edfa0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/popup-unspecified-with-same-site.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<meta content=timeout value=long>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/common.js"></script>
+
+<div id=log></div>
+<script>
+
+let tests = [
+  // popup Origin, popup COOP, expect opener
+  [SAME_SITE, "", true],
+  [SAME_SITE, "unsafe-none", true],
+  [SAME_SITE, "jibberish", true],
+  [SAME_SITE, "same-site", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-site unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-origin unsafe-allow-outgoing", true], // historical value, equivalent to "unsafe-none"
+  [SAME_SITE, "same-origin", false],
+  [SAME_SITE, "same-origin-allow-popups", false],
+];
+
+run_coop_tests("unspecified", tests);
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/resources/call-functionCalledByOpenee.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/resources/call-functionCalledByOpenee.html
new file mode 100644
index 0000000..d0ff0b7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/resources/call-functionCalledByOpenee.html
@@ -0,0 +1,5 @@
+<!doctype html>
+<meta charset=utf-8>
+<script>
+window.opener.functionCalledByOpenee();
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.worker-expected.txt b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.worker-expected.txt
index 88f80ee..f03700f7 100644
--- a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.worker-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.worker-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 790 tests; 773 PASS, 17 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 790 tests; 774 PASS, 16 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idl_test setup
 PASS idl_test validation
 PASS Partial interface Document: original interface defined
@@ -467,7 +467,7 @@
 PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type
 PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type
 PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type
-FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type Unrecognized type WindowProxy
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type
 PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type
 PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])" with the proper type
 PASS MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.worker.js b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.worker.js
index b720d54..feddaf54 100644
--- a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.worker.js
+++ b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.worker.js
@@ -7,6 +7,7 @@
   ["html"],
   ["dom", "cssom", "touch-events", "uievents"],
   idlArray => {
+    idlArray.add_untested_idls('typedef Window WindowProxy;');
     idlArray.add_objects({
       WorkerLocation: ['self.location'],
       WorkerNavigator: ['self.navigator'],
diff --git a/third_party/blink/web_tests/external/wpt/lint.whitelist b/third_party/blink/web_tests/external/wpt/lint.whitelist
index 6264476..353922a 100644
--- a/third_party/blink/web_tests/external/wpt/lint.whitelist
+++ b/third_party/blink/web_tests/external/wpt/lint.whitelist
@@ -94,6 +94,7 @@
 TRAILING WHITESPACE: webvtt/parsing/file-parsing/support/*.vtt
 TRAILING WHITESPACE: webvtt/parsing/file-parsing/tests/support/*.vtt
 TRAILING WHITESPACE: xhr/resources/headers-some-are-empty.asis
+TRAILING WHITESPACE: cookies/http-state/resources/test-files/*
 
 # Intentional use of print statements
 PRINT STATEMENT: dom/nodes/Document-createElement-namespace-tests/generate.py
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/opaque-script.https.html b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/opaque-script.https.html
new file mode 100644
index 0000000..7d21218
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/opaque-script.https.html
@@ -0,0 +1,71 @@
+<!doctype html>
+<title>Cache Storage: verify scripts loaded from cache_storage are marked opaque</title>
+<link rel="help" href="https://w3c.github.io/ServiceWorker/#cache-interface">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/testharness-helpers.js"></script>
+<script src="resources/test-helpers.sub.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script>
+'use strict';
+
+const SW_URL = 'resources/opaque-script-sw.js';
+const BASE_SCOPE = './resources/opaque-script-frame.html';
+const SAME_ORIGIN_BASE = new URL('./resources/', self.location.href).href;
+const CROSS_ORIGIN_BASE = new URL('./resources/',
+    get_host_info().HTTPS_REMOTE_ORIGIN + base_path()).href;
+
+function wait_for_error() {
+  return new Promise(resolve => {
+    self.addEventListener('message', function messageHandler(evt) {
+      if (evt.data.type !== 'ErrorEvent')
+        return;
+      self.removeEventListener('message', messageHandler);
+      resolve(evt.data.msg);
+    });
+  });
+}
+
+// Load an iframe that dynamically adds a script tag that is
+// same/cross origin and large/small.  It then calls a function
+// defined in that loaded script that throws an unhandled error.
+// The resulting message exposed in the global onerror handler
+// is reported back from this function.  Opaque cross origin
+// scripts should not expose the details of the uncaught exception.
+async function get_error_message(t, mode, size) {
+  const script_base = mode === 'same-origin' ? SAME_ORIGIN_BASE
+                                             : CROSS_ORIGIN_BASE;
+  const script = script_base + `opaque-script-${size}.js`;
+  const scope = BASE_SCOPE + `?script=${script}`;
+  const reg = await service_worker_unregister_and_register(t, SW_URL, scope);
+  t.add_cleanup(_ => reg.unregister());
+  assert_true(!!reg.installing);
+  await wait_for_state(t, reg.installing, 'activated');
+  const error_promise = wait_for_error();
+  const f = await with_iframe(scope);
+  t.add_cleanup(_ => f.remove());
+  const error = await error_promise;
+  return error;
+}
+
+promise_test(async t => {
+  const error = await get_error_message(t, 'same-origin', 'small');
+  assert_true(error.includes('Intentional error'));
+}, 'Verify small same-origin cache_storage scripts are not opaque.');
+
+promise_test(async t => {
+  const error = await get_error_message(t, 'same-origin', 'large');
+  assert_true(error.includes('Intentional error'));
+}, 'Verify large same-origin cache_storage scripts are not opaque.');
+
+promise_test(async t => {
+  const error = await get_error_message(t, 'cross-origin', 'small');
+  assert_false(error.includes('Intentional error'));
+}, 'Verify small cross-origin cache_storage scripts are opaque.');
+
+promise_test(async t => {
+  const error = await get_error_message(t, 'cross-origin', 'large');
+  assert_false(error.includes('Intentional error'));
+}, 'Verify large cross-origin cache_storage scripts are opaque.');
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/opaque-script-frame.html b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/opaque-script-frame.html
new file mode 100644
index 0000000..a57aace
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/opaque-script-frame.html
@@ -0,0 +1,21 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+</head>
+<body>
+<script>
+self.addEventListener('error', evt => {
+  self.parent.postMessage({ type: 'ErrorEvent', msg: evt.message }, '*');
+});
+
+const el = document.createElement('script');
+const params = new URLSearchParams(self.location.search);
+el.src = params.get('script');
+el.addEventListener('load', evt => {
+  runScript();
+});
+document.body.appendChild(el);
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/opaque-script-large.js b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/opaque-script-large.js
new file mode 100644
index 0000000..7e1c598e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/opaque-script-large.js
@@ -0,0 +1,41 @@
+function runScript() {
+  throw new Error("Intentional error.");
+}
+
+function unused() {
+  // The following string is intended to be relatively large since some
+  // browsers trigger different code paths based on script size.
+  return "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a " +
+         "tortor ut orci bibendum blandit non quis diam. Aenean sit amet " +
+         "urna sit amet neque malesuada ultricies at vel nisi. Nunc et lacus " +
+         "est. Nam posuere erat enim, ac fringilla purus pellentesque " +
+         "cursus. Proin sodales eleifend lorem, eu semper massa scelerisque " +
+         "ac. Maecenas pharetra leo malesuada vulputate vulputate. Sed at " +
+         "efficitur odio. In rhoncus neque varius nibh efficitur gravida. " +
+         "Curabitur vitae dolor enim. Mauris semper lobortis libero sed " +
+         "congue. Donec felis ante, fringilla eget urna ut, finibus " +
+         "hendrerit lacus. Donec at interdum diam. Proin a neque vitae diam " +
+         "egestas euismod. Mauris posuere elementum lorem, eget convallis " +
+         "nisl elementum et. In ut leo ac neque dapibus pharetra quis ac " +
+         "velit. Integer pretium lectus non urna vulputate, in interdum mi " +
+         "lobortis. Sed laoreet ex et metus pharetra blandit. Curabitur " +
+         "sollicitudin non neque eu varius. Phasellus posuere congue arcu, " +
+         "in aliquam nunc fringilla a. Morbi id facilisis libero. Phasellus " +
+         "metus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. " +
+         "tortor ut orci bibendum blandit non quis diam. Aenean sit amet " +
+         "urna sit amet neque malesuada ultricies at vel nisi. Nunc et lacus " +
+         "est. Nam posuere erat enim, ac fringilla purus pellentesque " +
+         "cursus. Proin sodales eleifend lorem, eu semper massa scelerisque " +
+         "ac. Maecenas pharetra leo malesuada vulputate vulputate. Sed at " +
+         "efficitur odio. In rhoncus neque varius nibh efficitur gravida. " +
+         "Curabitur vitae dolor enim. Mauris semper lobortis libero sed " +
+         "congue. Donec felis ante, fringilla eget urna ut, finibus " +
+         "hendrerit lacus. Donec at interdum diam. Proin a neque vitae diam " +
+         "egestas euismod. Mauris posuere elementum lorem, eget convallis " +
+         "nisl elementum et. In ut leo ac neque dapibus pharetra quis ac " +
+         "velit. Integer pretium lectus non urna vulputate, in interdum mi " +
+         "lobortis. Sed laoreet ex et metus pharetra blandit. Curabitur " +
+         "sollicitudin non neque eu varius. Phasellus posuere congue arcu, " +
+         "in aliquam nunc fringilla a. Morbi id facilisis libero. Phasellus " +
+         "metus.";
+}
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/opaque-script-small.js b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/opaque-script-small.js
new file mode 100644
index 0000000..8b890985
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/opaque-script-small.js
@@ -0,0 +1,3 @@
+function runScript() {
+  throw new Error("Intentional error.");
+}
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/opaque-script-sw.js b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/opaque-script-sw.js
new file mode 100644
index 0000000..4d882c6
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/opaque-script-sw.js
@@ -0,0 +1,37 @@
+importScripts('test-helpers.sub.js');
+importScripts('/common/get-host-info.sub.js');
+
+const NAME = 'foo';
+const SAME_ORIGIN_BASE = new URL('./', self.location.href).href;
+const CROSS_ORIGIN_BASE = new URL('./',
+    get_host_info().HTTPS_REMOTE_ORIGIN + base_path()).href;
+
+const urls = [
+  `${SAME_ORIGIN_BASE}opaque-script-small.js`,
+  `${SAME_ORIGIN_BASE}opaque-script-large.js`,
+  `${CROSS_ORIGIN_BASE}opaque-script-small.js`,
+  `${CROSS_ORIGIN_BASE}opaque-script-large.js`,
+];
+
+self.addEventListener('install', evt => {
+  evt.waitUntil(async function() {
+    const c = await caches.open(NAME);
+    const promises = urls.map(async function(u) {
+      const r = await fetch(u, { mode: 'no-cors' });
+      await c.put(u, r);
+    });
+    await Promise.all(promises);
+  }());
+});
+
+self.addEventListener('fetch', evt => {
+  const url = new URL(evt.request.url);
+  if (!url.pathname.includes('opaque-script-small.js') &&
+      !url.pathname.includes('opaque-script-large.js')) {
+    return;
+  }
+  evt.respondWith(async function() {
+    const c = await caches.open(NAME);
+    return c.match(evt.request);
+  }());
+});
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-content-expected.txt b/third_party/blink/web_tests/fast/css-grid-layout/grid-align-content-expected.txt
deleted file mode 100644
index 69de21eb..0000000
--- a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-content-expected.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-This test checks that the align-content property is applied correctly.
-
-direction: LTR | align-content: 'center'
-
-PASS
-
-direction: LTR | align-content: 'left'
-
-PASS
-
-direction: LTR | align-content: 'right'
-
-PASS
-
-direction: LTR | align-content: 'start'
-
-PASS
-
-direction: LTR | align-content: 'end'
-
-PASS
-
-direction: LTR | align-content: 'flex-start'
-
-PASS
-
-direction: LTR | align-content: 'flex-end
-
-PASS
-
-direction: LTR | align-content: 'auto' (resolved to 'start')
-
-PASS
-
-direction: RTL | align-content: 'center'
-
-PASS
-
-direction: RTL | align-content: 'left'
-
-PASS
-
-direction: RTL | align-content: 'right'
-
-PASS
-
-direction: RTL | align-content: 'start'
-
-PASS
-
-direction: RTL | align-content: 'end'
-
-PASS
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-content.html b/third_party/blink/web_tests/fast/css-grid-layout/grid-align-content.html
deleted file mode 100644
index f697eae9..0000000
--- a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-content.html
+++ /dev/null
@@ -1,167 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<link href="resources/grid.css" rel="stylesheet">
-<link href="resources/grid-alignment.css" rel="stylesheet">
-<script src="../../resources/check-layout.js"></script>
-<style>
-body {
-    margin: 0;
-}
-
-.grid {
-    grid: 100px 100px / 50px 50px;
-    position: relative;
-    width: 200px;
-    height: 300px;
-}
-
-.verticalGrid {
-    width: 300px;
-    height: 200px;
-}
-
-.cell {
-    width: 20px;
-    height: 40px;
-}
-</style>
-</head>
-<body onload="checkLayout('.grid')">
-
-<p>This test checks that the align-content property is applied correctly.</p>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'center'</p>
-    <div class="grid alignContentCenter" data-expected-width="200" data-expected-height="300">
-        <div class="cell firstRowFirstColumn" data-offset-x="0" data-offset-y="50" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="50" data-offset-y="50" data-expected-width="50" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="150" data-expected-width="50" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="50" data-offset-y="150" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'left'</p>
-    <div class="grid alignContentLeft" data-expected-width="200" data-expected-height="300">
-        <div class="cell firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="50" data-offset-y="0" data-expected-width="50" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="100" data-expected-width="50" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="50" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'right'</p>
-    <div class="grid alignContentRight" data-expected-width="200" data-expected-height="300">
-        <div class="cell firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="50" data-offset-y="0" data-expected-width="50" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="100" data-expected-width="50" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="50" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'start'</p>
-    <div class="grid alignContentStart" data-expected-width="200" data-expected-height="300">
-        <div class="cell firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="50" data-offset-y="0" data-expected-width="50" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="100" data-expected-width="50" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="50" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'end'</p>
-    <div class="grid alignContentEnd" data-expected-width="200" data-expected-height="300">
-        <div class="cell firstRowFirstColumn" data-offset-x="0" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="50" data-offset-y="100" data-expected-width="50" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="50" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="50" data-offset-y="200" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'flex-start'</p>
-    <div class="grid alignContentFlexStart" data-expected-width="200" data-expected-height="300">
-        <div class="cell firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="50" data-offset-y="0" data-expected-width="50" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="100" data-expected-width="50" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="50" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'flex-end</p>
-    <div class="grid alignContentFlexEnd" data-expected-width="200" data-expected-height="300">
-        <div class="cell firstRowFirstColumn" data-offset-x="0" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="50" data-offset-y="100" data-expected-width="50" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="50" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="50" data-offset-y="200" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<!-- Default alignment and initial values. -->
-<div style="position: relative">
-    <p>direction: LTR | align-content: 'auto' (resolved to 'start')</p>
-    <div class="grid" data-expected-width="200" data-expected-height="300">
-        <div class="cell firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="50" data-offset-y="0" data-expected-width="50" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="100" data-expected-width="50" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="50" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<!-- RTL direction. -->
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'center'</p>
-    <div class="grid directionRTL alignContentCenter" data-expected-width="200" data-expected-height="300">
-        <div class="cell firstRowFirstColumn" data-offset-x="180" data-offset-y="50" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="100" data-offset-y="50" data-expected-width="50" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="150" data-offset-y="150" data-expected-width="50" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="130" data-offset-y="150" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'left'</p>
-    <div class="grid directionRTL alignContentLeft" data-expected-width="200" data-expected-height="300">
-        <div class="cell firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="50" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="150" data-offset-y="100" data-expected-width="50" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="130" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'right'</p>
-    <div class="grid directionRTL alignContentRight" data-expected-width="200" data-expected-height="300">
-        <div class="cell firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="50" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="150" data-offset-y="100" data-expected-width="50" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="130" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'start'</p>
-    <div class="grid directionRTL alignContentStart" data-expected-width="200" data-expected-height="300">
-        <div class="cell firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="50" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="150" data-offset-y="100" data-expected-width="50" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="130" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <p>direction: RTL | align-content: 'end'</p>
-    <div class="grid directionRTL alignContentEnd" data-expected-width="200" data-expected-height="300">
-        <div class="cell firstRowFirstColumn" data-offset-x="180" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-        <div class="firstRowSecondColumn" data-offset-x="100" data-offset-y="100" data-expected-width="50" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="150" data-offset-y="200" data-expected-width="50" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="130" data-offset-y="200" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-</body>
-</html>
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-expected.txt b/third_party/blink/web_tests/fast/css-grid-layout/grid-align-expected.txt
deleted file mode 100644
index 5ec7e800..0000000
--- a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-expected.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-This test checks that the align-self property is applied correctly.
-
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-margin-border-padding-vertical-lr.html b/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-margin-border-padding-vertical-lr.html
deleted file mode 100644
index 4b81040c22..0000000
--- a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-margin-border-padding-vertical-lr.html
+++ /dev/null
@@ -1,236 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<link href="../css-intrinsic-dimensions/resources/width-keyword-classes.css" rel="stylesheet">
-<link href="resources/grid.css" rel="stylesheet">
-<link href="resources/grid-alignment.css" rel="stylesheet">
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script src="../../resources/check-layout-th.js"></script>
-<style>
-body {
-    margin: 0;
-}
-
-.grid {
-    grid-template-columns: 100px 200px;
-    grid-template-rows: 200px 200px;
-    padding: 10px 15px 20px 30px;
-    border-width: 5px 10px 15px 20px;
-    border-style: dotted;
-    border-color: blue;
-    position: relative;
-}
-
-.cell {
-    width: 20px;
-    height: 40px;
-    margin: 4px 8px 12px 16px;
-}
-</style>
-</head>
-<body onload="checkLayout('.grid')">
-
-<p>This test checks that the 'margin', 'border' and 'padding' properties are applied together correctly for 'align' and 'justify' properties on vertical-LR grids.</p>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR | align-items: 'auto' | justify-items: 'auto'</p>
-    <div class="grid fit-content verticalLR" data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"   data-offset-x="46"  data-offset-y="14"  data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell firstRowSecondColumn"  data-offset-x="46"  data-offset-y="114" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell secondRowFirstColumn"  data-offset-x="246" data-offset-y="14"  data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="246" data-offset-y="114" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR | align-items: 'center' | justify-items: 'center'</p>
-    <div class="grid fit-content verticalLR itemsCenter" data-expected-width="475" data-expected-height="350">
-        <div class="firstRowFirstColumn cell"     data-offset-x="124"  data-offset-y="36"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="30"   data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="230"  data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="324"  data-offset-y="186" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR | align-items: 'end' | justify-items: 'end'</p>
-    <div class="grid fit-content verticalLR itemsEnd" data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"     data-offset-x="202" data-offset-y="58" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="402" data-offset-y="258" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR | align-items: 'left' | justify-items: 'left'</p>
-    <div class="grid fit-content verticalLR itemsLeft" data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"     data-offset-x="46"  data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="246" data-offset-y="114" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR | align-items: 'start' | justify-items: 'right'</p>
-    <div class="grid fit-content verticalLR alignItemsStart justifyItemsRight" data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"     data-offset-x="46"  data-offset-y="58" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="246" data-offset-y="258" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR (ortho) | align-items: 'self-start' | justify-items: 'self-start'</p>
-    <div class="grid fit-content directionLTR verticalLR itemsSelfStart" data-expected-width="475" data-expected-height="350">
-        <div class="directionRTL cell firstRowFirstColumn"     data-offset-x="46"  data-offset-y="58" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionRTL selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionRTL selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionRTL cell secondRowSecondColumn"   data-offset-x="246" data-offset-y="258" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR (ortho) | align-items: 'self-end' | justify-items: 'self-end'</p>
-    <div class="grid fit-content directionLTR verticalLR itemsSelfEnd" data-expected-width="475" data-expected-height="350">
-        <div class="directionRTL cell firstRowFirstColumn"     data-offset-x="202" data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionRTL selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionRTL selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionRTL cell secondRowSecondColumn"   data-offset-x="402" data-offset-y="114" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR (parall) | align-items: 'self-start' | justify-items: 'self-start'</p>
-    <div class="grid fit-content directionLTR verticalLR itemsSelfStart" data-expected-width="475" data-expected-height="350">
-        <div class="directionLTR cell firstRowFirstColumn"     data-offset-x="46"  data-offset-y="14" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionLTR selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionLTR selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionLTR cell secondRowSecondColumn"   data-offset-x="246" data-offset-y="114" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR (parall) | align-items: 'self-end' | justify-items: 'self-end'</p>
-    <div class="grid fit-content directionLTR verticalLR itemsSelfEnd" data-expected-width="475" data-expected-height="350">
-        <div class="directionLTR cell firstRowFirstColumn"     data-offset-x="202" data-offset-y="58"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionLTR selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionLTR selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionLTR cell secondRowSecondColumn"   data-offset-x="402" data-offset-y="258" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<!-- RTL direction. -->
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL | align-items: 'auto' | justify-items: 'auto'</p>
-    <div class="grid fit-content verticalLR directionRTL" data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"   data-offset-x="46"  data-offset-y="258" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell firstRowSecondColumn"  data-offset-x="46"  data-offset-y="158" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell secondRowFirstColumn"  data-offset-x="246" data-offset-y="258" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="246" data-offset-y="158" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL | align-items: 'center' | justify-items: 'center'</p>
-    <div class="grid fit-content verticalLR directionRTL itemsCenter" data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"     data-offset-x="124" data-offset-y="236" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="324" data-offset-y="86" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL | align-items: 'end' | justify-items: 'end'</p>
-    <div class="grid fit-content verticalLR directionRTL itemsEnd"       data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"     data-offset-x="202" data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="402" data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL | align-items: 'start' | justify-items: 'left'</p>
-    <div class="grid fit-content verticalLR directionRTL alignItemsStart justifyItemsLeft"      data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"     data-offset-x="46"  data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="246" data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL | align-items: 'start' | justify-items: 'right'</p>
-    <div class="grid fit-content verticalLR directionRTL alignItemsStart justifyItemsRight"     data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"     data-offset-x="46"  data-offset-y="258" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="246" data-offset-y="158" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL (ortho) | align-items: 'self-start' | justify-items: 'self-start'</p>
-    <div class="grid fit-content verticalLR directionRTL itemsSelfStart" data-expected-width="475" data-expected-height="350">
-        <div class="directionLTR cell firstRowFirstColumn"     data-offset-x="46"  data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionLTR selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionLTR selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionLTR cell secondRowSecondColumn"   data-offset-x="246" data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL (ortho) | align-items: 'self-end' | justify-items: 'self-end'</p>
-    <div class="grid fit-content verticalLR directionRTL itemsSelfEnd" data-expected-width="475" data-expected-height="350">
-        <div class="directionLTR cell firstRowFirstColumn"     data-offset-x="202" data-offset-y="258" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionLTR selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionLTR selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionLTR cell secondRowSecondColumn"   data-offset-x="402" data-offset-y="158" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL (parall) | align-items: 'self-start' | justify-items: 'self-start'</p>
-    <div class="grid fit-content verticalLR directionRTL itemsSelfStart" data-expected-width="475" data-expected-height="350">
-        <div class="directionRTL cell firstRowFirstColumn"     data-offset-x="46"  data-offset-y="258" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionRTL selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionRTL selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionRTL cell secondRowSecondColumn"   data-offset-x="246" data-offset-y="158"  data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL (parall) | align-items: 'self-end' | justify-items: 'self-end'</p>
-    <div class="grid fit-content verticalLR directionRTL itemsSelfEnd" data-expected-width="475" data-expected-height="350">
-        <div class="directionRTL cell firstRowFirstColumn"     data-offset-x="202" data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionRTL selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionRTL selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionRTL cell secondRowSecondColumn"   data-offset-x="402" data-offset-y="14" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-</body>
-</html>
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-margin-border-padding-vertical-rl.html b/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-margin-border-padding-vertical-rl.html
deleted file mode 100644
index d41754fd..0000000
--- a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-margin-border-padding-vertical-rl.html
+++ /dev/null
@@ -1,237 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<link href="../css-intrinsic-dimensions/resources/width-keyword-classes.css" rel="stylesheet">
-<link href="resources/grid.css" rel="stylesheet">
-<link href="resources/grid-alignment.css" rel="stylesheet">
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script src="../../resources/check-layout-th.js"></script>
-<style>
-body {
-    margin: 0;
-}
-
-.grid {
-    grid-template-columns: 100px 200px;
-    grid-template-rows: 200px 200px;
-    padding: 10px 15px 20px 30px;
-    border-width: 5px 10px 15px 20px;
-    border-style: dotted;
-    border-color: blue;
-    position: relative;
-}
-
-.cell {
-    width: 20px;
-    height: 40px;
-    margin: 4px 8px 12px 16px;
-}
-</style>
-</head>
-<body onload="checkLayout('.grid')">
-
-<p>This test checks that the 'margin', 'border' and 'padding' properties are applied together correctly for 'align' and 'justify' properties on vertical-RL grids.</p>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR | align-items: 'auto' | justify-items: 'auto'</p>
-    <div class="grid fit-content verticalRL" data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"   data-offset-x="402" data-offset-y="14"  data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell firstRowSecondColumn"  data-offset-x="402" data-offset-y="114" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell secondRowFirstColumn"  data-offset-x="202" data-offset-y="14"  data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="202" data-offset-y="114" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR | align-items: 'center' | justify-items: 'center'</p>
-    <div class="grid fit-content verticalRL itemsCenter" data-expected-width="475" data-expected-height="350">
-        <div class="firstRowFirstColumn cell"     data-offset-x="324" data-offset-y="36"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="124" data-offset-y="186" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR | align-items: 'end' | justify-items: 'end'</p>
-    <div class="grid fit-content verticalRL itemsEnd" data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"     data-offset-x="246" data-offset-y="58" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="46"  data-offset-y="258" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR | align-items: 'left' | justify-items: 'left'</p>
-    <div class="grid fit-content verticalRL itemsLeft" data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"     data-offset-x="402" data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="202" data-offset-y="114" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR | align-items: 'start' | justify-items: 'right'</p>
-    <div class="grid fit-content verticalRL alignItemsStart justifyItemsRight" data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"     data-offset-x="402" data-offset-y="58" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="202" data-offset-y="258" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR (ortho) | align-items: 'self-start' | justify-items: 'self-start'</p>
-    <div class="grid fit-content directionLTR verticalRL itemsSelfStart" data-expected-width="475" data-expected-height="350">
-        <div class="directionRTL cell firstRowFirstColumn"     data-offset-x="402" data-offset-y="58" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionRTL selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionRTL selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionRTL cell secondRowSecondColumn"   data-offset-x="202" data-offset-y="258" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR (ortho) | align-items: 'self-end' | justify-items: 'self-end'</p>
-    <div class="grid fit-content directionLTR verticalRL itemsSelfEnd" data-expected-width="475" data-expected-height="350">
-        <div class="directionRTL cell firstRowFirstColumn"     data-offset-x="246" data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionRTL selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionRTL selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionRTL cell secondRowSecondColumn"   data-offset-x="46"  data-offset-y="114" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR (parall) | align-items: 'self-start' | justify-items: 'self-start'</p>
-    <div class="grid fit-content directionLTR verticalRL itemsSelfStart" data-expected-width="475" data-expected-height="350">
-        <div class="directionLTR cell firstRowFirstColumn"     data-offset-x="402" data-offset-y="14" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionLTR selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionLTR selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionLTR cell secondRowSecondColumn"   data-offset-x="202" data-offset-y="114" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR (parall) | align-items: 'self-end' | justify-items: 'self-end'</p>
-    <div class="grid fit-content directionLTR verticalRL itemsSelfEnd" data-expected-width="475" data-expected-height="350">
-        <div class="directionLTR cell firstRowFirstColumn"     data-offset-x="246" data-offset-y="58"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionLTR selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="110" data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionLTR selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionLTR cell secondRowSecondColumn"   data-offset-x="46"  data-offset-y="258" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-
-<!-- RTL direction. -->
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL | align-items: 'auto' | justify-items: 'auto'</p>
-    <div class="grid fit-content verticalRL directionRTL" data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"   data-offset-x="402" data-offset-y="258" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell firstRowSecondColumn"  data-offset-x="402" data-offset-y="158" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell secondRowFirstColumn"  data-offset-x="202" data-offset-y="258" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="202" data-offset-y="158" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL | align-items: 'center' | justify-items: 'center'</p>
-    <div class="grid fit-content verticalRL directionRTL itemsCenter" data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"     data-offset-x="324" data-offset-y="236" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="124" data-offset-y="86" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL | align-items: 'end' | justify-items: 'end'</p>
-    <div class="grid fit-content verticalRL directionRTL itemsEnd"       data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"     data-offset-x="246" data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="46"  data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL | align-items: 'start' | justify-items: 'left'</p>
-    <div class="grid fit-content verticalRL directionRTL alignItemsStart justifyItemsLeft"      data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"     data-offset-x="402" data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="202" data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL | align-items: 'start' | justify-items: 'right'</p>
-    <div class="grid fit-content verticalRL directionRTL alignItemsStart justifyItemsRight"     data-expected-width="475" data-expected-height="350">
-        <div class="cell firstRowFirstColumn"     data-offset-x="402" data-offset-y="258" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="202" data-offset-y="158" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL (ortho) | align-items: 'self-start' | justify-items: 'self-start'</p>
-    <div class="grid fit-content verticalRL directionRTL itemsSelfStart" data-expected-width="475" data-expected-height="350">
-        <div class="directionLTR cell firstRowFirstColumn"     data-offset-x="402" data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionLTR selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionLTR selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionLTR cell secondRowSecondColumn"   data-offset-x="202" data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL (ortho) | align-items: 'self-end' | justify-items: 'self-end'</p>
-    <div class="grid fit-content verticalRL directionRTL itemsSelfEnd" data-expected-width="475" data-expected-height="350">
-        <div class="directionLTR cell firstRowFirstColumn"     data-offset-x="246" data-offset-y="258" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionLTR selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionLTR selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionLTR cell secondRowSecondColumn"   data-offset-x="46"  data-offset-y="158" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL (parall) | align-items: 'self-start' | justify-items: 'self-start'</p>
-    <div class="grid fit-content verticalRL directionRTL itemsSelfStart" data-expected-width="475" data-expected-height="350">
-        <div class="directionRTL cell firstRowFirstColumn"     data-offset-x="402" data-offset-y="258" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionRTL selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionRTL selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionRTL cell secondRowSecondColumn"   data-offset-x="202" data-offset-y="158"  data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL (parall) | align-items: 'self-end' | justify-items: 'self-end'</p>
-    <div class="grid fit-content verticalRL directionRTL itemsSelfEnd" data-expected-width="475" data-expected-height="350">
-        <div class="directionRTL cell firstRowFirstColumn"     data-offset-x="246" data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionRTL selfStretch firstRowSecondColumn" data-offset-x="230" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionRTL selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="200" data-expected-height="100"></div>
-        <div class="directionRTL cell secondRowSecondColumn"   data-offset-x="46"  data-offset-y="14" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-</body>
-</html>
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-margin-border-padding.html b/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-margin-border-padding.html
deleted file mode 100644
index f43f0e80..0000000
--- a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-margin-border-padding.html
+++ /dev/null
@@ -1,236 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<link href="../css-intrinsic-dimensions/resources/width-keyword-classes.css" rel="stylesheet">
-<link href="resources/grid.css" rel="stylesheet">
-<link href="resources/grid-alignment.css" rel="stylesheet">
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script src="../../resources/check-layout-th.js"></script>
-<style>
-body {
-    margin: 0;
-}
-
-.grid {
-    grid-template-columns: 100px 200px;
-    grid-template-rows: 200px 200px;
-    padding: 10px 15px 20px 30px;
-    border-width: 5px 10px 15px 20px;
-    border-style: dotted;
-    border-color: blue;
-    position: relative;
-}
-
-.cell {
-    width: 20px;
-    height: 40px;
-    margin: 4px 8px 12px 16px;
-}
-</style>
-</head>
-<body onload="checkLayout('.grid')">
-
-<p>This test checks that the 'margin', 'border' and 'padding' properties are applied together correctly for 'align' and 'justify' properties.</p>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR | align-items: 'auto' | justify-items: 'auto'</p>
-    <div class="grid fit-content" data-expected-width="375" data-expected-height="450">
-        <div class="cell firstRowFirstColumn"   data-offset-x="46"  data-offset-y="14"  data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell firstRowSecondColumn"  data-offset-x="146" data-offset-y="14"  data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell secondRowFirstColumn"  data-offset-x="46"  data-offset-y="214" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="146" data-offset-y="214" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR | align-items: 'center' | justify-items: 'center'</p>
-    <div class="grid fit-content itemsCenter" data-expected-width="375" data-expected-height="450">
-        <div class="firstRowFirstColumn cell"     data-offset-x="74"  data-offset-y="86" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="130" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="224" data-offset-y="286" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR | align-items: 'end' | justify-items: 'end'</p>
-    <div class="grid fit-content itemsEnd" data-expected-width="375" data-expected-height="450">
-        <div class="cell firstRowFirstColumn"     data-offset-x="102" data-offset-y="158" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="130" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="302" data-offset-y="358" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR | align-items: 'start' | justify-items: 'left'</p>
-    <div class="grid fit-content alignItemsStart justifyItemsLeft" data-expected-width="375" data-expected-height="450">
-        <div class="cell firstRowFirstColumn"     data-offset-x="46"  data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="130" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="146" data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR | align-items: 'start' | justify-items: 'right'</p>
-    <div class="grid fit-content alignItemsStart justifyItemsRight" data-expected-width="375" data-expected-height="450">
-        <div class="cell firstRowFirstColumn"     data-offset-x="102" data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="130" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="302" data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR (ortho) | align-items: 'self-start' | justify-items: 'self-start'</p>
-    <div class="grid fit-content directionLTR itemsSelfStart" data-expected-width="375" data-expected-height="450">
-        <div class="directionRTL cell firstRowFirstColumn"     data-offset-x="102" data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionRTL selfStretch firstRowSecondColumn" data-offset-x="130" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionRTL selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="directionRTL cell secondRowSecondColumn"   data-offset-x="302" data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR (ortho) | align-items: 'self-end' | justify-items: 'self-end'</p>
-    <div class="grid fit-content directionLTR itemsSelfEnd" data-expected-width="375" data-expected-height="450">
-        <div class="directionRTL cell firstRowFirstColumn"     data-offset-x="46"  data-offset-y="158" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionRTL selfStretch firstRowSecondColumn" data-offset-x="130" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionRTL selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="directionRTL cell secondRowSecondColumn"   data-offset-x="146" data-offset-y="358" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR (parall) | align-items: 'self-start' | justify-items: 'self-start'</p>
-    <div class="grid fit-content directionLTR itemsSelfStart" data-expected-width="375" data-expected-height="450">
-        <div class="directionLTR cell firstRowFirstColumn"     data-offset-x="46" data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionLTR selfStretch firstRowSecondColumn" data-offset-x="130" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionLTR selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="directionLTR cell secondRowSecondColumn"   data-offset-x="146" data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: LTR - (parall) | align-items: 'self-end' | justify-items: 'self-end'</p>
-    <div class="grid fit-content directionLTR itemsSelfEnd" data-expected-width="375" data-expected-height="450">
-        <div class="directionLTR cell firstRowFirstColumn"     data-offset-x="102"  data-offset-y="158" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionLTR selfStretch firstRowSecondColumn" data-offset-x="130" data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionLTR selfStretch secondRowFirstColumn" data-offset-x="30"  data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="directionLTR cell secondRowSecondColumn"   data-offset-x="302" data-offset-y="358" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<!-- RTL direction. -->
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL | align-items: 'auto' | justify-items: 'auto'</p>
-    <div class="grid fit-content directionRTL" data-expected-width="375" data-expected-height="450">
-        <div class="cell firstRowFirstColumn"   data-offset-x="302" data-offset-y="14"  data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell firstRowSecondColumn"  data-offset-x="202" data-offset-y="14"  data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell secondRowFirstColumn"  data-offset-x="302" data-offset-y="214" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell secondRowSecondColumn" data-offset-x="202" data-offset-y="214" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL | align-items: 'center' | justify-items: 'center'</p>
-    <div class="grid fit-content directionRTL itemsCenter" data-expected-width="375" data-expected-height="450">
-        <div class="cell firstRowFirstColumn"     data-offset-x="274" data-offset-y="86" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="124" data-offset-y="286" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL | align-items: 'end' | justify-items: 'end'</p>
-    <div class="grid fit-content directionRTL itemsEnd"       data-expected-width="375" data-expected-height="450">
-        <div class="cell firstRowFirstColumn"     data-offset-x="246" data-offset-y="158" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="46"  data-offset-y="358" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL | align-items: 'start' | justify-items: 'left'</p>
-    <div class="grid fit-content directionRTL alignItemsStart justifyItemsLeft"      data-expected-width="375" data-expected-height="450">
-        <div class="cell firstRowFirstColumn"     data-offset-x="246" data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="46"  data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL | align-items: 'start' | justify-items: 'right'</p>
-    <div class="grid fit-content directionRTL alignItemsStart justifytemsRight"     data-expected-width="375" data-expected-height="450">
-        <div class="cell firstRowFirstColumn"     data-offset-x="302" data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="cell secondRowSecondColumn"   data-offset-x="202" data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL (ortho) | align-items: 'self-start' | justify-items: 'self-start'</p>
-    <div class="grid fit-content directionRTL itemsSelfStart" data-expected-width="375" data-expected-height="450">
-        <div class="directionLTR cell firstRowFirstColumn"     data-offset-x="246" data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionLTR selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionLTR selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="directionLTR cell secondRowSecondColumn"   data-offset-x="46"  data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL (ortho) | align-items: 'self-end' | justify-items: 'self-end'</p>
-    <div class="grid fit-content directionRTL itemsSelfEnd" data-expected-width="375" data-expected-height="450">
-        <div class="directionLTR cell firstRowFirstColumn"     data-offset-x="302" data-offset-y="158" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionLTR selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionLTR selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="directionLTR cell secondRowSecondColumn"   data-offset-x="202" data-offset-y="358" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL (parall) | align-items: 'self-start' | justify-items: 'self-start'</p>
-    <div class="grid fit-content directionRTL itemsSelfStart" data-expected-width="375" data-expected-height="450">
-        <div class="directionRTL cell firstRowFirstColumn"     data-offset-x="302" data-offset-y="14"  data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionRTL selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionRTL selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="directionRTL cell secondRowSecondColumn"   data-offset-x="202"  data-offset-y="214" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-<div>
-    <p>border: 5px 10px 15px 20px | padding: 10px 15px 20px 30px | margin: 4px 8px 12px 16px<br>
-        direction: RTL (parall) | align-items: 'self-end' | justify-items: 'self-end'</p>
-    <div class="grid fit-content directionRTL itemsSelfEnd" data-expected-width="375" data-expected-height="450">
-        <div class="directionRTL cell firstRowFirstColumn"     data-offset-x="246" data-offset-y="158" data-expected-width="20"  data-expected-height="40"></div>
-        <div class="directionRTL selfStretch firstRowSecondColumn" data-offset-x="30"  data-offset-y="10"  data-expected-width="200" data-expected-height="200"></div>
-        <div class="directionRTL selfStretch secondRowFirstColumn" data-offset-x="230" data-offset-y="210" data-expected-width="100" data-expected-height="200"></div>
-        <div class="directionRTL cell secondRowSecondColumn"   data-offset-x="46" data-offset-y="358" data-expected-width="20"  data-expected-height="40"></div>
-    </div>
-</div>
-
-</body>
-</html>
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-overflow-expected.txt b/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-overflow-expected.txt
deleted file mode 100644
index ee761ee..0000000
--- a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-overflow-expected.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-This test checks that the 'overflow' keyword is applied correctly for 'align' and 'justify' properties.
-
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-overflow.html b/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-overflow.html
deleted file mode 100644
index 53a4c9f2..0000000
--- a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-overflow.html
+++ /dev/null
@@ -1,134 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<link href="../css-intrinsic-dimensions/resources/width-keyword-classes.css" rel="stylesheet">
-<link href="resources/grid.css" rel="stylesheet">
-<link href="resources/grid-alignment.css" rel="stylesheet">
-<script src="../../resources/check-layout.js"></script>
-<style>
-body {
-    margin: 0;
-}
-
-.grid {
-    grid-template-columns: 150px 150px;
-    grid-template-rows: 120px 120px 120px;
-    margin-bottom: 20px;
-}
-
-.cellOverflowWidth {
-    width: 180px;
-    height: 40px;
-}
-
-.cellOverflowHeight {
-    width: 50px;
-    height: 150px;
-}
-
-.cellWithNoOverflow {
-    width: 50px;
-    height: 40px;
-}
-
-.thirdRowFirstColumn {
-    background-color: green;
-    grid-column: 1;
-    grid-row: 3;
-}
-</style>
-</head>
-<body onload="checkLayout('.grid')">
-
-<p>This test checks that the 'overflow' keyword is applied correctly for 'align' and 'justify' properties.</p>
-
-<div style="position: relative">
-    <div class="grid fit-content alignItemsCenter justifyItemsCenter" data-expected-width="300" data-expected-height="360">
-        <div class="cellOverflowWidth  firstRowFirstColumn" data-offset-x="-15" data-offset-y="40" data-expected-width="180" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow secondRowFirstColumn" data-offset-x="50" data-offset-y="160" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow thirdRowFirstColumn" data-offset-x="50" data-offset-y="280" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow firstRowSecondColumn" data-offset-x="200" data-offset-y="40" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellOverflowWidth  secondRowSecondColumn" data-offset-x="135" data-offset-y="160" data-expected-width="180" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow thirdRowSecondColumn" data-offset-x="200" data-offset-y="280" data-expected-width="50" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content alignItemsCenterUnsafe justifyItemsCenterUnsafe" data-expected-width="300" data-expected-height="360">
-        <div class="cellOverflowHeight firstRowFirstColumn" data-offset-x="50" data-offset-y="-15" data-expected-width="50" data-expected-height="150"></div>
-        <div class="cellWithNoOverflow secondRowFirstColumn" data-offset-x="50" data-offset-y="160" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow thirdRowFirstColumn" data-offset-x="50" data-offset-y="280" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow firstRowSecondColumn" data-offset-x="200" data-offset-y="40" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellOverflowHeight secondRowSecondColumn" data-offset-x="200" data-offset-y="105" data-expected-width="50" data-expected-height="150"></div>
-        <div class="cellWithNoOverflow thirdRowSecondColumn" data-offset-x="200" data-offset-y="280" data-expected-width="50" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content alignItemsCenterSafe justifyItemsCenterSafe" data-expected-width="300" data-expected-height="360">
-        <div class="cellOverflowWidth  firstRowFirstColumn" data-offset-x="0" data-offset-y="40" data-expected-width="180" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow secondRowFirstColumn" data-offset-x="50" data-offset-y="160" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow thirdRowFirstColumn" data-offset-x="50" data-offset-y="280" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow firstRowSecondColumn" data-offset-x="200" data-offset-y="40" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellOverflowWidth  secondRowSecondColumn" data-offset-x="150" data-offset-y="160" data-expected-width="180" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow thirdRowSecondColumn" data-offset-x="200" data-offset-y="280" data-expected-width="50" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content alignItemsCenterSafe justifyItemsCenterSafe" data-expected-width="300" data-expected-height="360">
-        <div class="cellOverflowHeight firstRowFirstColumn" data-offset-x="50" data-offset-y="0" data-expected-width="50" data-expected-height="150"></div>
-        <div class="cellWithNoOverflow secondRowFirstColumn" data-offset-x="50" data-offset-y="160" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow thirdRowFirstColumn" data-offset-x="50" data-offset-y="280" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow firstRowSecondColumn" data-offset-x="200" data-offset-y="40" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellOverflowHeight secondRowSecondColumn alignSelfCenterSafe justifySelfCenterSafe" data-offset-x="200" data-offset-y="120" data-expected-width="50" data-expected-height="150"></div>
-        <div class="cellWithNoOverflow thirdRowSecondColumn" data-offset-x="200" data-offset-y="280" data-expected-width="50" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content alignItemsEnd justifyItemsEnd" data-expected-width="300" data-expected-height="360">
-        <div class="cellOverflowWidth  firstRowFirstColumn" data-offset-x="-30" data-offset-y="80" data-expected-width="180" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow secondRowFirstColumn justifySelfCenter" data-offset-x="50" data-offset-y="200" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow thirdRowFirstColumn" data-offset-x="100" data-offset-y="320" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow firstRowSecondColumn" data-offset-x="250" data-offset-y="80" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellOverflowWidth  secondRowSecondColumn" data-offset-x="120" data-offset-y="200" data-expected-width="180" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow thirdRowSecondColumn" data-offset-x="250" data-offset-y="320" data-expected-width="50" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content alignItemsEndUnsafe justifyItemsEndUnsafe" data-expected-width="300" data-expected-height="360">
-        <div class="cellOverflowHeight firstRowFirstColumn" data-offset-x="100" data-offset-y="-30" data-expected-width="50" data-expected-height="150"></div>
-        <div class="cellWithNoOverflow secondRowFirstColumn" data-offset-x="100" data-offset-y="200" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow thirdRowFirstColumn" data-offset-x="100" data-offset-y="320" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow firstRowSecondColumn alignSelfCenter" data-offset-x="250" data-offset-y="40" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellOverflowHeight secondRowSecondColumn" data-offset-x="250" data-offset-y="90" data-expected-width="50" data-expected-height="150"></div>
-        <div class="cellWithNoOverflow thirdRowSecondColumn" data-offset-x="250" data-offset-y="320" data-expected-width="50" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content alignItemsEndSafe justifyItemsEndSafe" data-expected-width="300" data-expected-height="360">
-        <div class="cellOverflowWidth  firstRowFirstColumn" data-offset-x="0" data-offset-y="80" data-expected-width="180" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow secondRowFirstColumn justifySelfCenterUnsafe" data-offset-x="50" data-offset-y="200" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow thirdRowFirstColumn" data-offset-x="100" data-offset-y="320" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow firstRowSecondColumn" data-offset-x="250" data-offset-y="80" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellOverflowWidth  secondRowSecondColumn" data-offset-x="150" data-offset-y="200" data-expected-width="180" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow thirdRowSecondColumn" data-offset-x="250" data-offset-y="320" data-expected-width="50" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content alignItemsEndSafe justifyItemsEndSafe" data-expected-width="300" data-expected-height="360">
-        <div class="cellOverflowHeight firstRowFirstColumn" data-offset-x="100" data-offset-y="0" data-expected-width="50" data-expected-height="150"></div>
-        <div class="cellWithNoOverflow secondRowFirstColumn" data-offset-x="100" data-offset-y="200" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow thirdRowFirstColumn" data-offset-x="100" data-offset-y="320" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellWithNoOverflow firstRowSecondColumn alignSelfCenterUnsafe" data-offset-x="250" data-offset-y="40" data-expected-width="50" data-expected-height="40"></div>
-        <div class="cellOverflowHeight secondRowSecondColumn" data-offset-x="250" data-offset-y="120" data-expected-width="50" data-expected-height="150"></div>
-        <div class="cellWithNoOverflow thirdRowSecondColumn" data-offset-x="250" data-offset-y="320" data-expected-width="50" data-expected-height="40"></div>
-    </div>
-</div>
-
-</body>
-</html>
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-stretch-expected.txt b/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-stretch-expected.txt
deleted file mode 100644
index 9911dff2..0000000
--- a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-stretch-expected.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-This test checks that the 'stretch' value is applied correctly for 'align' and 'justify' properties.
-
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
-PASS
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-stretch-with-orthogonal-flows.html b/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-stretch-with-orthogonal-flows.html
deleted file mode 100644
index 75d58ea..0000000
--- a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-stretch-with-orthogonal-flows.html
+++ /dev/null
@@ -1,119 +0,0 @@
-<!DOCTYPE html>
-<link href="resources/grid.css" rel="stylesheet">
-<link href="resources/grid-alignment.css" rel="stylesheet">
-<link href="../css-intrinsic-dimensions/resources/width-keyword-classes.css" rel="stylesheet">
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script src="../../resources/check-layout-th.js"></script>
-<style>
-body {
-    margin: 0;
-}
-.container {
-    position: relative;
-}
-.grid {
-    grid-template-columns: 100px 100px;
-    grid-template-rows: 150px 150px;
-    font: 10px/1 Ahem;
-}
-.widthAndHeightSet {
-    width: 20px;
-    height: 40px;
-}
-.onlyWidthSet { width: 20px; }
-.onlyHeightSet { height: 40px; }
-.maxHeight { max-height: 160px; }
-.maxWidth { max-width: 90px; }
-.minWidth { min-width: 120px; }
-.minHeight { min-height: 220px; }
-.topAutoMargin { margin-top: auto; }
-.bottomAutoMargin { margin-bottom: auto; }
-.leftAutoMargin { margin-left: auto; }
-.rightAutoMargin { margin-right: auto; }
-</style>
-<body onload="checkLayout('.grid')">
-<div id="log"></div>
-<p>This test checks that stretching alignment works as expected with orthogonal flows.</p>
-
-<p>HORIZONTAL vs VERTICAL-RL</p>
-<p><b>row1/col1:</b> fixed width and height - <b>row1/col2:</b> fixed width and auto height - <b>row2/col1:</b> auto width and fixed height - <b>row2/col2:</b> auto width and height, but start.</p>
-<div class="container">
-    <div class="grid fit-content" data-expected-width="200" data-expected-height="300">
-        <div class="verticalRL firstRowFirstColumn   selfStretch   widthAndHeightSet " data-expected-width="20"  data-expected-height="40">XXX</div>
-        <div class="verticalRL firstRowSecondColumn  sefStretch    onlyWidthSet      " data-expected-width="20"  data-expected-height="150">XXX</div>
-        <div class="verticalRL secondRowFirstColumn  selfStretch    onlyHeightSet     " data-expected-width="100" data-expected-height="40">XXX</div>
-        <div class="verticalRL secondRowSecondColumn selfSelfStart                   " data-expected-width="10"  data-expected-height="30">XXX</div>
-    </div>
-</div>
-<p><b>row1/co1l:</b> bottom auto margin - <b>row1/col2:</b> left auto margin - <b>row2/col1:</b> top auto margin - <b>row2/col2:</b> right auto margin.</p>
-<div class="container">
-    <div class="grid fit-content" data-expected-width="200" data-expected-height="300">
-        <div class="verticalRL firstRowFirstColumn   selfStretch bottomAutoMargin " data-expected-width="100" data-expected-height="30">XXX</div>
-        <div class="verticalRL firstRowSecondColumn  seffStretch leftAutoMargin   " data-expected-width="10"  data-expected-height="150">XXX</div>
-        <div class="verticalRL secondRowFirstColumn  selffStretch topAutoMargin    " data-expected-width="100" data-expected-height="30">XXX</div>
-        <div class="verticalRL secondRowSecondColumn selffStretch rightAutoMargin  " data-expected-width="10"  data-expected-height="150">XXX</div>
-    </div>
-</div>
-
-<p>HORIZONTAL vs VERTICAL-LR</p>
-<p><b>row1/col1:</b> fixed width and height - <b>row1/col2:</b> fixed width and auto height - <b>row2/col1:</b> auto width and fixed height - <b>row2/col2:</b> auto width and height, but start.</p>
-<div class="container">
-    <div class="grid fit-content" data-expected-width="200" data-expected-height="300">
-        <div class="verticalLR firstRowFirstColumn   selfStretch   widthAndHeightSet " data-expected-width="20"  data-expected-height="40">XXX</div>
-        <div class="verticalLR firstRowSecondColumn  sefStretch    onlyWidthSet      " data-expected-width="20"  data-expected-height="150">XXX</div>
-        <div class="verticalLR secondRowFirstColumn  selfStretch    onlyHeightSet     " data-expected-width="100" data-expected-height="40">XXX</div>
-        <div class="verticalLR secondRowSecondColumn selfSelfStart                   " data-expected-width="10"  data-expected-height="30">XXX</div>
-    </div>
-</div>
-<p><b>row1/co1l:</b> bottom auto margin - <b>row1/col2:</b> left auto margin - <b>row2/col1:</b> top auto margin - <b>row2/col2:</b> right auto margin.</p>
-<div class="container">
-    <div class="grid fit-content" data-expected-width="200" data-expected-height="300">
-        <div class="verticalLR firstRowFirstColumn   selfStretch bottomAutoMargin " data-expected-width="100" data-expected-height="30">XXX</div>
-        <div class="verticalLR firstRowSecondColumn  seffStretch leftAutoMargin   " data-expected-width="10"  data-expected-height="150">XXX</div>
-        <div class="verticalLR secondRowFirstColumn  selffStretch topAutoMargin    " data-expected-width="100" data-expected-height="30">XXX</div>
-        <div class="verticalLR secondRowSecondColumn selffStretch rightAutoMargin  " data-expected-width="10"  data-expected-height="150">XXX</div>
-    </div>
-</div>
-
-<p>VERTICAL-RL vs HORIZONTAL</p>
-<p><b>row1/col1:</b> fixed width and height - <b>row1/col2:</b> fixed width and auto height - <b>row2/col1:</b> auto width and fixed height - <b>row2/col2:</b> auto width and height, but start.</p>
-<div class="container">
-    <div class="grid fit-content verticalRL" data-expected-width="300" data-expected-height="200">
-        <div class="horizonalTB firstRowFirstColumn   selfStretch   widthAndHeightSet " data-expected-width="20"  data-expected-height="40">XXX</div>
-        <div class="horizonalTB firstRowSecondColumn  sefStretch    onlyWidthSet      " data-expected-width="20"  data-expected-height="100">XXX</div>
-        <div class="horizonalTB secondRowFirstColumn  selfStretch    onlyHeightSet     " data-expected-width="150" data-expected-height="40">XXX</div>
-        <div class="horizonalTB secondRowSecondColumn selfSelfStart                   " data-expected-width="10"  data-expected-height="30">XXX</div>
-    </div>
-</div>
-<p><b>row1/co1l:</b> bottom auto margin - <b>row1/col2:</b> left auto margin - <b>row2/col1:</b> top auto margin - <b>row2/col2:</b> right auto margin.</p>
-<div class="container">
-    <div class="grid fit-content verticalRL" data-expected-width="300" data-expected-height="200">
-        <div class="horizonalTB firstRowFirstColumn   selfStretch bottomAutoMargin " data-expected-width="150" data-expected-height="30">XXX</div>
-        <div class="horizonalTB firstRowSecondColumn  seffStretch leftAutoMargin   " data-expected-width="10"  data-expected-height="100">XXX</div>
-        <div class="horizonalTB secondRowFirstColumn  selffStretch topAutoMargin    " data-expected-width="150" data-expected-height="30">XXX</div>
-        <div class="horizonalTB secondRowSecondColumn selffStretch rightAutoMargin  " data-expected-width="10"  data-expected-height="100">XXX</div>
-    </div>
-</div>
-
-<p>VERTICAL-LR vs HORIZONTAL</p>
-<p><b>row1/col1:</b> fixed width and height - <b>row1/col2:</b> fixed width and auto height - <b>row2/col1:</b> auto width and fixed height - <b>row2/col2:</b> auto width and height, but start.</p>
-<div class="container">
-    <div class="grid fit-content verticalLR" data-expected-width="300" data-expected-height="200">
-        <div class="horizonalTB firstRowFirstColumn   selfStretch   widthAndHeightSet " data-expected-width="20"  data-expected-height="40">XXX</div>
-        <div class="horizonalTB firstRowSecondColumn  sefStretch    onlyWidthSet      " data-expected-width="20"  data-expected-height="100">XXX</div>
-        <div class="horizonalTB secondRowFirstColumn  selfStretch    onlyHeightSet     " data-expected-width="150" data-expected-height="40">XXX</div>
-        <div class="horizonalTB secondRowSecondColumn selfSelfStart                   " data-expected-width="10"  data-expected-height="30">XXX</div>
-    </div>
-</div>
-<p><b>row1/co1l:</b> bottom auto margin - <b>row1/col2:</b> left auto margin - <b>row2/col1:</b> top auto margin - <b>row2/col2:</b> right auto margin.</p>
-<div class="container">
-    <div class="grid fit-content verticalLR" data-expected-width="300" data-expected-height="200">
-        <div class="horizonalTB firstRowFirstColumn   selfStretch bottomAutoMargin " data-expected-width="150" data-expected-height="30">XXX</div>
-        <div class="horizonalTB firstRowSecondColumn  seffStretch leftAutoMargin   " data-expected-width="10"  data-expected-height="100">XXX</div>
-        <div class="horizonalTB secondRowFirstColumn  selffStretch topAutoMargin    " data-expected-width="150" data-expected-height="30">XXX</div>
-        <div class="horizonalTB secondRowSecondColumn selffStretch rightAutoMargin  " data-expected-width="10"  data-expected-height="100">XXX</div>
-    </div>
-</div>
-
-</body>
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-stretch.html b/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-stretch.html
deleted file mode 100644
index 3a1d6613..0000000
--- a/third_party/blink/web_tests/fast/css-grid-layout/grid-align-justify-stretch.html
+++ /dev/null
@@ -1,184 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<link href="../css-intrinsic-dimensions/resources/width-keyword-classes.css" rel="stylesheet">
-<link href="resources/grid.css" rel="stylesheet">
-<link href="resources/grid-alignment.css" rel="stylesheet">
-<script src="../../resources/check-layout.js"></script>
-<style>
-body {
-    margin: 0;
-}
-
-.grid {
-    grid-template-columns: 100px 100px;
-    grid-template-rows: 200px 200px;
-    margin-bottom: 20px;
-}
-
-.widthAndHeightSet {
-    width: 20px;
-    height: 40px;
-}
-.onlyWidthSet { width: 20px; }
-.onlyHeightSet { height: 40px; }
-.maxHeight { max-height: 160px; }
-.maxWidth { max-width: 90px; }
-.minWidth { min-width: 120px; }
-.minHeight { min-height: 220px; }
-</style>
-</head>
-<body onload="checkLayout('.grid')">
-
-<p>This test checks that the 'stretch' value is applied correctly for 'align' and 'justify' properties.</p>
-
-<div style="position: relative">
-    <div class="grid fit-content" data-expected-width="200" data-expected-height="400">
-        <div class="alignSelfStretch justifySelfStart firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="0" data-expected-height="200"></div>
-        <div class="widthAndHeightSet alignSelfStretch justifySelfStart firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="onlyWidthSet alignSelfStretch justifySelfStart secondRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="200"></div>
-        <div class="onlyHeightSet alignSelfStretch justifySelfStart secondRowSecondColumn" data-offset-x="100" data-offset-y="200" data-expected-width="0" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content" data-expected-width="200" data-expected-height="400">
-        <div class="alignSelfStart justifySelfStretch firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="0"></div>
-        <div class="widthAndHeightSet alignSelfStart justifySelfStretch firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="onlyWidthSet alignSelfStart justifySelfStretch secondRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="0"></div>
-        <div class="onlyHeightSet alignSelfStart justifySelfStretch secondRowSecondColumn" data-offset-x="100" data-offset-y="200" data-expected-width="100" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content" data-expected-width="200" data-expected-height="400">
-        <div class="maxHeight alignSelfStretch justifySelfStart firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="0" data-expected-height="160"></div>
-        <div class="minWidth widthAndHeightSet alignSelfStretch justifySelfStart firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="120" data-expected-height="40"></div>
-        <div class="minHeight onlyWidthSet alignSelfStretch justifySelfStart secondRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="220"></div>
-        <div class="maxWidth onlyHeightSet alignSelfStretch justifySelfStretch secondRowSecondColumn" data-offset-x="100" data-offset-y="200" data-expected-width="90" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content" data-expected-width="200" data-expected-height="400">
-        <div class="alignSelfStretch justifySelfStretch firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
-        <div class="widthAndHeightSet alignSelfStretch justifySelfStretch firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="onlyWidthSet alignSelfStretch justifySelfStretch secondRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="200"></div>
-        <div class="onlyHeightSet alignSelfStretch justifySelfStretch secondRowSecondColumn" data-offset-x="100" data-offset-y="200" data-expected-width="100" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content alignItemsStretch justifyItemsStart" data-expected-width="200" data-expected-height="400">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="0" data-expected-height="200"></div>
-        <div class="widthAndHeightSet firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="onlyWidthSet secondRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="200"></div>
-        <div class="onlyHeightSet secondRowSecondColumn" data-offset-x="100" data-offset-y="200" data-expected-width="0" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content alignItemsStart justifyItemsStretch" data-expected-width="200" data-expected-height="400">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="0"></div>
-        <div class="widthAndHeightSet firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="onlyWidthSet secondRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="0"></div>
-        <div class="onlyHeightSet secondRowSecondColumn" data-offset-x="100" data-offset-y="200" data-expected-width="100" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content alignItemsStretch justifyItemsStretch" data-expected-width="200" data-expected-height="400">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
-        <div class="widthAndHeightSet firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="onlyWidthSet secondRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="200"></div>
-        <div class="onlyHeightSet secondRowSecondColumn" data-offset-x="100" data-offset-y="200" data-expected-width="100" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content alignItemsAuto justifyItemsAuto" data-expected-width="200" data-expected-height="400">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
-        <div class="widthAndHeightSet firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="onlyWidthSet secondRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="200"></div>
-        <div class="onlyHeightSet secondRowSecondColumn" data-offset-x="100" data-offset-y="200" data-expected-width="100" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content" data-expected-width="200" data-expected-height="400">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
-        <div class="widthAndHeightSet firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="onlyWidthSet secondRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="200"></div>
-        <div class="onlyHeightSet secondRowSecondColumn" data-offset-x="100" data-offset-y="200" data-expected-width="100" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content" data-expected-width="200" data-expected-height="400">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
-        <div class="firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="100" data-expected-height="200"></div>
-        <div class="secondRowSecondColumn" data-offset-x="100" data-offset-y="200" data-expected-width="100" data-expected-height="200"></div>
-    </div>
-</div>
-
-<!-- RTL direction (it should not affect the block-flow direction). -->
-<div style="position: relative">
-    <div class="grid fit-content directionRTL alignItemsStretch justifyItemsStretch" data-expected-width="200" data-expected-height="400">
-        <div class="firstRowFirstColumn" data-offset-x="100" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
-        <div class="widthAndHeightSet firstRowSecondColumn" data-offset-x="80" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="onlyWidthSet secondRowFirstColumn" data-offset-x="180" data-offset-y="200" data-expected-width="20" data-expected-height="200"></div>
-        <div class="onlyHeightSet secondRowSecondColumn" data-offset-x="0" data-offset-y="200" data-expected-width="100" data-expected-height="40"></div>
-    </div>
-</div>
-
-<!-- RTL direction (it should not affect the block-flow) with opposite directions grid container vs grid item. -->
-<div style="position: relative">
-    <div class="grid fit-content alignItemsStretch justifyItemsStretch" data-expected-width="200" data-expected-height="400">
-        <div class="firstRowFirstColumn  directionRTL" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
-        <div class="widthAndHeightSet firstRowSecondColumn  directionRTL" data-offset-x="100" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="onlyWidthSet secondRowFirstColumn  directionRTL" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="200"></div>
-        <div class="onlyHeightSet secondRowSecondColumn  directionRTL" data-offset-x="100" data-offset-y="200" data-expected-width="100" data-expected-height="40"></div>
-    </div>
-</div>
-
-<!-- Vertical RL writing mode. -->
-<div style="position: relative">
-    <div class="grid fit-content verticalRL alignItemsStretch justifyItemsStretch" data-expected-width="400" data-expected-height="200">
-        <div class="firstRowFirstColumn" data-offset-x="200" data-offset-y="0" data-expected-width="200" data-expected-height="100"></div>
-        <div class="widthAndHeightSet firstRowSecondColumn" data-offset-x="380" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-        <div class="onlyWidthSet secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="100"></div>
-        <div class="onlyHeightSet secondRowSecondColumn" data-offset-x="0" data-offset-y="100" data-expected-width="200" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content verticalRL" data-expected-width="400" data-expected-height="200">
-        <div class="firstRowFirstColumn" data-offset-x="200" data-offset-y="0" data-expected-width="200" data-expected-height="100"></div>
-        <div class="firstRowSecondColumn" data-offset-x="200" data-offset-y="100" data-expected-width="200" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="100"></div>
-        <div class="secondRowSecondColumn" data-offset-x="0" data-offset-y="100" data-expected-width="200" data-expected-height="100"></div>
-    </div>
-</div>
-
-<!-- Vertical LR writing mode. -->
-<div style="position: relative">
-    <div class="grid fit-content verticalLR alignItemsStretch justifyItemsStretch" data-expected-width="400" data-expected-height="200">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="100"></div>
-        <div class="widthAndHeightSet firstRowSecondColumn" data-offset-x="0" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-        <div class="onlyWidthSet secondRowFirstColumn" data-offset-x="200" data-offset-y="0" data-expected-width="20" data-expected-height="100"></div>
-        <div class="onlyHeightSet secondRowSecondColumn" data-offset-x="200" data-offset-y="100" data-expected-width="200" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content verticalLR" data-expected-width="400" data-expected-height="200">
-        <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="100"></div>
-        <div class="firstRowSecondColumn" data-offset-x="0" data-offset-y="100" data-expected-width="200" data-expected-height="100"></div>
-        <div class="secondRowFirstColumn" data-offset-x="200" data-offset-y="0" data-expected-width="200" data-expected-height="100"></div>
-        <div class="secondRowSecondColumn" data-offset-x="200" data-offset-y="100" data-expected-width="200" data-expected-height="100"></div>
-    </div>
-</div>
-
-</body>
-</html>
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-align.html b/third_party/blink/web_tests/fast/css-grid-layout/grid-align.html
deleted file mode 100644
index b628063..0000000
--- a/third_party/blink/web_tests/fast/css-grid-layout/grid-align.html
+++ /dev/null
@@ -1,240 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<link href="../css-intrinsic-dimensions/resources/width-keyword-classes.css" rel="stylesheet">
-<link href="resources/grid.css" rel="stylesheet">
-<link href="resources/grid-alignment.css" rel="stylesheet">
-<script src="../../resources/check-layout.js"></script>
-<style>
-body {
-    margin: 0;
-}
-
-.grid {
-    grid-template-columns: 100px 100px;
-    grid-template-rows: 200px 200px;
-    margin-bottom: 20px;
-}
-
-.cell {
-    width: 20px;
-    height: 40px;
-}
-
-.item {
-    width: 8px;
-    height: 16px;
-    background: black;
-}
-
-</style>
-</head>
-<body onload="checkLayout('.grid')">
-
-<p>This test checks that the align-self property is applied correctly.</p>
-
-<div style="position: relative">
-    <div class="grid fit-content" data-expected-width="200" data-expected-height="400">
-        <div class="alignSelfStretch firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
-        <div class="cell alignSelfStart firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfEnd firstRowSecondColumn" data-offset-x="100" data-offset-y="160" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfCenter secondRowFirstColumn" data-offset-x="0" data-offset-y="280" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfRight secondRowSecondColumn" data-offset-x="100" data-offset-y="200" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfLeft secondRowSecondColumn" data-offset-x="100" data-offset-y="200" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content" data-expected-width="200" data-expected-height="400">
-        <div class="cell alignSelfFlexEnd firstRowFirstColumn" data-offset-x="0" data-offset-y="160" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfFlexStart firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfSelfStart secondRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfSelfEnd secondRowSecondColumn" data-offset-x="100" data-offset-y="360" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<!-- Default alignment and initial values. -->
-<div style="position: relative">
-    <div class="grid fit-content alignItemsCenter" data-expected-width="200" data-expected-height="400">
-        <div class="cell alignSelfAuto firstRowFirstColumn" data-offset-x="0" data-offset-y="80" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell firstRowSecondColumn" data-offset-x="100" data-offset-y="80" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfSelfStart secondRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfSelfEnd secondRowSecondColumn" data-offset-x="100" data-offset-y="360" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content" data-expected-width="200" data-expected-height="400">
-        <div class="alignSelfAuto firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
-        <div class="cell firstRowSecondColumn" data-offset-x="100" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfStart secondRowFirstColumn" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfEnd secondRowSecondColumn" data-offset-x="100" data-offset-y="360" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<!-- RTL direction (it should not affect the block-flow direction). -->
-<div style="position: relative">
-     <div class="grid fit-content directionRTL" data-expected-width="200" data-expected-height="400">
-         <div class="alignSelfStretch firstRowFirstColumn" data-offset-x="100" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
-         <div class="cell alignSelfStart firstRowSecondColumn" data-offset-x="80" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-         <div class="cell alignSelfEnd firstRowSecondColumn" data-offset-x="80" data-offset-y="160" data-expected-width="20" data-expected-height="40"></div>
-         <div class="cell alignSelfCenter secondRowFirstColumn" data-offset-x="180" data-offset-y="280" data-expected-width="20" data-expected-height="40"></div>
-         <div class="cell alignSelfRight secondRowSecondColumn" data-offset-x="80" data-offset-y="200" data-expected-width="20" data-expected-height="40"></div>
-         <div class="cell alignSelfLeft secondRowSecondColumn" data-offset-x="80" data-offset-y="200" data-expected-width="20" data-expected-height="40"></div>
-     </div>
-</div>
-
-<div style="position: relative">
-     <div class="grid fit-content directionRTL" data-expected-width="200" data-expected-height="400">
-         <div class="cell alignSelfFlexEnd firstRowFirstColumn" data-offset-x="180" data-offset-y="160" data-expected-width="20" data-expected-height="40"></div>
-         <div class="cell alignSelfFlexStart firstRowSecondColumn" data-offset-x="80" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-         <div class="cell alignSelfSelfStart secondRowFirstColumn" data-offset-x="180" data-offset-y="200" data-expected-width="20" data-expected-height="40"></div>
-         <div class="cell alignSelfSelfEnd secondRowSecondColumn" data-offset-x="80" data-offset-y="360" data-expected-width="20" data-expected-height="40"></div>
-     </div>
-</div>
-
-<!-- RTL direction (it should not affect the block-flow) with opposite directions grid container vs grid item. -->
-<div style="position: relative">
-     <div class="grid fit-content" data-expected-width="200" data-expected-height="400">
-         <div class="alignSelfStretch firstRowFirstColumn directionRTL" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="200"></div>
-         <div class="cell alignSelfStart firstRowSecondColumn directionRTL" data-offset-x="100" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-         <div class="cell alignSelfEnd firstRowSecondColumn directionRTL" data-offset-x="100" data-offset-y="160" data-expected-width="20" data-expected-height="40"></div>
-         <div class="cell alignSelfCenter secondRowFirstColumn directionRTL" data-offset-x="0" data-offset-y="280" data-expected-width="20" data-expected-height="40"></div>
-         <div class="cell alignSelfRight secondRowSecondColumn directionRTL" data-offset-x="100" data-offset-y="200" data-expected-width="20" data-expected-height="40"></div>
-         <div class="cell alignSelfLeft secondRowSecondColumn directionRTL" data-offset-x="100" data-offset-y="200" data-expected-width="20" data-expected-height="40"></div>
-     </div>
-</div>
-
-<div style="position: relative">
-     <div class="grid fit-content" data-expected-width="200" data-expected-height="400">
-         <div class="cell alignSelfFlexEnd firstRowFirstColumn directionRTL" data-offset-x="0" data-offset-y="160" data-expected-width="20" data-expected-height="40"></div>
-         <div class="cell alignSelfFlexStart firstRowSecondColumn directionRTL" data-offset-x="100" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-         <div class="cell alignSelfSelfStart secondRowFirstColumn directionRTL" data-offset-x="0" data-offset-y="200" data-expected-width="20" data-expected-height="40"></div>
-         <div class="cell alignSelfSelfEnd secondRowSecondColumn directionRTL" data-offset-x="100" data-offset-y="360" data-expected-width="20" data-expected-height="40"></div>
-     </div>
-</div>
-
-<!-- Vertical RL writing mode. -->
-<div style="position: relative">
-    <div class="grid fit-content verticalRL" data-expected-width="400" data-expected-height="200">
-        <div class="alignSelfStretch firstRowFirstColumn" data-offset-x="200" data-offset-y="0" data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell alignSelfStart firstRowSecondColumn" data-offset-x="380" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfEnd firstRowSecondColumn" data-offset-x="200" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfCenter secondRowFirstColumn" data-offset-x="90" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfRight secondRowSecondColumn" data-offset-x="180" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfLeft secondRowSecondColumn" data-offset-x="180" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content verticalRL" data-expected-width="400" data-expected-height="200">
-        <div class="cell alignSelfFlexEnd firstRowFirstColumn" data-offset-x="200" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfFlexStart firstRowSecondColumn" data-offset-x="380" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfSelfStart secondRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfSelfEnd secondRowSecondColumn" data-offset-x="0" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<!-- Vertical LR writing mode. -->
-<div style="position: relative">
-    <div class="grid fit-content verticalLR" data-expected-width="400" data-expected-height="200">
-        <div class="alignSelfStretch firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="100"></div>
-        <div class="cell alignSelfStart firstRowSecondColumn" data-offset-x="0" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfEnd firstRowSecondColumn" data-offset-x="180" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfCenter secondRowFirstColumn" data-offset-x="290" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfRight secondRowSecondColumn" data-offset-x="200" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfLeft secondRowSecondColumn" data-offset-x="200" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content verticalLR" data-expected-width="400" data-expected-height="200">
-        <div class="cell alignSelfFlexEnd firstRowFirstColumn" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfFlexStart firstRowSecondColumn" data-offset-x="0" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfSelfStart secondRowFirstColumn" data-offset-x="200" data-offset-y="0" data-expected-width="20" data-expected-height="40"></div>
-        <div class="cell alignSelfSelfEnd secondRowSecondColumn" data-offset-x="380" data-offset-y="100" data-expected-width="20" data-expected-height="40"></div>
-    </div>
-</div>
-
-<!-- Vertical RL writing mode with opposite block-flow directions grid container vs grid item. -->
-<div style="position: relative">
-    <div class="grid fit-content verticalRL" data-expected-width="400" data-expected-height="200">
-        <div class="alignSelfStretch firstRowFirstColumn verticalLR" data-offset-x="200" data-offset-y="0" data-expected-width="200" data-expected-height="100">
-        </div>
-        <div class="cell alignSelfStart firstRowSecondColumn verticalLR" data-offset-x="380" data-offset-y="100" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-        <div class="cell alignSelfEnd firstRowSecondColumn verticalLR" data-offset-x="200" data-offset-y="100" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-        <div class="cell alignSelfCenter secondRowFirstColumn verticalLR" data-offset-x="90" data-offset-y="0" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-        <div class="cell alignSelfRight secondRowSecondColumn verticalLR" data-offset-x="180" data-offset-y="100" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-        <div class="cell alignSelfLeft secondRowSecondColumn verticalLR" data-offset-x="180" data-offset-y="100" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content verticalRL" data-expected-width="400" data-expected-height="200">
-        <div class="cell alignSelfFlexEnd firstRowFirstColumn verticalLR" data-offset-x="200" data-offset-y="0" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-        <div class="cell alignSelfFlexStart firstRowSecondColumn verticalLR" data-offset-x="380" data-offset-y="100" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-        <div class="cell alignSelfSelfStart secondRowFirstColumn verticalLR" data-offset-x="0" data-offset-y="0" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-        <div class="cell alignSelfSelfEnd secondRowSecondColumn verticalLR" data-offset-x="180" data-offset-y="100" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-    </div>
-</div>
-
-<!-- Vertical LR writing mode with opposite block-flow directions grid container vs grid item. -->
-<div style="position: relative">
-    <div class="grid fit-content verticalLR" data-expected-width="400" data-expected-height="200">
-        <div class="alignSelfStretch firstRowFirstColumn verticalRL" data-offset-x="0" data-offset-y="0" data-expected-width="200" data-expected-height="100">
-        </div>
-        <div class="cell alignSelfStart firstRowSecondColumn verticalRL" data-offset-x="0" data-offset-y="100" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-        <div class="cell alignSelfEnd firstRowSecondColumn verticalRL" data-offset-x="180" data-offset-y="100" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-        <div class="cell alignSelfCenter secondRowFirstColumn verticalRL" data-offset-x="290" data-offset-y="0" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-        <div class="cell alignSelfRight secondRowSecondColumn verticalRL" data-offset-x="200" data-offset-y="100" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-        <div class="cell alignSelfLeft secondRowSecondColumn verticalRL" data-offset-x="200" data-offset-y="100" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-    </div>
-</div>
-
-<div style="position: relative">
-    <div class="grid fit-content verticalLR" data-expected-width="400" data-expected-height="200">
-        <div class="cell alignSelfFlexEnd firstRowFirstColumn verticalRL" data-offset-x="180" data-offset-y="0" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-        <div class="cell alignSelfFlexStart firstRowSecondColumn verticalRL" data-offset-x="0" data-offset-y="100" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-        <div class="cell alignSelfSelfStart secondRowFirstColumn verticalRL" data-offset-x="380" data-offset-y="0" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-        <div class="cell alignSelfSelfEnd secondRowSecondColumn verticalRL" data-offset-x="200" data-offset-y="100" data-expected-width="20" data-expected-height="40">
-            <div class="item"></div>
-        </div>
-    </div>
-</div>
-
-</body>
-</html>
diff --git a/third_party/blink/web_tests/fast/forms/resources/picker-common.js b/third_party/blink/web_tests/fast/forms/resources/picker-common.js
index 8db456d..9444002 100644
--- a/third_party/blink/web_tests/fast/forms/resources/picker-common.js
+++ b/third_party/blink/web_tests/fast/forms/resources/picker-common.js
@@ -11,8 +11,8 @@
     setTimeout(popupOpenCallback, 20);
 }
 
-function waitUntilClosing(callback, customDelay) {
-    setTimeout(callback, (customDelay !== undefined) ? customDelay : 1);
+function waitUntilClosing(callback) {
+    setTimeout(callback, 1);
 }
 
 function rootWindow() {
@@ -34,6 +34,34 @@
 // - INPUT color with DATALIST
 // - INPUT date/datetime-local/month/week
 function openPicker(element, callback, errorCallback) {
+    popupWindow = openPickerHelper(element);
+    if (typeof callback === "function" && popupWindow)
+        setPopupOpenCallback(callback);
+    else if (typeof errorCallback === "function" && !popupWindow)
+        errorCallback();
+}
+
+// openPickerWithPromise opens a picker UI for the following types:
+// - menulist SELECT
+// - INPUT color
+// - INPUT date/datetime-local/month/week
+//
+// Returns a Promise that resolves when the popup has been opened.
+function openPickerWithPromise(element) {
+    return new Promise(function(resolve, reject) {
+        popupWindow = openPickerHelper(element);
+        if (popupWindow) {
+            popupWindow.addEventListener("didOpenPicker", resolve, false);
+        } else {
+            reject();
+        }
+    });
+}
+
+// Helper function for openPicker and openPickerWithPromise.
+// Performs the keystrokes that will cause the picker to open,
+// and returns the popup window, or null.
+function openPickerHelper(element) {
     element.offsetTop; // Force to lay out
     element.focus();
     if (element.tagName === "SELECT") {
@@ -45,11 +73,7 @@
             eventSender.keyDown("ArrowDown", ["altKey"]);
         }
     }
-    popupWindow = internals.pagePopupWindow;
-    if (typeof callback === "function" && popupWindow)
-        setPopupOpenCallback(callback);
-    else if (typeof errorCallback === "function" && !popupWindow)
-        errorCallback();
+    return internals.pagePopupWindow;
 }
 
 function clickToOpenPicker(x, y, callback, errorCallback) {
diff --git a/third_party/blink/web_tests/fast/forms/resources/state-restore-dynamic-controls-frame.html b/third_party/blink/web_tests/fast/forms/resources/state-restore-dynamic-controls-frame.html
index 3ec30e2..97bc453 100644
--- a/third_party/blink/web_tests/fast/forms/resources/state-restore-dynamic-controls-frame.html
+++ b/third_party/blink/web_tests/fast/forms/resources/state-restore-dynamic-controls-frame.html
@@ -1,17 +1,30 @@
 <!DOCTYPE html>
 <script>
 document.addEventListener('change', e => {
-  parent.inputOrChangeEvents.push('change/' + e.target.type);
+  parent.inputOrChangeEvents.push('change/' + e.target.id);
 });
 document.addEventListener('input', e => {
-  parent.inputOrChangeEvents.push('input/' + e.target.type);
+  parent.inputOrChangeEvents.push('input/' + e.target.id);
 });
 </script>
 <div></div>
-<input type=checkbox disabled>
-<input type=text disabled>
-<textarea></textarea>
-<select><option>1<option>2</select>
+<input type=checkbox disabled id="checkbox-disabled">
+<input type=text disabled id="text-disabled">
+<input type=checkbox id="checkbox-unmodified">
+<input type=text id="text-unmodified">
+<input type=file id="file-modified">
+<input type=file id="file-unmodified">
+<input type=date id="date-modified">
+<input type=date id="date-unmodified">
+<textarea id="textarea-modified"></textarea>
+<textarea id="textarea-unmodified">abc
+def</textarea>
+<select id="select-modified"><option>1<option>2</select>
+<select id="select-unmodified" multiple>
+<option selected>1</option>
+<option>2</option>
+<option selected>3</option>
+</select>
 <script>
-document.querySelector('div').innerHTML = '<input type=checkbox><input type=text>'
+document.querySelector('div').innerHTML = '<input type=checkbox id="checkbox-modified"><input type=text id="text-modified">';
 </script>
diff --git a/third_party/blink/web_tests/fast/forms/state-restore-dynamic-controls.html b/third_party/blink/web_tests/fast/forms/state-restore-dynamic-controls.html
index 902e76d..6e7be469 100644
--- a/third_party/blink/web_tests/fast/forms/state-restore-dynamic-controls.html
+++ b/third_party/blink/web_tests/fast/forms/state-restore-dynamic-controls.html
@@ -2,6 +2,17 @@
 <script src="../../resources/testharness.js"></script>
 <script src="../../resources/testharnessreport.js"></script>
 <script src="../../external/wpt/html/interaction/focus/the-autofocus-attribute/resources/utils.js"></script>
+<script src="file/resources/file-drag-common.js"></script>
+<style>
+/* Make the top-left corner of the iframe is equal to the top-left corner
+   of the body.  It's required for dragFilesOntoInput(). */
+body {
+  margin: 0;
+}
+iframe {
+  border: none;
+}
+</style>
 <body>
 <iframe src="resources/state-restore-dynamic-controls-frame.html"></iframe>
 <script>
@@ -16,14 +27,16 @@
   container.firstChild.click();
   container.lastChild.focus();
   eventSender.keyDown('z');
-  doc.querySelector('textarea').focus();
+  dragFilesOntoInput(doc.querySelector('#file-modified'), ['foo.txt']);
+  doc.querySelector('#date-modified').value = '2020-01-08';
+  doc.querySelector('#textarea-modified').focus();
   eventSender.keyDown('y');
-  doc.querySelector('select').focus();
+  doc.querySelector('#select-modified').focus();
   eventSender.keyDown('2');
   assert_true(container.firstChild.checked, 'sanity check for a checkbox');
   assert_equals(container.lastChild.value, 'z', 'sanity check for a text field');
-  assert_equals(doc.querySelector('textarea').value, 'y', 'sanity check for a textarea');
-  assert_equals(doc.querySelector('select').value, '2', 'sanity check for a select');
+  assert_equals(doc.querySelector('#textarea-modified').value, 'y', 'sanity check for a textarea');
+  assert_equals(doc.querySelector('#select-modified').value, '2', 'sanity check for a select');
 
   // Flush asynchronous input/change events
   await timeOut(t, 0);
@@ -50,7 +63,11 @@
   // Wait for asynchronous input/change events
   await timeOut(t, 0);
   assert_array_equals(inputOrChangeEvents, [
-      'input/checkbox', 'change/checkbox', 'input/text', 'change/text',
-      'input/textarea', 'change/textarea', 'input/select-one', 'change/select-one']);
+      'input/file-modified', 'change/file-modified',
+      'input/checkbox-modified', 'change/checkbox-modified',
+      'input/text-modified', 'change/text-modified',
+      'input/date-modified', 'change/date-modified',
+      'input/textarea-modified', 'change/textarea-modified',
+      'input/select-modified', 'change/select-modified']);
 }, 'Control states should be restored correctly even if controls were inserted before existing controls.');
 </script>
diff --git a/third_party/blink/web_tests/fast/gradients/degenerate-stop-crash.html b/third_party/blink/web_tests/fast/gradients/degenerate-stop-crash.html
new file mode 100644
index 0000000..c06a0076
--- /dev/null
+++ b/third_party/blink/web_tests/fast/gradients/degenerate-stop-crash.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<title>Degenerate stop offset does not crash</title>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+
+<style>
+div {
+  height: 600px;
+  width: 800px;
+  background-image: -webkit-radial-gradient(circle closest-side,
+                                            green,
+                                            red calc(9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999% + 174px));
+}
+</style>
+
+<div></div>
+
+<script>
+  test(() => {});
+</script>
diff --git a/third_party/blink/web_tests/fast/scroll-snap/root-scroller-snap-behaviour/smooth-scroll-snaps-visual-viewport.html b/third_party/blink/web_tests/fast/scroll-snap/root-scroller-snap-behaviour/smooth-scroll-snaps-visual-viewport.html
index 111c15b6..eea38bc 100644
--- a/third_party/blink/web_tests/fast/scroll-snap/root-scroller-snap-behaviour/smooth-scroll-snaps-visual-viewport.html
+++ b/third_party/blink/web_tests/fast/scroll-snap/root-scroller-snap-behaviour/smooth-scroll-snaps-visual-viewport.html
@@ -50,6 +50,12 @@
   <div class="spacer" style="background-color: PaleGreen"></div>
   <div class="spacer" style="background-color: PaleGreen"></div>
   <div id="initial-snap-area"></div>
+  <!--
+    Needed because otherwise the other snap-area's snap offset would get
+    clipped to the same offset as the initial snap area, which would make either
+    snap area a valid choice.
+  -->
+  <div style="height:10px;"></div>
   <div id="snap-area"></div>
 </div>
 
@@ -86,7 +92,7 @@
   assert_equals(window.internals.effectiveRootScroller(document),
     root_scroller,
     "#root-scroller must be the effective root scroller");
-  // Should be snapped to the closer snap area (0,0) on the initial layout.
+  // Should be snapped to the closer snap area on the initial layout.
   assert_equals(visualViewport.offsetTop + root_scroller.scrollTop,
       initial_area.offsetTop);
 
diff --git a/third_party/blink/web_tests/fast/webgl/webgl-composite-modes-tabswitching.html b/third_party/blink/web_tests/fast/webgl/webgl-composite-modes-tabswitching.html
index 8b5b1a2..7c3858a 100644
--- a/third_party/blink/web_tests/fast/webgl/webgl-composite-modes-tabswitching.html
+++ b/third_party/blink/web_tests/fast/webgl/webgl-composite-modes-tabswitching.html
@@ -126,13 +126,13 @@
     // Although page is hidden, WebGL must draw this frame.
     drawAll(30);
 
-    // TODO(crbug.com/919536): Ideally this should be wrapped in
-    // runAfterLayoutAndPaint() to ensure test coverage, but for now that will
-    // crash.
-    if (window.testRunner) {
-        testRunner.setPageVisibility("visible");
-    }
-    runAfterLayoutAndPaint(repaintOnVisiblePage);
+    // runAfterLayoutAndPaint doesn't work when the page is invisible.
+    setTimeout(function() {
+        if (window.testRunner) {
+            testRunner.setPageVisibility("visible");
+        }
+        runAfterLayoutAndPaint(repaintOnVisiblePage);
+    }, 0);
 }
 
 function runRepaintTest() {
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/webexposed/global-interface-listing-expected.txt
deleted file mode 100644
index cba0c1e..0000000
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/webexposed/global-interface-listing-expected.txt
+++ /dev/null
@@ -1,11603 +0,0 @@
-This test documents all interface attributes and methods on the global window object and element instances.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-[INTERFACES]
-interface AbortController
-    attribute @@toStringTag
-    getter signal
-    method abort
-    method constructor
-interface AbortSignal : EventTarget
-    attribute @@toStringTag
-    getter aborted
-    getter onabort
-    method constructor
-    setter onabort
-interface AbsoluteOrientationSensor : OrientationSensor
-    attribute @@toStringTag
-    method constructor
-interface Accelerometer : Sensor
-    attribute @@toStringTag
-    getter x
-    getter y
-    getter z
-    method constructor
-interface AccessibleNode : EventTarget
-    attribute @@toStringTag
-    getter activeDescendant
-    getter atomic
-    getter autocomplete
-    getter busy
-    getter checked
-    getter childNodes
-    getter colCount
-    getter colIndex
-    getter colSpan
-    getter controls
-    getter current
-    getter describedBy
-    getter details
-    getter disabled
-    getter errorMessage
-    getter expanded
-    getter flowTo
-    getter hasPopUp
-    getter hidden
-    getter invalid
-    getter keyShortcuts
-    getter label
-    getter labeledBy
-    getter level
-    getter live
-    getter modal
-    getter multiline
-    getter multiselectable
-    getter onaccessibleclick
-    getter onaccessiblecontextmenu
-    getter onaccessibledecrement
-    getter onaccessiblefocus
-    getter onaccessibleincrement
-    getter onaccessiblescrollintoview
-    getter orientation
-    getter owns
-    getter placeholder
-    getter posInSet
-    getter pressed
-    getter readOnly
-    getter relevant
-    getter required
-    getter role
-    getter roleDescription
-    getter rowCount
-    getter rowIndex
-    getter rowSpan
-    getter selected
-    getter setSize
-    getter sort
-    getter valueMax
-    getter valueMin
-    getter valueNow
-    getter valueText
-    method appendChild
-    method constructor
-    method removeChild
-    setter activeDescendant
-    setter atomic
-    setter autocomplete
-    setter busy
-    setter checked
-    setter colCount
-    setter colIndex
-    setter colSpan
-    setter controls
-    setter current
-    setter describedBy
-    setter details
-    setter disabled
-    setter errorMessage
-    setter expanded
-    setter flowTo
-    setter hasPopUp
-    setter hidden
-    setter invalid
-    setter keyShortcuts
-    setter label
-    setter labeledBy
-    setter level
-    setter live
-    setter modal
-    setter multiline
-    setter multiselectable
-    setter onaccessibleclick
-    setter onaccessiblecontextmenu
-    setter onaccessibledecrement
-    setter onaccessiblefocus
-    setter onaccessibleincrement
-    setter onaccessiblescrollintoview
-    setter orientation
-    setter owns
-    setter placeholder
-    setter posInSet
-    setter pressed
-    setter readOnly
-    setter relevant
-    setter required
-    setter role
-    setter roleDescription
-    setter rowCount
-    setter rowIndex
-    setter rowSpan
-    setter selected
-    setter setSize
-    setter sort
-    setter valueMax
-    setter valueMin
-    setter valueNow
-    setter valueText
-interface AccessibleNodeList
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method add
-    method constructor
-    method item
-    method remove
-    setter length
-interface ActivateInvisibleEvent : Event
-    attribute @@toStringTag
-    getter activatedElement
-    method constructor
-interface AmbientLightSensor : Sensor
-    attribute @@toStringTag
-    getter illuminance
-    method constructor
-interface AnalyserNode : AudioNode
-    attribute @@toStringTag
-    getter fftSize
-    getter frequencyBinCount
-    getter maxDecibels
-    getter minDecibels
-    getter smoothingTimeConstant
-    method constructor
-    method getByteFrequencyData
-    method getByteTimeDomainData
-    method getFloatFrequencyData
-    method getFloatTimeDomainData
-    setter fftSize
-    setter maxDecibels
-    setter minDecibels
-    setter smoothingTimeConstant
-interface Animation : EventTarget
-    attribute @@toStringTag
-    getter currentTime
-    getter effect
-    getter finished
-    getter id
-    getter oncancel
-    getter onfinish
-    getter pending
-    getter playState
-    getter playbackRate
-    getter ready
-    getter startTime
-    getter timeline
-    method cancel
-    method constructor
-    method finish
-    method pause
-    method play
-    method reverse
-    method updatePlaybackRate
-    setter currentTime
-    setter effect
-    setter id
-    setter oncancel
-    setter onfinish
-    setter playbackRate
-    setter startTime
-interface AnimationEffect
-    attribute @@toStringTag
-    method constructor
-    method getComputedTiming
-    method getTiming
-    method updateTiming
-interface AnimationEvent : Event
-    attribute @@toStringTag
-    getter animationName
-    getter elapsedTime
-    getter pseudoElement
-    method constructor
-interface AnimationPlaybackEvent : Event
-    attribute @@toStringTag
-    getter currentTime
-    getter timelineTime
-    method constructor
-interface AnimationTimeline
-    attribute @@toStringTag
-    getter currentTime
-    method constructor
-interface ApplicationCache : EventTarget
-    attribute @@toStringTag
-    attribute CHECKING
-    attribute DOWNLOADING
-    attribute IDLE
-    attribute OBSOLETE
-    attribute UNCACHED
-    attribute UPDATEREADY
-    getter oncached
-    getter onchecking
-    getter ondownloading
-    getter onerror
-    getter onnoupdate
-    getter onobsolete
-    getter onprogress
-    getter onupdateready
-    getter status
-    method abort
-    method constructor
-    method swapCache
-    method update
-    setter oncached
-    setter onchecking
-    setter ondownloading
-    setter onerror
-    setter onnoupdate
-    setter onobsolete
-    setter onprogress
-    setter onupdateready
-interface ApplicationCacheErrorEvent : Event
-    attribute @@toStringTag
-    getter message
-    getter reason
-    getter status
-    getter url
-    method constructor
-interface Attr : Node
-    attribute @@toStringTag
-    getter localName
-    getter name
-    getter namespaceURI
-    getter ownerElement
-    getter prefix
-    getter specified
-    getter value
-    method constructor
-    setter value
-interface Audio
-    attribute @@toStringTag
-    method constructor
-interface AudioBuffer
-    attribute @@toStringTag
-    getter duration
-    getter length
-    getter numberOfChannels
-    getter sampleRate
-    method constructor
-    method copyFromChannel
-    method copyToChannel
-    method getChannelData
-interface AudioBufferSourceNode : AudioScheduledSourceNode
-    attribute @@toStringTag
-    getter buffer
-    getter detune
-    getter loop
-    getter loopEnd
-    getter loopStart
-    getter playbackRate
-    method constructor
-    method start
-    setter buffer
-    setter loop
-    setter loopEnd
-    setter loopStart
-interface AudioContext : BaseAudioContext
-    attribute @@toStringTag
-    getter baseLatency
-    method close
-    method constructor
-    method createMediaElementSource
-    method createMediaStreamDestination
-    method createMediaStreamSource
-    method getOutputTimestamp
-    method resume
-    method suspend
-interface AudioDestinationNode : AudioNode
-    attribute @@toStringTag
-    getter maxChannelCount
-    method constructor
-interface AudioListener
-    attribute @@toStringTag
-    getter forwardX
-    getter forwardY
-    getter forwardZ
-    getter positionX
-    getter positionY
-    getter positionZ
-    getter upX
-    getter upY
-    getter upZ
-    method constructor
-    method setOrientation
-    method setPosition
-interface AudioNode : EventTarget
-    attribute @@toStringTag
-    getter channelCount
-    getter channelCountMode
-    getter channelInterpretation
-    getter context
-    getter numberOfInputs
-    getter numberOfOutputs
-    method connect
-    method constructor
-    method disconnect
-    setter channelCount
-    setter channelCountMode
-    setter channelInterpretation
-interface AudioParam
-    attribute @@toStringTag
-    getter automationRate
-    getter defaultValue
-    getter maxValue
-    getter minValue
-    getter value
-    method cancelAndHoldAtTime
-    method cancelScheduledValues
-    method constructor
-    method exponentialRampToValueAtTime
-    method linearRampToValueAtTime
-    method setTargetAtTime
-    method setValueAtTime
-    method setValueCurveAtTime
-    setter automationRate
-    setter value
-interface AudioParamMap
-    attribute @@toStringTag
-    getter size
-    method @@iterator
-    method constructor
-    method entries
-    method forEach
-    method get
-    method has
-    method keys
-    method values
-interface AudioProcessingEvent : Event
-    attribute @@toStringTag
-    getter inputBuffer
-    getter outputBuffer
-    getter playbackTime
-    method constructor
-interface AudioScheduledSourceNode : AudioNode
-    attribute @@toStringTag
-    getter onended
-    method constructor
-    method start
-    method stop
-    setter onended
-interface AudioTrack
-    attribute @@toStringTag
-    getter enabled
-    getter id
-    getter kind
-    getter label
-    getter language
-    getter sourceBuffer
-    method constructor
-    setter enabled
-interface AudioTrackList : EventTarget
-    attribute @@toStringTag
-    getter length
-    getter onaddtrack
-    getter onchange
-    getter onremovetrack
-    method @@iterator
-    method constructor
-    method getTrackById
-    setter onaddtrack
-    setter onchange
-    setter onremovetrack
-interface AudioWorklet : Worklet
-    attribute @@toStringTag
-    method constructor
-interface AudioWorkletNode : AudioNode
-    attribute @@toStringTag
-    getter onprocessorerror
-    getter parameters
-    getter port
-    method constructor
-    setter onprocessorerror
-interface AuthenticatorAssertionResponse : AuthenticatorResponse
-    attribute @@toStringTag
-    getter authenticatorData
-    getter signature
-    getter userHandle
-    method constructor
-interface AuthenticatorAttestationResponse : AuthenticatorResponse
-    attribute @@toStringTag
-    getter attestationObject
-    method constructor
-    method getTransports
-interface AuthenticatorResponse
-    attribute @@toStringTag
-    getter clientDataJSON
-    method constructor
-interface BackgroundFetchManager
-    attribute @@toStringTag
-    method constructor
-    method fetch
-    method get
-    method getIds
-interface BackgroundFetchRecord
-    attribute @@toStringTag
-    getter request
-    getter responseReady
-    method constructor
-interface BackgroundFetchRegistration : EventTarget
-    attribute @@toStringTag
-    getter downloadTotal
-    getter downloaded
-    getter failureReason
-    getter id
-    getter onprogress
-    getter recordsAvailable
-    getter result
-    getter uploadTotal
-    getter uploaded
-    method abort
-    method constructor
-    method match
-    method matchAll
-    setter onprogress
-interface BarProp
-    attribute @@toStringTag
-    getter visible
-    method constructor
-interface BarcodeDetector
-    static method getSupportedFormats
-    attribute @@toStringTag
-    method constructor
-    method detect
-interface BaseAudioContext : EventTarget
-    attribute @@toStringTag
-    getter audioWorklet
-    getter currentTime
-    getter destination
-    getter listener
-    getter onstatechange
-    getter sampleRate
-    getter state
-    method constructor
-    method createAnalyser
-    method createBiquadFilter
-    method createBuffer
-    method createBufferSource
-    method createChannelMerger
-    method createChannelSplitter
-    method createConstantSource
-    method createConvolver
-    method createDelay
-    method createDynamicsCompressor
-    method createGain
-    method createIIRFilter
-    method createOscillator
-    method createPanner
-    method createPeriodicWave
-    method createScriptProcessor
-    method createStereoPanner
-    method createWaveShaper
-    method decodeAudioData
-    setter onstatechange
-interface BatteryManager : EventTarget
-    attribute @@toStringTag
-    getter charging
-    getter chargingTime
-    getter dischargingTime
-    getter level
-    getter onchargingchange
-    getter onchargingtimechange
-    getter ondischargingtimechange
-    getter onlevelchange
-    method constructor
-    setter onchargingchange
-    setter onchargingtimechange
-    setter ondischargingtimechange
-    setter onlevelchange
-interface BeforeInstallPromptEvent : Event
-    attribute @@toStringTag
-    getter platforms
-    getter userChoice
-    method constructor
-    method prompt
-interface BeforeUnloadEvent : Event
-    attribute @@toStringTag
-    getter returnValue
-    method constructor
-    setter returnValue
-interface BiquadFilterNode : AudioNode
-    attribute @@toStringTag
-    getter Q
-    getter detune
-    getter frequency
-    getter gain
-    getter type
-    method constructor
-    method getFrequencyResponse
-    setter type
-interface Blob
-    attribute @@toStringTag
-    getter size
-    getter type
-    method arrayBuffer
-    method constructor
-    method slice
-    method stream
-    method text
-interface BlobEvent : Event
-    attribute @@toStringTag
-    getter data
-    getter timecode
-    method constructor
-interface BluetoothAdvertisingEvent : Event
-    attribute @@toStringTag
-    getter appearance
-    getter device
-    getter manufacturerData
-    getter name
-    getter rssi
-    getter serviceData
-    getter txPower
-    getter uuids
-    method constructor
-interface BluetoothLEScan
-    attribute @@toStringTag
-    getter acceptAllAdvertisements
-    getter active
-    getter filters
-    getter keepRepeatedDevices
-    method constructor
-    method stop
-interface BluetoothManufacturerDataMap
-    attribute @@toStringTag
-    getter size
-    method @@iterator
-    method constructor
-    method entries
-    method forEach
-    method get
-    method has
-    method keys
-    method values
-interface BluetoothServiceDataMap
-    attribute @@toStringTag
-    getter size
-    method @@iterator
-    method constructor
-    method entries
-    method forEach
-    method get
-    method has
-    method keys
-    method values
-interface BroadcastChannel : EventTarget
-    attribute @@toStringTag
-    getter name
-    getter onmessage
-    getter onmessageerror
-    method close
-    method constructor
-    method postMessage
-    setter onmessage
-    setter onmessageerror
-interface ByteLengthQueuingStrategy
-    attribute @@toStringTag
-    getter highWaterMark
-    getter size
-    method constructor
-interface CDATASection : Text
-    attribute @@toStringTag
-    method constructor
-interface CSS
-    static getter animationWorklet
-    static getter layoutWorklet
-    static getter paintWorklet
-    static method Hz
-    static method Q
-    static method ch
-    static method cm
-    static method deg
-    static method dpcm
-    static method dpi
-    static method dppx
-    static method em
-    static method escape
-    static method ex
-    static method fr
-    static method grad
-    static method in
-    static method kHz
-    static method mm
-    static method ms
-    static method number
-    static method pc
-    static method percent
-    static method pt
-    static method px
-    static method rad
-    static method registerProperty
-    static method rem
-    static method s
-    static method supports
-    static method turn
-    static method vh
-    static method vmax
-    static method vmin
-    static method vw
-    attribute @@toStringTag
-    method constructor
-interface CSSAnimation : Animation
-    attribute @@toStringTag
-    getter animationName
-    method constructor
-interface CSSConditionRule : CSSGroupingRule
-    attribute @@toStringTag
-    getter conditionText
-    method constructor
-interface CSSFontFaceRule : CSSRule
-    attribute @@toStringTag
-    getter style
-    method constructor
-interface CSSGroupingRule : CSSRule
-    attribute @@toStringTag
-    getter cssRules
-    method constructor
-    method deleteRule
-    method insertRule
-interface CSSImageValue : CSSStyleValue
-    attribute @@toStringTag
-    method constructor
-interface CSSImportRule : CSSRule
-    attribute @@toStringTag
-    getter href
-    getter media
-    getter styleSheet
-    method constructor
-    setter media
-interface CSSKeyframeRule : CSSRule
-    attribute @@toStringTag
-    getter keyText
-    getter style
-    method constructor
-    setter keyText
-    setter style
-interface CSSKeyframesRule : CSSRule
-    attribute @@toStringTag
-    getter cssRules
-    getter name
-    method appendRule
-    method constructor
-    method deleteRule
-    method findRule
-    setter name
-interface CSSKeywordValue : CSSStyleValue
-    attribute @@toStringTag
-    getter value
-    method constructor
-    setter value
-interface CSSMathInvert : CSSMathValue
-    attribute @@toStringTag
-    getter value
-    method constructor
-interface CSSMathMax : CSSMathValue
-    attribute @@toStringTag
-    getter values
-    method constructor
-interface CSSMathMin : CSSMathValue
-    attribute @@toStringTag
-    getter values
-    method constructor
-interface CSSMathNegate : CSSMathValue
-    attribute @@toStringTag
-    getter value
-    method constructor
-interface CSSMathProduct : CSSMathValue
-    attribute @@toStringTag
-    getter values
-    method constructor
-interface CSSMathSum : CSSMathValue
-    attribute @@toStringTag
-    getter values
-    method constructor
-interface CSSMathValue : CSSNumericValue
-    attribute @@toStringTag
-    getter operator
-    method constructor
-interface CSSMatrixComponent : CSSTransformComponent
-    attribute @@toStringTag
-    getter matrix
-    method constructor
-    setter matrix
-interface CSSMediaRule : CSSConditionRule
-    attribute @@toStringTag
-    getter media
-    method constructor
-    setter media
-interface CSSNamespaceRule : CSSRule
-    attribute @@toStringTag
-    getter namespaceURI
-    getter prefix
-    method constructor
-interface CSSNumericArray
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method entries
-    method forEach
-    method keys
-    method values
-interface CSSNumericValue : CSSStyleValue
-    attribute @@toStringTag
-    method add
-    method constructor
-    method div
-    method equals
-    method max
-    method min
-    method mul
-    method sub
-    method to
-    method toSum
-    method type
-interface CSSPageRule : CSSRule
-    attribute @@toStringTag
-    getter selectorText
-    getter style
-    method constructor
-    setter selectorText
-    setter style
-interface CSSPerspective : CSSTransformComponent
-    attribute @@toStringTag
-    getter length
-    method constructor
-    setter length
-interface CSSPositionValue : CSSStyleValue
-    attribute @@toStringTag
-    getter x
-    getter y
-    method constructor
-    setter x
-    setter y
-interface CSSRotate : CSSTransformComponent
-    attribute @@toStringTag
-    getter angle
-    getter x
-    getter y
-    getter z
-    method constructor
-    setter angle
-    setter x
-    setter y
-    setter z
-interface CSSRule
-    attribute @@toStringTag
-    attribute CHARSET_RULE
-    attribute FONT_FACE_RULE
-    attribute IMPORT_RULE
-    attribute KEYFRAMES_RULE
-    attribute KEYFRAME_RULE
-    attribute MEDIA_RULE
-    attribute NAMESPACE_RULE
-    attribute PAGE_RULE
-    attribute STYLE_RULE
-    attribute SUPPORTS_RULE
-    attribute VIEWPORT_RULE
-    getter cssText
-    getter parentRule
-    getter parentStyleSheet
-    getter type
-    method constructor
-    setter cssText
-interface CSSRuleList
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method item
-interface CSSScale : CSSTransformComponent
-    attribute @@toStringTag
-    getter x
-    getter y
-    getter z
-    method constructor
-    setter x
-    setter y
-    setter z
-interface CSSSkew : CSSTransformComponent
-    attribute @@toStringTag
-    getter ax
-    getter ay
-    method constructor
-    setter ax
-    setter ay
-interface CSSSkewX : CSSTransformComponent
-    attribute @@toStringTag
-    getter ax
-    method constructor
-    setter ax
-interface CSSSkewY : CSSTransformComponent
-    attribute @@toStringTag
-    getter ay
-    method constructor
-    setter ay
-interface CSSStyleDeclaration
-    attribute @@toStringTag
-    getter cssFloat
-    getter cssText
-    getter length
-    getter parentRule
-    method @@iterator
-    method constructor
-    method getPropertyPriority
-    method getPropertyValue
-    method item
-    method removeProperty
-    method setProperty
-    setter cssFloat
-    setter cssText
-interface CSSStyleRule : CSSRule
-    attribute @@toStringTag
-    getter selectorText
-    getter style
-    getter styleMap
-    method constructor
-    setter selectorText
-    setter style
-interface CSSStyleSheet : StyleSheet
-    attribute @@toStringTag
-    getter cssRules
-    getter ownerRule
-    getter rules
-    method addRule
-    method constructor
-    method deleteRule
-    method insertRule
-    method removeRule
-    method replace
-    method replaceSync
-interface CSSStyleValue
-    static method parse
-    static method parseAll
-    attribute @@toStringTag
-    method constructor
-    method toString
-interface CSSSupportsRule : CSSConditionRule
-    attribute @@toStringTag
-    method constructor
-interface CSSTransformComponent
-    attribute @@toStringTag
-    getter is2D
-    method constructor
-    method toMatrix
-    method toString
-    setter is2D
-interface CSSTransformValue : CSSStyleValue
-    attribute @@toStringTag
-    getter is2D
-    getter length
-    method @@iterator
-    method constructor
-    method entries
-    method forEach
-    method keys
-    method toMatrix
-    method values
-interface CSSTransition : Animation
-    attribute @@toStringTag
-    getter transitionProperty
-    method constructor
-interface CSSTranslate : CSSTransformComponent
-    attribute @@toStringTag
-    getter x
-    getter y
-    getter z
-    method constructor
-    setter x
-    setter y
-    setter z
-interface CSSUnitValue : CSSNumericValue
-    attribute @@toStringTag
-    getter unit
-    getter value
-    method constructor
-    setter value
-interface CSSUnparsedValue : CSSStyleValue
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method entries
-    method forEach
-    method keys
-    method values
-interface CSSVariableReferenceValue
-    attribute @@toStringTag
-    getter fallback
-    getter variable
-    method constructor
-    setter variable
-interface CSSViewportRule : CSSRule
-    attribute @@toStringTag
-    getter style
-    method constructor
-interface Cache
-    attribute @@toStringTag
-    method add
-    method addAll
-    method constructor
-    method delete
-    method keys
-    method match
-    method matchAll
-    method put
-interface CacheStorage
-    attribute @@toStringTag
-    method constructor
-    method delete
-    method has
-    method keys
-    method match
-    method open
-interface CanvasCaptureMediaStreamTrack : MediaStreamTrack
-    attribute @@toStringTag
-    getter canvas
-    method constructor
-    method requestFrame
-interface CanvasGradient
-    attribute @@toStringTag
-    method addColorStop
-    method constructor
-interface CanvasPattern
-    attribute @@toStringTag
-    method constructor
-    method setTransform
-interface CanvasRenderingContext2D
-    attribute @@toStringTag
-    getter canvas
-    getter direction
-    getter fillStyle
-    getter filter
-    getter font
-    getter globalAlpha
-    getter globalCompositeOperation
-    getter imageSmoothingEnabled
-    getter imageSmoothingQuality
-    getter lineCap
-    getter lineDashOffset
-    getter lineJoin
-    getter lineWidth
-    getter miterLimit
-    getter shadowBlur
-    getter shadowColor
-    getter shadowOffsetX
-    getter shadowOffsetY
-    getter strokeStyle
-    getter textAlign
-    getter textBaseline
-    method addHitRegion
-    method arc
-    method arcTo
-    method beginPath
-    method bezierCurveTo
-    method clearHitRegions
-    method clearRect
-    method clip
-    method closePath
-    method constructor
-    method createImageData
-    method createLinearGradient
-    method createPattern
-    method createRadialGradient
-    method drawFocusIfNeeded
-    method drawImage
-    method ellipse
-    method fill
-    method fillRect
-    method fillText
-    method getContextAttributes
-    method getImageData
-    method getLineDash
-    method getTransform
-    method isContextLost
-    method isPointInPath
-    method isPointInStroke
-    method lineTo
-    method measureText
-    method moveTo
-    method putImageData
-    method quadraticCurveTo
-    method rect
-    method removeHitRegion
-    method resetTransform
-    method restore
-    method rotate
-    method save
-    method scale
-    method scrollPathIntoView
-    method setLineDash
-    method setTransform
-    method stroke
-    method strokeRect
-    method strokeText
-    method transform
-    method translate
-    setter direction
-    setter fillStyle
-    setter filter
-    setter font
-    setter globalAlpha
-    setter globalCompositeOperation
-    setter imageSmoothingEnabled
-    setter imageSmoothingQuality
-    setter lineCap
-    setter lineDashOffset
-    setter lineJoin
-    setter lineWidth
-    setter miterLimit
-    setter shadowBlur
-    setter shadowColor
-    setter shadowOffsetX
-    setter shadowOffsetY
-    setter strokeStyle
-    setter textAlign
-    setter textBaseline
-interface ChannelMergerNode : AudioNode
-    attribute @@toStringTag
-    method constructor
-interface ChannelSplitterNode : AudioNode
-    attribute @@toStringTag
-    method constructor
-interface CharacterData : Node
-    attribute @@toStringTag
-    attribute @@unscopables
-    getter data
-    getter length
-    getter nextElementSibling
-    getter previousElementSibling
-    method after
-    method appendData
-    method before
-    method constructor
-    method deleteData
-    method insertData
-    method remove
-    method replaceData
-    method replaceWith
-    method substringData
-    setter data
-interface Clipboard : EventTarget
-    attribute @@toStringTag
-    method constructor
-    method read
-    method readText
-    method write
-    method writeText
-interface ClipboardEvent : Event
-    attribute @@toStringTag
-    getter clipboardData
-    method constructor
-interface ClipboardItem
-    attribute @@toStringTag
-    getter types
-    method constructor
-    method getType
-interface CloseEvent : Event
-    attribute @@toStringTag
-    getter code
-    getter reason
-    getter wasClean
-    method constructor
-interface Comment : CharacterData
-    attribute @@toStringTag
-    method constructor
-interface CompositionEvent : UIEvent
-    attribute @@toStringTag
-    getter data
-    method constructor
-    method initCompositionEvent
-interface CompressionStream
-    attribute @@toStringTag
-    getter readable
-    getter writable
-    method constructor
-interface ComputedAccessibleNode
-    attribute @@toStringTag
-    getter atomic
-    getter autocomplete
-    getter busy
-    getter checked
-    getter colCount
-    getter colIndex
-    getter colSpan
-    getter disabled
-    getter expanded
-    getter firstChild
-    getter keyShortcuts
-    getter lastChild
-    getter level
-    getter modal
-    getter multiline
-    getter multiselectable
-    getter name
-    getter nextSibling
-    getter parent
-    getter placeholder
-    getter posInSet
-    getter previousSibling
-    getter readOnly
-    getter required
-    getter role
-    getter roleDescription
-    getter rowCount
-    getter rowIndex
-    getter rowSpan
-    getter selected
-    getter setSize
-    getter valueMax
-    getter valueMin
-    getter valueNow
-    getter valueText
-    method constructor
-    method ensureUpToDate
-interface ConstantSourceNode : AudioScheduledSourceNode
-    attribute @@toStringTag
-    getter offset
-    method constructor
-interface ContactAddress : PaymentAddress
-    attribute @@toStringTag
-    method constructor
-interface ContactsManager
-    attribute @@toStringTag
-    method constructor
-    method getProperties
-    method select
-interface ContentIndex
-    attribute @@toStringTag
-    method add
-    method constructor
-    method delete
-    method getAll
-interface ConvolverNode : AudioNode
-    attribute @@toStringTag
-    getter buffer
-    getter normalize
-    method constructor
-    setter buffer
-    setter normalize
-interface CookieChangeEvent : Event
-    attribute @@toStringTag
-    getter changed
-    getter deleted
-    method constructor
-interface CookieStore : EventTarget
-    attribute @@toStringTag
-    getter onchange
-    method constructor
-    method delete
-    method get
-    method getAll
-    method set
-    setter onchange
-interface CookieStoreManager
-    attribute @@toStringTag
-    method constructor
-    method getSubscriptions
-    method subscribe
-    method unsubscribe
-interface CountQueuingStrategy
-    attribute @@toStringTag
-    getter highWaterMark
-    getter size
-    method constructor
-interface Credential
-    attribute @@toStringTag
-    getter id
-    getter type
-    method constructor
-interface CredentialsContainer
-    attribute @@toStringTag
-    method constructor
-    method create
-    method get
-    method preventSilentAccess
-    method store
-interface Crypto
-    attribute @@toStringTag
-    getter subtle
-    method constructor
-    method getRandomValues
-interface CryptoKey
-    attribute @@toStringTag
-    getter algorithm
-    getter extractable
-    getter type
-    getter usages
-    method constructor
-interface CustomElementRegistry
-    attribute @@toStringTag
-    method constructor
-    method define
-    method get
-    method upgrade
-    method whenDefined
-interface CustomEvent : Event
-    attribute @@toStringTag
-    getter detail
-    method constructor
-    method initCustomEvent
-interface DOMError
-    attribute @@toStringTag
-    getter message
-    getter name
-    method constructor
-interface DOMException
-    attribute @@toStringTag
-    attribute ABORT_ERR
-    attribute DATA_CLONE_ERR
-    attribute DOMSTRING_SIZE_ERR
-    attribute HIERARCHY_REQUEST_ERR
-    attribute INDEX_SIZE_ERR
-    attribute INUSE_ATTRIBUTE_ERR
-    attribute INVALID_ACCESS_ERR
-    attribute INVALID_CHARACTER_ERR
-    attribute INVALID_MODIFICATION_ERR
-    attribute INVALID_NODE_TYPE_ERR
-    attribute INVALID_STATE_ERR
-    attribute NAMESPACE_ERR
-    attribute NETWORK_ERR
-    attribute NOT_FOUND_ERR
-    attribute NOT_SUPPORTED_ERR
-    attribute NO_DATA_ALLOWED_ERR
-    attribute NO_MODIFICATION_ALLOWED_ERR
-    attribute QUOTA_EXCEEDED_ERR
-    attribute SECURITY_ERR
-    attribute SYNTAX_ERR
-    attribute TIMEOUT_ERR
-    attribute TYPE_MISMATCH_ERR
-    attribute URL_MISMATCH_ERR
-    attribute VALIDATION_ERR
-    attribute WRONG_DOCUMENT_ERR
-    getter code
-    getter message
-    getter name
-    method constructor
-interface DOMImplementation
-    attribute @@toStringTag
-    method constructor
-    method createDocument
-    method createDocumentType
-    method createHTMLDocument
-    method hasFeature
-interface DOMMatrix : DOMMatrixReadOnly
-    attribute @@toStringTag
-    getter a
-    getter b
-    getter c
-    getter d
-    getter e
-    getter f
-    getter m11
-    getter m12
-    getter m13
-    getter m14
-    getter m21
-    getter m22
-    getter m23
-    getter m24
-    getter m31
-    getter m32
-    getter m33
-    getter m34
-    getter m41
-    getter m42
-    getter m43
-    getter m44
-    method constructor
-    method invertSelf
-    method multiplySelf
-    method preMultiplySelf
-    method rotateAxisAngleSelf
-    method rotateFromVectorSelf
-    method rotateSelf
-    method scale3dSelf
-    method scaleSelf
-    method setMatrixValue
-    method skewXSelf
-    method skewYSelf
-    method translateSelf
-    setter a
-    setter b
-    setter c
-    setter d
-    setter e
-    setter f
-    setter m11
-    setter m12
-    setter m13
-    setter m14
-    setter m21
-    setter m22
-    setter m23
-    setter m24
-    setter m31
-    setter m32
-    setter m33
-    setter m34
-    setter m41
-    setter m42
-    setter m43
-    setter m44
-interface DOMMatrixReadOnly
-    static method fromFloat32Array
-    static method fromFloat64Array
-    static method fromMatrix
-    attribute @@toStringTag
-    getter a
-    getter b
-    getter c
-    getter d
-    getter e
-    getter f
-    getter is2D
-    getter isIdentity
-    getter m11
-    getter m12
-    getter m13
-    getter m14
-    getter m21
-    getter m22
-    getter m23
-    getter m24
-    getter m31
-    getter m32
-    getter m33
-    getter m34
-    getter m41
-    getter m42
-    getter m43
-    getter m44
-    method constructor
-    method flipX
-    method flipY
-    method inverse
-    method multiply
-    method rotate
-    method rotateAxisAngle
-    method rotateFromVector
-    method scale
-    method scale3d
-    method scaleNonUniform
-    method skewX
-    method skewY
-    method toFloat32Array
-    method toFloat64Array
-    method toJSON
-    method toString
-    method transformPoint
-    method translate
-interface DOMParser
-    attribute @@toStringTag
-    method constructor
-    method parseFromString
-interface DOMPoint : DOMPointReadOnly
-    attribute @@toStringTag
-    getter w
-    getter x
-    getter y
-    getter z
-    method constructor
-    setter w
-    setter x
-    setter y
-    setter z
-interface DOMPointReadOnly
-    static method fromPoint
-    attribute @@toStringTag
-    getter w
-    getter x
-    getter y
-    getter z
-    method constructor
-    method matrixTransform
-    method toJSON
-interface DOMQuad
-    static method fromQuad
-    static method fromRect
-    attribute @@toStringTag
-    getter p1
-    getter p2
-    getter p3
-    getter p4
-    method constructor
-    method getBounds
-    method toJSON
-interface DOMRect : DOMRectReadOnly
-    attribute @@toStringTag
-    getter height
-    getter width
-    getter x
-    getter y
-    method constructor
-    setter height
-    setter width
-    setter x
-    setter y
-interface DOMRectList
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method item
-interface DOMRectReadOnly
-    static method fromRect
-    attribute @@toStringTag
-    getter bottom
-    getter height
-    getter left
-    getter right
-    getter top
-    getter width
-    getter x
-    getter y
-    method constructor
-    method toJSON
-interface DOMStringList
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method contains
-    method item
-interface DOMStringMap
-    attribute @@toStringTag
-    method constructor
-interface DOMTokenList
-    attribute @@toStringTag
-    getter length
-    getter value
-    method @@iterator
-    method add
-    method constructor
-    method contains
-    method entries
-    method forEach
-    method item
-    method keys
-    method remove
-    method replace
-    method supports
-    method toString
-    method toggle
-    method values
-    setter value
-interface DataTransfer
-    attribute @@toStringTag
-    getter dropEffect
-    getter effectAllowed
-    getter files
-    getter items
-    getter types
-    method clearData
-    method constructor
-    method getData
-    method setData
-    method setDragImage
-    setter dropEffect
-    setter effectAllowed
-interface DataTransferItem
-    attribute @@toStringTag
-    getter kind
-    getter type
-    method constructor
-    method getAsFile
-    method getAsString
-    method webkitGetAsEntry
-interface DataTransferItemList
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method add
-    method clear
-    method constructor
-    method remove
-interface DecompressionStream
-    attribute @@toStringTag
-    getter readable
-    getter writable
-    method constructor
-interface DelayNode : AudioNode
-    attribute @@toStringTag
-    getter delayTime
-    method constructor
-interface DetectedBarcode
-    attribute @@toStringTag
-    getter boundingBox
-    getter cornerPoints
-    getter format
-    getter rawValue
-    method constructor
-interface DetectedFace
-    attribute @@toStringTag
-    getter boundingBox
-    getter landmarks
-    method constructor
-interface DetectedText
-    attribute @@toStringTag
-    getter boundingBox
-    getter cornerPoints
-    getter rawValue
-    method constructor
-interface DeviceMotionEvent : Event
-    attribute @@toStringTag
-    getter acceleration
-    getter accelerationIncludingGravity
-    getter interval
-    getter rotationRate
-    method constructor
-interface DeviceMotionEventAcceleration
-    attribute @@toStringTag
-    getter x
-    getter y
-    getter z
-    method constructor
-interface DeviceMotionEventRotationRate
-    attribute @@toStringTag
-    getter alpha
-    getter beta
-    getter gamma
-    method constructor
-interface DeviceOrientationEvent : Event
-    attribute @@toStringTag
-    getter absolute
-    getter alpha
-    getter beta
-    getter gamma
-    method constructor
-interface Document : Node
-    attribute @@toStringTag
-    attribute @@unscopables
-    getter URL
-    getter activeElement
-    getter addressSpace
-    getter adoptedStyleSheets
-    getter alinkColor
-    getter all
-    getter anchors
-    getter applets
-    getter bgColor
-    getter body
-    getter characterSet
-    getter charset
-    getter childElementCount
-    getter children
-    getter compatMode
-    getter contentType
-    getter cookie
-    getter currentScript
-    getter defaultView
-    getter designMode
-    getter dir
-    getter doctype
-    getter documentElement
-    getter documentURI
-    getter domain
-    getter embeds
-    getter featurePolicy
-    getter fgColor
-    getter firstElementChild
-    getter fonts
-    getter forms
-    getter fullscreen
-    getter fullscreenElement
-    getter fullscreenEnabled
-    getter head
-    getter hidden
-    getter images
-    getter implementation
-    getter inputEncoding
-    getter lastElementChild
-    getter lastModified
-    getter linkColor
-    getter links
-    getter onabort
-    getter onactivateinvisible
-    getter onanimationend
-    getter onanimationiteration
-    getter onanimationstart
-    getter onauxclick
-    getter onbeforecopy
-    getter onbeforecut
-    getter onbeforepaste
-    getter onblur
-    getter oncancel
-    getter oncanplay
-    getter oncanplaythrough
-    getter onchange
-    getter onclick
-    getter onclose
-    getter oncontextmenu
-    getter oncopy
-    getter oncuechange
-    getter oncut
-    getter ondblclick
-    getter ondrag
-    getter ondragend
-    getter ondragenter
-    getter ondragleave
-    getter ondragover
-    getter ondragstart
-    getter ondrop
-    getter ondurationchange
-    getter onemptied
-    getter onended
-    getter onerror
-    getter onfocus
-    getter onformdata
-    getter onfreeze
-    getter onfullscreenchange
-    getter onfullscreenerror
-    getter ongotpointercapture
-    getter oninput
-    getter oninvalid
-    getter onkeydown
-    getter onkeypress
-    getter onkeyup
-    getter onload
-    getter onloadeddata
-    getter onloadedmetadata
-    getter onloadstart
-    getter onlostpointercapture
-    getter onmousedown
-    getter onmouseenter
-    getter onmouseleave
-    getter onmousemove
-    getter onmouseout
-    getter onmouseover
-    getter onmouseup
-    getter onmousewheel
-    getter onoverscroll
-    getter onpaste
-    getter onpause
-    getter onplay
-    getter onplaying
-    getter onpointercancel
-    getter onpointerdown
-    getter onpointerenter
-    getter onpointerleave
-    getter onpointerlockchange
-    getter onpointerlockerror
-    getter onpointermove
-    getter onpointerout
-    getter onpointerover
-    getter onpointerrawupdate
-    getter onpointerup
-    getter onprogress
-    getter onratechange
-    getter onreadystatechange
-    getter onrendersubtreeactivation
-    getter onreset
-    getter onresize
-    getter onresume
-    getter onscroll
-    getter onscrollend
-    getter onsearch
-    getter onsecuritypolicyviolation
-    getter onseeked
-    getter onseeking
-    getter onselect
-    getter onselectionchange
-    getter onselectstart
-    getter onstalled
-    getter onsubmit
-    getter onsuspend
-    getter ontimeupdate
-    getter ontoggle
-    getter ontouchcancel
-    getter ontouchend
-    getter ontouchmove
-    getter ontouchstart
-    getter ontransitionend
-    getter onvisibilitychange
-    getter onvolumechange
-    getter onwaiting
-    getter onwebkitfullscreenchange
-    getter onwebkitfullscreenerror
-    getter onwheel
-    getter pictureInPictureElement
-    getter pictureInPictureEnabled
-    getter plugins
-    getter pointerLockElement
-    getter readyState
-    getter referrer
-    getter rootElement
-    getter rootScroller
-    getter scripts
-    getter scrollingElement
-    getter styleSheets
-    getter timeline
-    getter title
-    getter visibilityState
-    getter vlinkColor
-    getter wasDiscarded
-    getter webkitCurrentFullScreenElement
-    getter webkitFullscreenElement
-    getter webkitFullscreenEnabled
-    getter webkitHidden
-    getter webkitIsFullScreen
-    getter webkitVisibilityState
-    getter xmlEncoding
-    getter xmlStandalone
-    getter xmlVersion
-    method adoptNode
-    method append
-    method captureEvents
-    method caretRangeFromPoint
-    method clear
-    method close
-    method constructor
-    method createAttribute
-    method createAttributeNS
-    method createCDATASection
-    method createComment
-    method createDocumentFragment
-    method createElement
-    method createElementNS
-    method createEvent
-    method createExpression
-    method createNSResolver
-    method createNodeIterator
-    method createProcessingInstruction
-    method createRange
-    method createTextNode
-    method createTreeWalker
-    method elementFromPoint
-    method elementsFromPoint
-    method evaluate
-    method execCommand
-    method exitFullscreen
-    method exitPictureInPicture
-    method exitPointerLock
-    method getAnimations
-    method getElementById
-    method getElementsByClassName
-    method getElementsByName
-    method getElementsByTagName
-    method getElementsByTagNameNS
-    method getSelection
-    method hasFocus
-    method hasStorageAccess
-    method importNode
-    method open
-    method prepend
-    method queryCommandEnabled
-    method queryCommandIndeterm
-    method queryCommandState
-    method queryCommandSupported
-    method queryCommandValue
-    method querySelector
-    method querySelectorAll
-    method registerElement
-    method releaseEvents
-    method requestStorageAccess
-    method webkitCancelFullScreen
-    method webkitExitFullscreen
-    method write
-    method writeln
-    setter adoptedStyleSheets
-    setter alinkColor
-    setter bgColor
-    setter body
-    setter cookie
-    setter designMode
-    setter dir
-    setter domain
-    setter fgColor
-    setter fullscreen
-    setter fullscreenElement
-    setter fullscreenEnabled
-    setter linkColor
-    setter onabort
-    setter onactivateinvisible
-    setter onanimationend
-    setter onanimationiteration
-    setter onanimationstart
-    setter onauxclick
-    setter onbeforecopy
-    setter onbeforecut
-    setter onbeforepaste
-    setter onblur
-    setter oncancel
-    setter oncanplay
-    setter oncanplaythrough
-    setter onchange
-    setter onclick
-    setter onclose
-    setter oncontextmenu
-    setter oncopy
-    setter oncuechange
-    setter oncut
-    setter ondblclick
-    setter ondrag
-    setter ondragend
-    setter ondragenter
-    setter ondragleave
-    setter ondragover
-    setter ondragstart
-    setter ondrop
-    setter ondurationchange
-    setter onemptied
-    setter onended
-    setter onerror
-    setter onfocus
-    setter onformdata
-    setter onfreeze
-    setter onfullscreenchange
-    setter onfullscreenerror
-    setter ongotpointercapture
-    setter oninput
-    setter oninvalid
-    setter onkeydown
-    setter onkeypress
-    setter onkeyup
-    setter onload
-    setter onloadeddata
-    setter onloadedmetadata
-    setter onloadstart
-    setter onlostpointercapture
-    setter onmousedown
-    setter onmouseenter
-    setter onmouseleave
-    setter onmousemove
-    setter onmouseout
-    setter onmouseover
-    setter onmouseup
-    setter onmousewheel
-    setter onoverscroll
-    setter onpaste
-    setter onpause
-    setter onplay
-    setter onplaying
-    setter onpointercancel
-    setter onpointerdown
-    setter onpointerenter
-    setter onpointerleave
-    setter onpointerlockchange
-    setter onpointerlockerror
-    setter onpointermove
-    setter onpointerout
-    setter onpointerover
-    setter onpointerrawupdate
-    setter onpointerup
-    setter onprogress
-    setter onratechange
-    setter onreadystatechange
-    setter onrendersubtreeactivation
-    setter onreset
-    setter onresize
-    setter onresume
-    setter onscroll
-    setter onscrollend
-    setter onsearch
-    setter onsecuritypolicyviolation
-    setter onseeked
-    setter onseeking
-    setter onselect
-    setter onselectionchange
-    setter onselectstart
-    setter onstalled
-    setter onsubmit
-    setter onsuspend
-    setter ontimeupdate
-    setter ontoggle
-    setter ontouchcancel
-    setter ontouchend
-    setter ontouchmove
-    setter ontouchstart
-    setter ontransitionend
-    setter onvisibilitychange
-    setter onvolumechange
-    setter onwaiting
-    setter onwebkitfullscreenchange
-    setter onwebkitfullscreenerror
-    setter onwheel
-    setter rootScroller
-    setter title
-    setter vlinkColor
-    setter xmlStandalone
-    setter xmlVersion
-interface DocumentFragment : Node
-    attribute @@toStringTag
-    attribute @@unscopables
-    getter childElementCount
-    getter children
-    getter firstElementChild
-    getter lastElementChild
-    method append
-    method constructor
-    method getElementById
-    method prepend
-    method querySelector
-    method querySelectorAll
-interface DocumentTimeline : AnimationTimeline
-    attribute @@toStringTag
-    method constructor
-interface DocumentType : Node
-    attribute @@toStringTag
-    attribute @@unscopables
-    getter name
-    getter publicId
-    getter systemId
-    method after
-    method before
-    method constructor
-    method remove
-    method replaceWith
-interface DragEvent : MouseEvent
-    attribute @@toStringTag
-    getter dataTransfer
-    method constructor
-interface DynamicsCompressorNode : AudioNode
-    attribute @@toStringTag
-    getter attack
-    getter knee
-    getter ratio
-    getter reduction
-    getter release
-    getter threshold
-    method constructor
-interface EditContext : EventTarget
-    attribute @@toStringTag
-    getter enterKeyHint
-    getter inputMode
-    getter inputPanelPolicy
-    getter oncompositionend
-    getter oncompositionstart
-    getter ontextformatupdate
-    getter ontextupdate
-    getter selectionEnd
-    getter selectionStart
-    getter text
-    method blur
-    method constructor
-    method focus
-    method updateLayout
-    method updateSelection
-    method updateText
-    setter enterKeyHint
-    setter inputMode
-    setter inputPanelPolicy
-    setter oncompositionend
-    setter oncompositionstart
-    setter ontextformatupdate
-    setter ontextupdate
-    setter selectionEnd
-    setter selectionStart
-    setter text
-interface Element : Node
-    attribute @@toStringTag
-    attribute @@unscopables
-    getter accessibleNode
-    getter ariaActiveDescendantElement
-    getter ariaAtomic
-    getter ariaAutoComplete
-    getter ariaBusy
-    getter ariaChecked
-    getter ariaColCount
-    getter ariaColIndex
-    getter ariaColSpan
-    getter ariaControlsElements
-    getter ariaCurrent
-    getter ariaDescribedByElements
-    getter ariaDetailsElement
-    getter ariaDisabled
-    getter ariaErrorMessageElement
-    getter ariaExpanded
-    getter ariaFlowToElements
-    getter ariaHasPopup
-    getter ariaHidden
-    getter ariaKeyShortcuts
-    getter ariaLabel
-    getter ariaLabelledByElements
-    getter ariaLevel
-    getter ariaLive
-    getter ariaModal
-    getter ariaMultiLine
-    getter ariaMultiSelectable
-    getter ariaOrientation
-    getter ariaOwnsElements
-    getter ariaPlaceholder
-    getter ariaPosInSet
-    getter ariaPressed
-    getter ariaReadOnly
-    getter ariaRelevant
-    getter ariaRequired
-    getter ariaRoleDescription
-    getter ariaRowCount
-    getter ariaRowIndex
-    getter ariaRowSpan
-    getter ariaSelected
-    getter ariaSort
-    getter ariaValueMax
-    getter ariaValueMin
-    getter ariaValueNow
-    getter ariaValueText
-    getter assignedSlot
-    getter attributeStyleMap
-    getter attributes
-    getter childElementCount
-    getter children
-    getter classList
-    getter className
-    getter clientHeight
-    getter clientLeft
-    getter clientTop
-    getter clientWidth
-    getter computedName
-    getter computedRole
-    getter elementTiming
-    getter firstElementChild
-    getter id
-    getter innerHTML
-    getter invisible
-    getter lastElementChild
-    getter localName
-    getter namespaceURI
-    getter nextElementSibling
-    getter onbeforecopy
-    getter onbeforecut
-    getter onbeforepaste
-    getter onfullscreenchange
-    getter onfullscreenerror
-    getter onsearch
-    getter onwebkitfullscreenchange
-    getter onwebkitfullscreenerror
-    getter outerHTML
-    getter part
-    getter prefix
-    getter previousElementSibling
-    getter renderSubtree
-    getter role
-    getter scrollHeight
-    getter scrollLeft
-    getter scrollTop
-    getter scrollWidth
-    getter shadowRoot
-    getter slot
-    getter tagName
-    method after
-    method animate
-    method append
-    method attachShadow
-    method before
-    method closest
-    method computedStyleMap
-    method constructor
-    method createShadowRoot
-    method getAnimations
-    method getAttribute
-    method getAttributeNS
-    method getAttributeNames
-    method getAttributeNode
-    method getAttributeNodeNS
-    method getBoundingClientRect
-    method getClientRects
-    method getDestinationInsertionPoints
-    method getElementsByClassName
-    method getElementsByTagName
-    method getElementsByTagNameNS
-    method hasAttribute
-    method hasAttributeNS
-    method hasAttributes
-    method hasPointerCapture
-    method insertAdjacentElement
-    method insertAdjacentHTML
-    method insertAdjacentText
-    method matches
-    method prepend
-    method querySelector
-    method querySelectorAll
-    method releasePointerCapture
-    method remove
-    method removeAttribute
-    method removeAttributeNS
-    method removeAttributeNode
-    method replaceWith
-    method requestFullscreen
-    method requestPointerLock
-    method resetSubtreeRendered
-    method scroll
-    method scrollBy
-    method scrollIntoView
-    method scrollIntoViewIfNeeded
-    method scrollTo
-    method setAttribute
-    method setAttributeNS
-    method setAttributeNode
-    method setAttributeNodeNS
-    method setPointerCapture
-    method toggleAttribute
-    method updateRendering
-    method webkitMatchesSelector
-    method webkitRequestFullScreen
-    method webkitRequestFullscreen
-    setter ariaActiveDescendantElement
-    setter ariaAtomic
-    setter ariaAutoComplete
-    setter ariaBusy
-    setter ariaChecked
-    setter ariaColCount
-    setter ariaColIndex
-    setter ariaColSpan
-    setter ariaControlsElements
-    setter ariaCurrent
-    setter ariaDescribedByElements
-    setter ariaDetailsElement
-    setter ariaDisabled
-    setter ariaErrorMessageElement
-    setter ariaExpanded
-    setter ariaFlowToElements
-    setter ariaHasPopup
-    setter ariaHidden
-    setter ariaKeyShortcuts
-    setter ariaLabel
-    setter ariaLabelledByElements
-    setter ariaLevel
-    setter ariaLive
-    setter ariaModal
-    setter ariaMultiLine
-    setter ariaMultiSelectable
-    setter ariaOrientation
-    setter ariaOwnsElements
-    setter ariaPlaceholder
-    setter ariaPosInSet
-    setter ariaPressed
-    setter ariaReadOnly
-    setter ariaRelevant
-    setter ariaRequired
-    setter ariaRoleDescription
-    setter ariaRowCount
-    setter ariaRowIndex
-    setter ariaRowSpan
-    setter ariaSelected
-    setter ariaSort
-    setter ariaValueMax
-    setter ariaValueMin
-    setter ariaValueNow
-    setter ariaValueText
-    setter classList
-    setter className
-    setter elementTiming
-    setter id
-    setter innerHTML
-    setter invisible
-    setter onbeforecopy
-    setter onbeforecut
-    setter onbeforepaste
-    setter onfullscreenchange
-    setter onfullscreenerror
-    setter onsearch
-    setter onwebkitfullscreenchange
-    setter onwebkitfullscreenerror
-    setter outerHTML
-    setter part
-    setter renderSubtree
-    setter role
-    setter scrollLeft
-    setter scrollTop
-    setter slot
-interface ElementInternals
-    attribute @@toStringTag
-    getter ariaActiveDescendantElement
-    getter ariaAtomic
-    getter ariaAutoComplete
-    getter ariaBusy
-    getter ariaChecked
-    getter ariaColCount
-    getter ariaColIndex
-    getter ariaColSpan
-    getter ariaControlsElements
-    getter ariaCurrent
-    getter ariaDescribedByElements
-    getter ariaDetailsElement
-    getter ariaDisabled
-    getter ariaErrorMessageElement
-    getter ariaExpanded
-    getter ariaFlowToElements
-    getter ariaHasPopup
-    getter ariaHidden
-    getter ariaKeyShortcuts
-    getter ariaLabel
-    getter ariaLabelledByElements
-    getter ariaLevel
-    getter ariaLive
-    getter ariaModal
-    getter ariaMultiLine
-    getter ariaMultiSelectable
-    getter ariaOrientation
-    getter ariaOwnsElements
-    getter ariaPlaceholder
-    getter ariaPosInSet
-    getter ariaPressed
-    getter ariaReadOnly
-    getter ariaRelevant
-    getter ariaRequired
-    getter ariaRoleDescription
-    getter ariaRowCount
-    getter ariaRowIndex
-    getter ariaRowSpan
-    getter ariaSelected
-    getter ariaSort
-    getter ariaValueMax
-    getter ariaValueMin
-    getter ariaValueNow
-    getter ariaValueText
-    getter form
-    getter labels
-    getter role
-    getter states
-    getter validationMessage
-    getter validity
-    getter willValidate
-    method checkValidity
-    method constructor
-    method reportValidity
-    method setFormValue
-    method setValidity
-    setter ariaActiveDescendantElement
-    setter ariaAtomic
-    setter ariaAutoComplete
-    setter ariaBusy
-    setter ariaChecked
-    setter ariaColCount
-    setter ariaColIndex
-    setter ariaColSpan
-    setter ariaControlsElements
-    setter ariaCurrent
-    setter ariaDescribedByElements
-    setter ariaDetailsElement
-    setter ariaDisabled
-    setter ariaErrorMessageElement
-    setter ariaExpanded
-    setter ariaFlowToElements
-    setter ariaHasPopup
-    setter ariaHidden
-    setter ariaKeyShortcuts
-    setter ariaLabel
-    setter ariaLabelledByElements
-    setter ariaLevel
-    setter ariaLive
-    setter ariaModal
-    setter ariaMultiLine
-    setter ariaMultiSelectable
-    setter ariaOrientation
-    setter ariaOwnsElements
-    setter ariaPlaceholder
-    setter ariaPosInSet
-    setter ariaPressed
-    setter ariaReadOnly
-    setter ariaRelevant
-    setter ariaRequired
-    setter ariaRoleDescription
-    setter ariaRowCount
-    setter ariaRowIndex
-    setter ariaRowSpan
-    setter ariaSelected
-    setter ariaSort
-    setter ariaValueMax
-    setter ariaValueMin
-    setter ariaValueNow
-    setter ariaValueText
-    setter role
-interface EnterPictureInPictureEvent : Event
-    attribute @@toStringTag
-    getter pictureInPictureWindow
-    method constructor
-interface ErrorEvent : Event
-    attribute @@toStringTag
-    getter colno
-    getter error
-    getter filename
-    getter lineno
-    getter message
-    method constructor
-interface Event
-    attribute @@toStringTag
-    attribute AT_TARGET
-    attribute BUBBLING_PHASE
-    attribute CAPTURING_PHASE
-    attribute NONE
-    getter bubbles
-    getter cancelBubble
-    getter cancelable
-    getter composed
-    getter currentTarget
-    getter defaultPrevented
-    getter eventPhase
-    getter path
-    getter returnValue
-    getter srcElement
-    getter target
-    getter timeStamp
-    getter type
-    method composedPath
-    method constructor
-    method initEvent
-    method preventDefault
-    method stopImmediatePropagation
-    method stopPropagation
-    setter cancelBubble
-    setter returnValue
-interface EventSource : EventTarget
-    attribute @@toStringTag
-    attribute CLOSED
-    attribute CONNECTING
-    attribute OPEN
-    getter onerror
-    getter onmessage
-    getter onopen
-    getter readyState
-    getter url
-    getter withCredentials
-    method close
-    method constructor
-    setter onerror
-    setter onmessage
-    setter onopen
-interface EventTarget
-    attribute @@toStringTag
-    method addEventListener
-    method constructor
-    method dispatchEvent
-    method removeEventListener
-interface External
-    attribute @@toStringTag
-    method AddSearchProvider
-    method IsSearchProviderInstalled
-    method constructor
-interface FaceDetector
-    attribute @@toStringTag
-    method constructor
-    method detect
-interface FeaturePolicy
-    attribute @@toStringTag
-    method allowedFeatures
-    method allowsFeature
-    method constructor
-    method features
-    method getAllowlistForFeature
-interface FederatedCredential : Credential
-    attribute @@toStringTag
-    getter iconURL
-    getter name
-    getter protocol
-    getter provider
-    method constructor
-interface File : Blob
-    attribute @@toStringTag
-    getter lastModified
-    getter lastModifiedDate
-    getter name
-    getter webkitRelativePath
-    method constructor
-interface FileList
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method item
-interface FileReader : EventTarget
-    attribute @@toStringTag
-    attribute DONE
-    attribute EMPTY
-    attribute LOADING
-    getter error
-    getter onabort
-    getter onerror
-    getter onload
-    getter onloadend
-    getter onloadstart
-    getter onprogress
-    getter readyState
-    getter result
-    method abort
-    method constructor
-    method readAsArrayBuffer
-    method readAsBinaryString
-    method readAsDataURL
-    method readAsText
-    setter onabort
-    setter onerror
-    setter onload
-    setter onloadend
-    setter onloadstart
-    setter onprogress
-interface FileSystemDirectoryHandle : FileSystemHandle
-    static method getSystemDirectory
-    attribute @@toStringTag
-    method constructor
-    method getDirectory
-    method getEntries
-    method getFile
-    method removeEntry
-interface FileSystemFileHandle : FileSystemHandle
-    attribute @@toStringTag
-    method constructor
-    method createWriter
-    method getFile
-interface FileSystemHandle
-    attribute @@toStringTag
-    getter isDirectory
-    getter isFile
-    getter name
-    method constructor
-    method queryPermission
-    method requestPermission
-interface FileSystemWriter
-    attribute @@toStringTag
-    method close
-    method constructor
-    method truncate
-    method write
-interface FocusEvent : UIEvent
-    attribute @@toStringTag
-    getter relatedTarget
-    method constructor
-interface FontFace
-    attribute @@toStringTag
-    getter display
-    getter family
-    getter featureSettings
-    getter loaded
-    getter status
-    getter stretch
-    getter style
-    getter unicodeRange
-    getter variant
-    getter weight
-    method constructor
-    method load
-    setter display
-    setter family
-    setter featureSettings
-    setter stretch
-    setter style
-    setter unicodeRange
-    setter variant
-    setter weight
-interface FontFaceSetLoadEvent : Event
-    attribute @@toStringTag
-    getter fontfaces
-    method constructor
-interface FormData
-    attribute @@toStringTag
-    method @@iterator
-    method append
-    method constructor
-    method delete
-    method entries
-    method forEach
-    method get
-    method getAll
-    method has
-    method keys
-    method set
-    method values
-interface FormDataEvent : Event
-    attribute @@toStringTag
-    getter formData
-    method constructor
-interface GainNode : AudioNode
-    attribute @@toStringTag
-    getter gain
-    method constructor
-interface Gamepad
-    attribute @@toStringTag
-    getter axes
-    getter buttons
-    getter connected
-    getter id
-    getter index
-    getter mapping
-    getter timestamp
-    getter vibrationActuator
-    method constructor
-interface GamepadAxisEvent : GamepadEvent
-    attribute @@toStringTag
-    getter axis
-    getter value
-    method constructor
-interface GamepadButton
-    attribute @@toStringTag
-    getter pressed
-    getter touched
-    getter value
-    method constructor
-interface GamepadButtonEvent : GamepadEvent
-    attribute @@toStringTag
-    getter button
-    getter value
-    method constructor
-interface GamepadEvent : Event
-    attribute @@toStringTag
-    getter gamepad
-    method constructor
-interface GamepadHapticActuator
-    attribute @@toStringTag
-    getter type
-    method constructor
-    method playEffect
-    method reset
-interface Geolocation
-    attribute @@toStringTag
-    method clearWatch
-    method constructor
-    method getCurrentPosition
-    method watchPosition
-interface GeolocationCoordinates
-    attribute @@toStringTag
-    getter accuracy
-    getter altitude
-    getter altitudeAccuracy
-    getter heading
-    getter latitude
-    getter longitude
-    getter speed
-    method constructor
-interface GeolocationPosition
-    attribute @@toStringTag
-    getter coords
-    getter timestamp
-    method constructor
-interface GeolocationPositionError
-    attribute @@toStringTag
-    attribute PERMISSION_DENIED
-    attribute POSITION_UNAVAILABLE
-    attribute TIMEOUT
-    getter code
-    getter message
-    method constructor
-interface Gyroscope : Sensor
-    attribute @@toStringTag
-    getter x
-    getter y
-    getter z
-    method constructor
-interface HID : EventTarget
-    attribute @@toStringTag
-    getter onconnect
-    getter ondisconnect
-    method constructor
-    method getDevices
-    method requestDevice
-    setter onconnect
-    setter ondisconnect
-interface HIDCollectionInfo
-    attribute @@toStringTag
-    getter children
-    getter featureReports
-    getter inputReports
-    getter outputReports
-    getter usage
-    getter usagePage
-    method constructor
-interface HIDConnectionEvent : Event
-    attribute @@toStringTag
-    getter device
-    method constructor
-interface HIDDevice : EventTarget
-    attribute @@toStringTag
-    getter collections
-    getter oninputreport
-    getter opened
-    getter productId
-    getter productName
-    getter vendorId
-    method close
-    method constructor
-    method open
-    method receiveFeatureReport
-    method sendFeatureReport
-    method sendReport
-    setter oninputreport
-interface HIDInputReportEvent : Event
-    attribute @@toStringTag
-    getter data
-    getter device
-    getter reportId
-    method constructor
-interface HIDReportInfo
-    attribute @@toStringTag
-    getter items
-    getter reportId
-    method constructor
-interface HIDReportItem
-    attribute @@toStringTag
-    getter hasNull
-    getter isAbsolute
-    getter isArray
-    getter isRange
-    getter logicalMaximum
-    getter logicalMinimum
-    getter physicalMaximum
-    getter physicalMinimum
-    getter reportCount
-    getter reportSize
-    getter strings
-    getter unitExponent
-    getter unitFactorCurrentExponent
-    getter unitFactorLengthExponent
-    getter unitFactorLuminousIntensityExponent
-    getter unitFactorMassExponent
-    getter unitFactorTemperatureExponent
-    getter unitFactorTimeExponent
-    getter unitSystem
-    getter usageMaximum
-    getter usageMinimum
-    getter usages
-    method constructor
-interface HTMLAllCollection
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method item
-    method namedItem
-interface HTMLAnchorElement : HTMLElement
-    attribute @@toStringTag
-    getter charset
-    getter coords
-    getter download
-    getter hash
-    getter host
-    getter hostname
-    getter href
-    getter hrefTranslate
-    getter hreflang
-    getter name
-    getter origin
-    getter password
-    getter pathname
-    getter ping
-    getter port
-    getter protocol
-    getter referrerPolicy
-    getter rel
-    getter relList
-    getter rev
-    getter search
-    getter shape
-    getter target
-    getter text
-    getter type
-    getter username
-    method constructor
-    method toString
-    setter charset
-    setter coords
-    setter download
-    setter hash
-    setter host
-    setter hostname
-    setter href
-    setter hrefTranslate
-    setter hreflang
-    setter name
-    setter password
-    setter pathname
-    setter ping
-    setter port
-    setter protocol
-    setter referrerPolicy
-    setter rel
-    setter relList
-    setter rev
-    setter search
-    setter shape
-    setter target
-    setter text
-    setter type
-    setter username
-interface HTMLAreaElement : HTMLElement
-    attribute @@toStringTag
-    getter alt
-    getter coords
-    getter download
-    getter hash
-    getter host
-    getter hostname
-    getter href
-    getter noHref
-    getter origin
-    getter password
-    getter pathname
-    getter ping
-    getter port
-    getter protocol
-    getter referrerPolicy
-    getter rel
-    getter relList
-    getter search
-    getter shape
-    getter target
-    getter username
-    method constructor
-    method toString
-    setter alt
-    setter coords
-    setter download
-    setter hash
-    setter host
-    setter hostname
-    setter href
-    setter noHref
-    setter password
-    setter pathname
-    setter ping
-    setter port
-    setter protocol
-    setter referrerPolicy
-    setter rel
-    setter relList
-    setter search
-    setter shape
-    setter target
-    setter username
-interface HTMLAudioElement : HTMLMediaElement
-    attribute @@toStringTag
-    method constructor
-interface HTMLBRElement : HTMLElement
-    attribute @@toStringTag
-    getter clear
-    method constructor
-    setter clear
-interface HTMLBaseElement : HTMLElement
-    attribute @@toStringTag
-    getter href
-    getter target
-    method constructor
-    setter href
-    setter target
-interface HTMLBodyElement : HTMLElement
-    attribute @@toStringTag
-    getter aLink
-    getter background
-    getter bgColor
-    getter link
-    getter onafterprint
-    getter onbeforeprint
-    getter onbeforeunload
-    getter onblur
-    getter onerror
-    getter onfocus
-    getter onhashchange
-    getter onlanguagechange
-    getter onload
-    getter onmessage
-    getter onmessageerror
-    getter onoffline
-    getter ononline
-    getter onpagehide
-    getter onpageshow
-    getter onpopstate
-    getter onportalactivate
-    getter onrejectionhandled
-    getter onresize
-    getter onscroll
-    getter onstorage
-    getter onunhandledrejection
-    getter onunload
-    getter text
-    getter vLink
-    method constructor
-    setter aLink
-    setter background
-    setter bgColor
-    setter link
-    setter onafterprint
-    setter onbeforeprint
-    setter onbeforeunload
-    setter onblur
-    setter onerror
-    setter onfocus
-    setter onhashchange
-    setter onlanguagechange
-    setter onload
-    setter onmessage
-    setter onmessageerror
-    setter onoffline
-    setter ononline
-    setter onpagehide
-    setter onpageshow
-    setter onpopstate
-    setter onportalactivate
-    setter onrejectionhandled
-    setter onresize
-    setter onscroll
-    setter onstorage
-    setter onunhandledrejection
-    setter onunload
-    setter text
-    setter vLink
-interface HTMLButtonElement : HTMLElement
-    attribute @@toStringTag
-    getter disabled
-    getter form
-    getter formAction
-    getter formEnctype
-    getter formMethod
-    getter formNoValidate
-    getter formTarget
-    getter labels
-    getter name
-    getter type
-    getter validationMessage
-    getter validity
-    getter value
-    getter willValidate
-    method checkValidity
-    method constructor
-    method reportValidity
-    method setCustomValidity
-    setter disabled
-    setter formAction
-    setter formEnctype
-    setter formMethod
-    setter formNoValidate
-    setter formTarget
-    setter name
-    setter type
-    setter value
-interface HTMLCanvasElement : HTMLElement
-    attribute @@toStringTag
-    getter height
-    getter width
-    method captureStream
-    method constructor
-    method convertToBlob
-    method getContext
-    method toBlob
-    method toDataURL
-    method transferControlToOffscreen
-    setter height
-    setter width
-interface HTMLCollection
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method item
-    method namedItem
-interface HTMLContentElement : HTMLElement
-    attribute @@toStringTag
-    getter select
-    method constructor
-    method getDistributedNodes
-    setter select
-interface HTMLDListElement : HTMLElement
-    attribute @@toStringTag
-    getter compact
-    method constructor
-    setter compact
-interface HTMLDataElement : HTMLElement
-    attribute @@toStringTag
-    getter value
-    method constructor
-    setter value
-interface HTMLDataListElement : HTMLElement
-    attribute @@toStringTag
-    getter options
-    method constructor
-interface HTMLDetailsElement : HTMLElement
-    attribute @@toStringTag
-    getter open
-    method constructor
-    setter open
-interface HTMLDialogElement : HTMLElement
-    attribute @@toStringTag
-    getter open
-    getter returnValue
-    method close
-    method constructor
-    method show
-    method showModal
-    setter open
-    setter returnValue
-interface HTMLDirectoryElement : HTMLElement
-    attribute @@toStringTag
-    getter compact
-    method constructor
-    setter compact
-interface HTMLDivElement : HTMLElement
-    attribute @@toStringTag
-    getter align
-    method constructor
-    setter align
-interface HTMLDocument : Document
-    attribute @@toStringTag
-    method constructor
-interface HTMLElement : Element
-    attribute @@toStringTag
-    getter accessKey
-    getter autocapitalize
-    getter autofocus
-    getter contentEditable
-    getter dataset
-    getter dir
-    getter draggable
-    getter enterKeyHint
-    getter hidden
-    getter inert
-    getter innerText
-    getter inputMode
-    getter isContentEditable
-    getter lang
-    getter nonce
-    getter offsetHeight
-    getter offsetLeft
-    getter offsetParent
-    getter offsetTop
-    getter offsetWidth
-    getter onabort
-    getter onactivateinvisible
-    getter onanimationend
-    getter onanimationiteration
-    getter onanimationstart
-    getter onauxclick
-    getter onblur
-    getter oncancel
-    getter oncanplay
-    getter oncanplaythrough
-    getter onchange
-    getter onclick
-    getter onclose
-    getter oncontextmenu
-    getter oncopy
-    getter oncuechange
-    getter oncut
-    getter ondblclick
-    getter ondrag
-    getter ondragend
-    getter ondragenter
-    getter ondragleave
-    getter ondragover
-    getter ondragstart
-    getter ondrop
-    getter ondurationchange
-    getter onemptied
-    getter onended
-    getter onerror
-    getter onfocus
-    getter onformdata
-    getter ongotpointercapture
-    getter oninput
-    getter oninvalid
-    getter onkeydown
-    getter onkeypress
-    getter onkeyup
-    getter onload
-    getter onloadeddata
-    getter onloadedmetadata
-    getter onloadstart
-    getter onlostpointercapture
-    getter onmousedown
-    getter onmouseenter
-    getter onmouseleave
-    getter onmousemove
-    getter onmouseout
-    getter onmouseover
-    getter onmouseup
-    getter onmousewheel
-    getter onoverscroll
-    getter onpaste
-    getter onpause
-    getter onplay
-    getter onplaying
-    getter onpointercancel
-    getter onpointerdown
-    getter onpointerenter
-    getter onpointerleave
-    getter onpointermove
-    getter onpointerout
-    getter onpointerover
-    getter onpointerrawupdate
-    getter onpointerup
-    getter onprogress
-    getter onratechange
-    getter onrendersubtreeactivation
-    getter onreset
-    getter onresize
-    getter onscroll
-    getter onscrollend
-    getter onseeked
-    getter onseeking
-    getter onselect
-    getter onselectionchange
-    getter onselectstart
-    getter onstalled
-    getter onsubmit
-    getter onsuspend
-    getter ontimeupdate
-    getter ontoggle
-    getter ontouchcancel
-    getter ontouchend
-    getter ontouchmove
-    getter ontouchstart
-    getter ontransitionend
-    getter onvolumechange
-    getter onwaiting
-    getter onwheel
-    getter outerText
-    getter spellcheck
-    getter style
-    getter tabIndex
-    getter title
-    getter translate
-    method attachInternals
-    method blur
-    method click
-    method constructor
-    method focus
-    setter accessKey
-    setter autocapitalize
-    setter autofocus
-    setter contentEditable
-    setter dir
-    setter draggable
-    setter enterKeyHint
-    setter hidden
-    setter inert
-    setter innerText
-    setter inputMode
-    setter lang
-    setter nonce
-    setter onabort
-    setter onactivateinvisible
-    setter onanimationend
-    setter onanimationiteration
-    setter onanimationstart
-    setter onauxclick
-    setter onblur
-    setter oncancel
-    setter oncanplay
-    setter oncanplaythrough
-    setter onchange
-    setter onclick
-    setter onclose
-    setter oncontextmenu
-    setter oncopy
-    setter oncuechange
-    setter oncut
-    setter ondblclick
-    setter ondrag
-    setter ondragend
-    setter ondragenter
-    setter ondragleave
-    setter ondragover
-    setter ondragstart
-    setter ondrop
-    setter ondurationchange
-    setter onemptied
-    setter onended
-    setter onerror
-    setter onfocus
-    setter onformdata
-    setter ongotpointercapture
-    setter oninput
-    setter oninvalid
-    setter onkeydown
-    setter onkeypress
-    setter onkeyup
-    setter onload
-    setter onloadeddata
-    setter onloadedmetadata
-    setter onloadstart
-    setter onlostpointercapture
-    setter onmousedown
-    setter onmouseenter
-    setter onmouseleave
-    setter onmousemove
-    setter onmouseout
-    setter onmouseover
-    setter onmouseup
-    setter onmousewheel
-    setter onoverscroll
-    setter onpaste
-    setter onpause
-    setter onplay
-    setter onplaying
-    setter onpointercancel
-    setter onpointerdown
-    setter onpointerenter
-    setter onpointerleave
-    setter onpointermove
-    setter onpointerout
-    setter onpointerover
-    setter onpointerrawupdate
-    setter onpointerup
-    setter onprogress
-    setter onratechange
-    setter onrendersubtreeactivation
-    setter onreset
-    setter onresize
-    setter onscroll
-    setter onscrollend
-    setter onseeked
-    setter onseeking
-    setter onselect
-    setter onselectionchange
-    setter onselectstart
-    setter onstalled
-    setter onsubmit
-    setter onsuspend
-    setter ontimeupdate
-    setter ontoggle
-    setter ontouchcancel
-    setter ontouchend
-    setter ontouchmove
-    setter ontouchstart
-    setter ontransitionend
-    setter onvolumechange
-    setter onwaiting
-    setter onwheel
-    setter outerText
-    setter spellcheck
-    setter style
-    setter tabIndex
-    setter title
-    setter translate
-interface HTMLEmbedElement : HTMLElement
-    attribute @@toStringTag
-    getter align
-    getter height
-    getter name
-    getter src
-    getter type
-    getter width
-    method constructor
-    method getSVGDocument
-    setter align
-    setter height
-    setter name
-    setter src
-    setter type
-    setter width
-interface HTMLFieldSetElement : HTMLElement
-    attribute @@toStringTag
-    getter disabled
-    getter elements
-    getter form
-    getter name
-    getter type
-    getter validationMessage
-    getter validity
-    getter willValidate
-    method checkValidity
-    method constructor
-    method reportValidity
-    method setCustomValidity
-    setter disabled
-    setter name
-interface HTMLFontElement : HTMLElement
-    attribute @@toStringTag
-    getter color
-    getter face
-    getter size
-    method constructor
-    setter color
-    setter face
-    setter size
-interface HTMLFormControlsCollection : HTMLCollection
-    attribute @@toStringTag
-    method constructor
-    method namedItem
-interface HTMLFormElement : HTMLElement
-    attribute @@toStringTag
-    getter acceptCharset
-    getter action
-    getter autocomplete
-    getter elements
-    getter encoding
-    getter enctype
-    getter length
-    getter method
-    getter name
-    getter noValidate
-    getter target
-    method @@iterator
-    method checkValidity
-    method constructor
-    method reportValidity
-    method requestSubmit
-    method reset
-    method submit
-    setter acceptCharset
-    setter action
-    setter autocomplete
-    setter encoding
-    setter enctype
-    setter method
-    setter name
-    setter noValidate
-    setter target
-interface HTMLFrameElement : HTMLElement
-    attribute @@toStringTag
-    getter contentDocument
-    getter contentWindow
-    getter frameBorder
-    getter longDesc
-    getter marginHeight
-    getter marginWidth
-    getter name
-    getter noResize
-    getter scrolling
-    getter src
-    method constructor
-    setter frameBorder
-    setter longDesc
-    setter marginHeight
-    setter marginWidth
-    setter name
-    setter noResize
-    setter scrolling
-    setter src
-interface HTMLFrameSetElement : HTMLElement
-    attribute @@toStringTag
-    getter cols
-    getter onafterprint
-    getter onbeforeprint
-    getter onbeforeunload
-    getter onblur
-    getter onerror
-    getter onfocus
-    getter onhashchange
-    getter onlanguagechange
-    getter onload
-    getter onmessage
-    getter onmessageerror
-    getter onoffline
-    getter ononline
-    getter onpagehide
-    getter onpageshow
-    getter onpopstate
-    getter onportalactivate
-    getter onrejectionhandled
-    getter onresize
-    getter onscroll
-    getter onstorage
-    getter onunhandledrejection
-    getter onunload
-    getter rows
-    method constructor
-    setter cols
-    setter onafterprint
-    setter onbeforeprint
-    setter onbeforeunload
-    setter onblur
-    setter onerror
-    setter onfocus
-    setter onhashchange
-    setter onlanguagechange
-    setter onload
-    setter onmessage
-    setter onmessageerror
-    setter onoffline
-    setter ononline
-    setter onpagehide
-    setter onpageshow
-    setter onpopstate
-    setter onportalactivate
-    setter onrejectionhandled
-    setter onresize
-    setter onscroll
-    setter onstorage
-    setter onunhandledrejection
-    setter onunload
-    setter rows
-interface HTMLHRElement : HTMLElement
-    attribute @@toStringTag
-    getter align
-    getter color
-    getter noShade
-    getter size
-    getter width
-    method constructor
-    setter align
-    setter color
-    setter noShade
-    setter size
-    setter width
-interface HTMLHeadElement : HTMLElement
-    attribute @@toStringTag
-    method constructor
-interface HTMLHeadingElement : HTMLElement
-    attribute @@toStringTag
-    getter align
-    method constructor
-    setter align
-interface HTMLHtmlElement : HTMLElement
-    attribute @@toStringTag
-    getter version
-    method constructor
-    setter version
-interface HTMLIFrameElement : HTMLElement
-    attribute @@toStringTag
-    getter align
-    getter allow
-    getter allowFullscreen
-    getter allowPaymentRequest
-    getter contentDocument
-    getter contentWindow
-    getter csp
-    getter featurePolicy
-    getter frameBorder
-    getter height
-    getter loading
-    getter longDesc
-    getter marginHeight
-    getter marginWidth
-    getter name
-    getter referrerPolicy
-    getter sandbox
-    getter scrolling
-    getter src
-    getter srcdoc
-    getter width
-    method constructor
-    method getSVGDocument
-    setter align
-    setter allow
-    setter allowFullscreen
-    setter allowPaymentRequest
-    setter csp
-    setter frameBorder
-    setter height
-    setter loading
-    setter longDesc
-    setter marginHeight
-    setter marginWidth
-    setter name
-    setter referrerPolicy
-    setter sandbox
-    setter scrolling
-    setter src
-    setter srcdoc
-    setter width
-interface HTMLImageElement : HTMLElement
-    attribute @@toStringTag
-    getter align
-    getter alt
-    getter border
-    getter complete
-    getter crossOrigin
-    getter currentSrc
-    getter decoding
-    getter height
-    getter hspace
-    getter importance
-    getter isMap
-    getter loading
-    getter longDesc
-    getter lowsrc
-    getter name
-    getter naturalHeight
-    getter naturalWidth
-    getter referrerPolicy
-    getter sizes
-    getter src
-    getter srcset
-    getter useMap
-    getter vspace
-    getter width
-    getter x
-    getter y
-    method constructor
-    method decode
-    setter align
-    setter alt
-    setter border
-    setter crossOrigin
-    setter decoding
-    setter height
-    setter hspace
-    setter importance
-    setter isMap
-    setter loading
-    setter longDesc
-    setter lowsrc
-    setter name
-    setter referrerPolicy
-    setter sizes
-    setter src
-    setter srcset
-    setter useMap
-    setter vspace
-    setter width
-interface HTMLInputElement : HTMLElement
-    attribute @@toStringTag
-    getter accept
-    getter align
-    getter alt
-    getter autocomplete
-    getter checked
-    getter defaultChecked
-    getter defaultValue
-    getter dirName
-    getter disabled
-    getter files
-    getter form
-    getter formAction
-    getter formEnctype
-    getter formMethod
-    getter formNoValidate
-    getter formTarget
-    getter height
-    getter incremental
-    getter indeterminate
-    getter labels
-    getter list
-    getter max
-    getter maxLength
-    getter min
-    getter minLength
-    getter multiple
-    getter name
-    getter pattern
-    getter placeholder
-    getter readOnly
-    getter required
-    getter selectionDirection
-    getter selectionEnd
-    getter selectionStart
-    getter size
-    getter src
-    getter step
-    getter type
-    getter useMap
-    getter validationMessage
-    getter validity
-    getter value
-    getter valueAsDate
-    getter valueAsNumber
-    getter webkitEntries
-    getter webkitdirectory
-    getter width
-    getter willValidate
-    method checkValidity
-    method constructor
-    method reportValidity
-    method select
-    method setCustomValidity
-    method setRangeText
-    method setSelectionRange
-    method stepDown
-    method stepUp
-    setter accept
-    setter align
-    setter alt
-    setter autocomplete
-    setter checked
-    setter defaultChecked
-    setter defaultValue
-    setter dirName
-    setter disabled
-    setter files
-    setter formAction
-    setter formEnctype
-    setter formMethod
-    setter formNoValidate
-    setter formTarget
-    setter height
-    setter incremental
-    setter indeterminate
-    setter max
-    setter maxLength
-    setter min
-    setter minLength
-    setter multiple
-    setter name
-    setter pattern
-    setter placeholder
-    setter readOnly
-    setter required
-    setter selectionDirection
-    setter selectionEnd
-    setter selectionStart
-    setter size
-    setter src
-    setter step
-    setter type
-    setter useMap
-    setter value
-    setter valueAsDate
-    setter valueAsNumber
-    setter webkitdirectory
-    setter width
-interface HTMLLIElement : HTMLElement
-    attribute @@toStringTag
-    getter type
-    getter value
-    method constructor
-    setter type
-    setter value
-interface HTMLLabelElement : HTMLElement
-    attribute @@toStringTag
-    getter control
-    getter form
-    getter htmlFor
-    method constructor
-    setter htmlFor
-interface HTMLLegendElement : HTMLElement
-    attribute @@toStringTag
-    getter align
-    getter form
-    method constructor
-    setter align
-interface HTMLLinkElement : HTMLElement
-    attribute @@toStringTag
-    getter as
-    getter charset
-    getter crossOrigin
-    getter disabled
-    getter href
-    getter hreflang
-    getter imageSizes
-    getter imageSrcset
-    getter import
-    getter importance
-    getter integrity
-    getter media
-    getter referrerPolicy
-    getter rel
-    getter relList
-    getter rev
-    getter sheet
-    getter sizes
-    getter target
-    getter type
-    method constructor
-    setter as
-    setter charset
-    setter crossOrigin
-    setter disabled
-    setter href
-    setter hreflang
-    setter imageSizes
-    setter imageSrcset
-    setter importance
-    setter integrity
-    setter media
-    setter referrerPolicy
-    setter rel
-    setter relList
-    setter rev
-    setter sizes
-    setter target
-    setter type
-interface HTMLMapElement : HTMLElement
-    attribute @@toStringTag
-    getter areas
-    getter name
-    method constructor
-    setter name
-interface HTMLMarqueeElement : HTMLElement
-    attribute @@toStringTag
-    getter behavior
-    getter bgColor
-    getter direction
-    getter height
-    getter hspace
-    getter loop
-    getter scrollAmount
-    getter scrollDelay
-    getter trueSpeed
-    getter vspace
-    getter width
-    method constructor
-    method start
-    method stop
-    setter behavior
-    setter bgColor
-    setter direction
-    setter height
-    setter hspace
-    setter loop
-    setter scrollAmount
-    setter scrollDelay
-    setter trueSpeed
-    setter vspace
-    setter width
-interface HTMLMediaElement : HTMLElement
-    attribute @@toStringTag
-    attribute HAVE_CURRENT_DATA
-    attribute HAVE_ENOUGH_DATA
-    attribute HAVE_FUTURE_DATA
-    attribute HAVE_METADATA
-    attribute HAVE_NOTHING
-    attribute NETWORK_EMPTY
-    attribute NETWORK_IDLE
-    attribute NETWORK_LOADING
-    attribute NETWORK_NO_SOURCE
-    getter audioTracks
-    getter autoplay
-    getter buffered
-    getter controls
-    getter controlsList
-    getter crossOrigin
-    getter currentSrc
-    getter currentTime
-    getter defaultMuted
-    getter defaultPlaybackRate
-    getter disableRemotePlayback
-    getter duration
-    getter ended
-    getter error
-    getter latencyHint
-    getter loop
-    getter mediaKeys
-    getter muted
-    getter networkState
-    getter onencrypted
-    getter onwaitingforkey
-    getter paused
-    getter playbackRate
-    getter played
-    getter preload
-    getter readyState
-    getter remote
-    getter seekable
-    getter seeking
-    getter sinkId
-    getter src
-    getter srcObject
-    getter textTracks
-    getter videoTracks
-    getter volume
-    getter webkitAudioDecodedByteCount
-    getter webkitVideoDecodedByteCount
-    method addTextTrack
-    method canPlayType
-    method captureStream
-    method constructor
-    method load
-    method pause
-    method play
-    method setMediaKeys
-    method setSinkId
-    setter autoplay
-    setter controls
-    setter controlsList
-    setter crossOrigin
-    setter currentTime
-    setter defaultMuted
-    setter defaultPlaybackRate
-    setter disableRemotePlayback
-    setter latencyHint
-    setter loop
-    setter muted
-    setter onencrypted
-    setter onwaitingforkey
-    setter playbackRate
-    setter preload
-    setter src
-    setter srcObject
-    setter volume
-interface HTMLMenuElement : HTMLElement
-    attribute @@toStringTag
-    getter compact
-    method constructor
-    setter compact
-interface HTMLMetaElement : HTMLElement
-    attribute @@toStringTag
-    getter content
-    getter httpEquiv
-    getter name
-    getter scheme
-    method constructor
-    setter content
-    setter httpEquiv
-    setter name
-    setter scheme
-interface HTMLMeterElement : HTMLElement
-    attribute @@toStringTag
-    getter high
-    getter labels
-    getter low
-    getter max
-    getter min
-    getter optimum
-    getter value
-    method constructor
-    setter high
-    setter low
-    setter max
-    setter min
-    setter optimum
-    setter value
-interface HTMLModElement : HTMLElement
-    attribute @@toStringTag
-    getter cite
-    getter dateTime
-    method constructor
-    setter cite
-    setter dateTime
-interface HTMLOListElement : HTMLElement
-    attribute @@toStringTag
-    getter compact
-    getter reversed
-    getter start
-    getter type
-    method constructor
-    setter compact
-    setter reversed
-    setter start
-    setter type
-interface HTMLObjectElement : HTMLElement
-    attribute @@toStringTag
-    getter align
-    getter archive
-    getter border
-    getter code
-    getter codeBase
-    getter codeType
-    getter contentDocument
-    getter contentWindow
-    getter data
-    getter declare
-    getter form
-    getter height
-    getter hspace
-    getter name
-    getter standby
-    getter type
-    getter useMap
-    getter validationMessage
-    getter validity
-    getter vspace
-    getter width
-    getter willValidate
-    method checkValidity
-    method constructor
-    method getSVGDocument
-    method reportValidity
-    method setCustomValidity
-    setter align
-    setter archive
-    setter border
-    setter code
-    setter codeBase
-    setter codeType
-    setter data
-    setter declare
-    setter height
-    setter hspace
-    setter name
-    setter standby
-    setter type
-    setter useMap
-    setter vspace
-    setter width
-interface HTMLOptGroupElement : HTMLElement
-    attribute @@toStringTag
-    getter disabled
-    getter label
-    method constructor
-    setter disabled
-    setter label
-interface HTMLOptionElement : HTMLElement
-    attribute @@toStringTag
-    getter defaultSelected
-    getter disabled
-    getter form
-    getter index
-    getter label
-    getter selected
-    getter text
-    getter value
-    method constructor
-    setter defaultSelected
-    setter disabled
-    setter label
-    setter selected
-    setter text
-    setter value
-interface HTMLOptionsCollection : HTMLCollection
-    attribute @@toStringTag
-    getter length
-    getter selectedIndex
-    method @@iterator
-    method add
-    method constructor
-    method remove
-    setter length
-    setter selectedIndex
-interface HTMLOutputElement : HTMLElement
-    attribute @@toStringTag
-    getter defaultValue
-    getter form
-    getter htmlFor
-    getter labels
-    getter name
-    getter type
-    getter validationMessage
-    getter validity
-    getter value
-    getter willValidate
-    method checkValidity
-    method constructor
-    method reportValidity
-    method setCustomValidity
-    setter defaultValue
-    setter htmlFor
-    setter name
-    setter value
-interface HTMLParagraphElement : HTMLElement
-    attribute @@toStringTag
-    getter align
-    method constructor
-    setter align
-interface HTMLParamElement : HTMLElement
-    attribute @@toStringTag
-    getter name
-    getter type
-    getter value
-    getter valueType
-    method constructor
-    setter name
-    setter type
-    setter value
-    setter valueType
-interface HTMLPictureElement : HTMLElement
-    attribute @@toStringTag
-    method constructor
-interface HTMLPortalElement : HTMLElement
-    attribute @@toStringTag
-    getter onmessage
-    getter onmessageerror
-    getter referrerPolicy
-    getter src
-    method activate
-    method constructor
-    method postMessage
-    setter onmessage
-    setter onmessageerror
-    setter referrerPolicy
-    setter src
-interface HTMLPreElement : HTMLElement
-    attribute @@toStringTag
-    getter width
-    method constructor
-    setter width
-interface HTMLProgressElement : HTMLElement
-    attribute @@toStringTag
-    getter labels
-    getter max
-    getter position
-    getter value
-    method constructor
-    setter max
-    setter value
-interface HTMLQuoteElement : HTMLElement
-    attribute @@toStringTag
-    getter cite
-    method constructor
-    setter cite
-interface HTMLScriptElement : HTMLElement
-    attribute @@toStringTag
-    getter async
-    getter charset
-    getter crossOrigin
-    getter defer
-    getter event
-    getter htmlFor
-    getter importance
-    getter integrity
-    getter noModule
-    getter referrerPolicy
-    getter src
-    getter text
-    getter type
-    method constructor
-    setter async
-    setter charset
-    setter crossOrigin
-    setter defer
-    setter event
-    setter htmlFor
-    setter importance
-    setter integrity
-    setter noModule
-    setter referrerPolicy
-    setter src
-    setter text
-    setter type
-interface HTMLSelectElement : HTMLElement
-    attribute @@toStringTag
-    getter autocomplete
-    getter disabled
-    getter form
-    getter labels
-    getter length
-    getter multiple
-    getter name
-    getter options
-    getter required
-    getter selectedIndex
-    getter selectedOptions
-    getter size
-    getter type
-    getter validationMessage
-    getter validity
-    getter value
-    getter willValidate
-    method @@iterator
-    method add
-    method checkValidity
-    method constructor
-    method item
-    method namedItem
-    method remove
-    method reportValidity
-    method setCustomValidity
-    setter autocomplete
-    setter disabled
-    setter length
-    setter multiple
-    setter name
-    setter required
-    setter selectedIndex
-    setter size
-    setter value
-interface HTMLShadowElement : HTMLElement
-    attribute @@toStringTag
-    method constructor
-    method getDistributedNodes
-interface HTMLSlotElement : HTMLElement
-    attribute @@toStringTag
-    getter name
-    method assign
-    method assignedElements
-    method assignedNodes
-    method constructor
-    setter name
-interface HTMLSourceElement : HTMLElement
-    attribute @@toStringTag
-    getter media
-    getter sizes
-    getter src
-    getter srcset
-    getter type
-    method constructor
-    setter media
-    setter sizes
-    setter src
-    setter srcset
-    setter type
-interface HTMLSpanElement : HTMLElement
-    attribute @@toStringTag
-    method constructor
-interface HTMLStyleElement : HTMLElement
-    attribute @@toStringTag
-    getter disabled
-    getter media
-    getter sheet
-    getter type
-    method constructor
-    setter disabled
-    setter media
-    setter type
-interface HTMLTableCaptionElement : HTMLElement
-    attribute @@toStringTag
-    getter align
-    method constructor
-    setter align
-interface HTMLTableCellElement : HTMLElement
-    attribute @@toStringTag
-    getter abbr
-    getter align
-    getter axis
-    getter bgColor
-    getter cellIndex
-    getter ch
-    getter chOff
-    getter colSpan
-    getter headers
-    getter height
-    getter noWrap
-    getter rowSpan
-    getter scope
-    getter vAlign
-    getter width
-    method constructor
-    setter abbr
-    setter align
-    setter axis
-    setter bgColor
-    setter ch
-    setter chOff
-    setter colSpan
-    setter headers
-    setter height
-    setter noWrap
-    setter rowSpan
-    setter scope
-    setter vAlign
-    setter width
-interface HTMLTableColElement : HTMLElement
-    attribute @@toStringTag
-    getter align
-    getter ch
-    getter chOff
-    getter span
-    getter vAlign
-    getter width
-    method constructor
-    setter align
-    setter ch
-    setter chOff
-    setter span
-    setter vAlign
-    setter width
-interface HTMLTableElement : HTMLElement
-    attribute @@toStringTag
-    getter align
-    getter bgColor
-    getter border
-    getter caption
-    getter cellPadding
-    getter cellSpacing
-    getter frame
-    getter rows
-    getter rules
-    getter summary
-    getter tBodies
-    getter tFoot
-    getter tHead
-    getter width
-    method constructor
-    method createCaption
-    method createTBody
-    method createTFoot
-    method createTHead
-    method deleteCaption
-    method deleteRow
-    method deleteTFoot
-    method deleteTHead
-    method insertRow
-    setter align
-    setter bgColor
-    setter border
-    setter caption
-    setter cellPadding
-    setter cellSpacing
-    setter frame
-    setter rules
-    setter summary
-    setter tFoot
-    setter tHead
-    setter width
-interface HTMLTableRowElement : HTMLElement
-    attribute @@toStringTag
-    getter align
-    getter bgColor
-    getter cells
-    getter ch
-    getter chOff
-    getter rowIndex
-    getter sectionRowIndex
-    getter vAlign
-    method constructor
-    method deleteCell
-    method insertCell
-    setter align
-    setter bgColor
-    setter ch
-    setter chOff
-    setter vAlign
-interface HTMLTableSectionElement : HTMLElement
-    attribute @@toStringTag
-    getter align
-    getter ch
-    getter chOff
-    getter rows
-    getter vAlign
-    method constructor
-    method deleteRow
-    method insertRow
-    setter align
-    setter ch
-    setter chOff
-    setter vAlign
-interface HTMLTemplateElement : HTMLElement
-    attribute @@toStringTag
-    getter content
-    method constructor
-interface HTMLTextAreaElement : HTMLElement
-    attribute @@toStringTag
-    getter autocomplete
-    getter cols
-    getter defaultValue
-    getter dirName
-    getter disabled
-    getter form
-    getter labels
-    getter maxLength
-    getter minLength
-    getter name
-    getter placeholder
-    getter readOnly
-    getter required
-    getter rows
-    getter selectionDirection
-    getter selectionEnd
-    getter selectionStart
-    getter textLength
-    getter type
-    getter validationMessage
-    getter validity
-    getter value
-    getter willValidate
-    getter wrap
-    method checkValidity
-    method constructor
-    method reportValidity
-    method select
-    method setCustomValidity
-    method setRangeText
-    method setSelectionRange
-    setter autocomplete
-    setter cols
-    setter defaultValue
-    setter dirName
-    setter disabled
-    setter maxLength
-    setter minLength
-    setter name
-    setter placeholder
-    setter readOnly
-    setter required
-    setter rows
-    setter selectionDirection
-    setter selectionEnd
-    setter selectionStart
-    setter value
-    setter wrap
-interface HTMLTimeElement : HTMLElement
-    attribute @@toStringTag
-    getter dateTime
-    method constructor
-    setter dateTime
-interface HTMLTitleElement : HTMLElement
-    attribute @@toStringTag
-    getter text
-    method constructor
-    setter text
-interface HTMLTrackElement : HTMLElement
-    attribute @@toStringTag
-    attribute ERROR
-    attribute LOADED
-    attribute LOADING
-    attribute NONE
-    getter default
-    getter kind
-    getter label
-    getter readyState
-    getter src
-    getter srclang
-    getter track
-    method constructor
-    setter default
-    setter kind
-    setter label
-    setter src
-    setter srclang
-interface HTMLUListElement : HTMLElement
-    attribute @@toStringTag
-    getter compact
-    getter type
-    method constructor
-    setter compact
-    setter type
-interface HTMLUnknownElement : HTMLElement
-    attribute @@toStringTag
-    method constructor
-interface HTMLVideoElement : HTMLMediaElement
-    attribute @@toStringTag
-    getter autoPictureInPicture
-    getter disablePictureInPicture
-    getter height
-    getter onenterpictureinpicture
-    getter onleavepictureinpicture
-    getter playsInline
-    getter poster
-    getter videoHeight
-    getter videoWidth
-    getter webkitDecodedFrameCount
-    getter webkitDisplayingFullscreen
-    getter webkitDroppedFrameCount
-    getter webkitSupportsFullscreen
-    getter width
-    method constructor
-    method getVideoPlaybackQuality
-    method requestPictureInPicture
-    method webkitEnterFullScreen
-    method webkitEnterFullscreen
-    method webkitExitFullScreen
-    method webkitExitFullscreen
-    setter autoPictureInPicture
-    setter disablePictureInPicture
-    setter height
-    setter onenterpictureinpicture
-    setter onleavepictureinpicture
-    setter playsInline
-    setter poster
-    setter width
-interface HashChangeEvent : Event
-    attribute @@toStringTag
-    getter newURL
-    getter oldURL
-    method constructor
-interface Headers
-    attribute @@toStringTag
-    method @@iterator
-    method append
-    method constructor
-    method delete
-    method entries
-    method forEach
-    method get
-    method has
-    method keys
-    method set
-    method values
-interface History
-    attribute @@toStringTag
-    getter length
-    getter scrollRestoration
-    getter state
-    method back
-    method constructor
-    method forward
-    method go
-    method pushState
-    method replaceState
-    setter scrollRestoration
-interface IDBCursor
-    attribute @@toStringTag
-    getter direction
-    getter key
-    getter primaryKey
-    getter request
-    getter source
-    method advance
-    method constructor
-    method continue
-    method continuePrimaryKey
-    method delete
-    method update
-interface IDBCursorWithValue : IDBCursor
-    attribute @@toStringTag
-    getter value
-    method constructor
-interface IDBDatabase : EventTarget
-    attribute @@toStringTag
-    getter name
-    getter objectStoreNames
-    getter onabort
-    getter onclose
-    getter onerror
-    getter onversionchange
-    getter version
-    method close
-    method constructor
-    method createObjectStore
-    method deleteObjectStore
-    method transaction
-    setter onabort
-    setter onclose
-    setter onerror
-    setter onversionchange
-interface IDBFactory
-    attribute @@toStringTag
-    method cmp
-    method constructor
-    method databases
-    method deleteDatabase
-    method open
-interface IDBIndex
-    attribute @@toStringTag
-    getter keyPath
-    getter multiEntry
-    getter name
-    getter objectStore
-    getter unique
-    method constructor
-    method count
-    method get
-    method getAll
-    method getAllKeys
-    method getKey
-    method openCursor
-    method openKeyCursor
-    setter name
-interface IDBKeyRange
-    static method bound
-    static method lowerBound
-    static method only
-    static method upperBound
-    attribute @@toStringTag
-    getter lower
-    getter lowerOpen
-    getter upper
-    getter upperOpen
-    method constructor
-    method includes
-interface IDBObjectStore
-    attribute @@toStringTag
-    getter autoIncrement
-    getter indexNames
-    getter keyPath
-    getter name
-    getter transaction
-    method add
-    method clear
-    method constructor
-    method count
-    method createIndex
-    method delete
-    method deleteIndex
-    method get
-    method getAll
-    method getAllKeys
-    method getKey
-    method index
-    method openCursor
-    method openKeyCursor
-    method put
-    setter name
-interface IDBObservation
-    attribute @@toStringTag
-    getter key
-    getter type
-    getter value
-    method constructor
-interface IDBObserver
-    attribute @@toStringTag
-    method constructor
-    method observe
-    method unobserve
-interface IDBObserverChanges
-    attribute @@toStringTag
-    getter database
-    getter records
-    getter transaction
-    method constructor
-interface IDBOpenDBRequest : IDBRequest
-    attribute @@toStringTag
-    getter onblocked
-    getter onupgradeneeded
-    method constructor
-    setter onblocked
-    setter onupgradeneeded
-interface IDBRequest : EventTarget
-    attribute @@toStringTag
-    getter error
-    getter onerror
-    getter onsuccess
-    getter readyState
-    getter result
-    getter source
-    getter transaction
-    method constructor
-    setter onerror
-    setter onsuccess
-interface IDBTransaction : EventTarget
-    attribute @@toStringTag
-    getter db
-    getter durability
-    getter error
-    getter mode
-    getter objectStoreNames
-    getter onabort
-    getter oncomplete
-    getter onerror
-    method abort
-    method commit
-    method constructor
-    method objectStore
-    setter onabort
-    setter oncomplete
-    setter onerror
-interface IDBVersionChangeEvent : Event
-    attribute @@toStringTag
-    getter dataLoss
-    getter dataLossMessage
-    getter newVersion
-    getter oldVersion
-    method constructor
-interface IIRFilterNode : AudioNode
-    attribute @@toStringTag
-    method constructor
-    method getFrequencyResponse
-interface IdleDeadline
-    attribute @@toStringTag
-    getter didTimeout
-    method constructor
-    method timeRemaining
-interface IdleDetector : EventTarget
-    attribute @@toStringTag
-    getter onchange
-    getter state
-    method constructor
-    method start
-    method stop
-    setter onchange
-interface IdleState
-    attribute @@toStringTag
-    getter screen
-    getter user
-    method constructor
-interface Image
-    attribute @@toStringTag
-    getter align
-    getter alt
-    getter border
-    getter complete
-    getter crossOrigin
-    getter currentSrc
-    getter decoding
-    getter height
-    getter hspace
-    getter importance
-    getter isMap
-    getter loading
-    getter longDesc
-    getter lowsrc
-    getter name
-    getter naturalHeight
-    getter naturalWidth
-    getter referrerPolicy
-    getter sizes
-    getter src
-    getter srcset
-    getter useMap
-    getter vspace
-    getter width
-    getter x
-    getter y
-    method constructor
-    method decode
-    setter align
-    setter alt
-    setter border
-    setter crossOrigin
-    setter decoding
-    setter height
-    setter hspace
-    setter importance
-    setter isMap
-    setter loading
-    setter longDesc
-    setter lowsrc
-    setter name
-    setter referrerPolicy
-    setter sizes
-    setter src
-    setter srcset
-    setter useMap
-    setter vspace
-    setter width
-interface ImageBitmap
-    attribute @@toStringTag
-    getter height
-    getter width
-    method close
-    method constructor
-interface ImageBitmapRenderingContext
-    attribute @@toStringTag
-    getter canvas
-    method constructor
-    method transferFromImageBitmap
-interface ImageCapture
-    attribute @@toStringTag
-    getter track
-    method constructor
-    method getPhotoCapabilities
-    method getPhotoSettings
-    method grabFrame
-    method takePhoto
-interface ImageData
-    attribute @@toStringTag
-    getter data
-    getter dataUnion
-    getter height
-    getter width
-    method constructor
-    method getColorSettings
-interface InputDeviceCapabilities
-    attribute @@toStringTag
-    getter firesTouchEvents
-    method constructor
-interface InputDeviceInfo : MediaDeviceInfo
-    attribute @@toStringTag
-    method constructor
-    method getCapabilities
-interface InputEvent : UIEvent
-    attribute @@toStringTag
-    getter data
-    getter dataTransfer
-    getter inputType
-    getter isComposing
-    method constructor
-    method getTargetRanges
-interface IntersectionObserver
-    attribute @@toStringTag
-    getter delay
-    getter root
-    getter rootMargin
-    getter thresholds
-    getter trackVisibility
-    method constructor
-    method disconnect
-    method observe
-    method takeRecords
-    method unobserve
-interface IntersectionObserverEntry
-    attribute @@toStringTag
-    getter boundingClientRect
-    getter intersectionRatio
-    getter intersectionRect
-    getter isIntersecting
-    getter isVisible
-    getter rootBounds
-    getter target
-    getter time
-    method constructor
-interface Keyboard
-    attribute @@toStringTag
-    method constructor
-    method getLayoutMap
-    method lock
-    method unlock
-interface KeyboardEvent : UIEvent
-    attribute @@toStringTag
-    attribute DOM_KEY_LOCATION_LEFT
-    attribute DOM_KEY_LOCATION_NUMPAD
-    attribute DOM_KEY_LOCATION_RIGHT
-    attribute DOM_KEY_LOCATION_STANDARD
-    getter altKey
-    getter charCode
-    getter code
-    getter ctrlKey
-    getter isComposing
-    getter key
-    getter keyCode
-    getter location
-    getter metaKey
-    getter repeat
-    getter shiftKey
-    method constructor
-    method getModifierState
-    method initKeyboardEvent
-interface KeyboardLayoutMap
-    attribute @@toStringTag
-    getter size
-    method @@iterator
-    method constructor
-    method entries
-    method forEach
-    method get
-    method has
-    method keys
-    method values
-interface KeyframeEffect : AnimationEffect
-    attribute @@toStringTag
-    getter composite
-    getter target
-    method constructor
-    method getKeyframes
-    method setKeyframes
-    setter composite
-    setter target
-interface LargestContentfulPaint : PerformanceEntry
-    attribute @@toStringTag
-    getter element
-    getter id
-    getter loadTime
-    getter renderTime
-    getter size
-    getter url
-    method constructor
-    method toJSON
-interface LayoutShift : PerformanceEntry
-    attribute @@toStringTag
-    getter hadRecentInput
-    getter lastInputTime
-    getter value
-    method constructor
-    method toJSON
-interface LinearAccelerationSensor : Accelerometer
-    attribute @@toStringTag
-    method constructor
-interface Location
-    attribute @@toStringTag
-    method constructor
-interface Lock
-    attribute @@toStringTag
-    getter mode
-    getter name
-    method constructor
-interface LockManager
-    attribute @@toStringTag
-    method constructor
-    method query
-    method request
-interface MIDIAccess : EventTarget
-    attribute @@toStringTag
-    getter inputs
-    getter onstatechange
-    getter outputs
-    getter sysexEnabled
-    method constructor
-    setter onstatechange
-interface MIDIConnectionEvent : Event
-    attribute @@toStringTag
-    getter port
-    method constructor
-interface MIDIInput : MIDIPort
-    attribute @@toStringTag
-    getter onmidimessage
-    method constructor
-    setter onmidimessage
-interface MIDIInputMap
-    attribute @@toStringTag
-    getter size
-    method @@iterator
-    method constructor
-    method entries
-    method forEach
-    method get
-    method has
-    method keys
-    method values
-interface MIDIMessageEvent : Event
-    attribute @@toStringTag
-    getter data
-    method constructor
-interface MIDIOutput : MIDIPort
-    attribute @@toStringTag
-    method constructor
-    method send
-interface MIDIOutputMap
-    attribute @@toStringTag
-    getter size
-    method @@iterator
-    method constructor
-    method entries
-    method forEach
-    method get
-    method has
-    method keys
-    method values
-interface MIDIPort : EventTarget
-    attribute @@toStringTag
-    getter connection
-    getter id
-    getter manufacturer
-    getter name
-    getter onstatechange
-    getter state
-    getter type
-    getter version
-    method close
-    method constructor
-    method open
-    setter onstatechange
-interface Magnetometer : Sensor
-    attribute @@toStringTag
-    getter x
-    getter y
-    getter z
-    method constructor
-interface MediaCapabilities
-    attribute @@toStringTag
-    method constructor
-    method decodingInfo
-    method encodingInfo
-interface MediaDeviceInfo
-    attribute @@toStringTag
-    getter deviceId
-    getter groupId
-    getter kind
-    getter label
-    method constructor
-    method toJSON
-interface MediaDevices : EventTarget
-    attribute @@toStringTag
-    getter ondevicechange
-    method constructor
-    method enumerateDevices
-    method getDisplayMedia
-    method getSupportedConstraints
-    method getUserMedia
-    setter ondevicechange
-interface MediaElementAudioSourceNode : AudioNode
-    attribute @@toStringTag
-    getter mediaElement
-    method constructor
-interface MediaEncryptedEvent : Event
-    attribute @@toStringTag
-    getter initData
-    getter initDataType
-    method constructor
-interface MediaError
-    attribute @@toStringTag
-    attribute MEDIA_ERR_ABORTED
-    attribute MEDIA_ERR_DECODE
-    attribute MEDIA_ERR_NETWORK
-    attribute MEDIA_ERR_SRC_NOT_SUPPORTED
-    getter code
-    getter message
-    method constructor
-interface MediaKeyMessageEvent : Event
-    attribute @@toStringTag
-    getter message
-    getter messageType
-    method constructor
-interface MediaKeySession : EventTarget
-    attribute @@toStringTag
-    getter closed
-    getter expiration
-    getter keyStatuses
-    getter onkeystatuseschange
-    getter onmessage
-    getter sessionId
-    method close
-    method constructor
-    method generateRequest
-    method load
-    method remove
-    method update
-    setter onkeystatuseschange
-    setter onmessage
-interface MediaKeyStatusMap
-    attribute @@toStringTag
-    getter size
-    method @@iterator
-    method constructor
-    method entries
-    method forEach
-    method get
-    method has
-    method keys
-    method values
-interface MediaKeySystemAccess
-    attribute @@toStringTag
-    getter keySystem
-    method constructor
-    method createMediaKeys
-    method getConfiguration
-interface MediaKeys
-    attribute @@toStringTag
-    method constructor
-    method createSession
-    method getStatusForPolicy
-    method setServerCertificate
-interface MediaList
-    attribute @@toStringTag
-    getter length
-    getter mediaText
-    method @@iterator
-    method appendMedium
-    method constructor
-    method deleteMedium
-    method item
-    method toString
-    setter mediaText
-interface MediaMetadata
-    attribute @@toStringTag
-    getter album
-    getter artist
-    getter artwork
-    getter title
-    method constructor
-    setter album
-    setter artist
-    setter artwork
-    setter title
-interface MediaQueryList : EventTarget
-    attribute @@toStringTag
-    getter matches
-    getter media
-    getter onchange
-    method addListener
-    method constructor
-    method removeListener
-    setter onchange
-interface MediaQueryListEvent : Event
-    attribute @@toStringTag
-    getter matches
-    getter media
-    method constructor
-interface MediaRecorder : EventTarget
-    static method isTypeSupported
-    attribute @@toStringTag
-    getter audioBitsPerSecond
-    getter mimeType
-    getter ondataavailable
-    getter onerror
-    getter onpause
-    getter onresume
-    getter onstart
-    getter onstop
-    getter state
-    getter stream
-    getter videoBitsPerSecond
-    method constructor
-    method pause
-    method requestData
-    method resume
-    method start
-    method stop
-    setter ondataavailable
-    setter onerror
-    setter onpause
-    setter onresume
-    setter onstart
-    setter onstop
-interface MediaSession
-    attribute @@toStringTag
-    getter metadata
-    getter playbackState
-    method constructor
-    method setActionHandler
-    method setPositionState
-    setter metadata
-    setter playbackState
-interface MediaSettingsRange
-    attribute @@toStringTag
-    getter max
-    getter min
-    getter step
-    method constructor
-interface MediaSource : EventTarget
-    static method isTypeSupported
-    attribute @@toStringTag
-    getter activeSourceBuffers
-    getter duration
-    getter onsourceclose
-    getter onsourceended
-    getter onsourceopen
-    getter readyState
-    getter sourceBuffers
-    method addSourceBuffer
-    method clearLiveSeekableRange
-    method constructor
-    method endOfStream
-    method removeSourceBuffer
-    method setLiveSeekableRange
-    setter duration
-    setter onsourceclose
-    setter onsourceended
-    setter onsourceopen
-interface MediaStream : EventTarget
-    attribute @@toStringTag
-    getter active
-    getter id
-    getter onactive
-    getter onaddtrack
-    getter oninactive
-    getter onremovetrack
-    method addTrack
-    method clone
-    method constructor
-    method getAudioTracks
-    method getTrackById
-    method getTracks
-    method getVideoTracks
-    method removeTrack
-    setter onactive
-    setter onaddtrack
-    setter oninactive
-    setter onremovetrack
-interface MediaStreamAudioDestinationNode : AudioNode
-    attribute @@toStringTag
-    getter stream
-    method constructor
-interface MediaStreamAudioSourceNode : AudioNode
-    attribute @@toStringTag
-    getter mediaStream
-    method constructor
-interface MediaStreamEvent : Event
-    attribute @@toStringTag
-    getter stream
-    method constructor
-interface MediaStreamTrack : EventTarget
-    attribute @@toStringTag
-    getter contentHint
-    getter enabled
-    getter id
-    getter kind
-    getter label
-    getter muted
-    getter onended
-    getter onmute
-    getter onunmute
-    getter readyState
-    method applyConstraints
-    method clone
-    method constructor
-    method getCapabilities
-    method getConstraints
-    method getSettings
-    method stop
-    setter contentHint
-    setter enabled
-    setter onended
-    setter onmute
-    setter onunmute
-interface MediaStreamTrackEvent : Event
-    attribute @@toStringTag
-    getter track
-    method constructor
-interface MerchantValidationEvent : Event
-    attribute @@toStringTag
-    getter methodName
-    getter validationURL
-    method complete
-    method constructor
-interface MessageChannel
-    attribute @@toStringTag
-    getter port1
-    getter port2
-    method constructor
-interface MessageEvent : Event
-    attribute @@toStringTag
-    getter data
-    getter lastEventId
-    getter origin
-    getter ports
-    getter source
-    getter userActivation
-    method constructor
-    method initMessageEvent
-interface MessagePort : EventTarget
-    attribute @@toStringTag
-    getter onmessage
-    getter onmessageerror
-    method close
-    method constructor
-    method postMessage
-    method start
-    setter onmessage
-    setter onmessageerror
-interface MimeType
-    attribute @@toStringTag
-    getter description
-    getter enabledPlugin
-    getter suffixes
-    getter type
-    method constructor
-interface MimeTypeArray
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method item
-    method namedItem
-interface Mojo
-    static method bindInterface
-    static method createDataPipe
-    static method createMessagePipe
-    static method createSharedBuffer
-    attribute @@toStringTag
-    attribute RESULT_ABORTED
-    attribute RESULT_ALREADY_EXISTS
-    attribute RESULT_BUSY
-    attribute RESULT_CANCELLED
-    attribute RESULT_DATA_LOSS
-    attribute RESULT_DEADLINE_EXCEEDED
-    attribute RESULT_FAILED_PRECONDITION
-    attribute RESULT_INTERNAL
-    attribute RESULT_INVALID_ARGUMENT
-    attribute RESULT_NOT_FOUND
-    attribute RESULT_OK
-    attribute RESULT_OUT_OF_RANGE
-    attribute RESULT_PERMISSION_DENIED
-    attribute RESULT_RESOURCE_EXHAUSTED
-    attribute RESULT_SHOULD_WAIT
-    attribute RESULT_UNAVAILABLE
-    attribute RESULT_UNIMPLEMENTED
-    attribute RESULT_UNKNOWN
-    method constructor
-interface MojoHandle
-    attribute @@toStringTag
-    method close
-    method constructor
-    method discardData
-    method duplicateBufferHandle
-    method mapBuffer
-    method queryData
-    method readData
-    method readMessage
-    method watch
-    method writeData
-    method writeMessage
-interface MojoInterfaceInterceptor : EventTarget
-    attribute @@toStringTag
-    getter oninterfacerequest
-    method constructor
-    method start
-    method stop
-    setter oninterfacerequest
-interface MojoInterfaceRequestEvent : Event
-    attribute @@toStringTag
-    getter handle
-    method constructor
-interface MojoWatcher
-    attribute @@toStringTag
-    method cancel
-    method constructor
-interface MouseEvent : UIEvent
-    attribute @@toStringTag
-    getter altKey
-    getter button
-    getter buttons
-    getter clientX
-    getter clientY
-    getter ctrlKey
-    getter fromElement
-    getter layerX
-    getter layerY
-    getter metaKey
-    getter movementX
-    getter movementY
-    getter offsetX
-    getter offsetY
-    getter pageX
-    getter pageY
-    getter region
-    getter relatedTarget
-    getter screenX
-    getter screenY
-    getter shiftKey
-    getter toElement
-    getter x
-    getter y
-    method constructor
-    method getModifierState
-    method initMouseEvent
-interface MutationEvent : Event
-    attribute @@toStringTag
-    attribute ADDITION
-    attribute MODIFICATION
-    attribute REMOVAL
-    getter attrChange
-    getter attrName
-    getter newValue
-    getter prevValue
-    getter relatedNode
-    method constructor
-    method initMutationEvent
-interface MutationObserver
-    attribute @@toStringTag
-    method constructor
-    method disconnect
-    method observe
-    method takeRecords
-interface MutationRecord
-    attribute @@toStringTag
-    getter addedNodes
-    getter attributeName
-    getter attributeNamespace
-    getter nextSibling
-    getter oldValue
-    getter previousSibling
-    getter removedNodes
-    getter target
-    getter type
-    method constructor
-interface NDEFMessage
-    attribute @@toStringTag
-    getter records
-    getter url
-    method constructor
-interface NDEFReader : EventTarget
-    attribute @@toStringTag
-    getter onerror
-    getter onreading
-    method constructor
-    method scan
-    setter onerror
-    setter onreading
-interface NDEFReadingEvent : Event
-    attribute @@toStringTag
-    getter message
-    getter serialNumber
-    method constructor
-interface NDEFRecord
-    attribute @@toStringTag
-    getter data
-    getter encoding
-    getter id
-    getter lang
-    getter mediaType
-    getter recordType
-    method constructor
-    method toRecords
-interface NDEFWriter
-    attribute @@toStringTag
-    method constructor
-    method push
-interface NamedNodeMap
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method getNamedItem
-    method getNamedItemNS
-    method item
-    method removeNamedItem
-    method removeNamedItemNS
-    method setNamedItem
-    method setNamedItemNS
-interface NavigationPreloadManager
-    attribute @@toStringTag
-    method constructor
-    method disable
-    method enable
-    method getState
-    method setHeaderValue
-interface Navigator
-    attribute @@toStringTag
-    getter appCodeName
-    getter appName
-    getter appVersion
-    getter clipboard
-    getter connection
-    getter contacts
-    getter cookieEnabled
-    getter credentials
-    getter deviceMemory
-    getter doNotTrack
-    getter geolocation
-    getter hardwareConcurrency
-    getter hid
-    getter keyboard
-    getter language
-    getter languages
-    getter locks
-    getter maxTouchPoints
-    getter mediaCapabilities
-    getter mediaDevices
-    getter mediaSession
-    getter mimeTypes
-    getter onLine
-    getter permissions
-    getter platform
-    getter plugins
-    getter presentation
-    getter product
-    getter productSub
-    getter scheduling
-    getter screen
-    getter serial
-    getter serviceWorker
-    getter sms
-    getter storage
-    getter usb
-    getter userActivation
-    getter userAgent
-    getter vendor
-    getter vendorSub
-    getter wakeLock
-    getter webkitPersistentStorage
-    getter webkitTemporaryStorage
-    getter xr
-    method canShare
-    method clearExperimentalAppBadge
-    method constructor
-    method getBattery
-    method getGamepads
-    method getInstalledRelatedApps
-    method getUserAgent
-    method getUserMedia
-    method javaEnabled
-    method registerProtocolHandler
-    method requestMIDIAccess
-    method requestMediaKeySystemAccess
-    method sendBeacon
-    method setExperimentalAppBadge
-    method share
-    method unregisterProtocolHandler
-    method vibrate
-    method webkitGetUserMedia
-interface NetworkInformation : EventTarget
-    attribute @@toStringTag
-    getter downlink
-    getter downlinkMax
-    getter effectiveType
-    getter onchange
-    getter ontypechange
-    getter rtt
-    getter saveData
-    getter type
-    method constructor
-    setter onchange
-    setter ontypechange
-interface Node : EventTarget
-    attribute @@toStringTag
-    attribute ATTRIBUTE_NODE
-    attribute CDATA_SECTION_NODE
-    attribute COMMENT_NODE
-    attribute DOCUMENT_FRAGMENT_NODE
-    attribute DOCUMENT_NODE
-    attribute DOCUMENT_POSITION_CONTAINED_BY
-    attribute DOCUMENT_POSITION_CONTAINS
-    attribute DOCUMENT_POSITION_DISCONNECTED
-    attribute DOCUMENT_POSITION_FOLLOWING
-    attribute DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
-    attribute DOCUMENT_POSITION_PRECEDING
-    attribute DOCUMENT_TYPE_NODE
-    attribute ELEMENT_NODE
-    attribute ENTITY_NODE
-    attribute ENTITY_REFERENCE_NODE
-    attribute NOTATION_NODE
-    attribute PROCESSING_INSTRUCTION_NODE
-    attribute TEXT_NODE
-    getter baseURI
-    getter childNodes
-    getter firstChild
-    getter isConnected
-    getter lastChild
-    getter nextSibling
-    getter nodeName
-    getter nodeType
-    getter nodeValue
-    getter ownerDocument
-    getter parentElement
-    getter parentNode
-    getter previousSibling
-    getter textContent
-    method appendChild
-    method cloneNode
-    method compareDocumentPosition
-    method constructor
-    method contains
-    method getRootNode
-    method hasChildNodes
-    method insertBefore
-    method isDefaultNamespace
-    method isEqualNode
-    method isSameNode
-    method lookupNamespaceURI
-    method lookupPrefix
-    method normalize
-    method removeChild
-    method replaceChild
-    setter nodeValue
-    setter textContent
-interface NodeIterator
-    attribute @@toStringTag
-    getter filter
-    getter pointerBeforeReferenceNode
-    getter referenceNode
-    getter root
-    getter whatToShow
-    method constructor
-    method detach
-    method nextNode
-    method previousNode
-interface NodeList
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method entries
-    method forEach
-    method item
-    method keys
-    method values
-interface Notification : EventTarget
-    static getter maxActions
-    static getter permission
-    static method requestPermission
-    attribute @@toStringTag
-    getter actions
-    getter badge
-    getter body
-    getter data
-    getter dir
-    getter icon
-    getter lang
-    getter onclick
-    getter onclose
-    getter onerror
-    getter onshow
-    getter renotify
-    getter requireInteraction
-    getter showTrigger
-    getter silent
-    getter tag
-    getter timestamp
-    getter title
-    getter vibrate
-    method close
-    method constructor
-    setter onclick
-    setter onclose
-    setter onerror
-    setter onshow
-interface OfflineAudioCompletionEvent : Event
-    attribute @@toStringTag
-    getter renderedBuffer
-    method constructor
-interface OfflineAudioContext : BaseAudioContext
-    attribute @@toStringTag
-    getter length
-    getter oncomplete
-    method constructor
-    method resume
-    method startRendering
-    method suspend
-    setter oncomplete
-interface OffscreenCanvas : EventTarget
-    attribute @@toStringTag
-    getter height
-    getter width
-    method constructor
-    method convertToBlob
-    method getContext
-    method transferToImageBitmap
-    setter height
-    setter width
-interface OffscreenCanvasRenderingContext2D
-    attribute @@toStringTag
-    getter canvas
-    getter direction
-    getter fillStyle
-    getter filter
-    getter font
-    getter globalAlpha
-    getter globalCompositeOperation
-    getter imageSmoothingEnabled
-    getter imageSmoothingQuality
-    getter lineCap
-    getter lineDashOffset
-    getter lineJoin
-    getter lineWidth
-    getter miterLimit
-    getter shadowBlur
-    getter shadowColor
-    getter shadowOffsetX
-    getter shadowOffsetY
-    getter strokeStyle
-    getter textAlign
-    getter textBaseline
-    method arc
-    method arcTo
-    method beginPath
-    method bezierCurveTo
-    method clearRect
-    method clip
-    method closePath
-    method commit
-    method constructor
-    method createImageData
-    method createLinearGradient
-    method createPattern
-    method createRadialGradient
-    method drawImage
-    method ellipse
-    method fill
-    method fillRect
-    method fillText
-    method getImageData
-    method getLineDash
-    method getTransform
-    method isPointInPath
-    method isPointInStroke
-    method lineTo
-    method measureText
-    method moveTo
-    method putImageData
-    method quadraticCurveTo
-    method rect
-    method resetTransform
-    method restore
-    method rotate
-    method save
-    method scale
-    method setLineDash
-    method setTransform
-    method stroke
-    method strokeRect
-    method strokeText
-    method transform
-    method translate
-    setter direction
-    setter fillStyle
-    setter filter
-    setter font
-    setter globalAlpha
-    setter globalCompositeOperation
-    setter imageSmoothingEnabled
-    setter imageSmoothingQuality
-    setter lineCap
-    setter lineDashOffset
-    setter lineJoin
-    setter lineWidth
-    setter miterLimit
-    setter shadowBlur
-    setter shadowColor
-    setter shadowOffsetX
-    setter shadowOffsetY
-    setter strokeStyle
-    setter textAlign
-    setter textBaseline
-interface Option
-    attribute @@toStringTag
-    getter defaultSelected
-    getter disabled
-    getter form
-    getter index
-    getter label
-    getter selected
-    getter text
-    getter value
-    method constructor
-    setter defaultSelected
-    setter disabled
-    setter label
-    setter selected
-    setter text
-    setter value
-interface OrientationSensor : Sensor
-    attribute @@toStringTag
-    getter quaternion
-    method constructor
-    method populateMatrix
-interface OscillatorNode : AudioScheduledSourceNode
-    attribute @@toStringTag
-    getter detune
-    getter frequency
-    getter type
-    method constructor
-    method setPeriodicWave
-    setter type
-interface OverconstrainedError
-    attribute @@toStringTag
-    getter constraint
-    getter message
-    getter name
-    method constructor
-interface OverscrollEvent : Event
-    attribute @@toStringTag
-    getter deltaX
-    getter deltaY
-    method constructor
-interface PageTransitionEvent : Event
-    attribute @@toStringTag
-    getter persisted
-    method constructor
-interface PannerNode : AudioNode
-    attribute @@toStringTag
-    getter coneInnerAngle
-    getter coneOuterAngle
-    getter coneOuterGain
-    getter distanceModel
-    getter maxDistance
-    getter orientationX
-    getter orientationY
-    getter orientationZ
-    getter panningModel
-    getter positionX
-    getter positionY
-    getter positionZ
-    getter refDistance
-    getter rolloffFactor
-    method constructor
-    method setOrientation
-    method setPosition
-    setter coneInnerAngle
-    setter coneOuterAngle
-    setter coneOuterGain
-    setter distanceModel
-    setter maxDistance
-    setter panningModel
-    setter refDistance
-    setter rolloffFactor
-interface PasswordCredential : Credential
-    attribute @@toStringTag
-    getter iconURL
-    getter name
-    getter password
-    method constructor
-interface Path2D
-    attribute @@toStringTag
-    method addPath
-    method arc
-    method arcTo
-    method bezierCurveTo
-    method closePath
-    method constructor
-    method ellipse
-    method lineTo
-    method moveTo
-    method quadraticCurveTo
-    method rect
-interface PaymentAddress
-    attribute @@toStringTag
-    getter addressLine
-    getter city
-    getter country
-    getter dependentLocality
-    getter organization
-    getter phone
-    getter postalCode
-    getter recipient
-    getter region
-    getter sortingCode
-    method constructor
-    method toJSON
-interface PaymentInstruments
-    attribute @@toStringTag
-    method clear
-    method constructor
-    method delete
-    method get
-    method has
-    method keys
-    method set
-interface PaymentManager
-    attribute @@toStringTag
-    getter instruments
-    getter userHint
-    method constructor
-    method enableDelegations
-    setter userHint
-interface PaymentMethodChangeEvent : PaymentRequestUpdateEvent
-    attribute @@toStringTag
-    getter methodDetails
-    getter methodName
-    method constructor
-interface PaymentRequest : EventTarget
-    attribute @@toStringTag
-    getter id
-    getter onpaymentmethodchange
-    getter onshippingaddresschange
-    getter onshippingoptionchange
-    getter shippingAddress
-    getter shippingOption
-    getter shippingType
-    method abort
-    method canMakePayment
-    method constructor
-    method hasEnrolledInstrument
-    method show
-    setter onpaymentmethodchange
-    setter onshippingaddresschange
-    setter onshippingoptionchange
-interface PaymentRequestUpdateEvent : Event
-    attribute @@toStringTag
-    method constructor
-    method updateWith
-interface PaymentResponse : EventTarget
-    attribute @@toStringTag
-    getter details
-    getter methodName
-    getter onpayerdetailchange
-    getter payerEmail
-    getter payerName
-    getter payerPhone
-    getter requestId
-    getter shippingAddress
-    getter shippingOption
-    method complete
-    method constructor
-    method retry
-    method toJSON
-    setter onpayerdetailchange
-interface Performance : EventTarget
-    attribute @@toStringTag
-    getter memory
-    getter navigation
-    getter onresourcetimingbufferfull
-    getter timeOrigin
-    getter timing
-    method clearMarks
-    method clearMeasures
-    method clearResourceTimings
-    method constructor
-    method getEntries
-    method getEntriesByName
-    method getEntriesByType
-    method mark
-    method measure
-    method measureMemory
-    method now
-    method profile
-    method setResourceTimingBufferSize
-    method toJSON
-    setter onresourcetimingbufferfull
-interface PerformanceElementTiming : PerformanceEntry
-    attribute @@toStringTag
-    getter element
-    getter id
-    getter identifier
-    getter intersectionRect
-    getter loadTime
-    getter naturalHeight
-    getter naturalWidth
-    getter renderTime
-    getter url
-    method constructor
-    method toJSON
-interface PerformanceEntry
-    attribute @@toStringTag
-    getter duration
-    getter entryType
-    getter name
-    getter startTime
-    method constructor
-    method toJSON
-interface PerformanceEventTiming : PerformanceEntry
-    attribute @@toStringTag
-    getter cancelable
-    getter processingEnd
-    getter processingStart
-    method constructor
-    method toJSON
-interface PerformanceLongTaskTiming : PerformanceEntry
-    attribute @@toStringTag
-    getter attribution
-    method constructor
-    method toJSON
-interface PerformanceMark : PerformanceEntry
-    attribute @@toStringTag
-    getter detail
-    method constructor
-interface PerformanceMeasure : PerformanceEntry
-    attribute @@toStringTag
-    getter detail
-    method constructor
-interface PerformanceNavigation
-    attribute @@toStringTag
-    attribute TYPE_BACK_FORWARD
-    attribute TYPE_NAVIGATE
-    attribute TYPE_RELOAD
-    attribute TYPE_RESERVED
-    getter redirectCount
-    getter type
-    method constructor
-    method toJSON
-interface PerformanceNavigationTiming : PerformanceResourceTiming
-    attribute @@toStringTag
-    getter domComplete
-    getter domContentLoadedEventEnd
-    getter domContentLoadedEventStart
-    getter domInteractive
-    getter loadEventEnd
-    getter loadEventStart
-    getter redirectCount
-    getter type
-    getter unloadEventEnd
-    getter unloadEventStart
-    method constructor
-    method toJSON
-interface PerformanceObserver
-    static getter supportedEntryTypes
-    attribute @@toStringTag
-    method constructor
-    method disconnect
-    method observe
-    method takeRecords
-interface PerformanceObserverEntryList
-    attribute @@toStringTag
-    method constructor
-    method getEntries
-    method getEntriesByName
-    method getEntriesByType
-interface PerformancePaintTiming : PerformanceEntry
-    attribute @@toStringTag
-    method constructor
-interface PerformanceResourceTiming : PerformanceEntry
-    attribute @@toStringTag
-    getter connectEnd
-    getter connectStart
-    getter decodedBodySize
-    getter domainLookupEnd
-    getter domainLookupStart
-    getter encodedBodySize
-    getter fetchStart
-    getter initiatorType
-    getter nextHopProtocol
-    getter redirectEnd
-    getter redirectStart
-    getter requestStart
-    getter responseEnd
-    getter responseStart
-    getter secureConnectionStart
-    getter serverTiming
-    getter transferSize
-    getter workerStart
-    getter workerTiming
-    method constructor
-    method toJSON
-interface PerformanceServerTiming
-    attribute @@toStringTag
-    getter description
-    getter duration
-    getter name
-    method constructor
-    method toJSON
-interface PerformanceTiming
-    attribute @@toStringTag
-    getter connectEnd
-    getter connectStart
-    getter domComplete
-    getter domContentLoadedEventEnd
-    getter domContentLoadedEventStart
-    getter domInteractive
-    getter domLoading
-    getter domainLookupEnd
-    getter domainLookupStart
-    getter fetchStart
-    getter loadEventEnd
-    getter loadEventStart
-    getter navigationStart
-    getter redirectEnd
-    getter redirectStart
-    getter requestStart
-    getter responseEnd
-    getter responseStart
-    getter secureConnectionStart
-    getter unloadEventEnd
-    getter unloadEventStart
-    method constructor
-    method toJSON
-interface PeriodicSyncManager
-    attribute @@toStringTag
-    method constructor
-    method getTags
-    method register
-    method unregister
-interface PeriodicWave
-    attribute @@toStringTag
-    method constructor
-interface PermissionStatus : EventTarget
-    attribute @@toStringTag
-    getter onchange
-    getter state
-    method constructor
-    setter onchange
-interface Permissions
-    attribute @@toStringTag
-    method constructor
-    method query
-    method request
-    method requestAll
-    method revoke
-interface PhotoCapabilities
-    attribute @@toStringTag
-    getter fillLightMode
-    getter imageHeight
-    getter imageWidth
-    getter redEyeReduction
-    method constructor
-interface PictureInPictureWindow : EventTarget
-    attribute @@toStringTag
-    getter height
-    getter onresize
-    getter width
-    method constructor
-    setter onresize
-interface Plugin
-    attribute @@toStringTag
-    getter description
-    getter filename
-    getter length
-    getter name
-    method @@iterator
-    method constructor
-    method item
-    method namedItem
-interface PluginArray
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method item
-    method namedItem
-    method refresh
-interface PointerEvent : MouseEvent
-    attribute @@toStringTag
-    getter height
-    getter isPrimary
-    getter pointerId
-    getter pointerType
-    getter pressure
-    getter tangentialPressure
-    getter tiltX
-    getter tiltY
-    getter twist
-    getter width
-    method constructor
-    method getCoalescedEvents
-    method getPredictedEvents
-interface PopStateEvent : Event
-    attribute @@toStringTag
-    getter state
-    method constructor
-interface PortalActivateEvent : Event
-    attribute @@toStringTag
-    getter data
-    method adoptPredecessor
-    method constructor
-interface PortalHost : EventTarget
-    attribute @@toStringTag
-    getter onmessage
-    getter onmessageerror
-    method constructor
-    method postMessage
-    setter onmessage
-    setter onmessageerror
-interface Presentation
-    attribute @@toStringTag
-    getter defaultRequest
-    getter receiver
-    method constructor
-    setter defaultRequest
-interface PresentationAvailability : EventTarget
-    attribute @@toStringTag
-    getter onchange
-    getter value
-    method constructor
-    setter onchange
-interface PresentationConnection : EventTarget
-    attribute @@toStringTag
-    getter binaryType
-    getter id
-    getter onclose
-    getter onconnect
-    getter onmessage
-    getter onterminate
-    getter state
-    getter url
-    method close
-    method constructor
-    method send
-    method terminate
-    setter binaryType
-    setter onclose
-    setter onconnect
-    setter onmessage
-    setter onterminate
-interface PresentationConnectionAvailableEvent : Event
-    attribute @@toStringTag
-    getter connection
-    method constructor
-interface PresentationConnectionCloseEvent : Event
-    attribute @@toStringTag
-    getter message
-    getter reason
-    method constructor
-interface PresentationConnectionList : EventTarget
-    attribute @@toStringTag
-    getter connections
-    getter onconnectionavailable
-    method constructor
-    setter onconnectionavailable
-interface PresentationReceiver
-    attribute @@toStringTag
-    getter connectionList
-    method constructor
-interface PresentationRequest : EventTarget
-    attribute @@toStringTag
-    getter onconnectionavailable
-    method constructor
-    method getAvailability
-    method reconnect
-    method start
-    setter onconnectionavailable
-interface ProcessingInstruction : CharacterData
-    attribute @@toStringTag
-    getter sheet
-    getter target
-    method constructor
-interface Profiler
-    attribute @@toStringTag
-    getter sampleInterval
-    getter stopped
-    method constructor
-    method stop
-interface ProgressEvent : Event
-    attribute @@toStringTag
-    getter lengthComputable
-    getter loaded
-    getter total
-    method constructor
-interface PromiseRejectionEvent : Event
-    attribute @@toStringTag
-    getter promise
-    getter reason
-    method constructor
-interface PublicKeyCredential : Credential
-    static method isUserVerifyingPlatformAuthenticatorAvailable
-    attribute @@toStringTag
-    getter rawId
-    getter response
-    method constructor
-    method getClientExtensionResults
-interface PushManager
-    static getter supportedContentEncodings
-    attribute @@toStringTag
-    method constructor
-    method getSubscription
-    method permissionState
-    method subscribe
-interface PushSubscription
-    attribute @@toStringTag
-    getter endpoint
-    getter expirationTime
-    getter options
-    method constructor
-    method getKey
-    method toJSON
-    method unsubscribe
-interface PushSubscriptionOptions
-    attribute @@toStringTag
-    getter applicationServerKey
-    getter userVisibleOnly
-    method constructor
-interface QuicTransport
-    attribute @@toStringTag
-    method close
-    method constructor
-interface RTCCertificate
-    attribute @@toStringTag
-    getter expires
-    method constructor
-    method getFingerprints
-interface RTCDTMFSender : EventTarget
-    attribute @@toStringTag
-    getter canInsertDTMF
-    getter ontonechange
-    getter toneBuffer
-    method constructor
-    method insertDTMF
-    setter ontonechange
-interface RTCDTMFToneChangeEvent : Event
-    attribute @@toStringTag
-    getter tone
-    method constructor
-interface RTCDataChannel : EventTarget
-    attribute @@toStringTag
-    getter binaryType
-    getter bufferedAmount
-    getter bufferedAmountLowThreshold
-    getter id
-    getter label
-    getter maxPacketLifeTime
-    getter maxRetransmits
-    getter negotiated
-    getter onbufferedamountlow
-    getter onclose
-    getter onerror
-    getter onmessage
-    getter onopen
-    getter ordered
-    getter protocol
-    getter readyState
-    getter reliable
-    method close
-    method constructor
-    method send
-    setter binaryType
-    setter bufferedAmountLowThreshold
-    setter onbufferedamountlow
-    setter onclose
-    setter onerror
-    setter onmessage
-    setter onopen
-interface RTCDataChannelEvent : Event
-    attribute @@toStringTag
-    getter channel
-    method constructor
-interface RTCDtlsTransport : EventTarget
-    attribute @@toStringTag
-    getter iceTransport
-    getter onerror
-    getter onstatechange
-    getter state
-    method constructor
-    method getRemoteCertificates
-    setter onerror
-    setter onstatechange
-interface RTCError : DOMException
-    attribute @@toStringTag
-    getter errorDetail
-    getter httpRequestStatusCode
-    getter receivedAlert
-    getter sctpCauseCode
-    getter sdpLineNumber
-    getter sentAlert
-    method constructor
-interface RTCErrorEvent : Event
-    attribute @@toStringTag
-    getter error
-    method constructor
-interface RTCIceCandidate
-    attribute @@toStringTag
-    getter address
-    getter candidate
-    getter component
-    getter foundation
-    getter port
-    getter priority
-    getter protocol
-    getter relatedAddress
-    getter relatedPort
-    getter sdpMLineIndex
-    getter sdpMid
-    getter tcpType
-    getter type
-    getter usernameFragment
-    method constructor
-    method toJSON
-interface RTCIceTransport : EventTarget
-    attribute @@toStringTag
-    getter gatheringState
-    getter ongatheringstatechange
-    getter onicecandidate
-    getter onselectedcandidatepairchange
-    getter onstatechange
-    getter role
-    getter state
-    method addRemoteCandidate
-    method constructor
-    method gather
-    method getLocalCandidates
-    method getLocalParameters
-    method getRemoteCandidates
-    method getRemoteParameters
-    method getSelectedCandidatePair
-    method start
-    method stop
-    setter ongatheringstatechange
-    setter onicecandidate
-    setter onselectedcandidatepairchange
-    setter onstatechange
-interface RTCPeerConnection : EventTarget
-    static method generateCertificate
-    attribute @@toStringTag
-    getter connectionState
-    getter currentLocalDescription
-    getter currentRemoteDescription
-    getter iceConnectionState
-    getter iceGatheringState
-    getter localDescription
-    getter onaddstream
-    getter onconnectionstatechange
-    getter ondatachannel
-    getter onicecandidate
-    getter onicecandidateerror
-    getter oniceconnectionstatechange
-    getter onicegatheringstatechange
-    getter onnegotiationneeded
-    getter onremovestream
-    getter onsignalingstatechange
-    getter ontrack
-    getter pendingLocalDescription
-    getter pendingRemoteDescription
-    getter remoteDescription
-    getter sctp
-    getter signalingState
-    method addIceCandidate
-    method addStream
-    method addTrack
-    method addTransceiver
-    method close
-    method constructor
-    method createAnswer
-    method createDTMFSender
-    method createDataChannel
-    method createOffer
-    method getConfiguration
-    method getLocalStreams
-    method getReceivers
-    method getRemoteStreams
-    method getSenders
-    method getStats
-    method getTransceivers
-    method removeStream
-    method removeTrack
-    method restartIce
-    method setConfiguration
-    method setLocalDescription
-    method setRemoteDescription
-    setter onaddstream
-    setter onconnectionstatechange
-    setter ondatachannel
-    setter onicecandidate
-    setter onicecandidateerror
-    setter oniceconnectionstatechange
-    setter onicegatheringstatechange
-    setter onnegotiationneeded
-    setter onremovestream
-    setter onsignalingstatechange
-    setter ontrack
-interface RTCPeerConnectionIceErrorEvent : Event
-    attribute @@toStringTag
-    getter errorCode
-    getter errorText
-    getter hostCandidate
-    getter url
-    method constructor
-interface RTCPeerConnectionIceEvent : Event
-    attribute @@toStringTag
-    getter candidate
-    method constructor
-interface RTCQuicStream : EventTarget
-    attribute @@toStringTag
-    getter maxReadBufferedAmount
-    getter maxWriteBufferedAmount
-    getter onstatechange
-    getter readBufferedAmount
-    getter state
-    getter transport
-    getter writeBufferedAmount
-    method constructor
-    method readInto
-    method reset
-    method waitForReadable
-    method waitForWriteBufferedAmountBelow
-    method write
-    setter onstatechange
-interface RTCQuicStreamEvent : Event
-    attribute @@toStringTag
-    getter stream
-    method constructor
-interface RTCQuicTransport : EventTarget
-    attribute @@toStringTag
-    getter maxDatagramLength
-    getter onerror
-    getter onquicstream
-    getter onstatechange
-    getter state
-    getter transport
-    method connect
-    method constructor
-    method createStream
-    method getKey
-    method getStats
-    method listen
-    method readyToSendDatagram
-    method receiveDatagrams
-    method sendDatagram
-    method stop
-    setter onerror
-    setter onquicstream
-    setter onstatechange
-interface RTCRtpReceiver
-    static method getCapabilities
-    attribute @@toStringTag
-    getter playoutDelayHint
-    getter rtcpTransport
-    getter track
-    getter transport
-    method constructor
-    method getContributingSources
-    method getParameters
-    method getStats
-    method getSynchronizationSources
-    setter playoutDelayHint
-interface RTCRtpSender
-    static method getCapabilities
-    attribute @@toStringTag
-    getter dtmf
-    getter rtcpTransport
-    getter track
-    getter transport
-    method constructor
-    method getParameters
-    method getStats
-    method replaceTrack
-    method setParameters
-    method setStreams
-interface RTCRtpTransceiver
-    attribute @@toStringTag
-    getter currentDirection
-    getter direction
-    getter mid
-    getter receiver
-    getter sender
-    getter stopped
-    method constructor
-    method setCodecPreferences
-    setter direction
-interface RTCSctpTransport : EventTarget
-    attribute @@toStringTag
-    getter maxChannels
-    getter maxMessageSize
-    getter onstatechange
-    getter state
-    getter transport
-    method constructor
-    setter onstatechange
-interface RTCSessionDescription
-    attribute @@toStringTag
-    getter sdp
-    getter type
-    method constructor
-    method toJSON
-    setter sdp
-    setter type
-interface RTCStatsReport
-    attribute @@toStringTag
-    getter size
-    method @@iterator
-    method constructor
-    method entries
-    method forEach
-    method get
-    method has
-    method keys
-    method values
-interface RTCTrackEvent : Event
-    attribute @@toStringTag
-    getter receiver
-    getter streams
-    getter track
-    getter transceiver
-    method constructor
-interface RadioNodeList : NodeList
-    attribute @@toStringTag
-    getter value
-    method constructor
-    setter value
-interface Range
-    attribute @@toStringTag
-    attribute END_TO_END
-    attribute END_TO_START
-    attribute START_TO_END
-    attribute START_TO_START
-    getter collapsed
-    getter commonAncestorContainer
-    getter endContainer
-    getter endOffset
-    getter startContainer
-    getter startOffset
-    method cloneContents
-    method cloneRange
-    method collapse
-    method compareBoundaryPoints
-    method comparePoint
-    method constructor
-    method createContextualFragment
-    method deleteContents
-    method detach
-    method expand
-    method extractContents
-    method getBoundingClientRect
-    method getClientRects
-    method insertNode
-    method intersectsNode
-    method isPointInRange
-    method selectNode
-    method selectNodeContents
-    method setEnd
-    method setEndAfter
-    method setEndBefore
-    method setStart
-    method setStartAfter
-    method setStartBefore
-    method surroundContents
-    method toString
-interface ReadableStream
-    attribute @@toStringTag
-    getter locked
-    method cancel
-    method constructor
-    method getReader
-    method pipeThrough
-    method pipeTo
-    method tee
-interface ReadableStreamDefaultReader
-    attribute @@toStringTag
-    getter closed
-    method cancel
-    method constructor
-    method read
-    method releaseLock
-interface RelativeOrientationSensor : OrientationSensor
-    attribute @@toStringTag
-    method constructor
-interface RemotePlayback : EventTarget
-    attribute @@toStringTag
-    getter onconnect
-    getter onconnecting
-    getter ondisconnect
-    getter state
-    method cancelWatchAvailability
-    method constructor
-    method prompt
-    method watchAvailability
-    setter onconnect
-    setter onconnecting
-    setter ondisconnect
-interface RenderSubtreeActivationEvent : Event
-    attribute @@toStringTag
-    getter activatedElement
-    method constructor
-interface ReportingObserver
-    attribute @@toStringTag
-    method constructor
-    method disconnect
-    method observe
-    method takeRecords
-interface Request
-    attribute @@toStringTag
-    getter bodyUsed
-    getter cache
-    getter credentials
-    getter destination
-    getter headers
-    getter integrity
-    getter isHistoryNavigation
-    getter keepalive
-    getter method
-    getter mode
-    getter redirect
-    getter referrer
-    getter referrerPolicy
-    getter signal
-    getter url
-    method arrayBuffer
-    method blob
-    method clone
-    method constructor
-    method formData
-    method json
-    method text
-interface ResizeObserver
-    attribute @@toStringTag
-    method constructor
-    method disconnect
-    method observe
-    method unobserve
-interface ResizeObserverEntry
-    attribute @@toStringTag
-    getter contentRect
-    getter target
-    method constructor
-interface Response
-    static method error
-    static method redirect
-    attribute @@toStringTag
-    getter body
-    getter bodyUsed
-    getter headers
-    getter ok
-    getter redirected
-    getter status
-    getter statusText
-    getter type
-    getter url
-    method arrayBuffer
-    method blob
-    method clone
-    method constructor
-    method formData
-    method json
-    method text
-interface SMS
-    attribute @@toStringTag
-    getter content
-    method constructor
-interface SMSReceiver
-    attribute @@toStringTag
-    method constructor
-    method receive
-interface SVGAElement : SVGGraphicsElement
-    attribute @@toStringTag
-    getter href
-    getter target
-    method constructor
-interface SVGAngle
-    attribute @@toStringTag
-    attribute SVG_ANGLETYPE_DEG
-    attribute SVG_ANGLETYPE_GRAD
-    attribute SVG_ANGLETYPE_RAD
-    attribute SVG_ANGLETYPE_UNKNOWN
-    attribute SVG_ANGLETYPE_UNSPECIFIED
-    getter unitType
-    getter value
-    getter valueAsString
-    getter valueInSpecifiedUnits
-    method constructor
-    method convertToSpecifiedUnits
-    method newValueSpecifiedUnits
-    setter value
-    setter valueAsString
-    setter valueInSpecifiedUnits
-interface SVGAnimateElement : SVGAnimationElement
-    attribute @@toStringTag
-    method constructor
-interface SVGAnimateMotionElement : SVGAnimationElement
-    attribute @@toStringTag
-    method constructor
-interface SVGAnimateTransformElement : SVGAnimationElement
-    attribute @@toStringTag
-    method constructor
-interface SVGAnimatedAngle
-    attribute @@toStringTag
-    getter animVal
-    getter baseVal
-    method constructor
-interface SVGAnimatedBoolean
-    attribute @@toStringTag
-    getter animVal
-    getter baseVal
-    method constructor
-    setter baseVal
-interface SVGAnimatedEnumeration
-    attribute @@toStringTag
-    getter animVal
-    getter baseVal
-    method constructor
-    setter baseVal
-interface SVGAnimatedInteger
-    attribute @@toStringTag
-    getter animVal
-    getter baseVal
-    method constructor
-    setter baseVal
-interface SVGAnimatedLength
-    attribute @@toStringTag
-    getter animVal
-    getter baseVal
-    method constructor
-interface SVGAnimatedLengthList
-    attribute @@toStringTag
-    getter animVal
-    getter baseVal
-    method constructor
-interface SVGAnimatedNumber
-    attribute @@toStringTag
-    getter animVal
-    getter baseVal
-    method constructor
-    setter baseVal
-interface SVGAnimatedNumberList
-    attribute @@toStringTag
-    getter animVal
-    getter baseVal
-    method constructor
-interface SVGAnimatedPreserveAspectRatio
-    attribute @@toStringTag
-    getter animVal
-    getter baseVal
-    method constructor
-interface SVGAnimatedRect
-    attribute @@toStringTag
-    getter animVal
-    getter baseVal
-    method constructor
-interface SVGAnimatedString
-    attribute @@toStringTag
-    getter animVal
-    getter baseVal
-    method constructor
-    setter baseVal
-interface SVGAnimatedTransformList
-    attribute @@toStringTag
-    getter animVal
-    getter baseVal
-    method constructor
-interface SVGAnimationElement : SVGElement
-    attribute @@toStringTag
-    getter onbegin
-    getter onend
-    getter onrepeat
-    getter requiredExtensions
-    getter systemLanguage
-    getter targetElement
-    method beginElement
-    method beginElementAt
-    method constructor
-    method endElement
-    method endElementAt
-    method getCurrentTime
-    method getSimpleDuration
-    method getStartTime
-    setter onbegin
-    setter onend
-    setter onrepeat
-interface SVGCircleElement : SVGGeometryElement
-    attribute @@toStringTag
-    getter cx
-    getter cy
-    getter r
-    method constructor
-interface SVGClipPathElement : SVGGraphicsElement
-    attribute @@toStringTag
-    getter clipPathUnits
-    method constructor
-interface SVGComponentTransferFunctionElement : SVGElement
-    attribute @@toStringTag
-    attribute SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE
-    attribute SVG_FECOMPONENTTRANSFER_TYPE_GAMMA
-    attribute SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY
-    attribute SVG_FECOMPONENTTRANSFER_TYPE_LINEAR
-    attribute SVG_FECOMPONENTTRANSFER_TYPE_TABLE
-    attribute SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN
-    getter amplitude
-    getter exponent
-    getter intercept
-    getter offset
-    getter slope
-    getter tableValues
-    getter type
-    method constructor
-interface SVGDefsElement : SVGGraphicsElement
-    attribute @@toStringTag
-    method constructor
-interface SVGDescElement : SVGElement
-    attribute @@toStringTag
-    method constructor
-interface SVGDiscardElement : SVGElement
-    attribute @@toStringTag
-    method constructor
-interface SVGElement : Element
-    attribute @@toStringTag
-    getter autofocus
-    getter className
-    getter dataset
-    getter nonce
-    getter onabort
-    getter onactivateinvisible
-    getter onanimationend
-    getter onanimationiteration
-    getter onanimationstart
-    getter onauxclick
-    getter onblur
-    getter oncancel
-    getter oncanplay
-    getter oncanplaythrough
-    getter onchange
-    getter onclick
-    getter onclose
-    getter oncontextmenu
-    getter oncopy
-    getter oncuechange
-    getter oncut
-    getter ondblclick
-    getter ondrag
-    getter ondragend
-    getter ondragenter
-    getter ondragleave
-    getter ondragover
-    getter ondragstart
-    getter ondrop
-    getter ondurationchange
-    getter onemptied
-    getter onended
-    getter onerror
-    getter onfocus
-    getter onformdata
-    getter ongotpointercapture
-    getter oninput
-    getter oninvalid
-    getter onkeydown
-    getter onkeypress
-    getter onkeyup
-    getter onload
-    getter onloadeddata
-    getter onloadedmetadata
-    getter onloadstart
-    getter onlostpointercapture
-    getter onmousedown
-    getter onmouseenter
-    getter onmouseleave
-    getter onmousemove
-    getter onmouseout
-    getter onmouseover
-    getter onmouseup
-    getter onmousewheel
-    getter onoverscroll
-    getter onpaste
-    getter onpause
-    getter onplay
-    getter onplaying
-    getter onpointercancel
-    getter onpointerdown
-    getter onpointerenter
-    getter onpointerleave
-    getter onpointermove
-    getter onpointerout
-    getter onpointerover
-    getter onpointerrawupdate
-    getter onpointerup
-    getter onprogress
-    getter onratechange
-    getter onrendersubtreeactivation
-    getter onreset
-    getter onresize
-    getter onscroll
-    getter onscrollend
-    getter onseeked
-    getter onseeking
-    getter onselect
-    getter onselectionchange
-    getter onselectstart
-    getter onstalled
-    getter onsubmit
-    getter onsuspend
-    getter ontimeupdate
-    getter ontoggle
-    getter ontouchcancel
-    getter ontouchend
-    getter ontouchmove
-    getter ontouchstart
-    getter ontransitionend
-    getter onvolumechange
-    getter onwaiting
-    getter onwheel
-    getter ownerSVGElement
-    getter style
-    getter tabIndex
-    getter viewportElement
-    method blur
-    method constructor
-    method focus
-    setter autofocus
-    setter nonce
-    setter onabort
-    setter onactivateinvisible
-    setter onanimationend
-    setter onanimationiteration
-    setter onanimationstart
-    setter onauxclick
-    setter onblur
-    setter oncancel
-    setter oncanplay
-    setter oncanplaythrough
-    setter onchange
-    setter onclick
-    setter onclose
-    setter oncontextmenu
-    setter oncopy
-    setter oncuechange
-    setter oncut
-    setter ondblclick
-    setter ondrag
-    setter ondragend
-    setter ondragenter
-    setter ondragleave
-    setter ondragover
-    setter ondragstart
-    setter ondrop
-    setter ondurationchange
-    setter onemptied
-    setter onended
-    setter onerror
-    setter onfocus
-    setter onformdata
-    setter ongotpointercapture
-    setter oninput
-    setter oninvalid
-    setter onkeydown
-    setter onkeypress
-    setter onkeyup
-    setter onload
-    setter onloadeddata
-    setter onloadedmetadata
-    setter onloadstart
-    setter onlostpointercapture
-    setter onmousedown
-    setter onmouseenter
-    setter onmouseleave
-    setter onmousemove
-    setter onmouseout
-    setter onmouseover
-    setter onmouseup
-    setter onmousewheel
-    setter onoverscroll
-    setter onpaste
-    setter onpause
-    setter onplay
-    setter onplaying
-    setter onpointercancel
-    setter onpointerdown
-    setter onpointerenter
-    setter onpointerleave
-    setter onpointermove
-    setter onpointerout
-    setter onpointerover
-    setter onpointerrawupdate
-    setter onpointerup
-    setter onprogress
-    setter onratechange
-    setter onrendersubtreeactivation
-    setter onreset
-    setter onresize
-    setter onscroll
-    setter onscrollend
-    setter onseeked
-    setter onseeking
-    setter onselect
-    setter onselectionchange
-    setter onselectstart
-    setter onstalled
-    setter onsubmit
-    setter onsuspend
-    setter ontimeupdate
-    setter ontoggle
-    setter ontouchcancel
-    setter ontouchend
-    setter ontouchmove
-    setter ontouchstart
-    setter ontransitionend
-    setter onvolumechange
-    setter onwaiting
-    setter onwheel
-    setter style
-    setter tabIndex
-interface SVGEllipseElement : SVGGeometryElement
-    attribute @@toStringTag
-    getter cx
-    getter cy
-    getter rx
-    getter ry
-    method constructor
-interface SVGFEBlendElement : SVGElement
-    attribute @@toStringTag
-    attribute SVG_FEBLEND_MODE_COLOR
-    attribute SVG_FEBLEND_MODE_COLOR_BURN
-    attribute SVG_FEBLEND_MODE_COLOR_DODGE
-    attribute SVG_FEBLEND_MODE_DARKEN
-    attribute SVG_FEBLEND_MODE_DIFFERENCE
-    attribute SVG_FEBLEND_MODE_EXCLUSION
-    attribute SVG_FEBLEND_MODE_HARD_LIGHT
-    attribute SVG_FEBLEND_MODE_HUE
-    attribute SVG_FEBLEND_MODE_LIGHTEN
-    attribute SVG_FEBLEND_MODE_LUMINOSITY
-    attribute SVG_FEBLEND_MODE_MULTIPLY
-    attribute SVG_FEBLEND_MODE_NORMAL
-    attribute SVG_FEBLEND_MODE_OVERLAY
-    attribute SVG_FEBLEND_MODE_SATURATION
-    attribute SVG_FEBLEND_MODE_SCREEN
-    attribute SVG_FEBLEND_MODE_SOFT_LIGHT
-    attribute SVG_FEBLEND_MODE_UNKNOWN
-    getter height
-    getter in1
-    getter in2
-    getter mode
-    getter result
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGFEColorMatrixElement : SVGElement
-    attribute @@toStringTag
-    attribute SVG_FECOLORMATRIX_TYPE_HUEROTATE
-    attribute SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA
-    attribute SVG_FECOLORMATRIX_TYPE_MATRIX
-    attribute SVG_FECOLORMATRIX_TYPE_SATURATE
-    attribute SVG_FECOLORMATRIX_TYPE_UNKNOWN
-    getter height
-    getter in1
-    getter result
-    getter type
-    getter values
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGFEComponentTransferElement : SVGElement
-    attribute @@toStringTag
-    getter height
-    getter in1
-    getter result
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGFECompositeElement : SVGElement
-    attribute @@toStringTag
-    attribute SVG_FECOMPOSITE_OPERATOR_ARITHMETIC
-    attribute SVG_FECOMPOSITE_OPERATOR_ATOP
-    attribute SVG_FECOMPOSITE_OPERATOR_IN
-    attribute SVG_FECOMPOSITE_OPERATOR_OUT
-    attribute SVG_FECOMPOSITE_OPERATOR_OVER
-    attribute SVG_FECOMPOSITE_OPERATOR_UNKNOWN
-    attribute SVG_FECOMPOSITE_OPERATOR_XOR
-    getter height
-    getter in1
-    getter in2
-    getter k1
-    getter k2
-    getter k3
-    getter k4
-    getter operator
-    getter result
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGFEConvolveMatrixElement : SVGElement
-    attribute @@toStringTag
-    attribute SVG_EDGEMODE_DUPLICATE
-    attribute SVG_EDGEMODE_NONE
-    attribute SVG_EDGEMODE_UNKNOWN
-    attribute SVG_EDGEMODE_WRAP
-    getter bias
-    getter divisor
-    getter edgeMode
-    getter height
-    getter in1
-    getter kernelMatrix
-    getter kernelUnitLengthX
-    getter kernelUnitLengthY
-    getter orderX
-    getter orderY
-    getter preserveAlpha
-    getter result
-    getter targetX
-    getter targetY
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGFEDiffuseLightingElement : SVGElement
-    attribute @@toStringTag
-    getter diffuseConstant
-    getter height
-    getter in1
-    getter kernelUnitLengthX
-    getter kernelUnitLengthY
-    getter result
-    getter surfaceScale
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGFEDisplacementMapElement : SVGElement
-    attribute @@toStringTag
-    attribute SVG_CHANNEL_A
-    attribute SVG_CHANNEL_B
-    attribute SVG_CHANNEL_G
-    attribute SVG_CHANNEL_R
-    attribute SVG_CHANNEL_UNKNOWN
-    getter height
-    getter in1
-    getter in2
-    getter result
-    getter scale
-    getter width
-    getter x
-    getter xChannelSelector
-    getter y
-    getter yChannelSelector
-    method constructor
-interface SVGFEDistantLightElement : SVGElement
-    attribute @@toStringTag
-    getter azimuth
-    getter elevation
-    method constructor
-interface SVGFEDropShadowElement : SVGElement
-    attribute @@toStringTag
-    getter dx
-    getter dy
-    getter height
-    getter in1
-    getter result
-    getter stdDeviationX
-    getter stdDeviationY
-    getter width
-    getter x
-    getter y
-    method constructor
-    method setStdDeviation
-interface SVGFEFloodElement : SVGElement
-    attribute @@toStringTag
-    getter height
-    getter result
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGFEFuncAElement : SVGComponentTransferFunctionElement
-    attribute @@toStringTag
-    method constructor
-interface SVGFEFuncBElement : SVGComponentTransferFunctionElement
-    attribute @@toStringTag
-    method constructor
-interface SVGFEFuncGElement : SVGComponentTransferFunctionElement
-    attribute @@toStringTag
-    method constructor
-interface SVGFEFuncRElement : SVGComponentTransferFunctionElement
-    attribute @@toStringTag
-    method constructor
-interface SVGFEGaussianBlurElement : SVGElement
-    attribute @@toStringTag
-    getter height
-    getter in1
-    getter result
-    getter stdDeviationX
-    getter stdDeviationY
-    getter width
-    getter x
-    getter y
-    method constructor
-    method setStdDeviation
-interface SVGFEImageElement : SVGElement
-    attribute @@toStringTag
-    getter height
-    getter href
-    getter preserveAspectRatio
-    getter result
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGFEMergeElement : SVGElement
-    attribute @@toStringTag
-    getter height
-    getter result
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGFEMergeNodeElement : SVGElement
-    attribute @@toStringTag
-    getter in1
-    method constructor
-interface SVGFEMorphologyElement : SVGElement
-    attribute @@toStringTag
-    attribute SVG_MORPHOLOGY_OPERATOR_DILATE
-    attribute SVG_MORPHOLOGY_OPERATOR_ERODE
-    attribute SVG_MORPHOLOGY_OPERATOR_UNKNOWN
-    getter height
-    getter in1
-    getter operator
-    getter radiusX
-    getter radiusY
-    getter result
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGFEOffsetElement : SVGElement
-    attribute @@toStringTag
-    getter dx
-    getter dy
-    getter height
-    getter in1
-    getter result
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGFEPointLightElement : SVGElement
-    attribute @@toStringTag
-    getter x
-    getter y
-    getter z
-    method constructor
-interface SVGFESpecularLightingElement : SVGElement
-    attribute @@toStringTag
-    getter height
-    getter in1
-    getter kernelUnitLengthX
-    getter kernelUnitLengthY
-    getter result
-    getter specularConstant
-    getter specularExponent
-    getter surfaceScale
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGFESpotLightElement : SVGElement
-    attribute @@toStringTag
-    getter limitingConeAngle
-    getter pointsAtX
-    getter pointsAtY
-    getter pointsAtZ
-    getter specularExponent
-    getter x
-    getter y
-    getter z
-    method constructor
-interface SVGFETileElement : SVGElement
-    attribute @@toStringTag
-    getter height
-    getter in1
-    getter result
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGFETurbulenceElement : SVGElement
-    attribute @@toStringTag
-    attribute SVG_STITCHTYPE_NOSTITCH
-    attribute SVG_STITCHTYPE_STITCH
-    attribute SVG_STITCHTYPE_UNKNOWN
-    attribute SVG_TURBULENCE_TYPE_FRACTALNOISE
-    attribute SVG_TURBULENCE_TYPE_TURBULENCE
-    attribute SVG_TURBULENCE_TYPE_UNKNOWN
-    getter baseFrequencyX
-    getter baseFrequencyY
-    getter height
-    getter numOctaves
-    getter result
-    getter seed
-    getter stitchTiles
-    getter type
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGFilterElement : SVGElement
-    attribute @@toStringTag
-    getter filterUnits
-    getter height
-    getter href
-    getter primitiveUnits
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGForeignObjectElement : SVGGraphicsElement
-    attribute @@toStringTag
-    getter height
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGGElement : SVGGraphicsElement
-    attribute @@toStringTag
-    method constructor
-interface SVGGeometryElement : SVGGraphicsElement
-    attribute @@toStringTag
-    getter pathLength
-    method constructor
-    method getPointAtLength
-    method getTotalLength
-    method isPointInFill
-    method isPointInStroke
-interface SVGGradientElement : SVGElement
-    attribute @@toStringTag
-    attribute SVG_SPREADMETHOD_PAD
-    attribute SVG_SPREADMETHOD_REFLECT
-    attribute SVG_SPREADMETHOD_REPEAT
-    attribute SVG_SPREADMETHOD_UNKNOWN
-    getter gradientTransform
-    getter gradientUnits
-    getter href
-    getter spreadMethod
-    method constructor
-interface SVGGraphicsElement : SVGElement
-    attribute @@toStringTag
-    getter farthestViewportElement
-    getter nearestViewportElement
-    getter requiredExtensions
-    getter systemLanguage
-    getter transform
-    method constructor
-    method getBBox
-    method getCTM
-    method getScreenCTM
-interface SVGImageElement : SVGGraphicsElement
-    attribute @@toStringTag
-    getter decoding
-    getter height
-    getter href
-    getter preserveAspectRatio
-    getter width
-    getter x
-    getter y
-    method constructor
-    method decode
-    setter decoding
-interface SVGLength
-    attribute @@toStringTag
-    attribute SVG_LENGTHTYPE_CM
-    attribute SVG_LENGTHTYPE_EMS
-    attribute SVG_LENGTHTYPE_EXS
-    attribute SVG_LENGTHTYPE_IN
-    attribute SVG_LENGTHTYPE_MM
-    attribute SVG_LENGTHTYPE_NUMBER
-    attribute SVG_LENGTHTYPE_PC
-    attribute SVG_LENGTHTYPE_PERCENTAGE
-    attribute SVG_LENGTHTYPE_PT
-    attribute SVG_LENGTHTYPE_PX
-    attribute SVG_LENGTHTYPE_UNKNOWN
-    getter unitType
-    getter value
-    getter valueAsString
-    getter valueInSpecifiedUnits
-    method constructor
-    method convertToSpecifiedUnits
-    method newValueSpecifiedUnits
-    setter value
-    setter valueAsString
-    setter valueInSpecifiedUnits
-interface SVGLengthList
-    attribute @@toStringTag
-    getter length
-    getter numberOfItems
-    method @@iterator
-    method appendItem
-    method clear
-    method constructor
-    method getItem
-    method initialize
-    method insertItemBefore
-    method removeItem
-    method replaceItem
-interface SVGLineElement : SVGGeometryElement
-    attribute @@toStringTag
-    getter x1
-    getter x2
-    getter y1
-    getter y2
-    method constructor
-interface SVGLinearGradientElement : SVGGradientElement
-    attribute @@toStringTag
-    getter x1
-    getter x2
-    getter y1
-    getter y2
-    method constructor
-interface SVGMPathElement : SVGElement
-    attribute @@toStringTag
-    getter href
-    method constructor
-interface SVGMarkerElement : SVGElement
-    attribute @@toStringTag
-    attribute SVG_MARKERUNITS_STROKEWIDTH
-    attribute SVG_MARKERUNITS_UNKNOWN
-    attribute SVG_MARKERUNITS_USERSPACEONUSE
-    attribute SVG_MARKER_ORIENT_ANGLE
-    attribute SVG_MARKER_ORIENT_AUTO
-    attribute SVG_MARKER_ORIENT_UNKNOWN
-    getter markerHeight
-    getter markerUnits
-    getter markerWidth
-    getter orientAngle
-    getter orientType
-    getter preserveAspectRatio
-    getter refX
-    getter refY
-    getter viewBox
-    method constructor
-    method setOrientToAngle
-    method setOrientToAuto
-interface SVGMaskElement : SVGElement
-    attribute @@toStringTag
-    getter height
-    getter maskContentUnits
-    getter maskUnits
-    getter requiredExtensions
-    getter systemLanguage
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGMatrix
-    attribute @@toStringTag
-    getter a
-    getter b
-    getter c
-    getter d
-    getter e
-    getter f
-    method constructor
-    method flipX
-    method flipY
-    method inverse
-    method multiply
-    method rotate
-    method rotateFromVector
-    method scale
-    method scaleNonUniform
-    method skewX
-    method skewY
-    method translate
-    setter a
-    setter b
-    setter c
-    setter d
-    setter e
-    setter f
-interface SVGMetadataElement : SVGElement
-    attribute @@toStringTag
-    method constructor
-interface SVGNumber
-    attribute @@toStringTag
-    getter value
-    method constructor
-    setter value
-interface SVGNumberList
-    attribute @@toStringTag
-    getter length
-    getter numberOfItems
-    method @@iterator
-    method appendItem
-    method clear
-    method constructor
-    method getItem
-    method initialize
-    method insertItemBefore
-    method removeItem
-    method replaceItem
-interface SVGPathElement : SVGGeometryElement
-    attribute @@toStringTag
-    method constructor
-interface SVGPatternElement : SVGElement
-    attribute @@toStringTag
-    getter height
-    getter href
-    getter patternContentUnits
-    getter patternTransform
-    getter patternUnits
-    getter preserveAspectRatio
-    getter requiredExtensions
-    getter systemLanguage
-    getter viewBox
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGPoint
-    attribute @@toStringTag
-    getter x
-    getter y
-    method constructor
-    method matrixTransform
-    setter x
-    setter y
-interface SVGPointList
-    attribute @@toStringTag
-    getter length
-    getter numberOfItems
-    method @@iterator
-    method appendItem
-    method clear
-    method constructor
-    method getItem
-    method initialize
-    method insertItemBefore
-    method removeItem
-    method replaceItem
-interface SVGPolygonElement : SVGGeometryElement
-    attribute @@toStringTag
-    getter animatedPoints
-    getter points
-    method constructor
-interface SVGPolylineElement : SVGGeometryElement
-    attribute @@toStringTag
-    getter animatedPoints
-    getter points
-    method constructor
-interface SVGPreserveAspectRatio
-    attribute @@toStringTag
-    attribute SVG_MEETORSLICE_MEET
-    attribute SVG_MEETORSLICE_SLICE
-    attribute SVG_MEETORSLICE_UNKNOWN
-    attribute SVG_PRESERVEASPECTRATIO_NONE
-    attribute SVG_PRESERVEASPECTRATIO_UNKNOWN
-    attribute SVG_PRESERVEASPECTRATIO_XMAXYMAX
-    attribute SVG_PRESERVEASPECTRATIO_XMAXYMID
-    attribute SVG_PRESERVEASPECTRATIO_XMAXYMIN
-    attribute SVG_PRESERVEASPECTRATIO_XMIDYMAX
-    attribute SVG_PRESERVEASPECTRATIO_XMIDYMID
-    attribute SVG_PRESERVEASPECTRATIO_XMIDYMIN
-    attribute SVG_PRESERVEASPECTRATIO_XMINYMAX
-    attribute SVG_PRESERVEASPECTRATIO_XMINYMID
-    attribute SVG_PRESERVEASPECTRATIO_XMINYMIN
-    getter align
-    getter meetOrSlice
-    method constructor
-    setter align
-    setter meetOrSlice
-interface SVGRadialGradientElement : SVGGradientElement
-    attribute @@toStringTag
-    getter cx
-    getter cy
-    getter fr
-    getter fx
-    getter fy
-    getter r
-    method constructor
-interface SVGRect
-    attribute @@toStringTag
-    getter height
-    getter width
-    getter x
-    getter y
-    method constructor
-    setter height
-    setter width
-    setter x
-    setter y
-interface SVGRectElement : SVGGeometryElement
-    attribute @@toStringTag
-    getter height
-    getter rx
-    getter ry
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGSVGElement : SVGGraphicsElement
-    attribute @@toStringTag
-    attribute SVG_ZOOMANDPAN_DISABLE
-    attribute SVG_ZOOMANDPAN_MAGNIFY
-    attribute SVG_ZOOMANDPAN_UNKNOWN
-    getter currentScale
-    getter currentTranslate
-    getter height
-    getter preserveAspectRatio
-    getter viewBox
-    getter width
-    getter x
-    getter y
-    getter zoomAndPan
-    method animationsPaused
-    method checkEnclosure
-    method checkIntersection
-    method constructor
-    method createSVGAngle
-    method createSVGLength
-    method createSVGMatrix
-    method createSVGNumber
-    method createSVGPoint
-    method createSVGRect
-    method createSVGTransform
-    method createSVGTransformFromMatrix
-    method deselectAll
-    method forceRedraw
-    method getCurrentTime
-    method getElementById
-    method getEnclosureList
-    method getIntersectionList
-    method pauseAnimations
-    method setCurrentTime
-    method suspendRedraw
-    method unpauseAnimations
-    method unsuspendRedraw
-    method unsuspendRedrawAll
-    setter currentScale
-    setter zoomAndPan
-interface SVGScriptElement : SVGElement
-    attribute @@toStringTag
-    getter href
-    getter type
-    method constructor
-    setter type
-interface SVGSetElement : SVGAnimationElement
-    attribute @@toStringTag
-    method constructor
-interface SVGStopElement : SVGElement
-    attribute @@toStringTag
-    getter offset
-    method constructor
-interface SVGStringList
-    attribute @@toStringTag
-    getter length
-    getter numberOfItems
-    method @@iterator
-    method appendItem
-    method clear
-    method constructor
-    method getItem
-    method initialize
-    method insertItemBefore
-    method removeItem
-    method replaceItem
-interface SVGStyleElement : SVGElement
-    attribute @@toStringTag
-    getter disabled
-    getter media
-    getter sheet
-    getter title
-    getter type
-    method constructor
-    setter disabled
-    setter media
-    setter title
-    setter type
-interface SVGSwitchElement : SVGGraphicsElement
-    attribute @@toStringTag
-    method constructor
-interface SVGSymbolElement : SVGElement
-    attribute @@toStringTag
-    getter preserveAspectRatio
-    getter viewBox
-    method constructor
-interface SVGTSpanElement : SVGTextPositioningElement
-    attribute @@toStringTag
-    method constructor
-interface SVGTextContentElement : SVGGraphicsElement
-    attribute @@toStringTag
-    attribute LENGTHADJUST_SPACING
-    attribute LENGTHADJUST_SPACINGANDGLYPHS
-    attribute LENGTHADJUST_UNKNOWN
-    getter lengthAdjust
-    getter textLength
-    method constructor
-    method getCharNumAtPosition
-    method getComputedTextLength
-    method getEndPositionOfChar
-    method getExtentOfChar
-    method getNumberOfChars
-    method getRotationOfChar
-    method getStartPositionOfChar
-    method getSubStringLength
-    method selectSubString
-interface SVGTextElement : SVGTextPositioningElement
-    attribute @@toStringTag
-    method constructor
-interface SVGTextPathElement : SVGTextContentElement
-    attribute @@toStringTag
-    attribute TEXTPATH_METHODTYPE_ALIGN
-    attribute TEXTPATH_METHODTYPE_STRETCH
-    attribute TEXTPATH_METHODTYPE_UNKNOWN
-    attribute TEXTPATH_SPACINGTYPE_AUTO
-    attribute TEXTPATH_SPACINGTYPE_EXACT
-    attribute TEXTPATH_SPACINGTYPE_UNKNOWN
-    getter href
-    getter method
-    getter spacing
-    getter startOffset
-    method constructor
-interface SVGTextPositioningElement : SVGTextContentElement
-    attribute @@toStringTag
-    getter dx
-    getter dy
-    getter rotate
-    getter x
-    getter y
-    method constructor
-interface SVGTitleElement : SVGElement
-    attribute @@toStringTag
-    method constructor
-interface SVGTransform
-    attribute @@toStringTag
-    attribute SVG_TRANSFORM_MATRIX
-    attribute SVG_TRANSFORM_ROTATE
-    attribute SVG_TRANSFORM_SCALE
-    attribute SVG_TRANSFORM_SKEWX
-    attribute SVG_TRANSFORM_SKEWY
-    attribute SVG_TRANSFORM_TRANSLATE
-    attribute SVG_TRANSFORM_UNKNOWN
-    getter angle
-    getter matrix
-    getter type
-    method constructor
-    method setMatrix
-    method setRotate
-    method setScale
-    method setSkewX
-    method setSkewY
-    method setTranslate
-interface SVGTransformList
-    attribute @@toStringTag
-    getter length
-    getter numberOfItems
-    method @@iterator
-    method appendItem
-    method clear
-    method consolidate
-    method constructor
-    method createSVGTransformFromMatrix
-    method getItem
-    method initialize
-    method insertItemBefore
-    method removeItem
-    method replaceItem
-interface SVGUnitTypes
-    attribute @@toStringTag
-    attribute SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
-    attribute SVG_UNIT_TYPE_UNKNOWN
-    attribute SVG_UNIT_TYPE_USERSPACEONUSE
-    method constructor
-interface SVGUseElement : SVGGraphicsElement
-    attribute @@toStringTag
-    getter height
-    getter href
-    getter width
-    getter x
-    getter y
-    method constructor
-interface SVGViewElement : SVGElement
-    attribute @@toStringTag
-    attribute SVG_ZOOMANDPAN_DISABLE
-    attribute SVG_ZOOMANDPAN_MAGNIFY
-    attribute SVG_ZOOMANDPAN_UNKNOWN
-    getter preserveAspectRatio
-    getter viewBox
-    getter zoomAndPan
-    method constructor
-    setter zoomAndPan
-interface Scheduler
-    attribute @@toStringTag
-    method constructor
-    method postTask
-interface Scheduling
-    attribute @@toStringTag
-    method constructor
-    method isFramePending
-    method isInputPending
-interface Screen
-    attribute @@toStringTag
-    getter availHeight
-    getter availLeft
-    getter availTop
-    getter availWidth
-    getter colorDepth
-    getter height
-    getter internal
-    getter left
-    getter name
-    getter orientation
-    getter pixelDepth
-    getter primary
-    getter scaleFactor
-    getter top
-    getter width
-    method constructor
-interface ScreenManager
-    attribute @@toStringTag
-    method constructor
-    method getScreens
-interface ScreenOrientation : EventTarget
-    attribute @@toStringTag
-    getter angle
-    getter onchange
-    getter type
-    method constructor
-    method lock
-    method unlock
-    setter onchange
-interface ScriptProcessorNode : AudioNode
-    attribute @@toStringTag
-    getter bufferSize
-    getter onaudioprocess
-    method constructor
-    setter onaudioprocess
-interface ScrollTimeline : AnimationTimeline
-    attribute @@toStringTag
-    getter endScrollOffset
-    getter fill
-    getter orientation
-    getter scrollSource
-    getter startScrollOffset
-    getter timeRange
-    method constructor
-interface SecurityPolicyViolationEvent : Event
-    attribute @@toStringTag
-    getter blockedURI
-    getter columnNumber
-    getter disposition
-    getter documentURI
-    getter effectiveDirective
-    getter lineNumber
-    getter originalPolicy
-    getter referrer
-    getter sample
-    getter sourceFile
-    getter statusCode
-    getter violatedDirective
-    method constructor
-interface Selection
-    attribute @@toStringTag
-    getter anchorNode
-    getter anchorOffset
-    getter baseNode
-    getter baseOffset
-    getter extentNode
-    getter extentOffset
-    getter focusNode
-    getter focusOffset
-    getter isCollapsed
-    getter rangeCount
-    getter type
-    method addRange
-    method collapse
-    method collapseToEnd
-    method collapseToStart
-    method constructor
-    method containsNode
-    method deleteFromDocument
-    method empty
-    method extend
-    method getRangeAt
-    method modify
-    method removeAllRanges
-    method removeRange
-    method selectAllChildren
-    method setBaseAndExtent
-    method setPosition
-    method toString
-interface Sensor : EventTarget
-    attribute @@toStringTag
-    getter activated
-    getter hasReading
-    getter onactivate
-    getter onerror
-    getter onreading
-    getter timestamp
-    method constructor
-    method start
-    method stop
-    setter onactivate
-    setter onerror
-    setter onreading
-interface SensorErrorEvent : Event
-    attribute @@toStringTag
-    getter error
-    method constructor
-interface Serial : EventTarget
-    attribute @@toStringTag
-    getter onconnect
-    getter ondisconnect
-    method constructor
-    method getPorts
-    method requestPort
-    setter onconnect
-    setter ondisconnect
-interface SerialPort
-    attribute @@toStringTag
-    getter readable
-    getter writable
-    method close
-    method constructor
-    method getSignals
-    method open
-    method setSignals
-interface ServiceWorker : EventTarget
-    attribute @@toStringTag
-    getter onerror
-    getter onstatechange
-    getter scriptURL
-    getter state
-    method constructor
-    method postMessage
-    setter onerror
-    setter onstatechange
-interface ServiceWorkerContainer : EventTarget
-    attribute @@toStringTag
-    getter controller
-    getter oncontrollerchange
-    getter onmessage
-    getter onmessageerror
-    getter ready
-    method constructor
-    method getRegistration
-    method getRegistrations
-    method register
-    method startMessages
-    setter oncontrollerchange
-    setter onmessage
-    setter onmessageerror
-interface ServiceWorkerRegistration : EventTarget
-    attribute @@toStringTag
-    getter active
-    getter backgroundFetch
-    getter cookies
-    getter index
-    getter installing
-    getter navigationPreload
-    getter onupdatefound
-    getter paymentManager
-    getter periodicSync
-    getter pushManager
-    getter scope
-    getter sync
-    getter updateViaCache
-    getter waiting
-    method constructor
-    method getNotifications
-    method showNotification
-    method unregister
-    method update
-    setter onupdatefound
-interface ShadowRoot : DocumentFragment
-    attribute @@toStringTag
-    getter activeElement
-    getter adoptedStyleSheets
-    getter delegatesFocus
-    getter fullscreenElement
-    getter host
-    getter innerHTML
-    getter mode
-    getter pictureInPictureElement
-    getter pointerLockElement
-    getter styleSheets
-    method constructor
-    method elementFromPoint
-    method elementsFromPoint
-    method getSelection
-    setter adoptedStyleSheets
-    setter fullscreenElement
-    setter innerHTML
-interface SharedWorker : EventTarget
-    attribute @@toStringTag
-    getter onerror
-    getter port
-    method constructor
-    setter onerror
-interface SourceBuffer : EventTarget
-    attribute @@toStringTag
-    getter appendWindowEnd
-    getter appendWindowStart
-    getter audioTracks
-    getter buffered
-    getter mode
-    getter onabort
-    getter onerror
-    getter onupdate
-    getter onupdateend
-    getter onupdatestart
-    getter timestampOffset
-    getter trackDefaults
-    getter updating
-    getter videoTracks
-    method abort
-    method appendBuffer
-    method changeType
-    method constructor
-    method remove
-    setter appendWindowEnd
-    setter appendWindowStart
-    setter mode
-    setter onabort
-    setter onerror
-    setter onupdate
-    setter onupdateend
-    setter onupdatestart
-    setter timestampOffset
-    setter trackDefaults
-interface SourceBufferList : EventTarget
-    attribute @@toStringTag
-    getter length
-    getter onaddsourcebuffer
-    getter onremovesourcebuffer
-    method @@iterator
-    method constructor
-    setter onaddsourcebuffer
-    setter onremovesourcebuffer
-interface SpeechSynthesisErrorEvent : SpeechSynthesisEvent
-    attribute @@toStringTag
-    getter error
-    method constructor
-interface SpeechSynthesisEvent : Event
-    attribute @@toStringTag
-    getter charIndex
-    getter charLength
-    getter elapsedTime
-    getter name
-    getter utterance
-    method constructor
-interface SpeechSynthesisUtterance : EventTarget
-    attribute @@toStringTag
-    getter lang
-    getter onboundary
-    getter onend
-    getter onerror
-    getter onmark
-    getter onpause
-    getter onresume
-    getter onstart
-    getter pitch
-    getter rate
-    getter text
-    getter voice
-    getter volume
-    method constructor
-    setter lang
-    setter onboundary
-    setter onend
-    setter onerror
-    setter onmark
-    setter onpause
-    setter onresume
-    setter onstart
-    setter pitch
-    setter rate
-    setter text
-    setter voice
-    setter volume
-interface StaticRange
-    attribute @@toStringTag
-    getter collapsed
-    getter endContainer
-    getter endOffset
-    getter startContainer
-    getter startOffset
-    method constructor
-interface StereoPannerNode : AudioNode
-    attribute @@toStringTag
-    getter pan
-    method constructor
-interface Storage
-    attribute @@toStringTag
-    getter length
-    method clear
-    method constructor
-    method getItem
-    method key
-    method removeItem
-    method setItem
-interface StorageEvent : Event
-    attribute @@toStringTag
-    getter key
-    getter newValue
-    getter oldValue
-    getter storageArea
-    getter url
-    method constructor
-    method initStorageEvent
-interface StorageManager
-    attribute @@toStringTag
-    method constructor
-    method estimate
-    method persist
-    method persisted
-interface StylePropertyMap : StylePropertyMapReadOnly
-    attribute @@toStringTag
-    method append
-    method clear
-    method constructor
-    method delete
-    method set
-interface StylePropertyMapReadOnly
-    attribute @@toStringTag
-    getter size
-    method @@iterator
-    method constructor
-    method entries
-    method forEach
-    method get
-    method getAll
-    method has
-    method keys
-    method values
-interface StyleSheet
-    attribute @@toStringTag
-    getter disabled
-    getter href
-    getter media
-    getter ownerNode
-    getter parentStyleSheet
-    getter title
-    getter type
-    method constructor
-    setter disabled
-    setter media
-interface StyleSheetList
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method item
-interface SubtleCrypto
-    attribute @@toStringTag
-    method constructor
-    method decrypt
-    method deriveBits
-    method deriveKey
-    method digest
-    method encrypt
-    method exportKey
-    method generateKey
-    method importKey
-    method sign
-    method unwrapKey
-    method verify
-    method wrapKey
-interface SyncManager
-    attribute @@toStringTag
-    method constructor
-    method getTags
-    method register
-interface TaskAttributionTiming : PerformanceEntry
-    attribute @@toStringTag
-    getter containerId
-    getter containerName
-    getter containerSrc
-    getter containerType
-    method constructor
-    method toJSON
-interface TaskController : AbortController
-    attribute @@toStringTag
-    method constructor
-    method setPriority
-interface TaskSignal : AbortSignal
-    attribute @@toStringTag
-    getter priority
-    method constructor
-interface Text : CharacterData
-    attribute @@toStringTag
-    getter assignedSlot
-    getter wholeText
-    method constructor
-    method getDestinationInsertionPoints
-    method splitText
-interface TextDecoder
-    attribute @@toStringTag
-    getter encoding
-    getter fatal
-    getter ignoreBOM
-    method constructor
-    method decode
-interface TextDecoderStream
-    attribute @@toStringTag
-    getter encoding
-    getter fatal
-    getter ignoreBOM
-    getter readable
-    getter writable
-    method constructor
-interface TextDetector
-    attribute @@toStringTag
-    method constructor
-    method detect
-interface TextEncoder
-    attribute @@toStringTag
-    getter encoding
-    method constructor
-    method encode
-    method encodeInto
-interface TextEncoderStream
-    attribute @@toStringTag
-    getter encoding
-    getter readable
-    getter writable
-    method constructor
-interface TextEvent : UIEvent
-    attribute @@toStringTag
-    getter data
-    method constructor
-    method initTextEvent
-interface TextFormatUpdateEvent : Event
-    attribute @@toStringTag
-    getter backgroundColor
-    getter formatRangeEnd
-    getter formatRangeStart
-    getter textDecorationColor
-    getter textUnderlineStyle
-    getter underlineColor
-    method constructor
-interface TextMetrics
-    attribute @@toStringTag
-    getter actualBoundingBoxAscent
-    getter actualBoundingBoxDescent
-    getter actualBoundingBoxLeft
-    getter actualBoundingBoxRight
-    getter advances
-    getter emHeightAscent
-    getter emHeightDescent
-    getter fontBoundingBoxAscent
-    getter fontBoundingBoxDescent
-    getter width
-    method constructor
-    method getBaselines
-interface TextTrack : EventTarget
-    attribute @@toStringTag
-    getter activeCues
-    getter cues
-    getter id
-    getter kind
-    getter label
-    getter language
-    getter mode
-    getter oncuechange
-    method addCue
-    method constructor
-    method removeCue
-    setter mode
-    setter oncuechange
-interface TextTrackCue : EventTarget
-    attribute @@toStringTag
-    getter endTime
-    getter id
-    getter onenter
-    getter onexit
-    getter pauseOnExit
-    getter startTime
-    getter track
-    method constructor
-    setter endTime
-    setter id
-    setter onenter
-    setter onexit
-    setter pauseOnExit
-    setter startTime
-interface TextTrackCueList
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method getCueById
-interface TextTrackList : EventTarget
-    attribute @@toStringTag
-    getter length
-    getter onaddtrack
-    getter onchange
-    getter onremovetrack
-    method @@iterator
-    method constructor
-    method getTrackById
-    setter onaddtrack
-    setter onchange
-    setter onremovetrack
-interface TextUpdateEvent : Event
-    attribute @@toStringTag
-    getter newSelectionEnd
-    getter newSelectionStart
-    getter updateRangeEnd
-    getter updateRangeStart
-    getter updateText
-    method constructor
-interface TimeRanges
-    attribute @@toStringTag
-    getter length
-    method constructor
-    method end
-    method start
-interface TimestampTrigger
-    attribute @@toStringTag
-    getter timestamp
-    method constructor
-interface Touch
-    attribute @@toStringTag
-    getter clientX
-    getter clientY
-    getter force
-    getter identifier
-    getter pageX
-    getter pageY
-    getter radiusX
-    getter radiusY
-    getter region
-    getter rotationAngle
-    getter screenX
-    getter screenY
-    getter target
-    method constructor
-interface TouchEvent : UIEvent
-    attribute @@toStringTag
-    getter altKey
-    getter changedTouches
-    getter ctrlKey
-    getter metaKey
-    getter shiftKey
-    getter targetTouches
-    getter touches
-    method constructor
-interface TouchList
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method item
-interface TrackDefault
-    attribute @@toStringTag
-    getter byteStreamTrackID
-    getter kinds
-    getter label
-    getter language
-    getter type
-    method constructor
-interface TrackDefaultList
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-interface TrackEvent : Event
-    attribute @@toStringTag
-    getter track
-    method constructor
-interface TransformStream
-    attribute @@toStringTag
-    getter readable
-    getter writable
-    method constructor
-interface TransitionEvent : Event
-    attribute @@toStringTag
-    getter elapsedTime
-    getter propertyName
-    getter pseudoElement
-    method constructor
-interface TreeWalker
-    attribute @@toStringTag
-    getter currentNode
-    getter filter
-    getter root
-    getter whatToShow
-    method constructor
-    method firstChild
-    method lastChild
-    method nextNode
-    method nextSibling
-    method parentNode
-    method previousNode
-    method previousSibling
-    setter currentNode
-interface TrustedHTML
-    attribute @@toStringTag
-    method constructor
-    method toString
-interface TrustedScript
-    attribute @@toStringTag
-    method constructor
-    method toString
-interface TrustedScriptURL
-    attribute @@toStringTag
-    method constructor
-    method toString
-interface TrustedTypePolicy
-    attribute @@toStringTag
-    method constructor
-interface TrustedTypePolicyFactory
-    attribute @@toStringTag
-    method constructor
-    method getAttributeType
-    method getPropertyType
-    method getTypeMapping
-interface UIEvent : Event
-    attribute @@toStringTag
-    getter detail
-    getter sourceCapabilities
-    getter view
-    getter which
-    method constructor
-    method initUIEvent
-interface URL
-    static method createObjectURL
-    static method revokeObjectURL
-    attribute @@toStringTag
-    getter hash
-    getter host
-    getter hostname
-    getter href
-    getter origin
-    getter password
-    getter pathname
-    getter port
-    getter protocol
-    getter search
-    getter searchParams
-    getter username
-    method constructor
-    method toJSON
-    method toString
-    setter hash
-    setter host
-    setter hostname
-    setter href
-    setter password
-    setter pathname
-    setter port
-    setter protocol
-    setter search
-    setter username
-interface URLSearchParams
-    attribute @@toStringTag
-    method @@iterator
-    method append
-    method constructor
-    method delete
-    method entries
-    method forEach
-    method get
-    method getAll
-    method has
-    method keys
-    method set
-    method sort
-    method toString
-    method values
-interface USB : EventTarget
-    attribute @@toStringTag
-    getter onconnect
-    getter ondisconnect
-    method constructor
-    method getDevices
-    method requestDevice
-    setter onconnect
-    setter ondisconnect
-interface USBAlternateInterface
-    attribute @@toStringTag
-    getter alternateSetting
-    getter endpoints
-    getter interfaceClass
-    getter interfaceName
-    getter interfaceProtocol
-    getter interfaceSubclass
-    method constructor
-interface USBConfiguration
-    attribute @@toStringTag
-    getter configurationName
-    getter configurationValue
-    getter interfaces
-    method constructor
-interface USBConnectionEvent : Event
-    attribute @@toStringTag
-    getter device
-    method constructor
-interface USBDevice
-    attribute @@toStringTag
-    getter configuration
-    getter configurations
-    getter deviceClass
-    getter deviceProtocol
-    getter deviceSubclass
-    getter deviceVersionMajor
-    getter deviceVersionMinor
-    getter deviceVersionSubminor
-    getter manufacturerName
-    getter opened
-    getter productId
-    getter productName
-    getter serialNumber
-    getter usbVersionMajor
-    getter usbVersionMinor
-    getter usbVersionSubminor
-    getter vendorId
-    method claimInterface
-    method clearHalt
-    method close
-    method constructor
-    method controlTransferIn
-    method controlTransferOut
-    method isochronousTransferIn
-    method isochronousTransferOut
-    method open
-    method releaseInterface
-    method reset
-    method selectAlternateInterface
-    method selectConfiguration
-    method transferIn
-    method transferOut
-interface USBEndpoint
-    attribute @@toStringTag
-    getter direction
-    getter endpointNumber
-    getter packetSize
-    getter type
-    method constructor
-interface USBInTransferResult
-    attribute @@toStringTag
-    getter data
-    getter status
-    method constructor
-interface USBInterface
-    attribute @@toStringTag
-    getter alternate
-    getter alternates
-    getter claimed
-    getter interfaceNumber
-    method constructor
-interface USBIsochronousInTransferPacket
-    attribute @@toStringTag
-    getter data
-    getter status
-    method constructor
-interface USBIsochronousInTransferResult
-    attribute @@toStringTag
-    getter data
-    getter packets
-    method constructor
-interface USBIsochronousOutTransferPacket
-    attribute @@toStringTag
-    getter bytesWritten
-    getter status
-    method constructor
-interface USBIsochronousOutTransferResult
-    attribute @@toStringTag
-    getter packets
-    method constructor
-interface USBOutTransferResult
-    attribute @@toStringTag
-    getter bytesWritten
-    getter status
-    method constructor
-interface UserActivation
-    attribute @@toStringTag
-    getter hasBeenActive
-    getter isActive
-    method constructor
-interface VTTCue : TextTrackCue
-    attribute @@toStringTag
-    getter align
-    getter line
-    getter position
-    getter region
-    getter size
-    getter snapToLines
-    getter text
-    getter vertical
-    method constructor
-    method getCueAsHTML
-    setter align
-    setter line
-    setter position
-    setter region
-    setter size
-    setter snapToLines
-    setter text
-    setter vertical
-interface VTTRegion
-    attribute @@toStringTag
-    getter id
-    getter lines
-    getter regionAnchorX
-    getter regionAnchorY
-    getter scroll
-    getter viewportAnchorX
-    getter viewportAnchorY
-    getter width
-    method constructor
-    setter id
-    setter lines
-    setter regionAnchorX
-    setter regionAnchorY
-    setter scroll
-    setter viewportAnchorX
-    setter viewportAnchorY
-    setter width
-interface ValidityState
-    attribute @@toStringTag
-    getter badInput
-    getter customError
-    getter patternMismatch
-    getter rangeOverflow
-    getter rangeUnderflow
-    getter stepMismatch
-    getter tooLong
-    getter tooShort
-    getter typeMismatch
-    getter valid
-    getter valueMissing
-    method constructor
-interface VideoPlaybackQuality
-    attribute @@toStringTag
-    getter corruptedVideoFrames
-    getter creationTime
-    getter droppedVideoFrames
-    getter totalVideoFrames
-    method constructor
-interface VideoTrack
-    attribute @@toStringTag
-    getter id
-    getter kind
-    getter label
-    getter language
-    getter selected
-    getter sourceBuffer
-    method constructor
-    setter selected
-interface VideoTrackList : EventTarget
-    attribute @@toStringTag
-    getter length
-    getter onaddtrack
-    getter onchange
-    getter onremovetrack
-    getter selectedIndex
-    method @@iterator
-    method constructor
-    method getTrackById
-    setter onaddtrack
-    setter onchange
-    setter onremovetrack
-interface VisualViewport : EventTarget
-    attribute @@toStringTag
-    getter height
-    getter offsetLeft
-    getter offsetTop
-    getter onresize
-    getter onscroll
-    getter pageLeft
-    getter pageTop
-    getter scale
-    getter width
-    method constructor
-    setter onresize
-    setter onscroll
-interface WakeLock
-    attribute @@toStringTag
-    method constructor
-    method request
-interface WakeLockSentinel : EventTarget
-    attribute @@toStringTag
-    getter onrelease
-    getter type
-    method constructor
-    method release
-    setter onrelease
-interface WaveShaperNode : AudioNode
-    attribute @@toStringTag
-    getter curve
-    getter oversample
-    method constructor
-    setter curve
-    setter oversample
-interface WebGL2ComputeRenderingContext
-    attribute @@toStringTag
-    attribute ACTIVE_ATOMIC_COUNTER_BUFFERS
-    attribute ACTIVE_ATTRIBUTES
-    attribute ACTIVE_RESOURCES
-    attribute ACTIVE_TEXTURE
-    attribute ACTIVE_UNIFORMS
-    attribute ACTIVE_UNIFORM_BLOCKS
-    attribute ACTIVE_VARIABLES
-    attribute ALIASED_LINE_WIDTH_RANGE
-    attribute ALIASED_POINT_SIZE_RANGE
-    attribute ALL_BARRIER_BITS
-    attribute ALPHA
-    attribute ALPHA_BITS
-    attribute ALREADY_SIGNALED
-    attribute ALWAYS
-    attribute ANY_SAMPLES_PASSED
-    attribute ANY_SAMPLES_PASSED_CONSERVATIVE
-    attribute ARRAY_BUFFER
-    attribute ARRAY_BUFFER_BINDING
-    attribute ARRAY_SIZE
-    attribute ARRAY_STRIDE
-    attribute ATOMIC_COUNTER_BARRIER_BIT
-    attribute ATOMIC_COUNTER_BUFFER
-    attribute ATOMIC_COUNTER_BUFFER_BINDING
-    attribute ATOMIC_COUNTER_BUFFER_INDEX
-    attribute ATOMIC_COUNTER_BUFFER_SIZE
-    attribute ATOMIC_COUNTER_BUFFER_START
-    attribute ATTACHED_SHADERS
-    attribute BACK
-    attribute BLEND
-    attribute BLEND_COLOR
-    attribute BLEND_DST_ALPHA
-    attribute BLEND_DST_RGB
-    attribute BLEND_EQUATION
-    attribute BLEND_EQUATION_ALPHA
-    attribute BLEND_EQUATION_RGB
-    attribute BLEND_SRC_ALPHA
-    attribute BLEND_SRC_RGB
-    attribute BLOCK_INDEX
-    attribute BLUE_BITS
-    attribute BOOL
-    attribute BOOL_VEC2
-    attribute BOOL_VEC3
-    attribute BOOL_VEC4
-    attribute BROWSER_DEFAULT_WEBGL
-    attribute BUFFER_BINDING
-    attribute BUFFER_DATA_SIZE
-    attribute BUFFER_SIZE
-    attribute BUFFER_UPDATE_BARRIER_BIT
-    attribute BUFFER_USAGE
-    attribute BUFFER_VARIABLE
-    attribute BYTE
-    attribute CCW
-    attribute CLAMP_TO_EDGE
-    attribute COLOR
-    attribute COLOR_ATTACHMENT0
-    attribute COLOR_ATTACHMENT1
-    attribute COLOR_ATTACHMENT10
-    attribute COLOR_ATTACHMENT11
-    attribute COLOR_ATTACHMENT12
-    attribute COLOR_ATTACHMENT13
-    attribute COLOR_ATTACHMENT14
-    attribute COLOR_ATTACHMENT15
-    attribute COLOR_ATTACHMENT2
-    attribute COLOR_ATTACHMENT3
-    attribute COLOR_ATTACHMENT4
-    attribute COLOR_ATTACHMENT5
-    attribute COLOR_ATTACHMENT6
-    attribute COLOR_ATTACHMENT7
-    attribute COLOR_ATTACHMENT8
-    attribute COLOR_ATTACHMENT9
-    attribute COLOR_BUFFER_BIT
-    attribute COLOR_CLEAR_VALUE
-    attribute COLOR_WRITEMASK
-    attribute COMMAND_BARRIER_BIT
-    attribute COMPARE_REF_TO_TEXTURE
-    attribute COMPILE_STATUS
-    attribute COMPRESSED_TEXTURE_FORMATS
-    attribute COMPUTE_SHADER
-    attribute CONDITION_SATISFIED
-    attribute CONSTANT_ALPHA
-    attribute CONSTANT_COLOR
-    attribute CONTEXT_LOST_WEBGL
-    attribute COPY_READ_BUFFER
-    attribute COPY_READ_BUFFER_BINDING
-    attribute COPY_WRITE_BUFFER
-    attribute COPY_WRITE_BUFFER_BINDING
-    attribute CULL_FACE
-    attribute CULL_FACE_MODE
-    attribute CURRENT_PROGRAM
-    attribute CURRENT_QUERY
-    attribute CURRENT_VERTEX_ATTRIB
-    attribute CW
-    attribute DECR
-    attribute DECR_WRAP
-    attribute DELETE_STATUS
-    attribute DEPTH
-    attribute DEPTH24_STENCIL8
-    attribute DEPTH32F_STENCIL8
-    attribute DEPTH_ATTACHMENT
-    attribute DEPTH_BITS
-    attribute DEPTH_BUFFER_BIT
-    attribute DEPTH_CLEAR_VALUE
-    attribute DEPTH_COMPONENT
-    attribute DEPTH_COMPONENT16
-    attribute DEPTH_COMPONENT24
-    attribute DEPTH_COMPONENT32F
-    attribute DEPTH_FUNC
-    attribute DEPTH_RANGE
-    attribute DEPTH_STENCIL
-    attribute DEPTH_STENCIL_ATTACHMENT
-    attribute DEPTH_TEST
-    attribute DEPTH_WRITEMASK
-    attribute DISPATCH_INDIRECT_BUFFER
-    attribute DISPATCH_INDIRECT_BUFFER_BINDING
-    attribute DITHER
-    attribute DONT_CARE
-    attribute DRAW_BUFFER0
-    attribute DRAW_BUFFER1
-    attribute DRAW_BUFFER10
-    attribute DRAW_BUFFER11
-    attribute DRAW_BUFFER12
-    attribute DRAW_BUFFER13
-    attribute DRAW_BUFFER14
-    attribute DRAW_BUFFER15
-    attribute DRAW_BUFFER2
-    attribute DRAW_BUFFER3
-    attribute DRAW_BUFFER4
-    attribute DRAW_BUFFER5
-    attribute DRAW_BUFFER6
-    attribute DRAW_BUFFER7
-    attribute DRAW_BUFFER8
-    attribute DRAW_BUFFER9
-    attribute DRAW_FRAMEBUFFER
-    attribute DRAW_FRAMEBUFFER_BINDING
-    attribute DRAW_INDIRECT_BUFFER
-    attribute DRAW_INDIRECT_BUFFER_BINDING
-    attribute DST_ALPHA
-    attribute DST_COLOR
-    attribute DYNAMIC_COPY
-    attribute DYNAMIC_DRAW
-    attribute DYNAMIC_READ
-    attribute ELEMENT_ARRAY_BARRIER_BIT
-    attribute ELEMENT_ARRAY_BUFFER
-    attribute ELEMENT_ARRAY_BUFFER_BINDING
-    attribute EQUAL
-    attribute FASTEST
-    attribute FLOAT
-    attribute FLOAT_32_UNSIGNED_INT_24_8_REV
-    attribute FLOAT_MAT2
-    attribute FLOAT_MAT2x3
-    attribute FLOAT_MAT2x4
-    attribute FLOAT_MAT3
-    attribute FLOAT_MAT3x2
-    attribute FLOAT_MAT3x4
-    attribute FLOAT_MAT4
-    attribute FLOAT_MAT4x2
-    attribute FLOAT_MAT4x3
-    attribute FLOAT_VEC2
-    attribute FLOAT_VEC3
-    attribute FLOAT_VEC4
-    attribute FRAGMENT_SHADER
-    attribute FRAGMENT_SHADER_DERIVATIVE_HINT
-    attribute FRAMEBUFFER
-    attribute FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE
-    attribute FRAMEBUFFER_ATTACHMENT_BLUE_SIZE
-    attribute FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING
-    attribute FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE
-    attribute FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE
-    attribute FRAMEBUFFER_ATTACHMENT_GREEN_SIZE
-    attribute FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
-    attribute FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
-    attribute FRAMEBUFFER_ATTACHMENT_RED_SIZE
-    attribute FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE
-    attribute FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE
-    attribute FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER
-    attribute FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL
-    attribute FRAMEBUFFER_BARRIER_BIT
-    attribute FRAMEBUFFER_BINDING
-    attribute FRAMEBUFFER_COMPLETE
-    attribute FRAMEBUFFER_DEFAULT
-    attribute FRAMEBUFFER_INCOMPLETE_ATTACHMENT
-    attribute FRAMEBUFFER_INCOMPLETE_DIMENSIONS
-    attribute FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
-    attribute FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
-    attribute FRAMEBUFFER_UNSUPPORTED
-    attribute FRONT
-    attribute FRONT_AND_BACK
-    attribute FRONT_FACE
-    attribute FUNC_ADD
-    attribute FUNC_REVERSE_SUBTRACT
-    attribute FUNC_SUBTRACT
-    attribute GENERATE_MIPMAP_HINT
-    attribute GEQUAL
-    attribute GREATER
-    attribute GREEN_BITS
-    attribute HALF_FLOAT
-    attribute HIGH_FLOAT
-    attribute HIGH_INT
-    attribute IMPLEMENTATION_COLOR_READ_FORMAT
-    attribute IMPLEMENTATION_COLOR_READ_TYPE
-    attribute INCR
-    attribute INCR_WRAP
-    attribute INT
-    attribute INTERLEAVED_ATTRIBS
-    attribute INT_2_10_10_10_REV
-    attribute INT_SAMPLER_2D
-    attribute INT_SAMPLER_2D_ARRAY
-    attribute INT_SAMPLER_3D
-    attribute INT_SAMPLER_CUBE
-    attribute INT_VEC2
-    attribute INT_VEC3
-    attribute INT_VEC4
-    attribute INVALID_ENUM
-    attribute INVALID_FRAMEBUFFER_OPERATION
-    attribute INVALID_INDEX
-    attribute INVALID_OPERATION
-    attribute INVALID_VALUE
-    attribute INVERT
-    attribute IS_ROW_MAJOR
-    attribute KEEP
-    attribute LEQUAL
-    attribute LESS
-    attribute LINEAR
-    attribute LINEAR_MIPMAP_LINEAR
-    attribute LINEAR_MIPMAP_NEAREST
-    attribute LINES
-    attribute LINE_LOOP
-    attribute LINE_STRIP
-    attribute LINE_WIDTH
-    attribute LINK_STATUS
-    attribute LOCATION
-    attribute LOW_FLOAT
-    attribute LOW_INT
-    attribute LUMINANCE
-    attribute LUMINANCE_ALPHA
-    attribute MATRIX_STRIDE
-    attribute MAX
-    attribute MAX_3D_TEXTURE_SIZE
-    attribute MAX_ARRAY_TEXTURE_LAYERS
-    attribute MAX_ATOMIC_COUNTER_BUFFER_BINDINGS
-    attribute MAX_ATOMIC_COUNTER_BUFFER_SIZE
-    attribute MAX_CLIENT_WAIT_TIMEOUT_WEBGL
-    attribute MAX_COLOR_ATTACHMENTS
-    attribute MAX_COMBINED_ATOMIC_COUNTERS
-    attribute MAX_COMBINED_ATOMIC_COUNTER_BUFFERS
-    attribute MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS
-    attribute MAX_COMBINED_SHADER_STORAGE_BLOCKS
-    attribute MAX_COMBINED_TEXTURE_IMAGE_UNITS
-    attribute MAX_COMBINED_UNIFORM_BLOCKS
-    attribute MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS
-    attribute MAX_COMPUTE_ATOMIC_COUNTERS
-    attribute MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS
-    attribute MAX_COMPUTE_IMAGE_UNIFORMS
-    attribute MAX_COMPUTE_SHADER_STORAGE_BLOCKS
-    attribute MAX_COMPUTE_SHARED_MEMORY_SIZE
-    attribute MAX_COMPUTE_TEXTURE_IMAGE_UNITS
-    attribute MAX_COMPUTE_UNIFORM_BLOCKS
-    attribute MAX_COMPUTE_UNIFORM_COMPONENTS
-    attribute MAX_COMPUTE_WORK_GROUP_COUNT
-    attribute MAX_COMPUTE_WORK_GROUP_INVOCATIONS
-    attribute MAX_COMPUTE_WORK_GROUP_SIZE
-    attribute MAX_CUBE_MAP_TEXTURE_SIZE
-    attribute MAX_DRAW_BUFFERS
-    attribute MAX_ELEMENTS_INDICES
-    attribute MAX_ELEMENTS_VERTICES
-    attribute MAX_ELEMENT_INDEX
-    attribute MAX_FRAGMENT_ATOMIC_COUNTERS
-    attribute MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS
-    attribute MAX_FRAGMENT_INPUT_COMPONENTS
-    attribute MAX_FRAGMENT_SHADER_STORAGE_BLOCKS
-    attribute MAX_FRAGMENT_UNIFORM_BLOCKS
-    attribute MAX_FRAGMENT_UNIFORM_COMPONENTS
-    attribute MAX_FRAGMENT_UNIFORM_VECTORS
-    attribute MAX_NAME_LENGTH
-    attribute MAX_NUM_ACTIVE_VARIABLES
-    attribute MAX_PROGRAM_TEXEL_OFFSET
-    attribute MAX_RENDERBUFFER_SIZE
-    attribute MAX_SAMPLES
-    attribute MAX_SERVER_WAIT_TIMEOUT
-    attribute MAX_SHADER_STORAGE_BLOCK_SIZE
-    attribute MAX_SHADER_STORAGE_BUFFER_BINDINGS
-    attribute MAX_TEXTURE_IMAGE_UNITS
-    attribute MAX_TEXTURE_LOD_BIAS
-    attribute MAX_TEXTURE_SIZE
-    attribute MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS
-    attribute MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS
-    attribute MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS
-    attribute MAX_UNIFORM_BLOCK_SIZE
-    attribute MAX_UNIFORM_BUFFER_BINDINGS
-    attribute MAX_VARYING_COMPONENTS
-    attribute MAX_VARYING_VECTORS
-    attribute MAX_VERTEX_ATOMIC_COUNTERS
-    attribute MAX_VERTEX_ATOMIC_COUNTER_BUFFERS
-    attribute MAX_VERTEX_ATTRIBS
-    attribute MAX_VERTEX_OUTPUT_COMPONENTS
-    attribute MAX_VERTEX_SHADER_STORAGE_BLOCKS
-    attribute MAX_VERTEX_TEXTURE_IMAGE_UNITS
-    attribute MAX_VERTEX_UNIFORM_BLOCKS
-    attribute MAX_VERTEX_UNIFORM_COMPONENTS
-    attribute MAX_VERTEX_UNIFORM_VECTORS
-    attribute MAX_VIEWPORT_DIMS
-    attribute MEDIUM_FLOAT
-    attribute MEDIUM_INT
-    attribute MIN
-    attribute MIN_PROGRAM_TEXEL_OFFSET
-    attribute MIRRORED_REPEAT
-    attribute NAME_LENGTH
-    attribute NEAREST
-    attribute NEAREST_MIPMAP_LINEAR
-    attribute NEAREST_MIPMAP_NEAREST
-    attribute NEVER
-    attribute NICEST
-    attribute NONE
-    attribute NOTEQUAL
-    attribute NO_ERROR
-    attribute NUM_ACTIVE_VARIABLES
-    attribute OBJECT_TYPE
-    attribute OFFSET
-    attribute ONE
-    attribute ONE_MINUS_CONSTANT_ALPHA
-    attribute ONE_MINUS_CONSTANT_COLOR
-    attribute ONE_MINUS_DST_ALPHA
-    attribute ONE_MINUS_DST_COLOR
-    attribute ONE_MINUS_SRC_ALPHA
-    attribute ONE_MINUS_SRC_COLOR
-    attribute OUT_OF_MEMORY
-    attribute PACK_ALIGNMENT
-    attribute PACK_ROW_LENGTH
-    attribute PACK_SKIP_PIXELS
-    attribute PACK_SKIP_ROWS
-    attribute PIXEL_BUFFER_BARRIER_BIT
-    attribute PIXEL_PACK_BUFFER
-    attribute PIXEL_PACK_BUFFER_BINDING
-    attribute PIXEL_UNPACK_BUFFER
-    attribute PIXEL_UNPACK_BUFFER_BINDING
-    attribute POINTS
-    attribute POLYGON_OFFSET_FACTOR
-    attribute POLYGON_OFFSET_FILL
-    attribute POLYGON_OFFSET_UNITS
-    attribute PROGRAM_INPUT
-    attribute PROGRAM_OUTPUT
-    attribute QUERY_RESULT
-    attribute QUERY_RESULT_AVAILABLE
-    attribute R11F_G11F_B10F
-    attribute R16F
-    attribute R16I
-    attribute R16UI
-    attribute R32F
-    attribute R32I
-    attribute R32UI
-    attribute R8
-    attribute R8I
-    attribute R8UI
-    attribute R8_SNORM
-    attribute RASTERIZER_DISCARD
-    attribute READ_BUFFER
-    attribute READ_FRAMEBUFFER
-    attribute READ_FRAMEBUFFER_BINDING
-    attribute READ_ONLY
-    attribute READ_WRITE
-    attribute RED
-    attribute RED_BITS
-    attribute RED_INTEGER
-    attribute REFERENCED_BY_COMPUTE_SHADER
-    attribute REFERENCED_BY_FRAGMENT_SHADER
-    attribute REFERENCED_BY_VERTEX_SHADER
-    attribute RENDERBUFFER
-    attribute RENDERBUFFER_ALPHA_SIZE
-    attribute RENDERBUFFER_BINDING
-    attribute RENDERBUFFER_BLUE_SIZE
-    attribute RENDERBUFFER_DEPTH_SIZE
-    attribute RENDERBUFFER_GREEN_SIZE
-    attribute RENDERBUFFER_HEIGHT
-    attribute RENDERBUFFER_INTERNAL_FORMAT
-    attribute RENDERBUFFER_RED_SIZE
-    attribute RENDERBUFFER_SAMPLES
-    attribute RENDERBUFFER_STENCIL_SIZE
-    attribute RENDERBUFFER_WIDTH
-    attribute RENDERER
-    attribute REPEAT
-    attribute REPLACE
-    attribute RG
-    attribute RG16F
-    attribute RG16I
-    attribute RG16UI
-    attribute RG32F
-    attribute RG32I
-    attribute RG32UI
-    attribute RG8
-    attribute RG8I
-    attribute RG8UI
-    attribute RG8_SNORM
-    attribute RGB
-    attribute RGB10_A2
-    attribute RGB10_A2UI
-    attribute RGB16F
-    attribute RGB16I
-    attribute RGB16UI
-    attribute RGB32F
-    attribute RGB32I
-    attribute RGB32UI
-    attribute RGB565
-    attribute RGB5_A1
-    attribute RGB8
-    attribute RGB8I
-    attribute RGB8UI
-    attribute RGB8_SNORM
-    attribute RGB9_E5
-    attribute RGBA
-    attribute RGBA16F
-    attribute RGBA16I
-    attribute RGBA16UI
-    attribute RGBA32F
-    attribute RGBA32I
-    attribute RGBA32UI
-    attribute RGBA4
-    attribute RGBA8
-    attribute RGBA8I
-    attribute RGBA8UI
-    attribute RGBA8_SNORM
-    attribute RGBA_INTEGER
-    attribute RGB_INTEGER
-    attribute RG_INTEGER
-    attribute SAMPLER_2D
-    attribute SAMPLER_2D_ARRAY
-    attribute SAMPLER_2D_ARRAY_SHADOW
-    attribute SAMPLER_2D_SHADOW
-    attribute SAMPLER_3D
-    attribute SAMPLER_BINDING
-    attribute SAMPLER_CUBE
-    attribute SAMPLER_CUBE_SHADOW
-    attribute SAMPLES
-    attribute SAMPLE_ALPHA_TO_COVERAGE
-    attribute SAMPLE_BUFFERS
-    attribute SAMPLE_COVERAGE
-    attribute SAMPLE_COVERAGE_INVERT
-    attribute SAMPLE_COVERAGE_VALUE
-    attribute SCISSOR_BOX
-    attribute SCISSOR_TEST
-    attribute SEPARATE_ATTRIBS
-    attribute SHADER_IMAGE_ACCESS_BARRIER_BIT
-    attribute SHADER_STORAGE_BARRIER_BIT
-    attribute SHADER_STORAGE_BLOCK
-    attribute SHADER_STORAGE_BUFFER
-    attribute SHADER_STORAGE_BUFFER_BINDING
-    attribute SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT
-    attribute SHADER_STORAGE_BUFFER_SIZE
-    attribute SHADER_STORAGE_BUFFER_START
-    attribute SHADER_TYPE
-    attribute SHADING_LANGUAGE_VERSION
-    attribute SHORT
-    attribute SIGNALED
-    attribute SIGNED_NORMALIZED
-    attribute SRC_ALPHA
-    attribute SRC_ALPHA_SATURATE
-    attribute SRC_COLOR
-    attribute SRGB
-    attribute SRGB8
-    attribute SRGB8_ALPHA8
-    attribute STATIC_COPY
-    attribute STATIC_DRAW
-    attribute STATIC_READ
-    attribute STENCIL
-    attribute STENCIL_ATTACHMENT
-    attribute STENCIL_BACK_FAIL
-    attribute STENCIL_BACK_FUNC
-    attribute STENCIL_BACK_PASS_DEPTH_FAIL
-    attribute STENCIL_BACK_PASS_DEPTH_PASS
-    attribute STENCIL_BACK_REF
-    attribute STENCIL_BACK_VALUE_MASK
-    attribute STENCIL_BACK_WRITEMASK
-    attribute STENCIL_BITS
-    attribute STENCIL_BUFFER_BIT
-    attribute STENCIL_CLEAR_VALUE
-    attribute STENCIL_FAIL
-    attribute STENCIL_FUNC
-    attribute STENCIL_INDEX8
-    attribute STENCIL_PASS_DEPTH_FAIL
-    attribute STENCIL_PASS_DEPTH_PASS
-    attribute STENCIL_REF
-    attribute STENCIL_TEST
-    attribute STENCIL_VALUE_MASK
-    attribute STENCIL_WRITEMASK
-    attribute STREAM_COPY
-    attribute STREAM_DRAW
-    attribute STREAM_READ
-    attribute SUBPIXEL_BITS
-    attribute SYNC_CONDITION
-    attribute SYNC_FENCE
-    attribute SYNC_FLAGS
-    attribute SYNC_FLUSH_COMMANDS_BIT
-    attribute SYNC_GPU_COMMANDS_COMPLETE
-    attribute SYNC_STATUS
-    attribute TEXTURE
-    attribute TEXTURE0
-    attribute TEXTURE1
-    attribute TEXTURE10
-    attribute TEXTURE11
-    attribute TEXTURE12
-    attribute TEXTURE13
-    attribute TEXTURE14
-    attribute TEXTURE15
-    attribute TEXTURE16
-    attribute TEXTURE17
-    attribute TEXTURE18
-    attribute TEXTURE19
-    attribute TEXTURE2
-    attribute TEXTURE20
-    attribute TEXTURE21
-    attribute TEXTURE22
-    attribute TEXTURE23
-    attribute TEXTURE24
-    attribute TEXTURE25
-    attribute TEXTURE26
-    attribute TEXTURE27
-    attribute TEXTURE28
-    attribute TEXTURE29
-    attribute TEXTURE3
-    attribute TEXTURE30
-    attribute TEXTURE31
-    attribute TEXTURE4
-    attribute TEXTURE5
-    attribute TEXTURE6
-    attribute TEXTURE7
-    attribute TEXTURE8
-    attribute TEXTURE9
-    attribute TEXTURE_2D
-    attribute TEXTURE_2D_ARRAY
-    attribute TEXTURE_3D
-    attribute TEXTURE_BASE_LEVEL
-    attribute TEXTURE_BINDING_2D
-    attribute TEXTURE_BINDING_2D_ARRAY
-    attribute TEXTURE_BINDING_3D
-    attribute TEXTURE_BINDING_CUBE_MAP
-    attribute TEXTURE_COMPARE_FUNC
-    attribute TEXTURE_COMPARE_MODE
-    attribute TEXTURE_CUBE_MAP
-    attribute TEXTURE_CUBE_MAP_NEGATIVE_X
-    attribute TEXTURE_CUBE_MAP_NEGATIVE_Y
-    attribute TEXTURE_CUBE_MAP_NEGATIVE_Z
-    attribute TEXTURE_CUBE_MAP_POSITIVE_X
-    attribute TEXTURE_CUBE_MAP_POSITIVE_Y
-    attribute TEXTURE_CUBE_MAP_POSITIVE_Z
-    attribute TEXTURE_FETCH_BARRIER_BIT
-    attribute TEXTURE_IMMUTABLE_FORMAT
-    attribute TEXTURE_IMMUTABLE_LEVELS
-    attribute TEXTURE_MAG_FILTER
-    attribute TEXTURE_MAX_LEVEL
-    attribute TEXTURE_MAX_LOD
-    attribute TEXTURE_MIN_FILTER
-    attribute TEXTURE_MIN_LOD
-    attribute TEXTURE_UPDATE_BARRIER_BIT
-    attribute TEXTURE_WRAP_R
-    attribute TEXTURE_WRAP_S
-    attribute TEXTURE_WRAP_T
-    attribute TIMEOUT_EXPIRED
-    attribute TIMEOUT_IGNORED
-    attribute TOP_LEVEL_ARRAY_SIZE
-    attribute TOP_LEVEL_ARRAY_STRIDE
-    attribute TRANSFORM_FEEDBACK
-    attribute TRANSFORM_FEEDBACK_ACTIVE
-    attribute TRANSFORM_FEEDBACK_BARRIER_BIT
-    attribute TRANSFORM_FEEDBACK_BINDING
-    attribute TRANSFORM_FEEDBACK_BUFFER
-    attribute TRANSFORM_FEEDBACK_BUFFER_BINDING
-    attribute TRANSFORM_FEEDBACK_BUFFER_MODE
-    attribute TRANSFORM_FEEDBACK_BUFFER_SIZE
-    attribute TRANSFORM_FEEDBACK_BUFFER_START
-    attribute TRANSFORM_FEEDBACK_PAUSED
-    attribute TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN
-    attribute TRANSFORM_FEEDBACK_VARYING
-    attribute TRANSFORM_FEEDBACK_VARYINGS
-    attribute TRIANGLES
-    attribute TRIANGLE_FAN
-    attribute TRIANGLE_STRIP
-    attribute TYPE
-    attribute UNIFORM
-    attribute UNIFORM_ARRAY_STRIDE
-    attribute UNIFORM_BARRIER_BIT
-    attribute UNIFORM_BLOCK
-    attribute UNIFORM_BLOCK_ACTIVE_UNIFORMS
-    attribute UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES
-    attribute UNIFORM_BLOCK_BINDING
-    attribute UNIFORM_BLOCK_DATA_SIZE
-    attribute UNIFORM_BLOCK_INDEX
-    attribute UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER
-    attribute UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER
-    attribute UNIFORM_BUFFER
-    attribute UNIFORM_BUFFER_BINDING
-    attribute UNIFORM_BUFFER_OFFSET_ALIGNMENT
-    attribute UNIFORM_BUFFER_SIZE
-    attribute UNIFORM_BUFFER_START
-    attribute UNIFORM_IS_ROW_MAJOR
-    attribute UNIFORM_MATRIX_STRIDE
-    attribute UNIFORM_OFFSET
-    attribute UNIFORM_SIZE
-    attribute UNIFORM_TYPE
-    attribute UNPACK_ALIGNMENT
-    attribute UNPACK_COLORSPACE_CONVERSION_WEBGL
-    attribute UNPACK_FLIP_Y_WEBGL
-    attribute UNPACK_IMAGE_HEIGHT
-    attribute UNPACK_PREMULTIPLY_ALPHA_WEBGL
-    attribute UNPACK_ROW_LENGTH
-    attribute UNPACK_SKIP_IMAGES
-    attribute UNPACK_SKIP_PIXELS
-    attribute UNPACK_SKIP_ROWS
-    attribute UNSIGNALED
-    attribute UNSIGNED_BYTE
-    attribute UNSIGNED_INT
-    attribute UNSIGNED_INT_10F_11F_11F_REV
-    attribute UNSIGNED_INT_24_8
-    attribute UNSIGNED_INT_2_10_10_10_REV
-    attribute UNSIGNED_INT_5_9_9_9_REV
-    attribute UNSIGNED_INT_ATOMIC_COUNTER
-    attribute UNSIGNED_INT_SAMPLER_2D
-    attribute UNSIGNED_INT_SAMPLER_2D_ARRAY
-    attribute UNSIGNED_INT_SAMPLER_3D
-    attribute UNSIGNED_INT_SAMPLER_CUBE
-    attribute UNSIGNED_INT_VEC2
-    attribute UNSIGNED_INT_VEC3
-    attribute UNSIGNED_INT_VEC4
-    attribute UNSIGNED_NORMALIZED
-    attribute UNSIGNED_SHORT
-    attribute UNSIGNED_SHORT_4_4_4_4
-    attribute UNSIGNED_SHORT_5_5_5_1
-    attribute UNSIGNED_SHORT_5_6_5
-    attribute VALIDATE_STATUS
-    attribute VENDOR
-    attribute VERSION
-    attribute VERTEX_ARRAY_BINDING
-    attribute VERTEX_ATTRIB_ARRAY_BARRIER_BIT
-    attribute VERTEX_ATTRIB_ARRAY_BUFFER_BINDING
-    attribute VERTEX_ATTRIB_ARRAY_DIVISOR
-    attribute VERTEX_ATTRIB_ARRAY_ENABLED
-    attribute VERTEX_ATTRIB_ARRAY_INTEGER
-    attribute VERTEX_ATTRIB_ARRAY_NORMALIZED
-    attribute VERTEX_ATTRIB_ARRAY_POINTER
-    attribute VERTEX_ATTRIB_ARRAY_SIZE
-    attribute VERTEX_ATTRIB_ARRAY_STRIDE
-    attribute VERTEX_ATTRIB_ARRAY_TYPE
-    attribute VERTEX_SHADER
-    attribute VIEWPORT
-    attribute WAIT_FAILED
-    attribute WRITE_ONLY
-    attribute ZERO
-    getter canvas
-    getter drawingBufferHeight
-    getter drawingBufferWidth
-    method activeTexture
-    method attachShader
-    method beginQuery
-    method beginTransformFeedback
-    method bindAttribLocation
-    method bindBuffer
-    method bindBufferBase
-    method bindBufferRange
-    method bindFramebuffer
-    method bindImageTexture
-    method bindRenderbuffer
-    method bindSampler
-    method bindTexture
-    method bindTransformFeedback
-    method bindVertexArray
-    method blendColor
-    method blendEquation
-    method blendEquationSeparate
-    method blendFunc
-    method blendFuncSeparate
-    method blitFramebuffer
-    method bufferData
-    method bufferSubData
-    method checkFramebufferStatus
-    method clear
-    method clearBufferfi
-    method clearBufferfv
-    method clearBufferiv
-    method clearBufferuiv
-    method clearColor
-    method clearDepth
-    method clearStencil
-    method clientWaitSync
-    method colorMask
-    method commit
-    method compileShader
-    method compressedTexImage2D
-    method compressedTexImage3D
-    method compressedTexSubImage2D
-    method compressedTexSubImage3D
-    method constructor
-    method copyBufferSubData
-    method copyTexImage2D
-    method copyTexSubImage2D
-    method copyTexSubImage3D
-    method createBuffer
-    method createFramebuffer
-    method createProgram
-    method createQuery
-    method createRenderbuffer
-    method createSampler
-    method createShader
-    method createTexture
-    method createTransformFeedback
-    method createVertexArray
-    method cullFace
-    method deleteBuffer
-    method deleteFramebuffer
-    method deleteProgram
-    method deleteQuery
-    method deleteRenderbuffer
-    method deleteSampler
-    method deleteShader
-    method deleteSync
-    method deleteTexture
-    method deleteTransformFeedback
-    method deleteVertexArray
-    method depthFunc
-    method depthMask
-    method depthRange
-    method detachShader
-    method disable
-    method disableVertexAttribArray
-    method dispatchCompute
-    method dispatchComputeIndirect
-    method drawArrays
-    method drawArraysIndirect
-    method drawArraysInstanced
-    method drawBuffers
-    method drawElements
-    method drawElementsIndirect
-    method drawElementsInstanced
-    method drawRangeElements
-    method enable
-    method enableVertexAttribArray
-    method endQuery
-    method endTransformFeedback
-    method fenceSync
-    method finish
-    method flush
-    method framebufferRenderbuffer
-    method framebufferTexture2D
-    method framebufferTextureLayer
-    method frontFace
-    method generateMipmap
-    method getActiveAttrib
-    method getActiveUniform
-    method getActiveUniformBlockName
-    method getActiveUniformBlockParameter
-    method getActiveUniforms
-    method getAttachedShaders
-    method getAttribLocation
-    method getBufferParameter
-    method getBufferSubData
-    method getContextAttributes
-    method getError
-    method getExtension
-    method getFragDataLocation
-    method getFramebufferAttachmentParameter
-    method getIndexedParameter
-    method getInternalformatParameter
-    method getParameter
-    method getProgramInfoLog
-    method getProgramInterfaceParameter
-    method getProgramParameter
-    method getProgramResource
-    method getProgramResourceIndex
-    method getProgramResourceLocation
-    method getProgramResourceName
-    method getQuery
-    method getQueryParameter
-    method getRenderbufferParameter
-    method getSamplerParameter
-    method getShaderInfoLog
-    method getShaderParameter
-    method getShaderPrecisionFormat
-    method getShaderSource
-    method getSupportedExtensions
-    method getSyncParameter
-    method getTexParameter
-    method getTransformFeedbackVarying
-    method getUniform
-    method getUniformBlockIndex
-    method getUniformIndices
-    method getUniformLocation
-    method getVertexAttrib
-    method getVertexAttribOffset
-    method hint
-    method invalidateFramebuffer
-    method invalidateSubFramebuffer
-    method isBuffer
-    method isContextLost
-    method isEnabled
-    method isFramebuffer
-    method isProgram
-    method isQuery
-    method isRenderbuffer
-    method isSampler
-    method isShader
-    method isSync
-    method isTexture
-    method isTransformFeedback
-    method isVertexArray
-    method lineWidth
-    method linkProgram
-    method makeXRCompatible
-    method memoryBarrier
-    method memoryBarrierByRegion
-    method pauseTransformFeedback
-    method pixelStorei
-    method polygonOffset
-    method readBuffer
-    method readPixels
-    method renderbufferStorage
-    method renderbufferStorageMultisample
-    method resumeTransformFeedback
-    method sampleCoverage
-    method samplerParameterf
-    method samplerParameteri
-    method scissor
-    method shaderSource
-    method stencilFunc
-    method stencilFuncSeparate
-    method stencilMask
-    method stencilMaskSeparate
-    method stencilOp
-    method stencilOpSeparate
-    method texImage2D
-    method texImage3D
-    method texParameterf
-    method texParameteri
-    method texStorage2D
-    method texStorage3D
-    method texSubImage2D
-    method texSubImage3D
-    method transformFeedbackVaryings
-    method uniform1f
-    method uniform1fv
-    method uniform1i
-    method uniform1iv
-    method uniform1ui
-    method uniform1uiv
-    method uniform2f
-    method uniform2fv
-    method uniform2i
-    method uniform2iv
-    method uniform2ui
-    method uniform2uiv
-    method uniform3f
-    method uniform3fv
-    method uniform3i
-    method uniform3iv
-    method uniform3ui
-    method uniform3uiv
-    method uniform4f
-    method uniform4fv
-    method uniform4i
-    method uniform4iv
-    method uniform4ui
-    method uniform4uiv
-    method uniformBlockBinding
-    method uniformMatrix2fv
-    method uniformMatrix2x3fv
-    method uniformMatrix2x4fv
-    method uniformMatrix3fv
-    method uniformMatrix3x2fv
-    method uniformMatrix3x4fv
-    method uniformMatrix4fv
-    method uniformMatrix4x2fv
-    method uniformMatrix4x3fv
-    method useProgram
-    method validateProgram
-    method vertexAttrib1f
-    method vertexAttrib1fv
-    method vertexAttrib2f
-    method vertexAttrib2fv
-    method vertexAttrib3f
-    method vertexAttrib3fv
-    method vertexAttrib4f
-    method vertexAttrib4fv
-    method vertexAttribDivisor
-    method vertexAttribI4i
-    method vertexAttribI4iv
-    method vertexAttribI4ui
-    method vertexAttribI4uiv
-    method vertexAttribIPointer
-    method vertexAttribPointer
-    method viewport
-    method waitSync
-interface WebGL2RenderingContext
-    attribute @@toStringTag
-    attribute ACTIVE_ATTRIBUTES
-    attribute ACTIVE_TEXTURE
-    attribute ACTIVE_UNIFORMS
-    attribute ACTIVE_UNIFORM_BLOCKS
-    attribute ALIASED_LINE_WIDTH_RANGE
-    attribute ALIASED_POINT_SIZE_RANGE
-    attribute ALPHA
-    attribute ALPHA_BITS
-    attribute ALREADY_SIGNALED
-    attribute ALWAYS
-    attribute ANY_SAMPLES_PASSED
-    attribute ANY_SAMPLES_PASSED_CONSERVATIVE
-    attribute ARRAY_BUFFER
-    attribute ARRAY_BUFFER_BINDING
-    attribute ATTACHED_SHADERS
-    attribute BACK
-    attribute BLEND
-    attribute BLEND_COLOR
-    attribute BLEND_DST_ALPHA
-    attribute BLEND_DST_RGB
-    attribute BLEND_EQUATION
-    attribute BLEND_EQUATION_ALPHA
-    attribute BLEND_EQUATION_RGB
-    attribute BLEND_SRC_ALPHA
-    attribute BLEND_SRC_RGB
-    attribute BLUE_BITS
-    attribute BOOL
-    attribute BOOL_VEC2
-    attribute BOOL_VEC3
-    attribute BOOL_VEC4
-    attribute BROWSER_DEFAULT_WEBGL
-    attribute BUFFER_SIZE
-    attribute BUFFER_USAGE
-    attribute BYTE
-    attribute CCW
-    attribute CLAMP_TO_EDGE
-    attribute COLOR
-    attribute COLOR_ATTACHMENT0
-    attribute COLOR_ATTACHMENT1
-    attribute COLOR_ATTACHMENT10
-    attribute COLOR_ATTACHMENT11
-    attribute COLOR_ATTACHMENT12
-    attribute COLOR_ATTACHMENT13
-    attribute COLOR_ATTACHMENT14
-    attribute COLOR_ATTACHMENT15
-    attribute COLOR_ATTACHMENT2
-    attribute COLOR_ATTACHMENT3
-    attribute COLOR_ATTACHMENT4
-    attribute COLOR_ATTACHMENT5
-    attribute COLOR_ATTACHMENT6
-    attribute COLOR_ATTACHMENT7
-    attribute COLOR_ATTACHMENT8
-    attribute COLOR_ATTACHMENT9
-    attribute COLOR_BUFFER_BIT
-    attribute COLOR_CLEAR_VALUE
-    attribute COLOR_WRITEMASK
-    attribute COMPARE_REF_TO_TEXTURE
-    attribute COMPILE_STATUS
-    attribute COMPRESSED_TEXTURE_FORMATS
-    attribute CONDITION_SATISFIED
-    attribute CONSTANT_ALPHA
-    attribute CONSTANT_COLOR
-    attribute CONTEXT_LOST_WEBGL
-    attribute COPY_READ_BUFFER
-    attribute COPY_READ_BUFFER_BINDING
-    attribute COPY_WRITE_BUFFER
-    attribute COPY_WRITE_BUFFER_BINDING
-    attribute CULL_FACE
-    attribute CULL_FACE_MODE
-    attribute CURRENT_PROGRAM
-    attribute CURRENT_QUERY
-    attribute CURRENT_VERTEX_ATTRIB
-    attribute CW
-    attribute DECR
-    attribute DECR_WRAP
-    attribute DELETE_STATUS
-    attribute DEPTH
-    attribute DEPTH24_STENCIL8
-    attribute DEPTH32F_STENCIL8
-    attribute DEPTH_ATTACHMENT
-    attribute DEPTH_BITS
-    attribute DEPTH_BUFFER_BIT
-    attribute DEPTH_CLEAR_VALUE
-    attribute DEPTH_COMPONENT
-    attribute DEPTH_COMPONENT16
-    attribute DEPTH_COMPONENT24
-    attribute DEPTH_COMPONENT32F
-    attribute DEPTH_FUNC
-    attribute DEPTH_RANGE
-    attribute DEPTH_STENCIL
-    attribute DEPTH_STENCIL_ATTACHMENT
-    attribute DEPTH_TEST
-    attribute DEPTH_WRITEMASK
-    attribute DITHER
-    attribute DONT_CARE
-    attribute DRAW_BUFFER0
-    attribute DRAW_BUFFER1
-    attribute DRAW_BUFFER10
-    attribute DRAW_BUFFER11
-    attribute DRAW_BUFFER12
-    attribute DRAW_BUFFER13
-    attribute DRAW_BUFFER14
-    attribute DRAW_BUFFER15
-    attribute DRAW_BUFFER2
-    attribute DRAW_BUFFER3
-    attribute DRAW_BUFFER4
-    attribute DRAW_BUFFER5
-    attribute DRAW_BUFFER6
-    attribute DRAW_BUFFER7
-    attribute DRAW_BUFFER8
-    attribute DRAW_BUFFER9
-    attribute DRAW_FRAMEBUFFER
-    attribute DRAW_FRAMEBUFFER_BINDING
-    attribute DST_ALPHA
-    attribute DST_COLOR
-    attribute DYNAMIC_COPY
-    attribute DYNAMIC_DRAW
-    attribute DYNAMIC_READ
-    attribute ELEMENT_ARRAY_BUFFER
-    attribute ELEMENT_ARRAY_BUFFER_BINDING
-    attribute EQUAL
-    attribute FASTEST
-    attribute FLOAT
-    attribute FLOAT_32_UNSIGNED_INT_24_8_REV
-    attribute FLOAT_MAT2
-    attribute FLOAT_MAT2x3
-    attribute FLOAT_MAT2x4
-    attribute FLOAT_MAT3
-    attribute FLOAT_MAT3x2
-    attribute FLOAT_MAT3x4
-    attribute FLOAT_MAT4
-    attribute FLOAT_MAT4x2
-    attribute FLOAT_MAT4x3
-    attribute FLOAT_VEC2
-    attribute FLOAT_VEC3
-    attribute FLOAT_VEC4
-    attribute FRAGMENT_SHADER
-    attribute FRAGMENT_SHADER_DERIVATIVE_HINT
-    attribute FRAMEBUFFER
-    attribute FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE
-    attribute FRAMEBUFFER_ATTACHMENT_BLUE_SIZE
-    attribute FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING
-    attribute FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE
-    attribute FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE
-    attribute FRAMEBUFFER_ATTACHMENT_GREEN_SIZE
-    attribute FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
-    attribute FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
-    attribute FRAMEBUFFER_ATTACHMENT_RED_SIZE
-    attribute FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE
-    attribute FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE
-    attribute FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER
-    attribute FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL
-    attribute FRAMEBUFFER_BINDING
-    attribute FRAMEBUFFER_COMPLETE
-    attribute FRAMEBUFFER_DEFAULT
-    attribute FRAMEBUFFER_INCOMPLETE_ATTACHMENT
-    attribute FRAMEBUFFER_INCOMPLETE_DIMENSIONS
-    attribute FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
-    attribute FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
-    attribute FRAMEBUFFER_UNSUPPORTED
-    attribute FRONT
-    attribute FRONT_AND_BACK
-    attribute FRONT_FACE
-    attribute FUNC_ADD
-    attribute FUNC_REVERSE_SUBTRACT
-    attribute FUNC_SUBTRACT
-    attribute GENERATE_MIPMAP_HINT
-    attribute GEQUAL
-    attribute GREATER
-    attribute GREEN_BITS
-    attribute HALF_FLOAT
-    attribute HIGH_FLOAT
-    attribute HIGH_INT
-    attribute IMPLEMENTATION_COLOR_READ_FORMAT
-    attribute IMPLEMENTATION_COLOR_READ_TYPE
-    attribute INCR
-    attribute INCR_WRAP
-    attribute INT
-    attribute INTERLEAVED_ATTRIBS
-    attribute INT_2_10_10_10_REV
-    attribute INT_SAMPLER_2D
-    attribute INT_SAMPLER_2D_ARRAY
-    attribute INT_SAMPLER_3D
-    attribute INT_SAMPLER_CUBE
-    attribute INT_VEC2
-    attribute INT_VEC3
-    attribute INT_VEC4
-    attribute INVALID_ENUM
-    attribute INVALID_FRAMEBUFFER_OPERATION
-    attribute INVALID_INDEX
-    attribute INVALID_OPERATION
-    attribute INVALID_VALUE
-    attribute INVERT
-    attribute KEEP
-    attribute LEQUAL
-    attribute LESS
-    attribute LINEAR
-    attribute LINEAR_MIPMAP_LINEAR
-    attribute LINEAR_MIPMAP_NEAREST
-    attribute LINES
-    attribute LINE_LOOP
-    attribute LINE_STRIP
-    attribute LINE_WIDTH
-    attribute LINK_STATUS
-    attribute LOW_FLOAT
-    attribute LOW_INT
-    attribute LUMINANCE
-    attribute LUMINANCE_ALPHA
-    attribute MAX
-    attribute MAX_3D_TEXTURE_SIZE
-    attribute MAX_ARRAY_TEXTURE_LAYERS
-    attribute MAX_CLIENT_WAIT_TIMEOUT_WEBGL
-    attribute MAX_COLOR_ATTACHMENTS
-    attribute MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS
-    attribute MAX_COMBINED_TEXTURE_IMAGE_UNITS
-    attribute MAX_COMBINED_UNIFORM_BLOCKS
-    attribute MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS
-    attribute MAX_CUBE_MAP_TEXTURE_SIZE
-    attribute MAX_DRAW_BUFFERS
-    attribute MAX_ELEMENTS_INDICES
-    attribute MAX_ELEMENTS_VERTICES
-    attribute MAX_ELEMENT_INDEX
-    attribute MAX_FRAGMENT_INPUT_COMPONENTS
-    attribute MAX_FRAGMENT_UNIFORM_BLOCKS
-    attribute MAX_FRAGMENT_UNIFORM_COMPONENTS
-    attribute MAX_FRAGMENT_UNIFORM_VECTORS
-    attribute MAX_PROGRAM_TEXEL_OFFSET
-    attribute MAX_RENDERBUFFER_SIZE
-    attribute MAX_SAMPLES
-    attribute MAX_SERVER_WAIT_TIMEOUT
-    attribute MAX_TEXTURE_IMAGE_UNITS
-    attribute MAX_TEXTURE_LOD_BIAS
-    attribute MAX_TEXTURE_SIZE
-    attribute MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS
-    attribute MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS
-    attribute MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS
-    attribute MAX_UNIFORM_BLOCK_SIZE
-    attribute MAX_UNIFORM_BUFFER_BINDINGS
-    attribute MAX_VARYING_COMPONENTS
-    attribute MAX_VARYING_VECTORS
-    attribute MAX_VERTEX_ATTRIBS
-    attribute MAX_VERTEX_OUTPUT_COMPONENTS
-    attribute MAX_VERTEX_TEXTURE_IMAGE_UNITS
-    attribute MAX_VERTEX_UNIFORM_BLOCKS
-    attribute MAX_VERTEX_UNIFORM_COMPONENTS
-    attribute MAX_VERTEX_UNIFORM_VECTORS
-    attribute MAX_VIEWPORT_DIMS
-    attribute MEDIUM_FLOAT
-    attribute MEDIUM_INT
-    attribute MIN
-    attribute MIN_PROGRAM_TEXEL_OFFSET
-    attribute MIRRORED_REPEAT
-    attribute NEAREST
-    attribute NEAREST_MIPMAP_LINEAR
-    attribute NEAREST_MIPMAP_NEAREST
-    attribute NEVER
-    attribute NICEST
-    attribute NONE
-    attribute NOTEQUAL
-    attribute NO_ERROR
-    attribute OBJECT_TYPE
-    attribute ONE
-    attribute ONE_MINUS_CONSTANT_ALPHA
-    attribute ONE_MINUS_CONSTANT_COLOR
-    attribute ONE_MINUS_DST_ALPHA
-    attribute ONE_MINUS_DST_COLOR
-    attribute ONE_MINUS_SRC_ALPHA
-    attribute ONE_MINUS_SRC_COLOR
-    attribute OUT_OF_MEMORY
-    attribute PACK_ALIGNMENT
-    attribute PACK_ROW_LENGTH
-    attribute PACK_SKIP_PIXELS
-    attribute PACK_SKIP_ROWS
-    attribute PIXEL_PACK_BUFFER
-    attribute PIXEL_PACK_BUFFER_BINDING
-    attribute PIXEL_UNPACK_BUFFER
-    attribute PIXEL_UNPACK_BUFFER_BINDING
-    attribute POINTS
-    attribute POLYGON_OFFSET_FACTOR
-    attribute POLYGON_OFFSET_FILL
-    attribute POLYGON_OFFSET_UNITS
-    attribute QUERY_RESULT
-    attribute QUERY_RESULT_AVAILABLE
-    attribute R11F_G11F_B10F
-    attribute R16F
-    attribute R16I
-    attribute R16UI
-    attribute R32F
-    attribute R32I
-    attribute R32UI
-    attribute R8
-    attribute R8I
-    attribute R8UI
-    attribute R8_SNORM
-    attribute RASTERIZER_DISCARD
-    attribute READ_BUFFER
-    attribute READ_FRAMEBUFFER
-    attribute READ_FRAMEBUFFER_BINDING
-    attribute RED
-    attribute RED_BITS
-    attribute RED_INTEGER
-    attribute RENDERBUFFER
-    attribute RENDERBUFFER_ALPHA_SIZE
-    attribute RENDERBUFFER_BINDING
-    attribute RENDERBUFFER_BLUE_SIZE
-    attribute RENDERBUFFER_DEPTH_SIZE
-    attribute RENDERBUFFER_GREEN_SIZE
-    attribute RENDERBUFFER_HEIGHT
-    attribute RENDERBUFFER_INTERNAL_FORMAT
-    attribute RENDERBUFFER_RED_SIZE
-    attribute RENDERBUFFER_SAMPLES
-    attribute RENDERBUFFER_STENCIL_SIZE
-    attribute RENDERBUFFER_WIDTH
-    attribute RENDERER
-    attribute REPEAT
-    attribute REPLACE
-    attribute RG
-    attribute RG16F
-    attribute RG16I
-    attribute RG16UI
-    attribute RG32F
-    attribute RG32I
-    attribute RG32UI
-    attribute RG8
-    attribute RG8I
-    attribute RG8UI
-    attribute RG8_SNORM
-    attribute RGB
-    attribute RGB10_A2
-    attribute RGB10_A2UI
-    attribute RGB16F
-    attribute RGB16I
-    attribute RGB16UI
-    attribute RGB32F
-    attribute RGB32I
-    attribute RGB32UI
-    attribute RGB565
-    attribute RGB5_A1
-    attribute RGB8
-    attribute RGB8I
-    attribute RGB8UI
-    attribute RGB8_SNORM
-    attribute RGB9_E5
-    attribute RGBA
-    attribute RGBA16F
-    attribute RGBA16I
-    attribute RGBA16UI
-    attribute RGBA32F
-    attribute RGBA32I
-    attribute RGBA32UI
-    attribute RGBA4
-    attribute RGBA8
-    attribute RGBA8I
-    attribute RGBA8UI
-    attribute RGBA8_SNORM
-    attribute RGBA_INTEGER
-    attribute RGB_INTEGER
-    attribute RG_INTEGER
-    attribute SAMPLER_2D
-    attribute SAMPLER_2D_ARRAY
-    attribute SAMPLER_2D_ARRAY_SHADOW
-    attribute SAMPLER_2D_SHADOW
-    attribute SAMPLER_3D
-    attribute SAMPLER_BINDING
-    attribute SAMPLER_CUBE
-    attribute SAMPLER_CUBE_SHADOW
-    attribute SAMPLES
-    attribute SAMPLE_ALPHA_TO_COVERAGE
-    attribute SAMPLE_BUFFERS
-    attribute SAMPLE_COVERAGE
-    attribute SAMPLE_COVERAGE_INVERT
-    attribute SAMPLE_COVERAGE_VALUE
-    attribute SCISSOR_BOX
-    attribute SCISSOR_TEST
-    attribute SEPARATE_ATTRIBS
-    attribute SHADER_TYPE
-    attribute SHADING_LANGUAGE_VERSION
-    attribute SHORT
-    attribute SIGNALED
-    attribute SIGNED_NORMALIZED
-    attribute SRC_ALPHA
-    attribute SRC_ALPHA_SATURATE
-    attribute SRC_COLOR
-    attribute SRGB
-    attribute SRGB8
-    attribute SRGB8_ALPHA8
-    attribute STATIC_COPY
-    attribute STATIC_DRAW
-    attribute STATIC_READ
-    attribute STENCIL
-    attribute STENCIL_ATTACHMENT
-    attribute STENCIL_BACK_FAIL
-    attribute STENCIL_BACK_FUNC
-    attribute STENCIL_BACK_PASS_DEPTH_FAIL
-    attribute STENCIL_BACK_PASS_DEPTH_PASS
-    attribute STENCIL_BACK_REF
-    attribute STENCIL_BACK_VALUE_MASK
-    attribute STENCIL_BACK_WRITEMASK
-    attribute STENCIL_BITS
-    attribute STENCIL_BUFFER_BIT
-    attribute STENCIL_CLEAR_VALUE
-    attribute STENCIL_FAIL
-    attribute STENCIL_FUNC
-    attribute STENCIL_INDEX8
-    attribute STENCIL_PASS_DEPTH_FAIL
-    attribute STENCIL_PASS_DEPTH_PASS
-    attribute STENCIL_REF
-    attribute STENCIL_TEST
-    attribute STENCIL_VALUE_MASK
-    attribute STENCIL_WRITEMASK
-    attribute STREAM_COPY
-    attribute STREAM_DRAW
-    attribute STREAM_READ
-    attribute SUBPIXEL_BITS
-    attribute SYNC_CONDITION
-    attribute SYNC_FENCE
-    attribute SYNC_FLAGS
-    attribute SYNC_FLUSH_COMMANDS_BIT
-    attribute SYNC_GPU_COMMANDS_COMPLETE
-    attribute SYNC_STATUS
-    attribute TEXTURE
-    attribute TEXTURE0
-    attribute TEXTURE1
-    attribute TEXTURE10
-    attribute TEXTURE11
-    attribute TEXTURE12
-    attribute TEXTURE13
-    attribute TEXTURE14
-    attribute TEXTURE15
-    attribute TEXTURE16
-    attribute TEXTURE17
-    attribute TEXTURE18
-    attribute TEXTURE19
-    attribute TEXTURE2
-    attribute TEXTURE20
-    attribute TEXTURE21
-    attribute TEXTURE22
-    attribute TEXTURE23
-    attribute TEXTURE24
-    attribute TEXTURE25
-    attribute TEXTURE26
-    attribute TEXTURE27
-    attribute TEXTURE28
-    attribute TEXTURE29
-    attribute TEXTURE3
-    attribute TEXTURE30
-    attribute TEXTURE31
-    attribute TEXTURE4
-    attribute TEXTURE5
-    attribute TEXTURE6
-    attribute TEXTURE7
-    attribute TEXTURE8
-    attribute TEXTURE9
-    attribute TEXTURE_2D
-    attribute TEXTURE_2D_ARRAY
-    attribute TEXTURE_3D
-    attribute TEXTURE_BASE_LEVEL
-    attribute TEXTURE_BINDING_2D
-    attribute TEXTURE_BINDING_2D_ARRAY
-    attribute TEXTURE_BINDING_3D
-    attribute TEXTURE_BINDING_CUBE_MAP
-    attribute TEXTURE_COMPARE_FUNC
-    attribute TEXTURE_COMPARE_MODE
-    attribute TEXTURE_CUBE_MAP
-    attribute TEXTURE_CUBE_MAP_NEGATIVE_X
-    attribute TEXTURE_CUBE_MAP_NEGATIVE_Y
-    attribute TEXTURE_CUBE_MAP_NEGATIVE_Z
-    attribute TEXTURE_CUBE_MAP_POSITIVE_X
-    attribute TEXTURE_CUBE_MAP_POSITIVE_Y
-    attribute TEXTURE_CUBE_MAP_POSITIVE_Z
-    attribute TEXTURE_IMMUTABLE_FORMAT
-    attribute TEXTURE_IMMUTABLE_LEVELS
-    attribute TEXTURE_MAG_FILTER
-    attribute TEXTURE_MAX_LEVEL
-    attribute TEXTURE_MAX_LOD
-    attribute TEXTURE_MIN_FILTER
-    attribute TEXTURE_MIN_LOD
-    attribute TEXTURE_WRAP_R
-    attribute TEXTURE_WRAP_S
-    attribute TEXTURE_WRAP_T
-    attribute TIMEOUT_EXPIRED
-    attribute TIMEOUT_IGNORED
-    attribute TRANSFORM_FEEDBACK
-    attribute TRANSFORM_FEEDBACK_ACTIVE
-    attribute TRANSFORM_FEEDBACK_BINDING
-    attribute TRANSFORM_FEEDBACK_BUFFER
-    attribute TRANSFORM_FEEDBACK_BUFFER_BINDING
-    attribute TRANSFORM_FEEDBACK_BUFFER_MODE
-    attribute TRANSFORM_FEEDBACK_BUFFER_SIZE
-    attribute TRANSFORM_FEEDBACK_BUFFER_START
-    attribute TRANSFORM_FEEDBACK_PAUSED
-    attribute TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN
-    attribute TRANSFORM_FEEDBACK_VARYINGS
-    attribute TRIANGLES
-    attribute TRIANGLE_FAN
-    attribute TRIANGLE_STRIP
-    attribute UNIFORM_ARRAY_STRIDE
-    attribute UNIFORM_BLOCK_ACTIVE_UNIFORMS
-    attribute UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES
-    attribute UNIFORM_BLOCK_BINDING
-    attribute UNIFORM_BLOCK_DATA_SIZE
-    attribute UNIFORM_BLOCK_INDEX
-    attribute UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER
-    attribute UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER
-    attribute UNIFORM_BUFFER
-    attribute UNIFORM_BUFFER_BINDING
-    attribute UNIFORM_BUFFER_OFFSET_ALIGNMENT
-    attribute UNIFORM_BUFFER_SIZE
-    attribute UNIFORM_BUFFER_START
-    attribute UNIFORM_IS_ROW_MAJOR
-    attribute UNIFORM_MATRIX_STRIDE
-    attribute UNIFORM_OFFSET
-    attribute UNIFORM_SIZE
-    attribute UNIFORM_TYPE
-    attribute UNPACK_ALIGNMENT
-    attribute UNPACK_COLORSPACE_CONVERSION_WEBGL
-    attribute UNPACK_FLIP_Y_WEBGL
-    attribute UNPACK_IMAGE_HEIGHT
-    attribute UNPACK_PREMULTIPLY_ALPHA_WEBGL
-    attribute UNPACK_ROW_LENGTH
-    attribute UNPACK_SKIP_IMAGES
-    attribute UNPACK_SKIP_PIXELS
-    attribute UNPACK_SKIP_ROWS
-    attribute UNSIGNALED
-    attribute UNSIGNED_BYTE
-    attribute UNSIGNED_INT
-    attribute UNSIGNED_INT_10F_11F_11F_REV
-    attribute UNSIGNED_INT_24_8
-    attribute UNSIGNED_INT_2_10_10_10_REV
-    attribute UNSIGNED_INT_5_9_9_9_REV
-    attribute UNSIGNED_INT_SAMPLER_2D
-    attribute UNSIGNED_INT_SAMPLER_2D_ARRAY
-    attribute UNSIGNED_INT_SAMPLER_3D
-    attribute UNSIGNED_INT_SAMPLER_CUBE
-    attribute UNSIGNED_INT_VEC2
-    attribute UNSIGNED_INT_VEC3
-    attribute UNSIGNED_INT_VEC4
-    attribute UNSIGNED_NORMALIZED
-    attribute UNSIGNED_SHORT
-    attribute UNSIGNED_SHORT_4_4_4_4
-    attribute UNSIGNED_SHORT_5_5_5_1
-    attribute UNSIGNED_SHORT_5_6_5
-    attribute VALIDATE_STATUS
-    attribute VENDOR
-    attribute VERSION
-    attribute VERTEX_ARRAY_BINDING
-    attribute VERTEX_ATTRIB_ARRAY_BUFFER_BINDING
-    attribute VERTEX_ATTRIB_ARRAY_DIVISOR
-    attribute VERTEX_ATTRIB_ARRAY_ENABLED
-    attribute VERTEX_ATTRIB_ARRAY_INTEGER
-    attribute VERTEX_ATTRIB_ARRAY_NORMALIZED
-    attribute VERTEX_ATTRIB_ARRAY_POINTER
-    attribute VERTEX_ATTRIB_ARRAY_SIZE
-    attribute VERTEX_ATTRIB_ARRAY_STRIDE
-    attribute VERTEX_ATTRIB_ARRAY_TYPE
-    attribute VERTEX_SHADER
-    attribute VIEWPORT
-    attribute WAIT_FAILED
-    attribute ZERO
-    getter canvas
-    getter drawingBufferHeight
-    getter drawingBufferWidth
-    method activeTexture
-    method attachShader
-    method beginQuery
-    method beginTransformFeedback
-    method bindAttribLocation
-    method bindBuffer
-    method bindBufferBase
-    method bindBufferRange
-    method bindFramebuffer
-    method bindRenderbuffer
-    method bindSampler
-    method bindTexture
-    method bindTransformFeedback
-    method bindVertexArray
-    method blendColor
-    method blendEquation
-    method blendEquationSeparate
-    method blendFunc
-    method blendFuncSeparate
-    method blitFramebuffer
-    method bufferData
-    method bufferSubData
-    method checkFramebufferStatus
-    method clear
-    method clearBufferfi
-    method clearBufferfv
-    method clearBufferiv
-    method clearBufferuiv
-    method clearColor
-    method clearDepth
-    method clearStencil
-    method clientWaitSync
-    method colorMask
-    method commit
-    method compileShader
-    method compressedTexImage2D
-    method compressedTexImage3D
-    method compressedTexSubImage2D
-    method compressedTexSubImage3D
-    method constructor
-    method copyBufferSubData
-    method copyTexImage2D
-    method copyTexSubImage2D
-    method copyTexSubImage3D
-    method createBuffer
-    method createFramebuffer
-    method createProgram
-    method createQuery
-    method createRenderbuffer
-    method createSampler
-    method createShader
-    method createTexture
-    method createTransformFeedback
-    method createVertexArray
-    method cullFace
-    method deleteBuffer
-    method deleteFramebuffer
-    method deleteProgram
-    method deleteQuery
-    method deleteRenderbuffer
-    method deleteSampler
-    method deleteShader
-    method deleteSync
-    method deleteTexture
-    method deleteTransformFeedback
-    method deleteVertexArray
-    method depthFunc
-    method depthMask
-    method depthRange
-    method detachShader
-    method disable
-    method disableVertexAttribArray
-    method drawArrays
-    method drawArraysInstanced
-    method drawBuffers
-    method drawElements
-    method drawElementsInstanced
-    method drawRangeElements
-    method enable
-    method enableVertexAttribArray
-    method endQuery
-    method endTransformFeedback
-    method fenceSync
-    method finish
-    method flush
-    method framebufferRenderbuffer
-    method framebufferTexture2D
-    method framebufferTextureLayer
-    method frontFace
-    method generateMipmap
-    method getActiveAttrib
-    method getActiveUniform
-    method getActiveUniformBlockName
-    method getActiveUniformBlockParameter
-    method getActiveUniforms
-    method getAttachedShaders
-    method getAttribLocation
-    method getBufferParameter
-    method getBufferSubData
-    method getContextAttributes
-    method getError
-    method getExtension
-    method getFragDataLocation
-    method getFramebufferAttachmentParameter
-    method getIndexedParameter
-    method getInternalformatParameter
-    method getParameter
-    method getProgramInfoLog
-    method getProgramParameter
-    method getQuery
-    method getQueryParameter
-    method getRenderbufferParameter
-    method getSamplerParameter
-    method getShaderInfoLog
-    method getShaderParameter
-    method getShaderPrecisionFormat
-    method getShaderSource
-    method getSupportedExtensions
-    method getSyncParameter
-    method getTexParameter
-    method getTransformFeedbackVarying
-    method getUniform
-    method getUniformBlockIndex
-    method getUniformIndices
-    method getUniformLocation
-    method getVertexAttrib
-    method getVertexAttribOffset
-    method hint
-    method invalidateFramebuffer
-    method invalidateSubFramebuffer
-    method isBuffer
-    method isContextLost
-    method isEnabled
-    method isFramebuffer
-    method isProgram
-    method isQuery
-    method isRenderbuffer
-    method isSampler
-    method isShader
-    method isSync
-    method isTexture
-    method isTransformFeedback
-    method isVertexArray
-    method lineWidth
-    method linkProgram
-    method makeXRCompatible
-    method pauseTransformFeedback
-    method pixelStorei
-    method polygonOffset
-    method readBuffer
-    method readPixels
-    method renderbufferStorage
-    method renderbufferStorageMultisample
-    method resumeTransformFeedback
-    method sampleCoverage
-    method samplerParameterf
-    method samplerParameteri
-    method scissor
-    method shaderSource
-    method stencilFunc
-    method stencilFuncSeparate
-    method stencilMask
-    method stencilMaskSeparate
-    method stencilOp
-    method stencilOpSeparate
-    method texImage2D
-    method texImage3D
-    method texParameterf
-    method texParameteri
-    method texStorage2D
-    method texStorage3D
-    method texSubImage2D
-    method texSubImage3D
-    method transformFeedbackVaryings
-    method uniform1f
-    method uniform1fv
-    method uniform1i
-    method uniform1iv
-    method uniform1ui
-    method uniform1uiv
-    method uniform2f
-    method uniform2fv
-    method uniform2i
-    method uniform2iv
-    method uniform2ui
-    method uniform2uiv
-    method uniform3f
-    method uniform3fv
-    method uniform3i
-    method uniform3iv
-    method uniform3ui
-    method uniform3uiv
-    method uniform4f
-    method uniform4fv
-    method uniform4i
-    method uniform4iv
-    method uniform4ui
-    method uniform4uiv
-    method uniformBlockBinding
-    method uniformMatrix2fv
-    method uniformMatrix2x3fv
-    method uniformMatrix2x4fv
-    method uniformMatrix3fv
-    method uniformMatrix3x2fv
-    method uniformMatrix3x4fv
-    method uniformMatrix4fv
-    method uniformMatrix4x2fv
-    method uniformMatrix4x3fv
-    method useProgram
-    method validateProgram
-    method vertexAttrib1f
-    method vertexAttrib1fv
-    method vertexAttrib2f
-    method vertexAttrib2fv
-    method vertexAttrib3f
-    method vertexAttrib3fv
-    method vertexAttrib4f
-    method vertexAttrib4fv
-    method vertexAttribDivisor
-    method vertexAttribI4i
-    method vertexAttribI4iv
-    method vertexAttribI4ui
-    method vertexAttribI4uiv
-    method vertexAttribIPointer
-    method vertexAttribPointer
-    method viewport
-    method waitSync
-interface WebGLActiveInfo
-    attribute @@toStringTag
-    getter name
-    getter size
-    getter type
-    method constructor
-interface WebGLBuffer
-    attribute @@toStringTag
-    method constructor
-interface WebGLContextEvent : Event
-    attribute @@toStringTag
-    getter statusMessage
-    method constructor
-interface WebGLFramebuffer
-    attribute @@toStringTag
-    method constructor
-interface WebGLProgram
-    attribute @@toStringTag
-    method constructor
-interface WebGLQuery
-    attribute @@toStringTag
-    method constructor
-interface WebGLRenderbuffer
-    attribute @@toStringTag
-    method constructor
-interface WebGLRenderingContext
-    attribute @@toStringTag
-    attribute ACTIVE_ATTRIBUTES
-    attribute ACTIVE_TEXTURE
-    attribute ACTIVE_UNIFORMS
-    attribute ALIASED_LINE_WIDTH_RANGE
-    attribute ALIASED_POINT_SIZE_RANGE
-    attribute ALPHA
-    attribute ALPHA_BITS
-    attribute ALWAYS
-    attribute ARRAY_BUFFER
-    attribute ARRAY_BUFFER_BINDING
-    attribute ATTACHED_SHADERS
-    attribute BACK
-    attribute BLEND
-    attribute BLEND_COLOR
-    attribute BLEND_DST_ALPHA
-    attribute BLEND_DST_RGB
-    attribute BLEND_EQUATION
-    attribute BLEND_EQUATION_ALPHA
-    attribute BLEND_EQUATION_RGB
-    attribute BLEND_SRC_ALPHA
-    attribute BLEND_SRC_RGB
-    attribute BLUE_BITS
-    attribute BOOL
-    attribute BOOL_VEC2
-    attribute BOOL_VEC3
-    attribute BOOL_VEC4
-    attribute BROWSER_DEFAULT_WEBGL
-    attribute BUFFER_SIZE
-    attribute BUFFER_USAGE
-    attribute BYTE
-    attribute CCW
-    attribute CLAMP_TO_EDGE
-    attribute COLOR_ATTACHMENT0
-    attribute COLOR_BUFFER_BIT
-    attribute COLOR_CLEAR_VALUE
-    attribute COLOR_WRITEMASK
-    attribute COMPILE_STATUS
-    attribute COMPRESSED_TEXTURE_FORMATS
-    attribute CONSTANT_ALPHA
-    attribute CONSTANT_COLOR
-    attribute CONTEXT_LOST_WEBGL
-    attribute CULL_FACE
-    attribute CULL_FACE_MODE
-    attribute CURRENT_PROGRAM
-    attribute CURRENT_VERTEX_ATTRIB
-    attribute CW
-    attribute DECR
-    attribute DECR_WRAP
-    attribute DELETE_STATUS
-    attribute DEPTH_ATTACHMENT
-    attribute DEPTH_BITS
-    attribute DEPTH_BUFFER_BIT
-    attribute DEPTH_CLEAR_VALUE
-    attribute DEPTH_COMPONENT
-    attribute DEPTH_COMPONENT16
-    attribute DEPTH_FUNC
-    attribute DEPTH_RANGE
-    attribute DEPTH_STENCIL
-    attribute DEPTH_STENCIL_ATTACHMENT
-    attribute DEPTH_TEST
-    attribute DEPTH_WRITEMASK
-    attribute DITHER
-    attribute DONT_CARE
-    attribute DST_ALPHA
-    attribute DST_COLOR
-    attribute DYNAMIC_DRAW
-    attribute ELEMENT_ARRAY_BUFFER
-    attribute ELEMENT_ARRAY_BUFFER_BINDING
-    attribute EQUAL
-    attribute FASTEST
-    attribute FLOAT
-    attribute FLOAT_MAT2
-    attribute FLOAT_MAT3
-    attribute FLOAT_MAT4
-    attribute FLOAT_VEC2
-    attribute FLOAT_VEC3
-    attribute FLOAT_VEC4
-    attribute FRAGMENT_SHADER
-    attribute FRAMEBUFFER
-    attribute FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
-    attribute FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
-    attribute FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE
-    attribute FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL
-    attribute FRAMEBUFFER_BINDING
-    attribute FRAMEBUFFER_COMPLETE
-    attribute FRAMEBUFFER_INCOMPLETE_ATTACHMENT
-    attribute FRAMEBUFFER_INCOMPLETE_DIMENSIONS
-    attribute FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
-    attribute FRAMEBUFFER_UNSUPPORTED
-    attribute FRONT
-    attribute FRONT_AND_BACK
-    attribute FRONT_FACE
-    attribute FUNC_ADD
-    attribute FUNC_REVERSE_SUBTRACT
-    attribute FUNC_SUBTRACT
-    attribute GENERATE_MIPMAP_HINT
-    attribute GEQUAL
-    attribute GREATER
-    attribute GREEN_BITS
-    attribute HIGH_FLOAT
-    attribute HIGH_INT
-    attribute IMPLEMENTATION_COLOR_READ_FORMAT
-    attribute IMPLEMENTATION_COLOR_READ_TYPE
-    attribute INCR
-    attribute INCR_WRAP
-    attribute INT
-    attribute INT_VEC2
-    attribute INT_VEC3
-    attribute INT_VEC4
-    attribute INVALID_ENUM
-    attribute INVALID_FRAMEBUFFER_OPERATION
-    attribute INVALID_OPERATION
-    attribute INVALID_VALUE
-    attribute INVERT
-    attribute KEEP
-    attribute LEQUAL
-    attribute LESS
-    attribute LINEAR
-    attribute LINEAR_MIPMAP_LINEAR
-    attribute LINEAR_MIPMAP_NEAREST
-    attribute LINES
-    attribute LINE_LOOP
-    attribute LINE_STRIP
-    attribute LINE_WIDTH
-    attribute LINK_STATUS
-    attribute LOW_FLOAT
-    attribute LOW_INT
-    attribute LUMINANCE
-    attribute LUMINANCE_ALPHA
-    attribute MAX_COMBINED_TEXTURE_IMAGE_UNITS
-    attribute MAX_CUBE_MAP_TEXTURE_SIZE
-    attribute MAX_FRAGMENT_UNIFORM_VECTORS
-    attribute MAX_RENDERBUFFER_SIZE
-    attribute MAX_TEXTURE_IMAGE_UNITS
-    attribute MAX_TEXTURE_SIZE
-    attribute MAX_VARYING_VECTORS
-    attribute MAX_VERTEX_ATTRIBS
-    attribute MAX_VERTEX_TEXTURE_IMAGE_UNITS
-    attribute MAX_VERTEX_UNIFORM_VECTORS
-    attribute MAX_VIEWPORT_DIMS
-    attribute MEDIUM_FLOAT
-    attribute MEDIUM_INT
-    attribute MIRRORED_REPEAT
-    attribute NEAREST
-    attribute NEAREST_MIPMAP_LINEAR
-    attribute NEAREST_MIPMAP_NEAREST
-    attribute NEVER
-    attribute NICEST
-    attribute NONE
-    attribute NOTEQUAL
-    attribute NO_ERROR
-    attribute ONE
-    attribute ONE_MINUS_CONSTANT_ALPHA
-    attribute ONE_MINUS_CONSTANT_COLOR
-    attribute ONE_MINUS_DST_ALPHA
-    attribute ONE_MINUS_DST_COLOR
-    attribute ONE_MINUS_SRC_ALPHA
-    attribute ONE_MINUS_SRC_COLOR
-    attribute OUT_OF_MEMORY
-    attribute PACK_ALIGNMENT
-    attribute POINTS
-    attribute POLYGON_OFFSET_FACTOR
-    attribute POLYGON_OFFSET_FILL
-    attribute POLYGON_OFFSET_UNITS
-    attribute RED_BITS
-    attribute RENDERBUFFER
-    attribute RENDERBUFFER_ALPHA_SIZE
-    attribute RENDERBUFFER_BINDING
-    attribute RENDERBUFFER_BLUE_SIZE
-    attribute RENDERBUFFER_DEPTH_SIZE
-    attribute RENDERBUFFER_GREEN_SIZE
-    attribute RENDERBUFFER_HEIGHT
-    attribute RENDERBUFFER_INTERNAL_FORMAT
-    attribute RENDERBUFFER_RED_SIZE
-    attribute RENDERBUFFER_STENCIL_SIZE
-    attribute RENDERBUFFER_WIDTH
-    attribute RENDERER
-    attribute REPEAT
-    attribute REPLACE
-    attribute RGB
-    attribute RGB565
-    attribute RGB5_A1
-    attribute RGBA
-    attribute RGBA4
-    attribute SAMPLER_2D
-    attribute SAMPLER_CUBE
-    attribute SAMPLES
-    attribute SAMPLE_ALPHA_TO_COVERAGE
-    attribute SAMPLE_BUFFERS
-    attribute SAMPLE_COVERAGE
-    attribute SAMPLE_COVERAGE_INVERT
-    attribute SAMPLE_COVERAGE_VALUE
-    attribute SCISSOR_BOX
-    attribute SCISSOR_TEST
-    attribute SHADER_TYPE
-    attribute SHADING_LANGUAGE_VERSION
-    attribute SHORT
-    attribute SRC_ALPHA
-    attribute SRC_ALPHA_SATURATE
-    attribute SRC_COLOR
-    attribute STATIC_DRAW
-    attribute STENCIL_ATTACHMENT
-    attribute STENCIL_BACK_FAIL
-    attribute STENCIL_BACK_FUNC
-    attribute STENCIL_BACK_PASS_DEPTH_FAIL
-    attribute STENCIL_BACK_PASS_DEPTH_PASS
-    attribute STENCIL_BACK_REF
-    attribute STENCIL_BACK_VALUE_MASK
-    attribute STENCIL_BACK_WRITEMASK
-    attribute STENCIL_BITS
-    attribute STENCIL_BUFFER_BIT
-    attribute STENCIL_CLEAR_VALUE
-    attribute STENCIL_FAIL
-    attribute STENCIL_FUNC
-    attribute STENCIL_INDEX8
-    attribute STENCIL_PASS_DEPTH_FAIL
-    attribute STENCIL_PASS_DEPTH_PASS
-    attribute STENCIL_REF
-    attribute STENCIL_TEST
-    attribute STENCIL_VALUE_MASK
-    attribute STENCIL_WRITEMASK
-    attribute STREAM_DRAW
-    attribute SUBPIXEL_BITS
-    attribute TEXTURE
-    attribute TEXTURE0
-    attribute TEXTURE1
-    attribute TEXTURE10
-    attribute TEXTURE11
-    attribute TEXTURE12
-    attribute TEXTURE13
-    attribute TEXTURE14
-    attribute TEXTURE15
-    attribute TEXTURE16
-    attribute TEXTURE17
-    attribute TEXTURE18
-    attribute TEXTURE19
-    attribute TEXTURE2
-    attribute TEXTURE20
-    attribute TEXTURE21
-    attribute TEXTURE22
-    attribute TEXTURE23
-    attribute TEXTURE24
-    attribute TEXTURE25
-    attribute TEXTURE26
-    attribute TEXTURE27
-    attribute TEXTURE28
-    attribute TEXTURE29
-    attribute TEXTURE3
-    attribute TEXTURE30
-    attribute TEXTURE31
-    attribute TEXTURE4
-    attribute TEXTURE5
-    attribute TEXTURE6
-    attribute TEXTURE7
-    attribute TEXTURE8
-    attribute TEXTURE9
-    attribute TEXTURE_2D
-    attribute TEXTURE_BINDING_2D
-    attribute TEXTURE_BINDING_CUBE_MAP
-    attribute TEXTURE_CUBE_MAP
-    attribute TEXTURE_CUBE_MAP_NEGATIVE_X
-    attribute TEXTURE_CUBE_MAP_NEGATIVE_Y
-    attribute TEXTURE_CUBE_MAP_NEGATIVE_Z
-    attribute TEXTURE_CUBE_MAP_POSITIVE_X
-    attribute TEXTURE_CUBE_MAP_POSITIVE_Y
-    attribute TEXTURE_CUBE_MAP_POSITIVE_Z
-    attribute TEXTURE_MAG_FILTER
-    attribute TEXTURE_MIN_FILTER
-    attribute TEXTURE_WRAP_S
-    attribute TEXTURE_WRAP_T
-    attribute TRIANGLES
-    attribute TRIANGLE_FAN
-    attribute TRIANGLE_STRIP
-    attribute UNPACK_ALIGNMENT
-    attribute UNPACK_COLORSPACE_CONVERSION_WEBGL
-    attribute UNPACK_FLIP_Y_WEBGL
-    attribute UNPACK_PREMULTIPLY_ALPHA_WEBGL
-    attribute UNSIGNED_BYTE
-    attribute UNSIGNED_INT
-    attribute UNSIGNED_SHORT
-    attribute UNSIGNED_SHORT_4_4_4_4
-    attribute UNSIGNED_SHORT_5_5_5_1
-    attribute UNSIGNED_SHORT_5_6_5
-    attribute VALIDATE_STATUS
-    attribute VENDOR
-    attribute VERSION
-    attribute VERTEX_ATTRIB_ARRAY_BUFFER_BINDING
-    attribute VERTEX_ATTRIB_ARRAY_ENABLED
-    attribute VERTEX_ATTRIB_ARRAY_NORMALIZED
-    attribute VERTEX_ATTRIB_ARRAY_POINTER
-    attribute VERTEX_ATTRIB_ARRAY_SIZE
-    attribute VERTEX_ATTRIB_ARRAY_STRIDE
-    attribute VERTEX_ATTRIB_ARRAY_TYPE
-    attribute VERTEX_SHADER
-    attribute VIEWPORT
-    attribute ZERO
-    getter canvas
-    getter drawingBufferHeight
-    getter drawingBufferWidth
-    method activeTexture
-    method attachShader
-    method bindAttribLocation
-    method bindBuffer
-    method bindFramebuffer
-    method bindRenderbuffer
-    method bindTexture
-    method blendColor
-    method blendEquation
-    method blendEquationSeparate
-    method blendFunc
-    method blendFuncSeparate
-    method bufferData
-    method bufferSubData
-    method checkFramebufferStatus
-    method clear
-    method clearColor
-    method clearDepth
-    method clearStencil
-    method colorMask
-    method commit
-    method compileShader
-    method compressedTexImage2D
-    method compressedTexSubImage2D
-    method constructor
-    method copyTexImage2D
-    method copyTexSubImage2D
-    method createBuffer
-    method createFramebuffer
-    method createProgram
-    method createRenderbuffer
-    method createShader
-    method createTexture
-    method cullFace
-    method deleteBuffer
-    method deleteFramebuffer
-    method deleteProgram
-    method deleteRenderbuffer
-    method deleteShader
-    method deleteTexture
-    method depthFunc
-    method depthMask
-    method depthRange
-    method detachShader
-    method disable
-    method disableVertexAttribArray
-    method drawArrays
-    method drawElements
-    method enable
-    method enableVertexAttribArray
-    method finish
-    method flush
-    method framebufferRenderbuffer
-    method framebufferTexture2D
-    method frontFace
-    method generateMipmap
-    method getActiveAttrib
-    method getActiveUniform
-    method getAttachedShaders
-    method getAttribLocation
-    method getBufferParameter
-    method getContextAttributes
-    method getError
-    method getExtension
-    method getFramebufferAttachmentParameter
-    method getParameter
-    method getProgramInfoLog
-    method getProgramParameter
-    method getRenderbufferParameter
-    method getShaderInfoLog
-    method getShaderParameter
-    method getShaderPrecisionFormat
-    method getShaderSource
-    method getSupportedExtensions
-    method getTexParameter
-    method getUniform
-    method getUniformLocation
-    method getVertexAttrib
-    method getVertexAttribOffset
-    method hint
-    method isBuffer
-    method isContextLost
-    method isEnabled
-    method isFramebuffer
-    method isProgram
-    method isRenderbuffer
-    method isShader
-    method isTexture
-    method lineWidth
-    method linkProgram
-    method makeXRCompatible
-    method pixelStorei
-    method polygonOffset
-    method readPixels
-    method renderbufferStorage
-    method sampleCoverage
-    method scissor
-    method shaderSource
-    method stencilFunc
-    method stencilFuncSeparate
-    method stencilMask
-    method stencilMaskSeparate
-    method stencilOp
-    method stencilOpSeparate
-    method texImage2D
-    method texParameterf
-    method texParameteri
-    method texSubImage2D
-    method uniform1f
-    method uniform1fv
-    method uniform1i
-    method uniform1iv
-    method uniform2f
-    method uniform2fv
-    method uniform2i
-    method uniform2iv
-    method uniform3f
-    method uniform3fv
-    method uniform3i
-    method uniform3iv
-    method uniform4f
-    method uniform4fv
-    method uniform4i
-    method uniform4iv
-    method uniformMatrix2fv
-    method uniformMatrix3fv
-    method uniformMatrix4fv
-    method useProgram
-    method validateProgram
-    method vertexAttrib1f
-    method vertexAttrib1fv
-    method vertexAttrib2f
-    method vertexAttrib2fv
-    method vertexAttrib3f
-    method vertexAttrib3fv
-    method vertexAttrib4f
-    method vertexAttrib4fv
-    method vertexAttribPointer
-    method viewport
-interface WebGLSampler
-    attribute @@toStringTag
-    method constructor
-interface WebGLShader
-    attribute @@toStringTag
-    method constructor
-interface WebGLShaderPrecisionFormat
-    attribute @@toStringTag
-    getter precision
-    getter rangeMax
-    getter rangeMin
-    method constructor
-interface WebGLSync
-    attribute @@toStringTag
-    method constructor
-interface WebGLTexture
-    attribute @@toStringTag
-    method constructor
-interface WebGLTransformFeedback
-    attribute @@toStringTag
-    method constructor
-interface WebGLUniformLocation
-    attribute @@toStringTag
-    method constructor
-interface WebGLVertexArrayObject
-    attribute @@toStringTag
-    method constructor
-interface WebGLVideoFrameMetadata
-    attribute @@toStringTag
-    getter captureTime
-    getter elapsedProcessingTime
-    getter expectedPresentationTime
-    getter height
-    getter presentationTime
-    getter presentationTimestamp
-    getter presentedFrames
-    getter rtpTimestamp
-    getter width
-    method constructor
-interface WebKitCSSMatrix : DOMMatrixReadOnly
-    attribute @@toStringTag
-    getter a
-    getter b
-    getter c
-    getter d
-    getter e
-    getter f
-    getter m11
-    getter m12
-    getter m13
-    getter m14
-    getter m21
-    getter m22
-    getter m23
-    getter m24
-    getter m31
-    getter m32
-    getter m33
-    getter m34
-    getter m41
-    getter m42
-    getter m43
-    getter m44
-    method constructor
-    method invertSelf
-    method multiplySelf
-    method preMultiplySelf
-    method rotateAxisAngleSelf
-    method rotateFromVectorSelf
-    method rotateSelf
-    method scale3dSelf
-    method scaleSelf
-    method setMatrixValue
-    method skewXSelf
-    method skewYSelf
-    method translateSelf
-    setter a
-    setter b
-    setter c
-    setter d
-    setter e
-    setter f
-    setter m11
-    setter m12
-    setter m13
-    setter m14
-    setter m21
-    setter m22
-    setter m23
-    setter m24
-    setter m31
-    setter m32
-    setter m33
-    setter m34
-    setter m41
-    setter m42
-    setter m43
-    setter m44
-interface WebKitMutationObserver
-    attribute @@toStringTag
-    method constructor
-    method disconnect
-    method observe
-    method takeRecords
-interface WebSocket : EventTarget
-    attribute @@toStringTag
-    attribute CLOSED
-    attribute CLOSING
-    attribute CONNECTING
-    attribute OPEN
-    getter binaryType
-    getter bufferedAmount
-    getter extensions
-    getter onclose
-    getter onerror
-    getter onmessage
-    getter onopen
-    getter protocol
-    getter readyState
-    getter url
-    method close
-    method constructor
-    method send
-    setter binaryType
-    setter onclose
-    setter onerror
-    setter onmessage
-    setter onopen
-interface WebSocketStream
-    attribute @@toStringTag
-    getter closed
-    getter connection
-    getter url
-    method close
-    method constructor
-interface WheelEvent : MouseEvent
-    attribute @@toStringTag
-    attribute DOM_DELTA_LINE
-    attribute DOM_DELTA_PAGE
-    attribute DOM_DELTA_PIXEL
-    getter deltaMode
-    getter deltaX
-    getter deltaY
-    getter deltaZ
-    getter wheelDelta
-    getter wheelDeltaX
-    getter wheelDeltaY
-    method constructor
-interface Window : EventTarget
-    attribute @@toStringTag
-    attribute PERSISTENT
-    attribute TEMPORARY
-    method constructor
-interface Worker : EventTarget
-    attribute @@toStringTag
-    getter onerror
-    getter onmessage
-    method constructor
-    method postMessage
-    method terminate
-    setter onerror
-    setter onmessage
-interface Worklet
-    attribute @@toStringTag
-    method addModule
-    method constructor
-interface WorkletAnimation
-    attribute @@toStringTag
-    getter animatorName
-    getter currentTime
-    getter effect
-    getter playState
-    getter playbackRate
-    getter startTime
-    getter timeline
-    method cancel
-    method constructor
-    method pause
-    method play
-    setter playbackRate
-interface WritableStream
-    attribute @@toStringTag
-    getter locked
-    method abort
-    method constructor
-    method getWriter
-interface WritableStreamDefaultWriter
-    attribute @@toStringTag
-    getter closed
-    getter desiredSize
-    getter ready
-    method abort
-    method close
-    method constructor
-    method releaseLock
-    method write
-interface XMLDocument : Document
-    attribute @@toStringTag
-    method constructor
-interface XMLHttpRequest : XMLHttpRequestEventTarget
-    attribute @@toStringTag
-    attribute DONE
-    attribute HEADERS_RECEIVED
-    attribute LOADING
-    attribute OPENED
-    attribute UNSENT
-    getter onreadystatechange
-    getter readyState
-    getter response
-    getter responseText
-    getter responseType
-    getter responseURL
-    getter responseXML
-    getter status
-    getter statusText
-    getter timeout
-    getter upload
-    getter withCredentials
-    method abort
-    method constructor
-    method getAllResponseHeaders
-    method getResponseHeader
-    method open
-    method overrideMimeType
-    method send
-    method setRequestHeader
-    setter onreadystatechange
-    setter responseType
-    setter timeout
-    setter withCredentials
-interface XMLHttpRequestEventTarget : EventTarget
-    attribute @@toStringTag
-    getter onabort
-    getter onerror
-    getter onload
-    getter onloadend
-    getter onloadstart
-    getter onprogress
-    getter ontimeout
-    method constructor
-    setter onabort
-    setter onerror
-    setter onload
-    setter onloadend
-    setter onloadstart
-    setter onprogress
-    setter ontimeout
-interface XMLHttpRequestUpload : XMLHttpRequestEventTarget
-    attribute @@toStringTag
-    method constructor
-interface XMLSerializer
-    attribute @@toStringTag
-    method constructor
-    method serializeToString
-interface XPathEvaluator
-    attribute @@toStringTag
-    method constructor
-    method createExpression
-    method createNSResolver
-    method evaluate
-interface XPathExpression
-    attribute @@toStringTag
-    method constructor
-    method evaluate
-interface XPathResult
-    attribute @@toStringTag
-    attribute ANY_TYPE
-    attribute ANY_UNORDERED_NODE_TYPE
-    attribute BOOLEAN_TYPE
-    attribute FIRST_ORDERED_NODE_TYPE
-    attribute NUMBER_TYPE
-    attribute ORDERED_NODE_ITERATOR_TYPE
-    attribute ORDERED_NODE_SNAPSHOT_TYPE
-    attribute STRING_TYPE
-    attribute UNORDERED_NODE_ITERATOR_TYPE
-    attribute UNORDERED_NODE_SNAPSHOT_TYPE
-    getter booleanValue
-    getter invalidIteratorState
-    getter numberValue
-    getter resultType
-    getter singleNodeValue
-    getter snapshotLength
-    getter stringValue
-    method constructor
-    method iterateNext
-    method snapshotItem
-interface XR : EventTarget
-    attribute @@toStringTag
-    getter ondevicechange
-    method constructor
-    method isSessionSupported
-    method requestSession
-    method supportsSession
-    setter ondevicechange
-interface XRBoundedReferenceSpace : XRReferenceSpace
-    attribute @@toStringTag
-    getter boundsGeometry
-    method constructor
-interface XRFrame
-    attribute @@toStringTag
-    getter session
-    method constructor
-    method getHitTestResults
-    method getHitTestResultsForTransientInput
-    method getPose
-    method getViewerPose
-interface XRHitResult
-    attribute @@toStringTag
-    getter hitMatrix
-    method constructor
-interface XRHitTestResult
-    attribute @@toStringTag
-    method constructor
-    method getPose
-interface XRHitTestSource
-    attribute @@toStringTag
-    method cancel
-    method constructor
-interface XRInputSource
-    attribute @@toStringTag
-    getter gamepad
-    getter gripSpace
-    getter handedness
-    getter profiles
-    getter targetRayMode
-    getter targetRaySpace
-    method constructor
-interface XRInputSourceArray
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method constructor
-    method entries
-    method forEach
-    method keys
-    method values
-interface XRInputSourceEvent : Event
-    attribute @@toStringTag
-    getter frame
-    getter inputSource
-    method constructor
-interface XRInputSourcesChangeEvent : Event
-    attribute @@toStringTag
-    getter added
-    getter removed
-    getter session
-    method constructor
-interface XRPose
-    attribute @@toStringTag
-    getter emulatedPosition
-    getter transform
-    method constructor
-interface XRRay
-    attribute @@toStringTag
-    getter direction
-    getter matrix
-    getter origin
-    method constructor
-interface XRReferenceSpace : XRSpace
-    attribute @@toStringTag
-    getter onreset
-    method constructor
-    method getOffsetReferenceSpace
-    setter onreset
-interface XRReferenceSpaceEvent : Event
-    attribute @@toStringTag
-    getter referenceSpace
-    getter transform
-    method constructor
-interface XRRenderState
-    attribute @@toStringTag
-    getter baseLayer
-    getter depthFar
-    getter depthNear
-    getter inlineVerticalFieldOfView
-    method constructor
-interface XRRigidTransform
-    attribute @@toStringTag
-    getter inverse
-    getter matrix
-    getter orientation
-    getter position
-    method constructor
-interface XRSession : EventTarget
-    attribute @@toStringTag
-    getter environmentBlendMode
-    getter inputSources
-    getter onend
-    getter oninputsourceschange
-    getter onselect
-    getter onselectend
-    getter onselectstart
-    getter onvisibilitychange
-    getter renderState
-    getter visibilityState
-    method cancelAnimationFrame
-    method constructor
-    method end
-    method requestAnimationFrame
-    method requestHitTest
-    method requestHitTestSource
-    method requestHitTestSourceForTransientInput
-    method requestReferenceSpace
-    method updateRenderState
-    setter onend
-    setter oninputsourceschange
-    setter onselect
-    setter onselectend
-    setter onselectstart
-    setter onvisibilitychange
-interface XRSessionEvent : Event
-    attribute @@toStringTag
-    getter session
-    method constructor
-interface XRSpace : EventTarget
-    attribute @@toStringTag
-    method constructor
-interface XRTransientInputHitTestResult
-    attribute @@toStringTag
-    getter inputSource
-    getter results
-    method constructor
-interface XRTransientInputHitTestSource
-    attribute @@toStringTag
-    method cancel
-    method constructor
-interface XRView
-    attribute @@toStringTag
-    getter eye
-    getter projectionMatrix
-    getter transform
-    method constructor
-interface XRViewerPose : XRPose
-    attribute @@toStringTag
-    getter views
-    method constructor
-interface XRViewport
-    attribute @@toStringTag
-    getter height
-    getter width
-    getter x
-    getter y
-    method constructor
-interface XRWebGLLayer
-    static method getNativeFramebufferScaleFactor
-    attribute @@toStringTag
-    getter antialias
-    getter framebuffer
-    getter framebufferHeight
-    getter framebufferWidth
-    getter ignoreDepthValues
-    method constructor
-    method getViewport
-interface XSLTProcessor
-    attribute @@toStringTag
-    method clearParameters
-    method constructor
-    method getParameter
-    method importStylesheet
-    method removeParameter
-    method reset
-    method setParameter
-    method transformToDocument
-    method transformToFragment
-interface webkitMediaStream : EventTarget
-    attribute @@toStringTag
-    getter active
-    getter id
-    getter onactive
-    getter onaddtrack
-    getter oninactive
-    getter onremovetrack
-    method addTrack
-    method clone
-    method constructor
-    method getAudioTracks
-    method getTrackById
-    method getTracks
-    method getVideoTracks
-    method removeTrack
-    setter onactive
-    setter onaddtrack
-    setter oninactive
-    setter onremovetrack
-interface webkitRTCPeerConnection : EventTarget
-    static method generateCertificate
-    attribute @@toStringTag
-    getter connectionState
-    getter currentLocalDescription
-    getter currentRemoteDescription
-    getter iceConnectionState
-    getter iceGatheringState
-    getter localDescription
-    getter onaddstream
-    getter onconnectionstatechange
-    getter ondatachannel
-    getter onicecandidate
-    getter onicecandidateerror
-    getter oniceconnectionstatechange
-    getter onicegatheringstatechange
-    getter onnegotiationneeded
-    getter onremovestream
-    getter onsignalingstatechange
-    getter ontrack
-    getter pendingLocalDescription
-    getter pendingRemoteDescription
-    getter remoteDescription
-    getter sctp
-    getter signalingState
-    method addIceCandidate
-    method addStream
-    method addTrack
-    method addTransceiver
-    method close
-    method constructor
-    method createAnswer
-    method createDTMFSender
-    method createDataChannel
-    method createOffer
-    method getConfiguration
-    method getLocalStreams
-    method getReceivers
-    method getRemoteStreams
-    method getSenders
-    method getStats
-    method getTransceivers
-    method removeStream
-    method removeTrack
-    method restartIce
-    method setConfiguration
-    method setLocalDescription
-    method setRemoteDescription
-    setter onaddstream
-    setter onconnectionstatechange
-    setter ondatachannel
-    setter onicecandidate
-    setter onicecandidateerror
-    setter oniceconnectionstatechange
-    setter onicegatheringstatechange
-    setter onnegotiationneeded
-    setter onremovestream
-    setter onsignalingstatechange
-    setter ontrack
-interface webkitSpeechGrammar
-    attribute @@toStringTag
-    getter src
-    getter weight
-    method constructor
-    setter src
-    setter weight
-interface webkitSpeechGrammarList
-    attribute @@toStringTag
-    getter length
-    method @@iterator
-    method addFromString
-    method addFromUri
-    method constructor
-    method item
-interface webkitSpeechRecognition : EventTarget
-    attribute @@toStringTag
-    getter continuous
-    getter grammars
-    getter interimResults
-    getter lang
-    getter maxAlternatives
-    getter onaudioend
-    getter onaudiostart
-    getter onend
-    getter onerror
-    getter onnomatch
-    getter onresult
-    getter onsoundend
-    getter onsoundstart
-    getter onspeechend
-    getter onspeechstart
-    getter onstart
-    method abort
-    method constructor
-    method start
-    method stop
-    setter continuous
-    setter grammars
-    setter interimResults
-    setter lang
-    setter maxAlternatives
-    setter onaudioend
-    setter onaudiostart
-    setter onend
-    setter onerror
-    setter onnomatch
-    setter onresult
-    setter onsoundend
-    setter onsoundstart
-    setter onspeechend
-    setter onspeechstart
-    setter onstart
-interface webkitSpeechRecognitionError : Event
-    attribute @@toStringTag
-    getter error
-    getter message
-    method constructor
-interface webkitSpeechRecognitionEvent : Event
-    attribute @@toStringTag
-    getter emma
-    getter interpretation
-    getter resultIndex
-    getter results
-    method constructor
-interface webkitURL
-    static method createObjectURL
-    static method revokeObjectURL
-    attribute @@toStringTag
-    getter hash
-    getter host
-    getter hostname
-    getter href
-    getter origin
-    getter password
-    getter pathname
-    getter port
-    getter protocol
-    getter search
-    getter searchParams
-    getter username
-    method constructor
-    method toJSON
-    method toString
-    setter hash
-    setter host
-    setter hostname
-    setter href
-    setter password
-    setter pathname
-    setter port
-    setter protocol
-    setter search
-    setter username
-[GLOBAL OBJECT]
-    attribute GCController
-    attribute accessibilityController
-    attribute chrome
-    attribute closed
-    attribute console
-    attribute eventSender
-    attribute frames
-    attribute gamepadController
-    attribute globalThis
-    attribute internals
-    attribute length
-    attribute location
-    attribute opener
-    attribute parent
-    attribute propertyNamesInGlobal
-    attribute self
-    attribute testRunner
-    attribute textInputController
-    attribute top
-    attribute window
-    getter applicationCache
-    getter caches
-    getter clientInformation
-    getter cookieStore
-    getter crypto
-    getter customElements
-    getter defaultStatus
-    getter defaultstatus
-    getter devicePixelRatio
-    getter document
-    getter event
-    getter external
-    getter frameElement
-    getter history
-    getter indexedDB
-    getter innerHeight
-    getter innerWidth
-    getter isSecureContext
-    getter localStorage
-    getter locationbar
-    getter menubar
-    getter name
-    getter navigator
-    getter offscreenBuffering
-    getter onabort
-    getter onactivateinvisible
-    getter onafterprint
-    getter onanimationend
-    getter onanimationiteration
-    getter onanimationstart
-    getter onappinstalled
-    getter onauxclick
-    getter onbeforeinstallprompt
-    getter onbeforeprint
-    getter onbeforeunload
-    getter onblur
-    getter oncancel
-    getter oncanplay
-    getter oncanplaythrough
-    getter onchange
-    getter onclick
-    getter onclose
-    getter oncontextmenu
-    getter oncuechange
-    getter ondblclick
-    getter ondevicemotion
-    getter ondeviceorientation
-    getter ondeviceorientationabsolute
-    getter ondrag
-    getter ondragend
-    getter ondragenter
-    getter ondragleave
-    getter ondragover
-    getter ondragstart
-    getter ondrop
-    getter ondurationchange
-    getter onemptied
-    getter onended
-    getter onerror
-    getter onfocus
-    getter onformdata
-    getter ongotpointercapture
-    getter onhashchange
-    getter oninput
-    getter oninvalid
-    getter onkeydown
-    getter onkeypress
-    getter onkeyup
-    getter onlanguagechange
-    getter onload
-    getter onloadeddata
-    getter onloadedmetadata
-    getter onloadstart
-    getter onlostpointercapture
-    getter onmessage
-    getter onmessageerror
-    getter onmousedown
-    getter onmouseenter
-    getter onmouseleave
-    getter onmousemove
-    getter onmouseout
-    getter onmouseover
-    getter onmouseup
-    getter onmousewheel
-    getter onoffline
-    getter ononline
-    getter onoverscroll
-    getter onpagehide
-    getter onpageshow
-    getter onpause
-    getter onplay
-    getter onplaying
-    getter onpointercancel
-    getter onpointerdown
-    getter onpointerenter
-    getter onpointerleave
-    getter onpointermove
-    getter onpointerout
-    getter onpointerover
-    getter onpointerrawupdate
-    getter onpointerup
-    getter onpopstate
-    getter onportalactivate
-    getter onprogress
-    getter onratechange
-    getter onrejectionhandled
-    getter onrendersubtreeactivation
-    getter onreset
-    getter onresize
-    getter onscroll
-    getter onscrollend
-    getter onsearch
-    getter onseeked
-    getter onseeking
-    getter onselect
-    getter onselectionchange
-    getter onselectstart
-    getter onstalled
-    getter onstorage
-    getter onsubmit
-    getter onsuspend
-    getter ontimeupdate
-    getter ontoggle
-    getter ontouchcancel
-    getter ontouchend
-    getter ontouchmove
-    getter ontouchstart
-    getter ontransitionend
-    getter onunhandledrejection
-    getter onunload
-    getter onvolumechange
-    getter onwaiting
-    getter onwebkitanimationend
-    getter onwebkitanimationiteration
-    getter onwebkitanimationstart
-    getter onwebkittransitionend
-    getter onwheel
-    getter origin
-    getter outerHeight
-    getter outerWidth
-    getter pageXOffset
-    getter pageYOffset
-    getter performance
-    getter personalbar
-    getter portalHost
-    getter scheduler
-    getter screen
-    getter screenLeft
-    getter screenTop
-    getter screenX
-    getter screenY
-    getter scrollX
-    getter scrollY
-    getter scrollbars
-    getter sessionStorage
-    getter speechSynthesis
-    getter status
-    getter statusbar
-    getter styleMedia
-    getter toolbar
-    getter trustedTypes
-    getter visualViewport
-    getter webkitStorageInfo
-    method NodeFilter
-    method alert
-    method atob
-    method blur
-    method btoa
-    method cancelAnimationFrame
-    method cancelIdleCallback
-    method cancelPostAnimationFrame
-    method captureEvents
-    method chooseFileSystemEntries
-    method clearInterval
-    method clearTimeout
-    method close
-    method confirm
-    method createImageBitmap
-    method fetch
-    method find
-    method focus
-    method gc
-    method getComputedAccessibleNode
-    method getComputedStyle
-    method getSelection
-    method matchMedia
-    method moveBy
-    method moveTo
-    method open
-    method openDatabase
-    method postMessage
-    method print
-    method prompt
-    method queueMicrotask
-    method releaseEvents
-    method requestAnimationFrame
-    method requestIdleCallback
-    method requestPostAnimationFrame
-    method resizeBy
-    method resizeTo
-    method scroll
-    method scrollBy
-    method scrollTo
-    method setInterval
-    method setTimeout
-    method stop
-    method webkitCancelAnimationFrame
-    method webkitRequestAnimationFrame
-    method webkitRequestFileSystem
-    method webkitResolveLocalFileSystemURL
-    setter clientInformation
-    setter cookieStore
-    setter defaultStatus
-    setter defaultstatus
-    setter devicePixelRatio
-    setter event
-    setter external
-    setter innerHeight
-    setter innerWidth
-    setter locationbar
-    setter menubar
-    setter name
-    setter offscreenBuffering
-    setter onabort
-    setter onactivateinvisible
-    setter onafterprint
-    setter onanimationend
-    setter onanimationiteration
-    setter onanimationstart
-    setter onappinstalled
-    setter onauxclick
-    setter onbeforeinstallprompt
-    setter onbeforeprint
-    setter onbeforeunload
-    setter onblur
-    setter oncancel
-    setter oncanplay
-    setter oncanplaythrough
-    setter onchange
-    setter onclick
-    setter onclose
-    setter oncontextmenu
-    setter oncuechange
-    setter ondblclick
-    setter ondevicemotion
-    setter ondeviceorientation
-    setter ondeviceorientationabsolute
-    setter ondrag
-    setter ondragend
-    setter ondragenter
-    setter ondragleave
-    setter ondragover
-    setter ondragstart
-    setter ondrop
-    setter ondurationchange
-    setter onemptied
-    setter onended
-    setter onerror
-    setter onfocus
-    setter onformdata
-    setter ongotpointercapture
-    setter onhashchange
-    setter oninput
-    setter oninvalid
-    setter onkeydown
-    setter onkeypress
-    setter onkeyup
-    setter onlanguagechange
-    setter onload
-    setter onloadeddata
-    setter onloadedmetadata
-    setter onloadstart
-    setter onlostpointercapture
-    setter onmessage
-    setter onmessageerror
-    setter onmousedown
-    setter onmouseenter
-    setter onmouseleave
-    setter onmousemove
-    setter onmouseout
-    setter onmouseover
-    setter onmouseup
-    setter onmousewheel
-    setter onoffline
-    setter ononline
-    setter onoverscroll
-    setter onpagehide
-    setter onpageshow
-    setter onpause
-    setter onplay
-    setter onplaying
-    setter onpointercancel
-    setter onpointerdown
-    setter onpointerenter
-    setter onpointerleave
-    setter onpointermove
-    setter onpointerout
-    setter onpointerover
-    setter onpointerrawupdate
-    setter onpointerup
-    setter onpopstate
-    setter onportalactivate
-    setter onprogress
-    setter onratechange
-    setter onrejectionhandled
-    setter onrendersubtreeactivation
-    setter onreset
-    setter onresize
-    setter onscroll
-    setter onscrollend
-    setter onsearch
-    setter onseeked
-    setter onseeking
-    setter onselect
-    setter onselectionchange
-    setter onselectstart
-    setter onstalled
-    setter onstorage
-    setter onsubmit
-    setter onsuspend
-    setter ontimeupdate
-    setter ontoggle
-    setter ontouchcancel
-    setter ontouchend
-    setter ontouchmove
-    setter ontouchstart
-    setter ontransitionend
-    setter onunhandledrejection
-    setter onunload
-    setter onvolumechange
-    setter onwaiting
-    setter onwebkitanimationend
-    setter onwebkitanimationiteration
-    setter onwebkitanimationstart
-    setter onwebkittransitionend
-    setter onwheel
-    setter origin
-    setter outerHeight
-    setter outerWidth
-    setter pageXOffset
-    setter pageYOffset
-    setter performance
-    setter personalbar
-    setter scheduler
-    setter screen
-    setter screenLeft
-    setter screenTop
-    setter screenX
-    setter screenY
-    setter scrollX
-    setter scrollY
-    setter scrollbars
-    setter status
-    setter statusbar
-    setter toolbar
-    setter visualViewport
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 0056109..25d9623 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png
index e1f4302..6c81cce2 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
index f3813770..69e1d36 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-12-AM-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-12-AM-expected.png
index 7e22a7c4..53dd09c 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-12-AM-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/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/time-picker/time-picker-appearance-12-PM-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-12-PM-expected.png
index b6cb3a0..5e2a7b472 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-12-PM-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/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/time-picker/time-picker-appearance-arrowdown-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-arrowdown-expected.png
index 61e78cff..4cd4a90 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-arrowdown-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-arrowdown-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png
index 833fcf1..6a0804e 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
index 155c9d34..d0ab457 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png
index 6afd9449..2fac4ca 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-seconds-pm-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-seconds-pm-expected.png
index f9529d3..a393957 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/time-picker/time-picker-appearance-seconds-pm-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/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/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png
index 17f8796..dfe7c6c 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
index 72c9511..d86a0c03 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png
index d09fd88..fbf152f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png
index ee758da..daa4ab7 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png
index bb7c202..e189651 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png
index 79a65c30d..97b7b2e 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 17f8796..dfe7c6c 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index f8490f3..33cde42 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 12f31a4f..1d815442 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index f8ed12ed..452ae4b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png
index 56a7188..57f8e7c 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 14dae875..04f7c84 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png
index fbc5354..878fbf3f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/color-scheme/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/datetimelocal-picker/datetimelocal-picker-step2-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
index 190f927..8d1e798a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png
index f492021..07cc94fb 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png
index fa2e4979..9f5f148 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png
index f5f4f51..3ed5b30 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png
index 149271a..6141d554 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-12-AM-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-12-AM-expected.png
index 6c3a211e..0762f76 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-12-AM-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/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/time-picker/time-picker-appearance-12-PM-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-12-PM-expected.png
index c58408a0..c34c03da 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-12-PM-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/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/time-picker/time-picker-appearance-24-hour-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-24-hour-expected.png
index 37db129..7a380f0d 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-24-hour-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/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/time-picker/time-picker-appearance-arrowdown-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-arrowdown-expected.png
index 620b45a3..aa5720c 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-arrowdown-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/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/time-picker/time-picker-appearance-arrowup-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png
index 5363b4d8..4c2d734a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/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/time-picker/time-picker-appearance-ko-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
index 08d74bf..e6209d2 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/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/time-picker/time-picker-appearance-milliseconds-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png
index ab52c9e..23097ab 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/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/time-picker/time-picker-appearance-seconds-pm-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-seconds-pm-expected.png
index 8163cd79..5979919a 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/time-picker/time-picker-appearance-seconds-pm-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/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/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png
index 16f1470..e3bd113 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
index 9179e31..41a93c6d 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png
index 7f3ff8a..c503e2e 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png
index cb4e6df..3c92b16 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png
index aff4296..1586c37 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png
index 5902ada0..f14ccb3 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 16f1470..e3bd113 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 7244aaf..bd5249b6d 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 797e4b9..9772416 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 722e61c..21ab713 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png
index ef75c622..85ab8890 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index bf9f53d2..30a84bf 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png
index a8ed0908f..1aefab9 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/color-scheme/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/datetimelocal-picker/datetimelocal-picker-step2-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
index b31ee51..0a39750 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png
index c10ea84..32ee326 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png
index 4b51ad01..a765e087 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png
index e60ea62e..81a445c 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png
index 8e7f165b..1bcc044 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-12-AM-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-12-AM-expected.png
index 63fc1dd8..08b68fc 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-12-AM-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/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/time-picker/time-picker-appearance-12-PM-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-12-PM-expected.png
index 3b453f6..917caa9 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-12-PM-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/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/time-picker/time-picker-appearance-24-hour-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-24-hour-expected.png
index eb6ef7a..9b31142 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-24-hour-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/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/time-picker/time-picker-appearance-arrowdown-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-arrowdown-expected.png
index be6da2bf..a709c9d6 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-arrowdown-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/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/time-picker/time-picker-appearance-arrowup-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png
index fdcee64..6b33b56 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/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/time-picker/time-picker-appearance-ko-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
index a29b01bb..2147d33 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/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/time-picker/time-picker-appearance-milliseconds-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png
index a620e53..784ddc3b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/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/time-picker/time-picker-appearance-seconds-pm-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-seconds-pm-expected.png
index b55e288..b1600612 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/time-picker/time-picker-appearance-seconds-pm-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/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-hc/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png
index 3700a096..0506476 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png
index d0632b6..4a8d4dd 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
index 7725557..e9aa6f7 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png
index 7ede342..9398c57 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png
index 9c0fb386..0545139 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png
index 054c6d04..dceaeab 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png
index 722dda7..009a6dda 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png
index d0632b6..4a8d4dd 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 7b10a8bd..ffc336a 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png
index 103fc646..d76ad62 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index bc61f1c..e11ba70eb 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 79ae029..4aa3fe5 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png
index 656859d..90f019e 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 0108c0d..44f123d 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png
index 0bc3ff1..c7e9fc6 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-click-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-click-expected.png
index 513826a7..472b7cbb 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-click-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
index 7d3cd3b..2777e5e 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
index 782ffd67..3a771b5 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-drag-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-drag-expected.png
index 513826a7..472b7cbb 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
index 5afd3ef..d7224dd 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
index 7a25036..d4c7f47 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
index c2e5b5a..8dc58ec 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
index 9376492..8380ffd7 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
index 7d69248..236fb85 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
index 3053c524..4d7a46a 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
index 2dbe819c..b2b9877 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hex-format-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hex-format-expected.png
index 701399db..2266fbee 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hex-format-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hex-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hsl-format-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hsl-format-expected.png
index 8c38887..1331ff29 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hsl-format-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hsl-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
index 7b30bdb..8b06bcf 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-click-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-click-expected.png
index b3072285..2bf6e04b 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-click-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-drag-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-drag-expected.png
index b3072285..2bf6e04b 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-drag-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
index 0e60d0e6a..307468f7 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
index 4789f2a..f3dd485 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
index 7fbc4d3..130d9bc 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-imperfect-match-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-imperfect-match-expected.png
index 2f3017d5..896918f 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-imperfect-match-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-imperfect-match-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-manual-color-change-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-manual-color-change-expected.png
index 7263ab6..cd8e63ea 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-manual-color-change-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-manual-color-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-set-value-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-set-value-expected.png
index 0faa811..6acfe9c3 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-set-value-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-set-value-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-value-attribute-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-value-attribute-expected.png
index 16d1491..b4d50022 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-value-attribute-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-value-attribute-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-zoom125-expected.png
index 91efffd..1ae83c7 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-zoom200-expected.png
index e9f0823..9ea95f9 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/color/color-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
index 31807e2c..a49b64b4 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png
index 25d5c55..891f91c 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png
index da61a9f..7ab112ee 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png
index 9ebf8ef..8a8e4d8d 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png
index b162677..ca458d99 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-12-AM-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-12-AM-expected.png
index ddd8cb8..b3dc43a 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-12-AM-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/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/time-picker/time-picker-appearance-12-PM-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-12-PM-expected.png
index 651a881..ec4e4562 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-12-PM-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/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/time-picker/time-picker-appearance-24-hour-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-24-hour-expected.png
index de5474be..d6c995e1 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-24-hour-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/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/time-picker/time-picker-appearance-arrowdown-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-arrowdown-expected.png
index 94338d0..6ab2c36 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-arrowdown-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-arrowdown-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png
index ea5f1880..54c5c6b 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
index 09953e9..b742421 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png
index 5785258..79ae69fd 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-seconds-pm-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-seconds-pm-expected.png
index b6f9cf6..a83cf8d 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-seconds-pm-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/time-picker/time-picker-appearance-seconds-pm-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/cascade/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/virtual/cascade/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
index 4fa11a7..caa729f 100644
--- a/third_party/blink/web_tests/platform/win/virtual/cascade/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/cascade/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png
index 39becea09..53e7683 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png
index 29f21e8..6dfaa5a 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
index af40c2e..e6a8fe2 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png
index 4b19cc8..589c8a3 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png
index 16a44f4e..69d0c5d 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png
index 44cd61d..923974e 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png
index dcc76b4..7323fef 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 29f21e8..6dfaa5a 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 33d2336..e52d347 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png
index 2727347ca..d3c96b03 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/color/color-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index c85963a..d1112112 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index fbaeb66..e2f2ee7 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png
index f0391c5a..d05f206 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 51d0b5e6..834a396 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png
index 308b16b8..19adc10 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color-scheme/time-picker/time-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-click-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-click-expected.png
index bb943ed..e96b861 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-click-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
index 0393f9d..92f8ebe 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
index 090a8c6..6776ef2 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-down-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-drag-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-drag-expected.png
index bb943ed..e96b861 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-drag-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
index 2a681ea..f0644fe 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
index f78fec6..3f4655f 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
index 599c090..4dfe404 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-top-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
index e587ded..5e43cb4 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
index 8af1519d..9dbfbbd 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-top-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
index b2792dd..2a47431 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
index 0afe6028..6bd37a8c 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hex-format-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hex-format-expected.png
index a453c44..5e07307 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hex-format-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hex-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hsl-format-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hsl-format-expected.png
index 77a9a66..1e6b80ff 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hsl-format-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hsl-format-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
index 337eb82..85ffe05 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-accelerated-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-click-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-click-expected.png
index d7a19a4..c959607d 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-click-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-click-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-drag-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-drag-expected.png
index d7a19a4..c959607d 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-drag-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-drag-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
index 98b5324..758ce17 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-keyboard-navigation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
index ff4b7b44..dbf011f4 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-left-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
index 500ab54f..47407a4 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-hue-slider-right-edge-zero-hue-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-imperfect-match-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-imperfect-match-expected.png
index c3305767..6b94fb1 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-imperfect-match-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-imperfect-match-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-manual-color-change-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-manual-color-change-expected.png
index cbc0181..b985cc1 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-manual-color-change-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-manual-color-change-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-set-value-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-set-value-expected.png
index 82ae927..87be1f6 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-set-value-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-set-value-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-value-attribute-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-value-attribute-expected.png
index 77f76f7..f989b7a 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-value-attribute-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-value-attribute-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-zoom125-expected.png
index 06e0ff9..edbf519b 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-zoom200-expected.png
index 3515be60..c8f313e 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/color/color-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
index d42bee8..769a96b 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png
index 95c1098..631cc0c 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png
index f239e25..fa584477 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png
index 766e46da..e08dfec 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png
index 8003c168..e6b9354 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-12-AM-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-12-AM-expected.png
index eddde61..8e2b79c 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-12-AM-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/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/time-picker/time-picker-appearance-12-PM-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-12-PM-expected.png
index 4796ef4..52e0d94 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-12-PM-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/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/time-picker/time-picker-appearance-24-hour-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-24-hour-expected.png
index 27727052..561cebcb 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-24-hour-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/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/time-picker/time-picker-appearance-arrowdown-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-arrowdown-expected.png
index 89dfd5b..6a0b344d 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-arrowdown-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-arrowdown-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png
index 8b1fe0c0..3d4112be 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-arrowup-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
index 00b29fd..21ed4c8 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png
index 81a5390..8a2d80fb 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-milliseconds-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-seconds-pm-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-seconds-pm-expected.png
index 825fcfe1b..282e845 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-seconds-pm-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh/time-picker/time-picker-appearance-seconds-pm-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/cascade/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win7/virtual/cascade/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
index 87cfe7c..869fd52 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/cascade/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/cascade/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png
index 346d7143..9043cdb 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
index ed8393c..ef44020 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png
index 4f83bfc1..a2c4ab71 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png
index 86683ca..a408cbb 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png
index a9caba9..08280656 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png
index 9e7882a..59cd069 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 346d7143..9043cdb 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index ce16da8..0de972a 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 98e9b122..bff1ee3 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 6a92794..48e0cfa 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png
index 7c11828..2d08858 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 333e8f6..350e63b 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
index 3cd1bd7..0bae342 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/datetimelocal-picker/datetimelocal-picker-step2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png
index 8f0b31aa..f151430 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-disabled-today-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png
index 7218b68..9a75b945 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png
index aecaa9c..4051a11 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-value-not-in-interval-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png
index 3933b47..3edf8e8 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/month-picker/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
index ec90cb2..b278bd7 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/time-picker/time-picker-appearance-ko-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-enter-submission.html b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-enter-submission.html
deleted file mode 100644
index b6e958f..0000000
--- a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-enter-submission.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<script src='../../../resources/testharness.js'></script>
-<script src='../../../resources/testharnessreport.js'></script>
-<script src='../../../fast/forms/resources/picker-common.js'></script>
-</head>
-<body>
-<input type='color' id='color' value='#80d9ff'>
-<script>
-'use strict';
-
-let t = async_test('Color picker: Pressing enter to submit color selection.');
-t.step(() => {
-  let colorControl = document.getElementById('color');
-  openPicker(colorControl, t.step_func(() => {
-    popupWindow.focus();
-    const popupDocument = popupWindow.document;
-    const colorWell = popupDocument.querySelector('color-well');
-    const colorWellRect = colorWell.getBoundingClientRect();
-    eventSender.mouseMoveTo(colorWellRect.left, colorWellRect.top);
-    eventSender.mouseDown();
-    eventSender.mouseMoveTo(colorWellRect.left + (colorWellRect.width * 4 / 10), colorWellRect.top + (colorWellRect.height * 6 / 10));
-    eventSender.mouseUp();
-    eventSender.keyDown('Enter');
-    waitUntilClosing(t.step_func_done(() => {
-      assert_equals(colorControl.value, '#3d5a66', 'Color control value should update after pressing enter.');
-    }), popupWindow.eval('ColorPicker').COMMIT_DELAY_MS);
-  }), t.step_func_done(() => {
-    assert_true(true, 'Popup did not open.');
-  }));
-});
-</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-escape-cancellation.html b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-escape-cancellation.html
index 85543c53..5a4549b5 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-escape-cancellation.html
+++ b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-escape-cancellation.html
@@ -6,30 +6,124 @@
 <script src='../../../fast/forms/resources/picker-common.js'></script>
 </head>
 <body>
-<input type='color' id='color' value='#80d9ff'>
+<input type='color' id='color1' value='#80d9ff'>
+<input type='color' id='color2' value='#3d5a66'>
+<input type='color' id='color3' value='#000000'>
 <script>
 'use strict';
 
-let t = async_test('Color picker: Pressing escape to discard color selection.');
-t.step(() => {
-  let colorControl = document.getElementById('color');
-  openPicker(colorControl, t.step_func(() => {
-    popupWindow.focus();
-    const popupDocument = popupWindow.document;
+promise_test(() => {
+  let colorControl = document.getElementById('color1');
+  return openPickerWithPromise(colorControl)
+  .then(() => {
+    internals.pagePopupWindow.focus();
+    eventSender.keyDown('Escape');
+    assert_equals(internals.pagePopupWindow, null, 'Popup should close after pressing escape with no changes.');
+  });
+}, "Color picker: Pressing escape with no changes should close the popup");
+
+promise_test(() => {
+  let colorControl = document.getElementById('color1');
+  return openPickerWithPromise(colorControl)
+  .then(() => {
+    internals.pagePopupWindow.focus();
+    const popupDocument = internals.pagePopupWindow.document;
     const colorWell = popupDocument.querySelector('color-well');
     const colorWellRect = colorWell.getBoundingClientRect();
     eventSender.mouseMoveTo(colorWellRect.left, colorWellRect.top);
     eventSender.mouseDown();
     eventSender.mouseMoveTo(colorWellRect.left + (colorWellRect.width * 4 / 10), colorWellRect.top + (colorWellRect.height * 6 / 10));
     eventSender.mouseUp();
+    assert_equals(colorControl.value, '#3d5a66', 'Expected color value to change from mouse input.');
     eventSender.keyDown('Escape');
-    waitUntilClosing(t.step_func_done(() => {
-      assert_equals(colorControl.value, '#80d9ff', 'Color control value should remain the same after pressing escape.');
-    }), popupWindow.eval('ColorPicker').COMMIT_DELAY_MS);
-  }), t.step_func_done(() => {
-    assert_true(true, 'Popup did not open.');
-  }));
-});
+    assert_equals(colorControl.value, '#80d9ff', 'Color control value should have reverted back after pressing escape.');
+    assert_not_equals(internals.pagePopupWindow, null, 'Popup should still be open after escape that reverted color value.');
+    eventSender.keyDown('Escape');
+    assert_equals(internals.pagePopupWindow, null, 'Popup should close after second escape.');
+  });
+}, "Color picker: Pressing escape once discards color selection but keeps popup open, pressing again closes popup");
+
+promise_test(() => {
+  let colorControl = document.getElementById('color1');
+  return openPickerWithPromise(colorControl)
+  .then(() => {
+    internals.pagePopupWindow.focus();
+    const popupDocument = internals.pagePopupWindow.document;
+    const colorWell = popupDocument.querySelector('color-well');
+    const rValueContainer = popupDocument.getElementById('rValueContainer');
+    const rValueContainerRect = rValueContainer.getBoundingClientRect();
+    eventSender.mouseMoveTo(rValueContainerRect.left + 1, rValueContainerRect.top);
+    eventSender.mouseDown();
+    eventSender.mouseUp();
+    assert_equals(rValueContainer.value, '128');
+    eventSender.keyDown('Delete');
+    assert_equals(rValueContainer.value, '28');
+    assert_equals(colorControl.value, '#1cd9ff', 'Expected color value to change from manualinput.');
+    eventSender.keyDown('Escape');
+    assert_equals(colorControl.value, '#80d9ff', 'Color control value should have reverted back after pressing escape.');
+    assert_equals(rValueContainer.value, '128');
+    assert_not_equals(internals.pagePopupWindow, null, 'Popup should still be open after escape that reverted color value.');
+    eventSender.keyDown('Escape');
+    assert_equals(internals.pagePopupWindow, null, 'Popup should close after second escape.');
+  });
+}, "Color picker: Pressing escape once discards manual color selection but keeps popup open, pressing again closes popup");
+
+promise_test(() => {
+  let colorControl = document.getElementById('color2');
+  return openPickerWithPromise(colorControl)
+  .then(() => {
+    internals.pagePopupWindow.focus();
+    const popupDocument = internals.pagePopupWindow.document;
+    const colorWell = popupDocument.querySelector('color-well');
+    const colorWellRect = colorWell.getBoundingClientRect();
+    eventSender.mouseMoveTo(colorWellRect.left + (colorWellRect.width * 2 / 10), colorWellRect.top + (colorWellRect.height * 3 / 10));
+    eventSender.mouseDown();
+    eventSender.mouseUp();
+    assert_equals(colorControl.value, '#8fa8b3', 'Mouse input should have changed color value.');
+
+    eventSender.mouseMoveTo(colorWellRect.left + (colorWellRect.width * 4 / 10), colorWellRect.top + (colorWellRect.height * 6 / 10));
+    eventSender.mouseDown();
+    eventSender.mouseUp();
+    assert_equals(colorControl.value, '#3d5a66', 'Mouse input should have changed color back to original value.');
+    eventSender.keyDown('Escape');
+    assert_equals(internals.pagePopupWindow, null, 'Single escape should change popup since its value was switched back the value when opened');
+  });
+}, "Color picker: Pressing escape closes popup after value is changed and then set back to original value.");
+
+promise_test(() => {
+  let colorControl = document.getElementById('color3');
+  return openPickerWithPromise(colorControl)
+  .then(() => {
+    internals.pagePopupWindow.focus();
+    const popupDocument = internals.pagePopupWindow.document;
+    const hueSlider = popupDocument.querySelector('hue-slider');
+    const hueSliderRect = hueSlider.getBoundingClientRect();
+    eventSender.mouseMoveTo(hueSliderRect.left, hueSliderRect.top);
+    eventSender.mouseDown();
+    eventSender.mouseMoveTo(hueSliderRect.left + (hueSliderRect.width / 2), hueSliderRect.top);
+    eventSender.mouseUp();
+    assert_equals(colorControl.value, '#000000', 'Hue slider should not have changed value when starting from #000000.');
+
+    eventSender.keyDown('Escape');
+    assert_equals(internals.pagePopupWindow, null, 'Single escape should close popup if hue slider but not color value changed');
+  });
+}, "Color picker: Hue slider change with no color value change doesn't affect escape behavior");
+
+promise_test(() => {
+  let colorControl = document.getElementById('color3');
+  return openPickerWithPromise(colorControl)
+  .then(() => {
+    internals.pagePopupWindow.focus();
+    const popupDocument = internals.pagePopupWindow.document;
+    const formatToggler = popupDocument.querySelector('format-toggler');
+    formatToggler.click();  // first click changes format to HSL
+    formatToggler.click();  // second click changes format to Hex
+
+    eventSender.keyDown('Escape');
+    assert_equals(internals.pagePopupWindow, null, 'Single escape should close popup if manual color entry format but not color value changed');
+  });
+}, "Color picker: Format changes with no color value change don't affect escape behavior");
+
 </script>
 </body>
 </html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-events.html b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-events.html
new file mode 100644
index 0000000..8209532
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-events.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src='../../../resources/testharness.js'></script>
+<script src='../../../resources/testharnessreport.js'></script>
+<script src='../../../fast/forms/resources/picker-common.js'></script>
+</head>
+<body>
+<input type='color' id='color1' value='#000000' oninput='inputEventCount++;' onchange='changeEventCount++;'>
+<script>
+'use strict';
+
+var inputEventCount = 0;
+var changeEventCount = 0;
+
+promise_test(() => {
+  let colorControl = document.getElementById('color1');
+  return openPickerWithPromise(colorControl)
+  .then(() => {
+    internals.pagePopupWindow.focus();
+    eventSender.keyDown('Enter');
+    assert_equals(inputEventCount, 0, 'No input event should have fired if color value was not changed.');
+    return new Promise((resolve) => {
+      window.setTimeout(() => {
+        assert_equals(changeEventCount, 0, 'No change event should have fired if color value was not changed.');
+        resolve();
+      }, 0)
+    });
+  });
+}, "Color picker: Opening and closing popup with no changes should not fire input/change events");
+
+promise_test(() => {
+  inputEventCount = 0;
+  changeEventCount = 0;
+  let colorControl = document.getElementById('color1');
+  return openPickerWithPromise(colorControl)
+  .then(() => {
+    internals.pagePopupWindow.focus();
+    const popupDocument = internals.pagePopupWindow.document;
+    const rValueContainer = popupDocument.getElementById('rValueContainer');
+    rValueContainer.focus();
+
+    assert_equals(rValueContainer.value, '0');
+    eventSender.keyDown('1');
+    assert_equals(rValueContainer.value, '01');
+    assert_equals(inputEventCount, 1, 'Input event should have fired after color value change.');
+    assert_equals(changeEventCount, 0, 'No change event should have fired before popup is closed.');
+
+    eventSender.keyDown('2');
+    assert_equals(rValueContainer.value, '012');
+    assert_equals(inputEventCount, 2, 'Additional input event should have fired after additional color value change.');
+    assert_equals(changeEventCount, 0, 'No change event should have fired before popup is closed.');
+    
+    eventSender.keyDown('Enter');
+    assert_equals(internals.pagePopupWindow, null, "Popup should have closed from Enter key");
+    assert_equals(inputEventCount, 2, 'No extra input event should fire when closing popup.');
+    assert_equals(changeEventCount, 0, 'Change event is fired asynchronously after closing popup.');
+    return new Promise((resolve) => {
+      window.setTimeout(() => {
+        assert_equals(changeEventCount, 1, 'Change event should have fired (once) asynchronously after closing popup.');
+        resolve();
+      }, 0)
+    });
+  });
+}, "Color picker: Test firing change and input events");
+
+promise_test(() => {
+  inputEventCount = 0;
+  changeEventCount = 0;
+  let colorControl = document.getElementById('color1');
+  colorControl.value = '#000000';
+  return openPickerWithPromise(colorControl)
+  .then(() => {
+    internals.pagePopupWindow.focus();
+    const popupDocument = internals.pagePopupWindow.document;
+    const rValueContainer = popupDocument.getElementById('rValueContainer');
+    rValueContainer.focus();
+
+    assert_equals(rValueContainer.value, '0');
+    eventSender.keyDown('1');
+    assert_equals(rValueContainer.value, '01');
+    assert_equals(inputEventCount, 1, 'Input event should have fired after color value change.');
+    assert_equals(changeEventCount, 0, 'No change event should have fired before popup is closed.');
+    
+    eventSender.keyDown('Escape');
+    assert_equals(rValueContainer.value, '0');
+    assert_equals(inputEventCount, 2, 'Additional input event should have fired after color value is reset.');
+    assert_equals(changeEventCount, 0, 'No change event should have fired before popup is closed.');
+    
+    eventSender.keyDown('Enter');
+    assert_equals(internals.pagePopupWindow, null, "Popup should have closed from Enter key");
+    assert_equals(inputEventCount, 2, 'No extra input event should fire when closing popup.');
+    return new Promise((resolve) => {
+      window.setTimeout(() => {
+        assert_equals(changeEventCount, 0, 'Change event should not fire if value when opening popup is restored.');
+        resolve();
+      }, 0)
+    });
+  });
+}, "Color picker: Test that change is not fired if original value is restored");
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-tab-navigation-expected.txt b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-tab-navigation-expected.txt
index 4fe22dc..ebad46c 100644
--- a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-tab-navigation-expected.txt
+++ b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-tab-navigation-expected.txt
@@ -5,11 +5,7 @@
 GVALUECONTAINER
 BVALUECONTAINER
 FORMAT-TOGGLER
-SUBMISSION-BUTTON
-SUBMISSION-BUTTON
 FORMAT-TOGGLER clicked. Active color format changed.
-SUBMISSION-BUTTON
-SUBMISSION-BUTTON
 COLOR-SELECTION-RING
 COLOR-SELECTION-RING
 HVALUECONTAINER
@@ -17,8 +13,6 @@
 LVALUECONTAINER
 FORMAT-TOGGLER
 FORMAT-TOGGLER clicked. Active color format changed.
-SUBMISSION-BUTTON
-SUBMISSION-BUTTON
 COLOR-SELECTION-RING
 COLOR-SELECTION-RING
 HEXVALUECONTAINER
diff --git a/third_party/sqlite/amalgamation/shell/shell.c b/third_party/sqlite/amalgamation/shell/shell.c
index a7275a2..f3998bd 100644
--- a/third_party/sqlite/amalgamation/shell/shell.c
+++ b/third_party/sqlite/amalgamation/shell/shell.c
@@ -5827,6 +5827,7 @@
 
     if( rc==SQLITE_OK ){
       zPath = (const char*)sqlite3_value_text(apVal[2]);
+      if( zPath==0 ) zPath = "";
       nPath = (int)strlen(zPath);
       mTime = zipfileGetTime(apVal[4]);
     }
diff --git a/third_party/sqlite/amalgamation/sqlite3.c b/third_party/sqlite/amalgamation/sqlite3.c
index 46b690dd..359c15e 100644
--- a/third_party/sqlite/amalgamation/sqlite3.c
+++ b/third_party/sqlite/amalgamation/sqlite3.c
@@ -19114,6 +19114,7 @@
 SQLITE_PRIVATE void sqlite3Savepoint(Parse*, int, Token*);
 SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *);
 SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3*);
+SQLITE_PRIVATE u32 sqlite3IsTrueOrFalse(const char*);
 SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr*);
 SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr*);
 SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr*);
@@ -99331,18 +99332,33 @@
 }
 
 /*
+** Check the input string to see if it is "true" or "false" (in any case).
+**
+**       If the string is....           Return
+**         "true"                         EP_IsTrue
+**         "false"                        EP_IsFalse
+**         anything else                  0
+*/
+SQLITE_PRIVATE u32 sqlite3IsTrueOrFalse(const char *zIn){
+  if( sqlite3StrICmp(zIn, "true")==0  ) return EP_IsTrue;
+  if( sqlite3StrICmp(zIn, "false")==0 ) return EP_IsFalse;
+  return 0;
+}
+
+
+/*
 ** If the input expression is an ID with the name "true" or "false"
 ** then convert it into an TK_TRUEFALSE term.  Return non-zero if
 ** the conversion happened, and zero if the expression is unaltered.
 */
 SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr *pExpr){
+  u32 v;
   assert( pExpr->op==TK_ID || pExpr->op==TK_STRING );
   if( !ExprHasProperty(pExpr, EP_Quoted)
-   && (sqlite3StrICmp(pExpr->u.zToken, "true")==0
-       || sqlite3StrICmp(pExpr->u.zToken, "false")==0)
+   && (v = sqlite3IsTrueOrFalse(pExpr->u.zToken))!=0
   ){
     pExpr->op = TK_TRUEFALSE;
-    ExprSetProperty(pExpr, pExpr->u.zToken[4]==0 ? EP_IsTrue : EP_IsFalse);
+    ExprSetProperty(pExpr, v);
     return 1;
   }
   return 0;
@@ -127627,7 +127643,7 @@
         zName = pEList->a[i].zSpan;
       }
     }
-    if( zName ){
+    if( zName && !sqlite3IsTrueOrFalse(zName) ){
       zName = sqlite3DbStrDup(db, zName);
     }else{
       zName = sqlite3MPrintf(db,"column%d",i+1);
@@ -147617,9 +147633,11 @@
     int nInit = pList ? pList->nExpr : 0;
     for(i=0; i<pAppend->nExpr; i++){
       Expr *pDup = sqlite3ExprDup(pParse->db, pAppend->a[i].pExpr, 0);
+      assert( pDup==0 || !ExprHasProperty(pDup, EP_MemToken) );
       if( bIntToNull && pDup && pDup->op==TK_INTEGER ){
         pDup->op = TK_NULL;
         pDup->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse);
+        pDup->u.zToken = 0;
       }
       pList = sqlite3ExprListAppend(pParse, pList, pDup);
       if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags;
@@ -172008,7 +172026,7 @@
 ** returns zero rows.  */
 /* 28 */ "SELECT level, count(*) AS cnt FROM %Q.'%q_segdir' "
          "  GROUP BY level HAVING cnt>=?"
-         "  ORDER BY (level %% 1024) ASC LIMIT 1",
+         "  ORDER BY (level %% 1024) ASC, 2 DESC LIMIT 1",
 
 /* Estimate the upper limit on the number of leaf nodes in a new segment
 ** created by merging the oldest :2 segments from absolute level :1. See
@@ -176598,8 +176616,14 @@
 
       rc = fts3IncrmergeHintPop(&hint, &iHintAbsLevel, &nHintSeg);
       if( nSeg<0 || (iAbsLevel % nMod) >= (iHintAbsLevel % nMod) ){
+        /* Based on the scan in the block above, it is known that there
+        ** are no levels with a relative level smaller than that of
+        ** iAbsLevel with more than nSeg segments, or if nSeg is -1,
+        ** no levels with more than nMin segments. Use this to limit the
+        ** value of nHintSeg to avoid a large memory allocation in case the
+        ** merge-hint is corrupt*/
         iAbsLevel = iHintAbsLevel;
-        nSeg = nHintSeg;
+        nSeg = MIN(MAX(nMin,nSeg), nHintSeg);
         bUseHint = 1;
         bDirtyHint = 1;
       }else{
@@ -176612,7 +176636,7 @@
     /* If nSeg is less that zero, then there is no level with at least
     ** nMin segments and no hint in the %_stat table. No work to do.
     ** Exit early in this case.  */
-    if( nSeg<0 ) break;
+    if( nSeg<=0 ) break;
 
     /* Open a cursor to iterate through the contents of the oldest nSeg
     ** indexes of absolute level iAbsLevel. If this cursor is opened using
@@ -177990,7 +178014,7 @@
     /* Set the *pmSeen output variable. */
     for(i=0; i<nList; i++){
       if( sIter.aPhrase[i].pHead ){
-        *pmSeen |= (u64)1 << i;
+        *pmSeen |= (u64)1 << (i%64);
       }
     }
 
@@ -224696,7 +224720,7 @@
 #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
 
 /************** End of stmt.c ************************************************/
-#if __LINE__!=224699
+#if __LINE__!=224723
 #undef SQLITE_SOURCE_ID
 #define SQLITE_SOURCE_ID      "2019-10-10 20:19:45 18db032d058f1436ce3dea84081f4ee5a0f2259ad97301d43c426bc7f3dfalt2"
 #endif
diff --git a/third_party/sqlite/patched/ext/fts3/fts3_snippet.c b/third_party/sqlite/patched/ext/fts3/fts3_snippet.c
index dda71c3..6eae82d 100644
--- a/third_party/sqlite/patched/ext/fts3/fts3_snippet.c
+++ b/third_party/sqlite/patched/ext/fts3/fts3_snippet.c
@@ -560,7 +560,7 @@
     /* Set the *pmSeen output variable. */
     for(i=0; i<nList; i++){
       if( sIter.aPhrase[i].pHead ){
-        *pmSeen |= (u64)1 << i;
+        *pmSeen |= (u64)1 << (i%64);
       }
     }
 
diff --git a/third_party/sqlite/patched/ext/fts3/fts3_write.c b/third_party/sqlite/patched/ext/fts3/fts3_write.c
index 8b6b7299..f30bf34 100644
--- a/third_party/sqlite/patched/ext/fts3/fts3_write.c
+++ b/third_party/sqlite/patched/ext/fts3/fts3_write.c
@@ -335,7 +335,7 @@
 ** returns zero rows.  */
 /* 28 */ "SELECT level, count(*) AS cnt FROM %Q.'%q_segdir' "
          "  GROUP BY level HAVING cnt>=?"
-         "  ORDER BY (level %% 1024) ASC LIMIT 1",
+         "  ORDER BY (level %% 1024) ASC, 2 DESC LIMIT 1",
 
 /* Estimate the upper limit on the number of leaf nodes in a new segment
 ** created by merging the oldest :2 segments from absolute level :1. See
@@ -4925,8 +4925,14 @@
 
       rc = fts3IncrmergeHintPop(&hint, &iHintAbsLevel, &nHintSeg);
       if( nSeg<0 || (iAbsLevel % nMod) >= (iHintAbsLevel % nMod) ){
+        /* Based on the scan in the block above, it is known that there
+        ** are no levels with a relative level smaller than that of
+        ** iAbsLevel with more than nSeg segments, or if nSeg is -1,
+        ** no levels with more than nMin segments. Use this to limit the
+        ** value of nHintSeg to avoid a large memory allocation in case the
+        ** merge-hint is corrupt*/
         iAbsLevel = iHintAbsLevel;
-        nSeg = nHintSeg;
+        nSeg = MIN(MAX(nMin,nSeg), nHintSeg);
         bUseHint = 1;
         bDirtyHint = 1;
       }else{
@@ -4939,7 +4945,7 @@
     /* If nSeg is less that zero, then there is no level with at least
     ** nMin segments and no hint in the %_stat table. No work to do.
     ** Exit early in this case.  */
-    if( nSeg<0 ) break;
+    if( nSeg<=0 ) break;
 
     /* Open a cursor to iterate through the contents of the oldest nSeg
     ** indexes of absolute level iAbsLevel. If this cursor is opened using
diff --git a/third_party/sqlite/patched/ext/misc/zipfile.c b/third_party/sqlite/patched/ext/misc/zipfile.c
index 5a88389..1dc47a7 100644
--- a/third_party/sqlite/patched/ext/misc/zipfile.c
+++ b/third_party/sqlite/patched/ext/misc/zipfile.c
@@ -1618,6 +1618,7 @@
 
     if( rc==SQLITE_OK ){
       zPath = (const char*)sqlite3_value_text(apVal[2]);
+      if( zPath==0 ) zPath = "";
       nPath = (int)strlen(zPath);
       mTime = zipfileGetTime(apVal[4]);
     }
diff --git a/third_party/sqlite/patched/src/expr.c b/third_party/sqlite/patched/src/expr.c
index e8b1f31..760978c 100644
--- a/third_party/sqlite/patched/src/expr.c
+++ b/third_party/sqlite/patched/src/expr.c
@@ -1815,18 +1815,33 @@
 }
 
 /*
+** Check the input string to see if it is "true" or "false" (in any case).
+**
+**       If the string is....           Return
+**         "true"                         EP_IsTrue
+**         "false"                        EP_IsFalse
+**         anything else                  0
+*/
+u32 sqlite3IsTrueOrFalse(const char *zIn){
+  if( sqlite3StrICmp(zIn, "true")==0  ) return EP_IsTrue;
+  if( sqlite3StrICmp(zIn, "false")==0 ) return EP_IsFalse;
+  return 0;
+}
+
+
+/*
 ** If the input expression is an ID with the name "true" or "false"
 ** then convert it into an TK_TRUEFALSE term.  Return non-zero if
 ** the conversion happened, and zero if the expression is unaltered.
 */
 int sqlite3ExprIdToTrueFalse(Expr *pExpr){
+  u32 v;
   assert( pExpr->op==TK_ID || pExpr->op==TK_STRING );
   if( !ExprHasProperty(pExpr, EP_Quoted)
-   && (sqlite3StrICmp(pExpr->u.zToken, "true")==0
-       || sqlite3StrICmp(pExpr->u.zToken, "false")==0)
+   && (v = sqlite3IsTrueOrFalse(pExpr->u.zToken))!=0
   ){
     pExpr->op = TK_TRUEFALSE;
-    ExprSetProperty(pExpr, pExpr->u.zToken[4]==0 ? EP_IsTrue : EP_IsFalse);
+    ExprSetProperty(pExpr, v);
     return 1;
   }
   return 0;
diff --git a/third_party/sqlite/patched/src/select.c b/third_party/sqlite/patched/src/select.c
index ba70a2b..be705c11 100644
--- a/third_party/sqlite/patched/src/select.c
+++ b/third_party/sqlite/patched/src/select.c
@@ -1980,7 +1980,7 @@
         zName = pEList->a[i].zSpan;
       }
     }
-    if( zName ){
+    if( zName && !sqlite3IsTrueOrFalse(zName) ){
       zName = sqlite3DbStrDup(db, zName);
     }else{
       zName = sqlite3MPrintf(db,"column%d",i+1);
diff --git a/third_party/sqlite/patched/src/sqliteInt.h b/third_party/sqlite/patched/src/sqliteInt.h
index 2eb9ff55..970ef81 100644
--- a/third_party/sqlite/patched/src/sqliteInt.h
+++ b/third_party/sqlite/patched/src/sqliteInt.h
@@ -4093,6 +4093,7 @@
 void sqlite3Savepoint(Parse*, int, Token*);
 void sqlite3CloseSavepoints(sqlite3 *);
 void sqlite3LeaveMutexAndCloseZombie(sqlite3*);
+u32 sqlite3IsTrueOrFalse(const char*);
 int sqlite3ExprIdToTrueFalse(Expr*);
 int sqlite3ExprTruthValue(const Expr*);
 int sqlite3ExprIsConstant(Expr*);
diff --git a/third_party/sqlite/patched/src/window.c b/third_party/sqlite/patched/src/window.c
index c251cd01..2d79ffe 100644
--- a/third_party/sqlite/patched/src/window.c
+++ b/third_party/sqlite/patched/src/window.c
@@ -883,9 +883,11 @@
     int nInit = pList ? pList->nExpr : 0;
     for(i=0; i<pAppend->nExpr; i++){
       Expr *pDup = sqlite3ExprDup(pParse->db, pAppend->a[i].pExpr, 0);
+      assert( pDup==0 || !ExprHasProperty(pDup, EP_MemToken) );
       if( bIntToNull && pDup && pDup->op==TK_INTEGER ){
         pDup->op = TK_NULL;
         pDup->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse);
+        pDup->u.zToken = 0;
       }
       pList = sqlite3ExprListAppend(pParse, pList, pDup);
       if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags;
diff --git a/third_party/sqlite/patched/test/fts3corrupt4.test b/third_party/sqlite/patched/test/fts3corrupt4.test
index 45dd52f..ed670c72 100644
--- a/third_party/sqlite/patched/test/fts3corrupt4.test
+++ b/third_party/sqlite/patched/test/fts3corrupt4.test
@@ -5589,4 +5589,13 @@
   INSERT INTO f(f) VALUES ('integrity-check');
 } {1 {database disk image is malformed}}
 
+reset_db
+do_catchsql_test 36.0 {
+  CREATE VIRTUAL TABLE f USING fts3(a,tokenize=porter);
+  CREATE TABLE 'f_stat'(id INTEGER PRIMARY KEY, value BLOB);
+  INSERT INTO f VALUES (1);
+  INSERT INTO f_stat VALUES (1,x'00000000000101010119013d00ffff0400fa83717b71a69297979701f63d010101010101010101010101190000000000000000fa83717b71a601f63d01010101010101010101010119013d00ffffff0400fa83717b71a69297979701f63d010101010101010101010101190000000000000000fa83717b71a69201f63d010101f63d01010101010101010101010119013d00ffffff0400fa83717b71a6929797010101010101010101010119013d00ffff01f63d01010101010101010101010119013d00ffffff0400fa83717b71a69297979701f63d00fa03ffffffa69297979701f63d010101000000000101010101197e9797976567656565ffa63535354e');
+  INSERT INTO f(f) VALUES ('merge=53,216');
+} {0 {}}
+
 finish_test
diff --git a/third_party/sqlite/patched/test/fts3snippet.test b/third_party/sqlite/patched/test/fts3snippet.test
index ce56512..9ee37dc 100644
--- a/third_party/sqlite/patched/test/fts3snippet.test
+++ b/third_party/sqlite/patched/test/fts3snippet.test
@@ -587,5 +587,18 @@
   {[a70] [a71] [a72]}
 }
 
+#-------------------------------------------------------------------------
+# Request a snippet from a query with more than 64 phrases.
+#
+reset_db
+do_execsql_test 6.0 {
+  CREATE VIRTUAL TABLE f USING fts3(b);
+  INSERT INTO f VALUES ( x'746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218');
+}
+
+do_execsql_test 6.1 {
+  SELECT  length(snippet(f))>0  FROM f WHERE b MATCH x'1065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a010f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c2a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e0f42';
+} {1}
+
 set sqlite_fts3_enable_parentheses 0
 finish_test
diff --git a/third_party/sqlite/patched/test/with1.test b/third_party/sqlite/patched/test/with1.test
index 4fb074b2c..e5787db 100644
--- a/third_party/sqlite/patched/test/with1.test
+++ b/third_party/sqlite/patched/test/with1.test
@@ -1140,4 +1140,28 @@
   3 1 1 3
 }
 
+# 2020-01-02 chromium ticket 1033461
+# Do not allow the generated name of a CTE be "true" or "false" as
+# such a label might be later confused for the boolean literals of
+# the same name, causing inconsistencies in the abstract syntax
+# tree.  This problem first arose in version 3.23.0 when SQLite
+# began recognizing "true" and "false" as boolean literals, but also
+# had to continue to recognize "true" and "false" as identifiers for
+# backwards compatibility.
+#
+reset_db
+do_execsql_test 25.1 {
+  CREATE TABLE dual(dummy);
+  INSERT INTO dual(dummy) VALUES('X');
+  WITH cte1 AS (
+    SELECT TRUE, (
+      WITH cte2 AS (SELECT avg(DISTINCT TRUE) FROM dual)
+      SELECT 2571 FROM cte2
+    ) AS subquery1
+    FROM dual
+    GROUP BY 1
+  )
+  SELECT (SELECT 1324 FROM cte1) FROM cte1;
+} {1324}
+
 finish_test
diff --git a/third_party/sqlite/patched/test/zipfile.test b/third_party/sqlite/patched/test/zipfile.test
index 25dc5d64..f5c503d 100644
--- a/third_party/sqlite/patched/test/zipfile.test
+++ b/third_party/sqlite/patched/test/zipfile.test
@@ -795,4 +795,17 @@
   } {. ./x1.txt ./x2.txt}
 }
 
+# 2019-12-18 Yongheng and Rui fuzzer
+#
+do_execsql_test 13.10 {
+  DROP TABLE IF EXISTS t0;
+  DROP TABLE IF EXISTS t1;
+  CREATE TABLE t0(a,b,c,d,e,f,g);
+  REPLACE INTO t0(c,b,f) VALUES(10,10,10);
+  CREATE VIRTUAL TABLE t1 USING zipfile('h.zip');
+  REPLACE INTO t1 SELECT * FROM t0;
+  SELECT quote(name),quote(mode),quote(mtime),quote(sz),quote(rawdata),
+         quote(data),quote(method) FROM t1;
+} {'' 10 10 2 X'3130' X'3130' 0}
+
 finish_test
diff --git a/third_party/sqlite/patches/0001-Don-t-allow-shadow-tables-to-be-dropped-in-defensive.patch b/third_party/sqlite/patches/0001-Don-t-allow-shadow-tables-to-be-dropped-in-defensive.patch
index e479379..0e81cdf 100644
--- a/third_party/sqlite/patches/0001-Don-t-allow-shadow-tables-to-be-dropped-in-defensive.patch
+++ b/third_party/sqlite/patches/0001-Don-t-allow-shadow-tables-to-be-dropped-in-defensive.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Tue, 19 Nov 2019 14:09:07 -0800
-Subject: [PATCH 01/17] Don't allow shadow tables to be dropped in defensive
+Subject: [PATCH 01/22] Don't allow shadow tables to be dropped in defensive
  mode.
 
 Backports https://www.sqlite.org/src/info/70390bbca49e7066
diff --git a/third_party/sqlite/patches/0002-Improve-shadow-table-corruption-detection-in-fts3.patch b/third_party/sqlite/patches/0002-Improve-shadow-table-corruption-detection-in-fts3.patch
index 2294109..eac985c 100644
--- a/third_party/sqlite/patches/0002-Improve-shadow-table-corruption-detection-in-fts3.patch
+++ b/third_party/sqlite/patches/0002-Improve-shadow-table-corruption-detection-in-fts3.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Tue, 19 Nov 2019 14:32:48 -0800
-Subject: [PATCH 02/17] Improve shadow table corruption detection in fts3
+Subject: [PATCH 02/22] Improve shadow table corruption detection in fts3
 
 Backports https://www.sqlite.org/src/info/04b2873be5aedeb1
 
diff --git a/third_party/sqlite/patches/0003-Shadow-Table-Corruption-Detection-improvements-in-ft.patch b/third_party/sqlite/patches/0003-Shadow-Table-Corruption-Detection-improvements-in-ft.patch
index 0f27608..0982e1d 100644
--- a/third_party/sqlite/patches/0003-Shadow-Table-Corruption-Detection-improvements-in-ft.patch
+++ b/third_party/sqlite/patches/0003-Shadow-Table-Corruption-Detection-improvements-in-ft.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Tue, 19 Nov 2019 15:04:03 -0800
-Subject: [PATCH 03/17] Shadow Table Corruption Detection improvements in fts3
+Subject: [PATCH 03/22] Shadow Table Corruption Detection improvements in fts3
 
 Backports https://www.sqlite.org/src/info/51525f9c3235967b
 
diff --git a/third_party/sqlite/patches/0004-Remove-reachable-NEVER-in-fts3.patch b/third_party/sqlite/patches/0004-Remove-reachable-NEVER-in-fts3.patch
index f330e17d..bce21ca2a 100644
--- a/third_party/sqlite/patches/0004-Remove-reachable-NEVER-in-fts3.patch
+++ b/third_party/sqlite/patches/0004-Remove-reachable-NEVER-in-fts3.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Tue, 19 Nov 2019 15:05:43 -0800
-Subject: [PATCH 04/17] Remove reachable NEVER in fts3
+Subject: [PATCH 04/22] Remove reachable NEVER in fts3
 
 Backports https://www.sqlite.org/src/info/8bd75bf636f72f32
 
diff --git a/third_party/sqlite/patches/0005-Better-corruption-detection-in-fts3.patch b/third_party/sqlite/patches/0005-Better-corruption-detection-in-fts3.patch
index 6e1bd70..afe1a4c 100644
--- a/third_party/sqlite/patches/0005-Better-corruption-detection-in-fts3.patch
+++ b/third_party/sqlite/patches/0005-Better-corruption-detection-in-fts3.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Tue, 19 Nov 2019 15:17:18 -0800
-Subject: [PATCH 05/17] Better % corruption detection in fts3.
+Subject: [PATCH 05/22] Better % corruption detection in fts3.
 
 Backports https://www.sqlite.org/src/info/1e449687881f4d38
 
diff --git a/third_party/sqlite/patches/0006-Detect-Prevent-infinite-recursion.patch b/third_party/sqlite/patches/0006-Detect-Prevent-infinite-recursion.patch
index c54eb99..5f78c913 100644
--- a/third_party/sqlite/patches/0006-Detect-Prevent-infinite-recursion.patch
+++ b/third_party/sqlite/patches/0006-Detect-Prevent-infinite-recursion.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Tue, 19 Nov 2019 15:19:40 -0800
-Subject: [PATCH 06/17] Detect/Prevent infinite recursion
+Subject: [PATCH 06/22] Detect/Prevent infinite recursion
 
 Backports https://www.sqlite.org/src/info/dfcf081d842629a0
 
diff --git a/third_party/sqlite/patches/0007-Improve-corruption-detection-in-fts4.patch b/third_party/sqlite/patches/0007-Improve-corruption-detection-in-fts4.patch
index 846d1d5..5f9cc00 100644
--- a/third_party/sqlite/patches/0007-Improve-corruption-detection-in-fts4.patch
+++ b/third_party/sqlite/patches/0007-Improve-corruption-detection-in-fts4.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Tue, 19 Nov 2019 15:34:00 -0800
-Subject: [PATCH 07/17] Improve corruption detection in fts4
+Subject: [PATCH 07/22] Improve corruption detection in fts4
 
 Backports https://www.sqlite.org/src/info/10f8a3b718e0f47b
 
diff --git a/third_party/sqlite/patches/0008-Further-improve-corruption-detection-in-fts3.patch b/third_party/sqlite/patches/0008-Further-improve-corruption-detection-in-fts3.patch
index 191d1b7..3789924 100644
--- a/third_party/sqlite/patches/0008-Further-improve-corruption-detection-in-fts3.patch
+++ b/third_party/sqlite/patches/0008-Further-improve-corruption-detection-in-fts3.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Wed, 20 Nov 2019 10:58:51 -0800
-Subject: [PATCH 08/17] Further improve corruption detection in fts3
+Subject: [PATCH 08/22] Further improve corruption detection in fts3
 
 Backports https://sqlite.org/src/info/a0f6d526baecd061 (aka
 https://sqlite.org/src/info/a0f6d526baecd061a5e2)
diff --git a/third_party/sqlite/patches/0009-Make-sure-WITH-stack-is-disabled-after-error.patch b/third_party/sqlite/patches/0009-Make-sure-WITH-stack-is-disabled-after-error.patch
index b2e44f3..4caeaa13 100644
--- a/third_party/sqlite/patches/0009-Make-sure-WITH-stack-is-disabled-after-error.patch
+++ b/third_party/sqlite/patches/0009-Make-sure-WITH-stack-is-disabled-after-error.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Tue, 3 Dec 2019 13:56:38 -0800
-Subject: [PATCH 09/17] Make sure WITH stack is disabled after error
+Subject: [PATCH 09/22] Make sure WITH stack is disabled after error
 
 Backports https://sqlite.org/src/info/de6e6d6846d6a41c
 
diff --git a/third_party/sqlite/patches/0010-Avoid-zero-offset.patch b/third_party/sqlite/patches/0010-Avoid-zero-offset.patch
index 51e40d0..5d94488a 100644
--- a/third_party/sqlite/patches/0010-Avoid-zero-offset.patch
+++ b/third_party/sqlite/patches/0010-Avoid-zero-offset.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Tue, 3 Dec 2019 13:59:19 -0800
-Subject: [PATCH 10/17] Avoid zero offset
+Subject: [PATCH 10/22] Avoid zero offset
 
 Backports https://www.sqlite.org/src/info/3ce804e99bbef83d
 
diff --git a/third_party/sqlite/patches/0011-Avoid-zero-offset-of-nullptr.patch b/third_party/sqlite/patches/0011-Avoid-zero-offset-of-nullptr.patch
index 3dbb9fa..6b2737cc 100644
--- a/third_party/sqlite/patches/0011-Avoid-zero-offset-of-nullptr.patch
+++ b/third_party/sqlite/patches/0011-Avoid-zero-offset-of-nullptr.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Tue, 3 Dec 2019 14:01:40 -0800
-Subject: [PATCH 11/17] Avoid zero offset of nullptr
+Subject: [PATCH 11/22] Avoid zero offset of nullptr
 
 Backports https://www.sqlite.org/src/info/85d95abec4a596eb
 
diff --git a/third_party/sqlite/patches/0012-Fix-buffer-overread.patch b/third_party/sqlite/patches/0012-Fix-buffer-overread.patch
index 033ebc4..bac4345 100644
--- a/third_party/sqlite/patches/0012-Fix-buffer-overread.patch
+++ b/third_party/sqlite/patches/0012-Fix-buffer-overread.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Mon, 16 Dec 2019 11:49:51 -0800
-Subject: [PATCH 12/17] Fix buffer overread
+Subject: [PATCH 12/22] Fix buffer overread
 
 Backports https://www.sqlite.org/src/info/e01fdbf9f700e1bd
 
diff --git a/third_party/sqlite/patches/0013-Fix-UB-warning.patch b/third_party/sqlite/patches/0013-Fix-UB-warning.patch
index 2e640a3..6073283 100644
--- a/third_party/sqlite/patches/0013-Fix-UB-warning.patch
+++ b/third_party/sqlite/patches/0013-Fix-UB-warning.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Mon, 16 Dec 2019 13:45:04 -0800
-Subject: [PATCH 13/17] Fix UB warning
+Subject: [PATCH 13/22] Fix UB warning
 
 Backports https://sqlite.org/src/info/052fdf5e58b41cca
 
diff --git a/third_party/sqlite/patches/0014-Avoid-temp-trigger-crash.patch b/third_party/sqlite/patches/0014-Avoid-temp-trigger-crash.patch
index aa89003..c13e071 100644
--- a/third_party/sqlite/patches/0014-Avoid-temp-trigger-crash.patch
+++ b/third_party/sqlite/patches/0014-Avoid-temp-trigger-crash.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Mon, 16 Dec 2019 13:48:39 -0800
-Subject: [PATCH 14/17] Avoid temp trigger crash
+Subject: [PATCH 14/22] Avoid temp trigger crash
 
 Backports https://sqlite.org/src/info/c4cb9708d48ead10
 
diff --git a/third_party/sqlite/patches/0015-Fix-fts3-integer-overflows.patch b/third_party/sqlite/patches/0015-Fix-fts3-integer-overflows.patch
index 4556006c..ec72ce0 100644
--- a/third_party/sqlite/patches/0015-Fix-fts3-integer-overflows.patch
+++ b/third_party/sqlite/patches/0015-Fix-fts3-integer-overflows.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Mon, 16 Dec 2019 16:01:06 -0800
-Subject: [PATCH 15/17] Fix fts3 integer overflows
+Subject: [PATCH 15/22] Fix fts3 integer overflows
 
 Backports https://www.sqlite.org/src/info/3b873029ef1903f7
 
diff --git a/third_party/sqlite/patches/0016-Avoid-infinite-recursion-in-ALTER-TABLE-code.patch b/third_party/sqlite/patches/0016-Avoid-infinite-recursion-in-ALTER-TABLE-code.patch
index b5e4084..795ed396 100644
--- a/third_party/sqlite/patches/0016-Avoid-infinite-recursion-in-ALTER-TABLE-code.patch
+++ b/third_party/sqlite/patches/0016-Avoid-infinite-recursion-in-ALTER-TABLE-code.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Wed, 18 Dec 2019 16:38:02 -0800
-Subject: [PATCH 16/17] Avoid infinite recursion in ALTER TABLE code
+Subject: [PATCH 16/22] Avoid infinite recursion in ALTER TABLE code
 
 Backports https://www.sqlite.org/src/info/1d2e53a39b87e364685e21de137655b6eee725e4c6d27fc90865072d7c5892b5
 
diff --git a/third_party/sqlite/patches/0017-Add-restrictions-on-shadow-table-changes-in-defensiv.patch b/third_party/sqlite/patches/0017-Add-restrictions-on-shadow-table-changes-in-defensiv.patch
index 780d341..49b3e5d 100644
--- a/third_party/sqlite/patches/0017-Add-restrictions-on-shadow-table-changes-in-defensiv.patch
+++ b/third_party/sqlite/patches/0017-Add-restrictions-on-shadow-table-changes-in-defensiv.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
 From: Darwin Huang <huangdarwin@chromium.org>
 Date: Thu, 19 Dec 2019 14:19:06 -0800
-Subject: [PATCH 17/17] Add restrictions on shadow table changes in defensive
+Subject: [PATCH 17/22] Add restrictions on shadow table changes in defensive
  mode
 
 Backports https://www.sqlite.org/src/info/bae76a5c40703871
diff --git a/third_party/sqlite/patches/0018-Avoid-ambiguous-true-and-false-return.patch b/third_party/sqlite/patches/0018-Avoid-ambiguous-true-and-false-return.patch
new file mode 100644
index 0000000..607d9c5
--- /dev/null
+++ b/third_party/sqlite/patches/0018-Avoid-ambiguous-true-and-false-return.patch
@@ -0,0 +1,118 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Darwin Huang <huangdarwin@chromium.org>
+Date: Tue, 7 Jan 2020 13:32:12 -0800
+Subject: [PATCH 18/22] Avoid ambiguous true and false return
+
+Backports https://www.sqlite.org/src/info/ff9492d3ff733c22
+
+Bug: 1033461
+---
+ third_party/sqlite/patched/src/expr.c      | 21 ++++++++++++++++---
+ third_party/sqlite/patched/src/select.c    |  2 +-
+ third_party/sqlite/patched/src/sqliteInt.h |  1 +
+ third_party/sqlite/patched/test/with1.test | 24 ++++++++++++++++++++++
+ 4 files changed, 44 insertions(+), 4 deletions(-)
+
+diff --git a/third_party/sqlite/patched/src/expr.c b/third_party/sqlite/patched/src/expr.c
+index e8b1f31c42aa..760978c482d3 100644
+--- a/third_party/sqlite/patched/src/expr.c
++++ b/third_party/sqlite/patched/src/expr.c
+@@ -1814,19 +1814,34 @@ int sqlite3SelectWalkFail(Walker *pWalker, Select *NotUsed){
+   return WRC_Abort;
+ }
+ 
++/*
++** Check the input string to see if it is "true" or "false" (in any case).
++**
++**       If the string is....           Return
++**         "true"                         EP_IsTrue
++**         "false"                        EP_IsFalse
++**         anything else                  0
++*/
++u32 sqlite3IsTrueOrFalse(const char *zIn){
++  if( sqlite3StrICmp(zIn, "true")==0  ) return EP_IsTrue;
++  if( sqlite3StrICmp(zIn, "false")==0 ) return EP_IsFalse;
++  return 0;
++}
++
++
+ /*
+ ** If the input expression is an ID with the name "true" or "false"
+ ** then convert it into an TK_TRUEFALSE term.  Return non-zero if
+ ** the conversion happened, and zero if the expression is unaltered.
+ */
+ int sqlite3ExprIdToTrueFalse(Expr *pExpr){
++  u32 v;
+   assert( pExpr->op==TK_ID || pExpr->op==TK_STRING );
+   if( !ExprHasProperty(pExpr, EP_Quoted)
+-   && (sqlite3StrICmp(pExpr->u.zToken, "true")==0
+-       || sqlite3StrICmp(pExpr->u.zToken, "false")==0)
++   && (v = sqlite3IsTrueOrFalse(pExpr->u.zToken))!=0
+   ){
+     pExpr->op = TK_TRUEFALSE;
+-    ExprSetProperty(pExpr, pExpr->u.zToken[4]==0 ? EP_IsTrue : EP_IsFalse);
++    ExprSetProperty(pExpr, v);
+     return 1;
+   }
+   return 0;
+diff --git a/third_party/sqlite/patched/src/select.c b/third_party/sqlite/patched/src/select.c
+index ba70a2bdec78..be705c11d1b4 100644
+--- a/third_party/sqlite/patched/src/select.c
++++ b/third_party/sqlite/patched/src/select.c
+@@ -1980,7 +1980,7 @@ int sqlite3ColumnsFromExprList(
+         zName = pEList->a[i].zSpan;
+       }
+     }
+-    if( zName ){
++    if( zName && !sqlite3IsTrueOrFalse(zName) ){
+       zName = sqlite3DbStrDup(db, zName);
+     }else{
+       zName = sqlite3MPrintf(db,"column%d",i+1);
+diff --git a/third_party/sqlite/patched/src/sqliteInt.h b/third_party/sqlite/patched/src/sqliteInt.h
+index 2eb9ff559aac..970ef817f3e1 100644
+--- a/third_party/sqlite/patched/src/sqliteInt.h
++++ b/third_party/sqlite/patched/src/sqliteInt.h
+@@ -4093,6 +4093,7 @@ void sqlite3EndTransaction(Parse*,int);
+ void sqlite3Savepoint(Parse*, int, Token*);
+ void sqlite3CloseSavepoints(sqlite3 *);
+ void sqlite3LeaveMutexAndCloseZombie(sqlite3*);
++u32 sqlite3IsTrueOrFalse(const char*);
+ int sqlite3ExprIdToTrueFalse(Expr*);
+ int sqlite3ExprTruthValue(const Expr*);
+ int sqlite3ExprIsConstant(Expr*);
+diff --git a/third_party/sqlite/patched/test/with1.test b/third_party/sqlite/patched/test/with1.test
+index 4fb074b2cf0a..e5787db704d1 100644
+--- a/third_party/sqlite/patched/test/with1.test
++++ b/third_party/sqlite/patched/test/with1.test
+@@ -1140,4 +1140,28 @@ do_execsql_test 24.2 {
+   3 1 1 3
+ }
+ 
++# 2020-01-02 chromium ticket 1033461
++# Do not allow the generated name of a CTE be "true" or "false" as
++# such a label might be later confused for the boolean literals of
++# the same name, causing inconsistencies in the abstract syntax
++# tree.  This problem first arose in version 3.23.0 when SQLite
++# began recognizing "true" and "false" as boolean literals, but also
++# had to continue to recognize "true" and "false" as identifiers for
++# backwards compatibility.
++#
++reset_db
++do_execsql_test 25.1 {
++  CREATE TABLE dual(dummy);
++  INSERT INTO dual(dummy) VALUES('X');
++  WITH cte1 AS (
++    SELECT TRUE, (
++      WITH cte2 AS (SELECT avg(DISTINCT TRUE) FROM dual)
++      SELECT 2571 FROM cte2
++    ) AS subquery1
++    FROM dual
++    GROUP BY 1
++  )
++  SELECT (SELECT 1324 FROM cte1) FROM cte1;
++} {1324}
++
+ finish_test
+-- 
+2.24.1.735.g03f4e72817-goog
+
diff --git a/third_party/sqlite/patches/0019-Fix-fts3-UB-uint64.patch b/third_party/sqlite/patches/0019-Fix-fts3-UB-uint64.patch
new file mode 100644
index 0000000..964c7c0
--- /dev/null
+++ b/third_party/sqlite/patches/0019-Fix-fts3-UB-uint64.patch
@@ -0,0 +1,52 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Darwin Huang <huangdarwin@chromium.org>
+Date: Tue, 7 Jan 2020 13:34:37 -0800
+Subject: [PATCH 19/22] Fix fts3 UB uint64
+
+Backports https://sqlite.org/src/info/e1f12978b53683114ab0
+
+Bug: 1037786
+---
+ third_party/sqlite/patched/ext/fts3/fts3_snippet.c |  2 +-
+ third_party/sqlite/patched/test/fts3snippet.test   | 13 +++++++++++++
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+
+diff --git a/third_party/sqlite/patched/ext/fts3/fts3_snippet.c b/third_party/sqlite/patched/ext/fts3/fts3_snippet.c
+index dda71c3985af..6eae82dbc3ff 100644
+--- a/third_party/sqlite/patched/ext/fts3/fts3_snippet.c
++++ b/third_party/sqlite/patched/ext/fts3/fts3_snippet.c
+@@ -560,7 +560,7 @@ static int fts3BestSnippet(
+     /* Set the *pmSeen output variable. */
+     for(i=0; i<nList; i++){
+       if( sIter.aPhrase[i].pHead ){
+-        *pmSeen |= (u64)1 << i;
++        *pmSeen |= (u64)1 << (i%64);
+       }
+     }
+ 
+diff --git a/third_party/sqlite/patched/test/fts3snippet.test b/third_party/sqlite/patched/test/fts3snippet.test
+index ce565127b5a3..9ee37dc6263f 100644
+--- a/third_party/sqlite/patched/test/fts3snippet.test
++++ b/third_party/sqlite/patched/test/fts3snippet.test
+@@ -587,5 +587,18 @@ do_execsql_test 5.1 {
+   {[a70] [a71] [a72]}
+ }
+ 
++#-------------------------------------------------------------------------
++# Request a snippet from a query with more than 64 phrases.
++#
++reset_db
++do_execsql_test 6.0 {
++  CREATE VIRTUAL TABLE f USING fts3(b);
++  INSERT INTO f VALUES ( x'746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218');
++}
++
++do_execsql_test 6.1 {
++  SELECT  length(snippet(f))>0  FROM f WHERE b MATCH x'1065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a010f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c2a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e082a011065616e656d655a616c702a2f65732e0f42014001380230018218021001081e0a3d746e6e6d64612e0f42';
++} {1}
++
+ set sqlite_fts3_enable_parentheses 0
+ finish_test
+-- 
+2.24.1.735.g03f4e72817-goog
+
diff --git a/third_party/sqlite/patches/0020-Avoid-large-memory-alloc-for-corrupt-record.patch b/third_party/sqlite/patches/0020-Avoid-large-memory-alloc-for-corrupt-record.patch
new file mode 100644
index 0000000..877411ce
--- /dev/null
+++ b/third_party/sqlite/patches/0020-Avoid-large-memory-alloc-for-corrupt-record.patch
@@ -0,0 +1,72 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Darwin Huang <huangdarwin@chromium.org>
+Date: Tue, 7 Jan 2020 13:38:31 -0800
+Subject: [PATCH 20/22] Avoid large memory alloc for corrupt record
+
+Backports https://www.sqlite.org/src/info/9add58fe9688d5c1
+
+Bug: 1038213
+---
+ third_party/sqlite/patched/ext/fts3/fts3_write.c  | 12 +++++++++---
+ third_party/sqlite/patched/test/fts3corrupt4.test |  9 +++++++++
+ 2 files changed, 18 insertions(+), 3 deletions(-)
+
+diff --git a/third_party/sqlite/patched/ext/fts3/fts3_write.c b/third_party/sqlite/patched/ext/fts3/fts3_write.c
+index 8b6b729987c3..f30bf343635d 100644
+--- a/third_party/sqlite/patched/ext/fts3/fts3_write.c
++++ b/third_party/sqlite/patched/ext/fts3/fts3_write.c
+@@ -335,7 +335,7 @@ static int fts3SqlStmt(
+ ** returns zero rows.  */
+ /* 28 */ "SELECT level, count(*) AS cnt FROM %Q.'%q_segdir' "
+          "  GROUP BY level HAVING cnt>=?"
+-         "  ORDER BY (level %% 1024) ASC LIMIT 1",
++         "  ORDER BY (level %% 1024) ASC, 2 DESC LIMIT 1",
+ 
+ /* Estimate the upper limit on the number of leaf nodes in a new segment
+ ** created by merging the oldest :2 segments from absolute level :1. See
+@@ -4925,8 +4925,14 @@ int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){
+ 
+       rc = fts3IncrmergeHintPop(&hint, &iHintAbsLevel, &nHintSeg);
+       if( nSeg<0 || (iAbsLevel % nMod) >= (iHintAbsLevel % nMod) ){
++        /* Based on the scan in the block above, it is known that there
++        ** are no levels with a relative level smaller than that of
++        ** iAbsLevel with more than nSeg segments, or if nSeg is -1,
++        ** no levels with more than nMin segments. Use this to limit the
++        ** value of nHintSeg to avoid a large memory allocation in case the
++        ** merge-hint is corrupt*/
+         iAbsLevel = iHintAbsLevel;
+-        nSeg = nHintSeg;
++        nSeg = MIN(MAX(nMin,nSeg), nHintSeg);
+         bUseHint = 1;
+         bDirtyHint = 1;
+       }else{
+@@ -4939,7 +4945,7 @@ int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){
+     /* If nSeg is less that zero, then there is no level with at least
+     ** nMin segments and no hint in the %_stat table. No work to do.
+     ** Exit early in this case.  */
+-    if( nSeg<0 ) break;
++    if( nSeg<=0 ) break;
+ 
+     /* Open a cursor to iterate through the contents of the oldest nSeg
+     ** indexes of absolute level iAbsLevel. If this cursor is opened using
+diff --git a/third_party/sqlite/patched/test/fts3corrupt4.test b/third_party/sqlite/patched/test/fts3corrupt4.test
+index 45dd52fff29e..ed670c72223c 100644
+--- a/third_party/sqlite/patched/test/fts3corrupt4.test
++++ b/third_party/sqlite/patched/test/fts3corrupt4.test
+@@ -5589,4 +5589,13 @@ do_catchsql_test 35.1 {
+   INSERT INTO f(f) VALUES ('integrity-check');
+ } {1 {database disk image is malformed}}
+ 
++reset_db
++do_catchsql_test 36.0 {
++  CREATE VIRTUAL TABLE f USING fts3(a,tokenize=porter);
++  CREATE TABLE 'f_stat'(id INTEGER PRIMARY KEY, value BLOB);
++  INSERT INTO f VALUES (1);
++  INSERT INTO f_stat VALUES (1,x'00000000000101010119013d00ffff0400fa83717b71a69297979701f63d010101010101010101010101190000000000000000fa83717b71a601f63d01010101010101010101010119013d00ffffff0400fa83717b71a69297979701f63d010101010101010101010101190000000000000000fa83717b71a69201f63d010101f63d01010101010101010101010119013d00ffffff0400fa83717b71a6929797010101010101010101010119013d00ffff01f63d01010101010101010101010119013d00ffffff0400fa83717b71a69297979701f63d00fa03ffffffa69297979701f63d010101000000000101010101197e9797976567656565ffa63535354e');
++  INSERT INTO f(f) VALUES ('merge=53,216');
++} {0 {}}
++
+ finish_test
+-- 
+2.24.1.735.g03f4e72817-goog
+
diff --git a/third_party/sqlite/patches/0021-Avoid-invalid-pointer-dereference-in-ORDER-BY.patch b/third_party/sqlite/patches/0021-Avoid-invalid-pointer-dereference-in-ORDER-BY.patch
new file mode 100644
index 0000000..5b2f4630
--- /dev/null
+++ b/third_party/sqlite/patches/0021-Avoid-invalid-pointer-dereference-in-ORDER-BY.patch
@@ -0,0 +1,31 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Darwin Huang <huangdarwin@chromium.org>
+Date: Tue, 7 Jan 2020 13:42:03 -0800
+Subject: [PATCH 21/22] Avoid invalid pointer dereference in ORDER BY
+
+Backports https://sqlite.org/src/info/1ca0bd982ab1183bbafce0d260e4dceda5eb766ed2e7793374a88d1ae0bdd2ca
+
+Bug: 1038863
+---
+ third_party/sqlite/patched/src/window.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/third_party/sqlite/patched/src/window.c b/third_party/sqlite/patched/src/window.c
+index c251cd01974d..2d79ffe63d6d 100644
+--- a/third_party/sqlite/patched/src/window.c
++++ b/third_party/sqlite/patched/src/window.c
+@@ -883,9 +883,11 @@ static ExprList *exprListAppendList(
+     int nInit = pList ? pList->nExpr : 0;
+     for(i=0; i<pAppend->nExpr; i++){
+       Expr *pDup = sqlite3ExprDup(pParse->db, pAppend->a[i].pExpr, 0);
++      assert( pDup==0 || !ExprHasProperty(pDup, EP_MemToken) );
+       if( bIntToNull && pDup && pDup->op==TK_INTEGER ){
+         pDup->op = TK_NULL;
+         pDup->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse);
++        pDup->u.zToken = 0;
+       }
+       pList = sqlite3ExprListAppend(pParse, pList, pDup);
+       if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags;
+-- 
+2.24.1.735.g03f4e72817-goog
+
diff --git a/third_party/sqlite/patches/0022-Fix-zipfile-extension-INSERT-with-NULL-pathname.patch b/third_party/sqlite/patches/0022-Fix-zipfile-extension-INSERT-with-NULL-pathname.patch
new file mode 100644
index 0000000..a2308deb
--- /dev/null
+++ b/third_party/sqlite/patches/0022-Fix-zipfile-extension-INSERT-with-NULL-pathname.patch
@@ -0,0 +1,50 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Darwin Huang <huangdarwin@chromium.org>
+Date: Tue, 7 Jan 2020 13:43:48 -0800
+Subject: [PATCH 22/22] Fix zipfile extension INSERT with NULL pathname
+
+Backports https://sqlite.org/src/info/a80f84b511231204658304226de3e075a55afc2e3f39ac063716f7a57f585c06
+
+Bug: 1038863
+---
+ third_party/sqlite/patched/ext/misc/zipfile.c |  1 +
+ third_party/sqlite/patched/test/zipfile.test  | 13 +++++++++++++
+ 2 files changed, 14 insertions(+)
+
+diff --git a/third_party/sqlite/patched/ext/misc/zipfile.c b/third_party/sqlite/patched/ext/misc/zipfile.c
+index 5a88389bf2da..1dc47a7d9ae0 100644
+--- a/third_party/sqlite/patched/ext/misc/zipfile.c
++++ b/third_party/sqlite/patched/ext/misc/zipfile.c
+@@ -1618,6 +1618,7 @@ static int zipfileUpdate(
+ 
+     if( rc==SQLITE_OK ){
+       zPath = (const char*)sqlite3_value_text(apVal[2]);
++      if( zPath==0 ) zPath = "";
+       nPath = (int)strlen(zPath);
+       mTime = zipfileGetTime(apVal[4]);
+     }
+diff --git a/third_party/sqlite/patched/test/zipfile.test b/third_party/sqlite/patched/test/zipfile.test
+index 25dc5d6497d1..f5c503d7f156 100644
+--- a/third_party/sqlite/patched/test/zipfile.test
++++ b/third_party/sqlite/patched/test/zipfile.test
+@@ -795,4 +795,17 @@ if {$tcl_platform(platform)!="windows"} {
+   } {. ./x1.txt ./x2.txt}
+ }
+ 
++# 2019-12-18 Yongheng and Rui fuzzer
++#
++do_execsql_test 13.10 {
++  DROP TABLE IF EXISTS t0;
++  DROP TABLE IF EXISTS t1;
++  CREATE TABLE t0(a,b,c,d,e,f,g);
++  REPLACE INTO t0(c,b,f) VALUES(10,10,10);
++  CREATE VIRTUAL TABLE t1 USING zipfile('h.zip');
++  REPLACE INTO t1 SELECT * FROM t0;
++  SELECT quote(name),quote(mode),quote(mtime),quote(sz),quote(rawdata),
++         quote(data),quote(method) FROM t1;
++} {'' 10 10 2 X'3130' X'3130' 0}
++
+ finish_test
+-- 
+2.24.1.735.g03f4e72817-goog
+
diff --git a/third_party/sqlite4java/cipd.yaml b/third_party/sqlite4java/cipd.yaml
index 177101d..2172c07 100644
--- a/third_party/sqlite4java/cipd.yaml
+++ b/third_party/sqlite4java/cipd.yaml
@@ -13,3 +13,4 @@
   - file: lib/mac-x86_64/libsqlite4java.jnilib
   - file: lib/windows-x86/sqlite4java.dll
   - file: lib/windows-x86_64/sqlite4java.dll
+install_mode: "copy"
diff --git a/tools/binary_size/trybot_commit_size_checker.py b/tools/binary_size/trybot_commit_size_checker.py
index 775ae705..73832c23 100755
--- a/tools/binary_size/trybot_commit_size_checker.py
+++ b/tools/binary_size/trybot_commit_size_checker.py
@@ -264,14 +264,17 @@
 
   binary_size_listings = []
   for delta in size_deltas:
-    if delta.actual == 0:
-      continue
     listing = {
         'name': delta.name,
         'delta': '{} {}'.format(_FormatSign(delta.actual), delta.units),
         'limit': '{} {}'.format(_FormatSign(delta.expected), delta.units),
         'allowed': delta.IsAllowable(),
     }
+    if delta is resource_sizes_delta:
+      listing['name'] = 'Android Binary Size',
+    # The main 'binary size' delta is always shown even if unchanged.
+    elif delta.actual == 0:
+      continue
     binary_size_listings.append(listing)
 
   binary_size_extras = [
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 01d96f307..ab981ac3 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -76,7 +76,7 @@
       'Android WebView P Blink-CORS FYI (rel)': 'android_release_bot_minimal_symbols_arm64_webview_google',
       'Android WebView P FYI (rel)': 'android_release_bot_minimal_symbols_arm64_webview_google',
       'android-marshmallow-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86_resource_whitelisting',
-      'android-pie-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86',
+      'android-pie-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86_webview_google',
       'android-bfcache-debug': 'android_debug_static_bot',
     },
 
@@ -678,7 +678,7 @@
       'android-pie-arm64-coverage-rel': 'android_release_trybot_arm64_webview_google_native_coverage',
       'android-pie-arm64-rel': 'android_release_trybot_arm64_webview_google',
       'android-webview-pie-arm64-fyi-rel': 'android_release_trybot_arm64_webview_google',
-      'android-pie-x86-fyi-rel': 'android_release_trybot_x86',
+      'android-pie-x86-fyi-rel': 'android_release_trybot_x86_webview_google',
       'android-webview-marshmallow-arm64-dbg': 'android_release_trybot_arm64_webview_google',
       'android-webview-nougat-arm64-dbg': 'android_release_trybot_arm64_webview_google',
       'android-webview-oreo-arm64-dbg': 'android_release_trybot_arm64_webview_google',
@@ -1170,16 +1170,16 @@
       'strip_debug_info', 'android_fastbuild',
     ],
 
-    'android_release_bot_minimal_symbols_x86': [
-      'android', 'release_bot', 'minimal_symbols', 'x86',
-      'strip_debug_info',
-    ],
-
     'android_release_bot_minimal_symbols_x86_resource_whitelisting': [
       'android', 'release_bot', 'minimal_symbols', 'x86',
       'resource_whitelisting',
     ],
 
+    'android_release_bot_minimal_symbols_x86_webview_google': [
+      'android', 'release_bot', 'minimal_symbols', 'x86',
+      'strip_debug_info', 'webview_google',
+    ],
+
     'android_release_trybot': [
       'android', 'release_trybot', 'strip_debug_info',
     ],
@@ -1204,14 +1204,14 @@
       'android_no_proguard',
     ],
 
-    'android_release_trybot_x86': [
-      'android', 'release_trybot', 'strip_debug_info', 'x86',
-    ],
-
     'android_release_trybot_x86_resource_whitelisting': [
       'android', 'release_trybot', 'x86', 'resource_whitelisting',
     ],
 
+    'android_release_trybot_x86_webview_google': [
+      'android', 'release_trybot', 'strip_debug_info', 'x86', 'webview_google',
+    ],
+
     'android_webview_google_debug_static_bot': [
       'android', 'debug_static_bot', 'webview_google',
     ],
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 832dad4..3588bc33 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -3262,7 +3262,7 @@
 </enum>
 
 <enum name="AsyncHitTestReasons">
-  <int value="0" label="Not async hit test"/>
+  <int value="0" label="Synchronous hit test"/>
   <int value="1" label="Iframe has overlapped region"/>
   <int value="2" label="Iframe is irregularly clipped"/>
   <int value="3" label="Iframe is not active"/>
@@ -4411,6 +4411,8 @@
   <int value="0" label="Not migrated"/>
   <int value="1" label="Migrated from canonical email"/>
   <int value="2" label="Migrated from non canonical email"/>
+  <int value="3"
+      label="Not migrated (Unexpected primary account id with email format)."/>
 </enum>
 
 <enum name="AutofillPredictionSource">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index ecb16ac..a55aebd 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -695,7 +695,7 @@
 </histogram>
 
 <histogram name="Accessibility.WinScreenReader2" enum="BooleanEnabled"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
 <!-- expires-never: usage drives a11y prioritization in browser and content. -->
 
   <owner>aleventhal@chromium.org</owner>
@@ -2534,14 +2534,14 @@
 </histogram>
 
 <histogram name="Android.DownloadManager.OpenSource.Video"
-    enum="AndroidDownloadOpenSource" expires_after="2020-05-03">
+    enum="AndroidDownloadOpenSource" expires_after="2020-07-06">
   <owner>xingliu@chromium.org</owner>
   <owner>clank-downloads@google.com</owner>
   <summary>Records how users open video download files on Android.</summary>
 </histogram>
 
 <histogram name="Android.DownloadManager.OtherExtensions.InitialCount"
-    enum="AndroidDownloadExtensionType" expires_after="M81">
+    enum="AndroidDownloadExtensionType" expires_after="2020-07-06">
   <owner>twellington@chromium.org</owner>
   <owner>clank-downloads@google.com</owner>
   <summary>
@@ -2571,7 +2571,7 @@
 </histogram>
 
 <histogram name="Android.DownloadManager.OtherExtensions.Share"
-    enum="AndroidDownloadExtensionType" expires_after="M81">
+    enum="AndroidDownloadExtensionType" expires_after="2020-07-06">
   <owner>twellington@chromium.org</owner>
   <owner>clank-downloads@google.com</owner>
   <summary>
@@ -2699,7 +2699,7 @@
 </histogram>
 
 <histogram base="true" name="Android.FeatureModules.AvailabilityStatus"
-    enum="FeatureModuleAvailabilityStatus" expires_after="2020-05-03">
+    enum="FeatureModuleAvailabilityStatus" expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes
        name="AndroidFeatureModuleName" -->
 
@@ -3004,7 +3004,7 @@
 </histogram>
 
 <histogram name="Android.Language.WrongLanguageAfterResume" enum="Boolean"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>tiborg@chromium.org</owner>
   <owner>heamy@chromium.org</owner>
   <summary>
@@ -3777,7 +3777,7 @@
 </histogram>
 
 <histogram name="Android.SeccompStatus.RendererSandbox"
-    enum="AndroidSeccompSandboxStatus" expires_after="2020-05-03">
+    enum="AndroidSeccompSandboxStatus" expires_after="2020-07-06">
   <owner>rsesek@chromium.org</owner>
   <summary>
     Reports the status of the seccomp-bpf sandbox in renderer processes.
@@ -5186,7 +5186,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.AnswerCardSearchProvider.SearchAnswerLoadingTime"
-    units="ms" expires_after="2020-05-03">
+    units="ms" expires_after="2020-07-06">
   <owner>jennyz@chriomium.org</owner>
   <owner>newcomer@chromium.org</owner>
   <summary>
@@ -5207,7 +5207,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.AppSearchProvider.QueryTime" units="ms"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>jennyz@chromium.org</owner>
   <owner>newcomer@chromium.org</owner>
   <summary>
@@ -5237,7 +5237,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.DriveQuickAccessProvider.ApiResults"
-    units="count" expires_after="2020-05-03">
+    units="count" expires_after="2020-07-06">
   <owner>tby@chromium.org</owner>
   <owner>wrong@chromium.org</owner>
   <owner>jiameng@chromium.org</owner>
@@ -5271,7 +5271,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.DriveQuickAccessProvider.FileError"
-    enum="DriveFileError" expires_after="2020-05-03">
+    enum="DriveFileError" expires_after="2020-07-06">
   <owner>tby@chromium.org</owner>
   <owner>wrong@chromium.org</owner>
   <owner>jiameng@chromium.org</owner>
@@ -5318,7 +5318,7 @@
 
 <histogram
     name="Apps.AppList.DriveQuickAccessProvider.TimeFromFetchToZeroStateStart"
-    units="ms" expires_after="2020-05-03">
+    units="ms" expires_after="2020-07-06">
   <owner>wrong@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <owner>jiameng@chromium.org</owner>
@@ -5361,7 +5361,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.OmniboxProvider.ZeroStateLatency" units="ms"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>jennyz@chriomium.org</owner>
   <owner>newcomer@chromium.org</owner>
   <summary>
@@ -5482,7 +5482,7 @@
 </histogram>
 
 <histogram name="Apps.AppList.ZeroStateResultsList.FileImpressions"
-    enum="AppListSearchResult" expires_after="2020-05-03">
+    enum="AppListSearchResult" expires_after="2020-07-06">
   <owner>wrong@chromium.org</owner>
   <owner>tby@chromium.org</owner>
   <owner>jiameng@chromium.org</owner>
@@ -5816,7 +5816,7 @@
 </histogram>
 
 <histogram name="Apps.AppListPlayStoreAppLaunchedIndex" units="indices"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>jennyz@chromium.org</owner>
   <owner>newcomer@chromium.org</owner>
   <summary>
@@ -5841,7 +5841,7 @@
 </histogram>
 
 <histogram name="Apps.AppListRecommendedImpResultCountAfterOpen" units="shows"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>napper@chromium.org</owner>
   <owner>robsc@chromium.org</owner>
   <summary>
@@ -6032,7 +6032,7 @@
 </histogram>
 
 <histogram name="Apps.AppListShowSource" enum="AppListShowSource"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>newcomer@chromium.org</owner>
   <summary>
     The number of times the different sources for showing the app list are used.
@@ -6452,7 +6452,7 @@
 </histogram>
 
 <histogram name="Apps.LogDisplayTypeClickedResultZeroState"
-    enum="AppListSearchResultDisplayType" expires_after="2020-05-03">
+    enum="AppListSearchResultDisplayType" expires_after="2020-07-06">
   <owner>jiameng@chromium.org</owner>
   <owner>thanhdng@chromium.org</owner>
   <owner>tby@chromium.org</owner>
@@ -7004,7 +7004,7 @@
 </histogram>
 
 <histogram name="Arc.FirstAppLaunchDelay.TimeDelta" units="ms"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>yusukes@google.com</owner>
   <owner>khmel@google.com</owner>
   <summary>
@@ -7084,7 +7084,7 @@
   </summary>
 </histogram>
 
-<histogram name="Arc.ImeCount" units="units" expires_after="M81">
+<histogram name="Arc.ImeCount" units="units" expires_after="2020-07-06">
   <owner>yhanada@google.com</owner>
   <owner>tetsui@google.com</owner>
   <summary>
@@ -7160,7 +7160,7 @@
 </histogram>
 
 <histogram name="Arc.NativeBridge" enum="ArcNativeBridgeType"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>elijahtaylor@google.com</owner>
   <owner>levarum@google.com</owner>
   <summary>
@@ -7964,7 +7964,7 @@
 </histogram>
 
 <histogram name="Ash.Display.PrimaryDisplayZoomAtStartup" units="%"
-    expires_after="2020-03-01">
+    expires_after="2020-07-06">
   <owner>jamescook@chromium.org</owner>
   <owner>jessejames@chromium.org</owner>
   <owner>cros-system-services@google.com</owner>
@@ -8114,7 +8114,7 @@
 </histogram>
 
 <histogram name="Ash.GestureTarget" enum="AshGestureActionType"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <obsolete>
     Deprecated on 01/2020, no longer useful.
   </obsolete>
@@ -8703,7 +8703,7 @@
 </histogram>
 
 <histogram name="Ash.ShelfAlignmentOverTime" enum="ShelfAlignmentValue"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>kuscher@google.com</owner>
   <summary>
     The current state of the shelf (alignment) tracked over time by logging on a
@@ -9012,7 +9012,7 @@
 </histogram>
 
 <histogram name="Ash.TouchView.TouchViewInactive" units="ms"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>girard@chromium.org</owner>
   <summary>The length of time between TouchView activations.</summary>
 </histogram>
@@ -14161,7 +14161,7 @@
 </histogram>
 
 <histogram name="AutoScreenBrightness.DailyUserAdjustment.Eve" units="count"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>jiameng@chromium.org</owner>
   <summary>
     Number of times that a user has made brightness adjustments on an Eve device
@@ -14354,7 +14354,7 @@
 </histogram>
 
 <histogram name="AutoScreenBrightness.NewCurveSaved.Success"
-    enum="BooleanSuccess" expires_after="2020-05-03">
+    enum="BooleanSuccess" expires_after="2020-07-06">
   <owner>jiameng@chromium.org</owner>
   <summary>
     Whether a new curve was successfully saved to disk. Only reported if a new
@@ -14363,7 +14363,7 @@
 </histogram>
 
 <histogram name="AutoScreenBrightness.Opposite.UserModelBrightnessAdjustments"
-    units="count" expires_after="2020-05-03">
+    units="count" expires_after="2020-07-06">
   <owner>jiameng@chromium.org</owner>
   <summary>
     When user changes brightness manually, if the previous change was caused by
@@ -14411,7 +14411,7 @@
 </histogram>
 
 <histogram name="AutoScreenBrightness.TrainingCompleteDuration.NoNewCurve"
-    units="ms" expires_after="2020-05-03">
+    units="ms" expires_after="2020-07-06">
   <owner>jiameng@chromium.org</owner>
   <summary>
     The time elapsed to complete training after which no new curve was
@@ -15427,7 +15427,7 @@
 </histogram>
 
 <histogram name="Blink.Animate.UpdateTime" units="microseconds"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" -->
 
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" -->
@@ -16696,7 +16696,7 @@
 </histogram>
 
 <histogram name="Blink.ForcedStyleAndLayout.UpdateTime" units="microseconds"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimeAggregatedSuffixes" -->
 
   <owner>paint-dev@chromium.org</owner>
@@ -16809,7 +16809,7 @@
 </histogram>
 
 <histogram name="Blink.IntersectionObservation.UpdateTime" units="microseconds"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimeAggregatedSuffixes" -->
 
   <owner>paint-dev@chromium.org</owner>
@@ -16832,7 +16832,7 @@
 </histogram>
 
 <histogram name="Blink.Layout.UpdateTime" units="microseconds"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimeAggregatedSuffixes" -->
 
   <owner>schenney@chromium.org</owner>
@@ -16882,7 +16882,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.MainFrame.AnimateRatio" units="%"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
 <!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
@@ -16894,7 +16894,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.MainFrame.CompositingCommitRatio" units="%"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
 <!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
@@ -16906,7 +16906,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.MainFrame.CompositingRatio" units="%"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
 <!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
@@ -16918,7 +16918,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.MainFrame.ForcedStyleAndLayoutRatio"
-    units="%" expires_after="2020-05-03">
+    units="%" expires_after="2020-07-06">
   <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
 <!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
@@ -16931,7 +16931,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.MainFrame.HandleInputEventsRatio" units="%"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
 <!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
@@ -16943,7 +16943,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.MainFrame.IntersectionObservationRatio"
-    units="%" expires_after="2020-05-03">
+    units="%" expires_after="2020-07-06">
   <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
 <!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
@@ -16955,7 +16955,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.MainFrame.LayoutRatio" units="%"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
 <!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
@@ -16967,7 +16967,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.MainFrame.PaintRatio" units="%"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
 <!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
@@ -16979,7 +16979,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.MainFrame.PrePaintRatio" units="%"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
 <!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
@@ -16991,7 +16991,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.MainFrame.ProxyCommitRatio" units="%"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
 <!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
@@ -17003,7 +17003,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.MainFrame.ScrollingCoordinatorRatio"
-    units="%" expires_after="2020-05-03">
+    units="%" expires_after="2020-07-06">
   <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
 <!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
@@ -17028,7 +17028,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.MainFrame.StyleRatio" units="%"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
 <!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
@@ -17040,7 +17040,7 @@
 </histogram>
 
 <histogram base="true" name="Blink.MainFrame.UpdateLayersRatio" units="%"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>schenney@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
 <!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
@@ -17052,7 +17052,7 @@
 </histogram>
 
 <histogram name="Blink.MainFrame.UpdateTime" units="microseconds"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" -->
 
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" -->
@@ -17245,7 +17245,7 @@
 </histogram>
 
 <histogram name="Blink.Paint.UpdateTime" units="microseconds"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" -->
 
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" -->
@@ -17276,7 +17276,7 @@
 </histogram>
 
 <histogram name="Blink.PrePaint.UpdateTime" units="microseconds"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" -->
 
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" -->
@@ -17296,7 +17296,7 @@
 </histogram>
 
 <histogram name="Blink.ProxyCommit.UpdateTime" units="microseconds"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" -->
 
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" -->
@@ -17594,7 +17594,7 @@
 </histogram>
 
 <histogram name="Blink.ScrollingCoordinator.UpdateTime" units="microseconds"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" -->
 
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" -->
@@ -17777,7 +17777,7 @@
 </histogram>
 
 <histogram name="Blink.Style.UpdateTime" units="microseconds"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" -->
 
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" -->
@@ -17957,7 +17957,7 @@
 </histogram>
 
 <histogram name="Blink.UseCounter.FeaturePolicy.Header"
-    enum="FeaturePolicyFeature" expires_after="2020-05-03">
+    enum="FeaturePolicyFeature" expires_after="2020-07-06">
   <owner>iclelland@chromium.org</owner>
   <summary>
     Counts the use of a specific feature policy via the
@@ -18116,7 +18116,7 @@
 </histogram>
 
 <histogram name="Blink.UseCounter.File.Features" enum="FeatureObserver"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>yhirano@chromium.org</owner>
   <owner>mkwst@chromium.org</owner>
   <summary>
@@ -18881,7 +18881,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.Pairing.Result" enum="BooleanSuccess"
-    expires_after="2020-05-02">
+    expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes name="BluetoothTransportTypes" -->
 
   <owner>hansberry@chromium.org</owner>
@@ -18897,7 +18897,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ChromeOS.Pairing.TransportType"
-    enum="BluetoothTransportType" expires_after="2020-05-02">
+    enum="BluetoothTransportType" expires_after="2020-07-06">
   <owner>hansberry@chromium.org</owner>
   <summary>
     An enumerated histogram which captures the transport type of devices which
@@ -18925,7 +18925,7 @@
 </histogram>
 
 <histogram name="Bluetooth.ConnectedDeviceCount" units="devices"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>adlr@chromium.org</owner>
   <summary>
     Counts the number of simulataneously connected Bluetooth devices. Used to
@@ -19114,7 +19114,7 @@
 </histogram>
 
 <histogram name="Bluetooth.Web.ConnectGATT.Outcome"
-    enum="WebBluetoothConnectGATTOutcome" expires_after="M81">
+    enum="WebBluetoothConnectGATTOutcome" expires_after="2020-07-06">
   <owner>odejesush@chromium.org</owner>
   <owner>ortuno@chromium.org</owner>
   <owner>reillyg@chromium.org</owner>
@@ -19490,7 +19490,7 @@
   </summary>
 </histogram>
 
-<histogram name="BlueZ.AdapterLost" units="seconds" expires_after="2020-05-03">
+<histogram name="BlueZ.AdapterLost" units="seconds" expires_after="2020-07-06">
   <owner>mcchou@chromium.org</owner>
   <summary>
     This is specific to Chrome OS. Records a duration of a Bluetooth adapter
@@ -19533,7 +19533,7 @@
 </histogram>
 
 <histogram name="BlueZ.ReasonOfDisconnection" enum="BlueZReasonOfDisconnection"
-    expires_after="2020-04-26">
+    expires_after="2020-07-06">
   <owner>mcchou@chromium.org</owner>
   <summary>
     This is specific to Chrome OS. Records the reason of Bluetooth disconnection
@@ -19553,7 +19553,7 @@
 </histogram>
 
 <histogram name="BlueZ.ResultOfConnection" enum="BlueZResultOfConnection"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>mcchou@chromium.org</owner>
   <summary>
     This is specific to Chrome OS. Records the outcomes of connection requests
@@ -20196,7 +20196,7 @@
 </histogram>
 
 <histogram name="BrowserRenderProcessHost.ChildCrashes" enum="RendererType"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>wfh@chromium.org</owner>
   <summary>Count of renderer process crashes grouped by type.</summary>
 </histogram>
@@ -20593,7 +20593,7 @@
 </histogram>
 
 <histogram name="BrowserWindow.Resize.StepBoundsChange" units="pixels"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>sadrul@chromium.org</owner>
   <summary>
     Size changed between two consecutive steps during browser-window resize.
@@ -20969,7 +20969,7 @@
 </histogram>
 
 <histogram name="CaptivePortal.DetectResult" enum="CaptivePortalDetectResult"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>meacer@chromium.org</owner>
   <summary>Records the result of a captive portal probe.</summary>
 </histogram>
@@ -21296,7 +21296,7 @@
 </histogram>
 
 <histogram name="Cast.Sender.VideoEncodeAcceleratorInitializeSuccess"
-    enum="BooleanSuccess" expires_after="2020-05-03">
+    enum="BooleanSuccess" expires_after="2020-07-06">
   <owner>posciak@chromium.org</owner>
   <summary>
     Indicates whether initialization of a video encode accelerator for Cast
@@ -21689,7 +21689,7 @@
 </histogram>
 
 <histogram name="ChildProcess.Killed2.OOM" enum="ProcessType2"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>oshima@chromium.org</owner>
   <summary>
     Out of ChildProcess.Killled, number of kills due to SIGKILL, which is a
@@ -22054,7 +22054,7 @@
 </histogram>
 
 <histogram name="ChromeColors.AppliedColor" enum="ChromeColorsInfo"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <obsolete>
     Deprecated 12/2019. No longer tracked.
   </obsolete>
@@ -22079,7 +22079,7 @@
 </histogram>
 
 <histogram name="ChromeColors.ColorOnLoad" enum="ChromeColorsInfo"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>gayane@chromium.org</owner>
   <owner>yyushkina@chromium.org</owner>
   <summary>
@@ -22089,7 +22089,7 @@
 </histogram>
 
 <histogram name="ChromeColors.RevertReason" enum="ChromeColorsRevertReason"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <obsolete>
     Deprecated 12/2019. No longer tracked.
   </obsolete>
@@ -22421,7 +22421,7 @@
 </histogram>
 
 <histogram name="ChromeOS.CWP.UploadPerf" units="reports"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>aalexand@google.com</owner>
   <owner>gmx@chromium.org</owner>
   <summary>
@@ -23793,7 +23793,7 @@
 </histogram>
 
 <histogram name="Compositing.DirectRenderer.Software.DrawFrameUs"
-    units="microseconds" expires_after="M81">
+    units="microseconds" expires_after="2020-07-06">
   <owner>weiliangc@chromium.org</owner>
   <summary>
     Time spent drawing of composited layers by SoftwareRenderer, in
@@ -24991,7 +24991,7 @@
 </histogram>
 
 <histogram name="ContentCapture.CaptureContentTime" units="microseconds"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>michaelbai@chromium.org</owner>
   <summary>The time taken to capture the on-screen content.</summary>
 </histogram>
@@ -25171,14 +25171,16 @@
 </histogram>
 
 <histogram name="ContentSettings.DefaultNotificationsSetting"
-    enum="ContentSetting" expires_after="2020-03-29">
+    enum="ContentSetting" expires_after="2020-07-06">
   <owner>toyoshim@chromium.org</owner>
   <summary>The default notification setting at profile open.</summary>
 </histogram>
 
 <histogram name="ContentSettings.DefaultPluginsSetting" enum="ContentSetting"
-    expires_after="2020-06-28">
-  <owner>toyoshim@chromium.org</owner>
+    expires_after="M90">
+  <owner>andypaicu@chromium.org</owner>
+  <owner>engedy@chromium.org</owner>
+  <owner>hkamila@chromium.org</owner>
   <summary>The default plugins setting at profile open.</summary>
 </histogram>
 
@@ -25204,7 +25206,7 @@
 </histogram>
 
 <histogram name="ContentSettings.DefaultSubresourceFilterSetting"
-    enum="ContentSetting" expires_after="M81">
+    enum="ContentSetting" expires_after="2020-07-06">
   <owner>csharrison@chromium.org</owner>
   <summary>The default subresource filter setting at profile open</summary>
 </histogram>
@@ -26867,7 +26869,7 @@
 </histogram>
 
 <histogram name="Cookie.CookiePrefix" enum="CookiePrefix"
-    expires_after="2020-03-08">
+    expires_after="2020-07-06">
   <owner>estark@chromium.org</owner>
   <summary>
     Number of times a cookie was set with a name prefixed by
@@ -26902,7 +26904,7 @@
 </histogram>
 
 <histogram name="Cookie.CookieSourceScheme" enum="CookieSourceScheme"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>estark@chromium.org</owner>
   <summary>
     For each cookie added to the store, record whether its source URL has a
@@ -28506,7 +28508,7 @@
 </histogram>
 
 <histogram name="CrosDisksClient.MountCompletedError"
-    enum="CrosDisksClientMountError" expires_after="2020-05-03">
+    enum="CrosDisksClientMountError" expires_after="2020-07-06">
   <owner>amistry@chromium.org</owner>
   <summary>
     The error code of disk mount signals received from the Chrome OS cros-disks
@@ -28524,7 +28526,7 @@
 </histogram>
 
 <histogram name="CrosDisksClient.MountTime" units="ms"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>amistry@chromium.org</owner>
   <summary>
     Time taken by the Chrome OS cros-disks daemon to perform a Mount operation.
@@ -28541,7 +28543,7 @@
 </histogram>
 
 <histogram name="CrosDisksClient.UnmountTime" units="ms"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>amistry@chromium.org</owner>
   <summary>
     Time taken by the Chrome OS cros-disks daemon to perform an Unmount
@@ -29340,7 +29342,7 @@
 </histogram>
 
 <histogram name="Cryptohome.AsyncDBusRequest" units="ms"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>zuan@chromium.org</owner>
   <owner>cros-hwsec+uma@chromium.org</owner>
   <summary>
@@ -29594,7 +29596,7 @@
 </histogram>
 
 <histogram base="true" name="Cryptohome.LECredential"
-    enum="CryptohomeLECredError" expires_after="2020-02-23">
+    enum="CryptohomeLECredError" expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes name="LECredentialOps" -->
 
   <owner>pmalani@chromium.org</owner>
@@ -39194,7 +39196,7 @@
 </histogram>
 
 <histogram name="Download.Service.Files.FreeDiskSpace" units="%"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>xingliu@chromium.org</owner>
   <summary>
     The percentage of free disk space to total disk space. Recorded during
@@ -39260,7 +39262,7 @@
 </histogram>
 
 <histogram name="Download.Service.Finish.Type"
-    enum="Download.Service.CompletionType" expires_after="2020-05-03">
+    enum="Download.Service.CompletionType" expires_after="2020-07-06">
   <owner>xingliu@chromium.org</owner>
   <summary>The completion type for downloads in download service.</summary>
 </histogram>
@@ -39490,7 +39492,7 @@
 </histogram>
 
 <histogram name="Download.Start.ContentType.InsecureChain"
-    enum="DownloadContentType" expires_after="2020-05-03">
+    enum="DownloadContentType" expires_after="2020-07-06">
   <owner>cthomp@chromium.org</owner>
   <owner>estark@chromium.org</owner>
   <summary>
@@ -41205,7 +41207,7 @@
 </histogram>
 
 <histogram name="Enterprise.FCMInvalidationService.DevicePolicyInvalidations"
-    enum="EnterprisePolicyInvalidations" expires_after="2020-05-03">
+    enum="EnterprisePolicyInvalidations" expires_after="2020-07-06">
   <owner>askaraitzhan@google.com</owner>
   <owner>isandrk@chromium.org</owner>
   <summary>
@@ -41410,7 +41412,7 @@
 
 <histogram name="Enterprise.MachineLevelUserCloudPolicyEnrollment.Result"
     enum="MachineLevelUserCloudPolicyEnrollmentResult"
-    expires_after="2020-04-26">
+    expires_after="2020-07-06">
   <owner>zmin@chromium.org</owner>
   <summary>The result of machine level user cloud policy enrollment.</summary>
 </histogram>
@@ -41707,7 +41709,7 @@
 </histogram>
 
 <histogram name="Enterprise.TiclInvalidationService.DevicePolicyInvalidations"
-    enum="EnterprisePolicyInvalidations" expires_after="2020-05-03">
+    enum="EnterprisePolicyInvalidations" expires_after="2020-07-06">
   <owner>askaraitzhan@google.com</owner>
   <owner>isandrk@chromium.org</owner>
   <summary>
@@ -42059,7 +42061,7 @@
 </histogram>
 
 <histogram name="EnterpriseCheck.IsDomainJoined" enum="BooleanEnabled"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>mad@chromium.org</owner>
   <summary>
     Whether the machine is joined to an AD domain. This check is performed once
@@ -42248,6 +42250,9 @@
 
 <histogram name="Event.AsyncTargeting.TimeInQueue" units="ms"
     expires_after="2020-06-28">
+  <obsolete>
+    Deprecated as of 01/2020. The feature has been launched.
+  </obsolete>
   <owner>yigu@chromium.org</owner>
   <summary>
     Tracks how long an event has to wait in the queue while a previous event is
@@ -43475,7 +43480,7 @@
 </histogram>
 
 <histogram name="Event.Latency.EndToEnd.Mouse" units="microseconds"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>input-dev@chromium.org</owner>
   <summary>
     Time between the OS receiving a mouse event and the resulting GPU frame
@@ -45902,6 +45907,9 @@
 
 <histogram name="Event.VizHitTest.AggregateTimeUs" units="microseconds"
     expires_after="M81">
+  <obsolete>
+    Deprecated as of 01/2020. The feature has been launched.
+  </obsolete>
   <owner>yigu@chromium.org</owner>
   <owner>event-targeting@chromium.org</owner>
   <summary>
@@ -45933,6 +45941,9 @@
 
 <histogram name="Event.VizHitTest.HitTestRegions" units="regions"
     expires_after="2020-06-28">
+  <obsolete>
+    Deprecated as of 01/2020. The feature has been launched.
+  </obsolete>
   <owner>yigu@chromium.org</owner>
   <owner>event-targeting@chromium.org</owner>
   <summary>
@@ -45955,6 +45966,9 @@
 
 <histogram name="Event.VizHitTest.TargetTimeUs" units="microseconds"
     expires_after="2020-06-28">
+  <obsolete>
+    Deprecated as of 01/2020. The feature has been launched.
+  </obsolete>
   <owner>yigu@chromium.org</owner>
   <owner>event-targeting@chromium.org</owner>
   <summary>
@@ -45978,6 +45992,9 @@
 
 <histogram name="Event.VizHitTest.TransformTimeUs" units="microseconds"
     expires_after="2020-06-28">
+  <obsolete>
+    Deprecated as of 01/2020. The feature has been launched.
+  </obsolete>
   <owner>yigu@chromium.org</owner>
   <owner>event-targeting@chromium.org</owner>
   <summary>
@@ -55624,7 +55641,7 @@
 </histogram>
 
 <histogram name="GPU.D3DShaderModel" enum="ShaderModel"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>jmadill@chromium.org</owner>
   <summary>
     ANGLE's currently active D3D shader model version. Logged once every startup
@@ -56259,7 +56276,7 @@
 </histogram>
 
 <histogram name="GPU.GPUProcessExitCode" enum="GPUProcessExitCode"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>jbauman@chromium.org</owner>
   <summary>
     Counts for the exit codes returned by the GPU process when it terminated.
@@ -56435,7 +56452,7 @@
 </histogram>
 
 <histogram name="GPU.MaxMSAASampleCount" units="samples"
-    expires_after="2020-03-01">
+    expires_after="2020-07-06">
   <owner>senorblanco@chromium.org</owner>
   <summary>
     The maximum number of multisampled anti-aliasing (MSAA) samples per pixel
@@ -57031,7 +57048,7 @@
 </histogram>
 
 <histogram name="GPU.WatchdogThread.ExtraThreadTime" units="# timeouts"
-    expires_after="2020-05-01">
+    expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes name="GPU.WatchdogStage" -->
 
   <owner>magchen@chromium.org</owner>
@@ -57043,7 +57060,7 @@
 </histogram>
 
 <histogram name="GPU.WatchdogThread.Timeout" enum="GpuWatchdogTimeoutEvent"
-    expires_after="2020-05-01">
+    expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes name="GPU.WatchdogStage" -->
 
   <owner>magchen@chromium.org</owner>
@@ -57054,7 +57071,7 @@
 </histogram>
 
 <histogram name="GPU.WatchdogThread.V1.ExtraThreadTime" units="ms"
-    expires_after="2020-05-01">
+    expires_after="2020-07-06">
   <owner>magchen@chromium.org</owner>
   <owner>zmo@chromium.org</owner>
   <summary>
@@ -57064,7 +57081,7 @@
 </histogram>
 
 <histogram name="GPU.WatchdogThread.V1.Timeout" enum="GpuWatchdogTimeoutEvent"
-    expires_after="2020-05-01">
+    expires_after="2020-07-06">
   <owner>magchen@chromium.org</owner>
   <owner>zmo@chromium.org</owner>
   <summary>
@@ -57083,7 +57100,7 @@
 </histogram>
 
 <histogram name="GPU.WatchdogThread.WaitTime" units="ms"
-    expires_after="2020-05-01">
+    expires_after="2020-07-06">
 <!-- Name completed by histogram_suffixes name="GPU.WatchdogStage" -->
 
   <owner>magchen@chromium.org</owner>
@@ -58912,7 +58929,7 @@
   </summary>
 </histogram>
 
-<histogram name="HttpCache.BeforeSend" units="ms" expires_after="2020-05-03">
+<histogram name="HttpCache.BeforeSend" units="ms" expires_after="2020-07-06">
   <owner>morlovich@chromium.org</owner>
   <summary>
     For http cache transactions in which a network request was sent, the time
@@ -62678,7 +62695,7 @@
 </histogram>
 
 <histogram name="JSDialogs.CharacterCount" units="characters"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <obsolete>
     Deprecated 2020-01.
   </obsolete>
@@ -64106,7 +64123,7 @@
 </histogram>
 
 <histogram base="true" name="LocalNetworkRequests.PrivatePage" units="requests"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>uthakore@chromium.org</owner>
   <owner>invernizzi@chromium.org</owner>
   <summary>
@@ -76814,7 +76831,7 @@
 <histogram
     name="MultiDevice.DeviceSyncService.SetSoftwareFeatureState.Result.FailureReason"
     enum="MultiDevice_DeviceSyncService_DeviceSyncRequestFailureReason"
-    expires_after="2020-04-19">
+    expires_after="2020-07-06">
   <owner>vecore@google.com</owner>
   <owner>better-together-dev@google.com</owner>
   <summary>
@@ -76929,7 +76946,7 @@
 
 <histogram
     name="MultiDevice.SecureChannel.BLE.Performance.StartScanToReceiveAdvertisementDuration.Background"
-    units="ms" expires_after="2020-05-03">
+    units="ms" expires_after="2020-07-06">
   <owner>vecore@google.com</owner>
   <owner>better-together-dev@google.com</owner>
   <summary>
@@ -98221,7 +98238,7 @@
 </histogram>
 
 <histogram name="NQE.WifiSignalStrength.LevelAvailable" enum="BooleanAvailable"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>tbansal@chromium.org</owner>
   <owner>bengr@chromium.org</owner>
   <summary>
@@ -103061,7 +103078,7 @@
 </histogram>
 
 <histogram name="Overscroll.Navigated3" enum="OverscrollNavigationType"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>nzolghadr@chromium.org</owner>
   <summary>
     Navigations that were triggered due to completed overscroll gesture. Note
@@ -116452,7 +116469,7 @@
   </summary>
 </histogram>
 
-<histogram name="Power.BacklightLevelOnAC" units="%" expires_after="2020-05-03">
+<histogram name="Power.BacklightLevelOnAC" units="%" expires_after="2020-07-06">
   <owner>tbroch@chromium.org</owner>
   <summary>
     The level of the backlight as a percentage when the user is on AC. Sampled
@@ -117164,7 +117181,7 @@
 </histogram>
 
 <histogram name="Power.NumberOfSessionsPerCharge" units="units"
-    expires_after="2020-04-26">
+    expires_after="2020-07-06">
   <owner>tbroch@chromium.org</owner>
   <summary>
     The number of user sessions that occured since the last time that the device
@@ -117373,7 +117390,7 @@
 </histogram>
 
 <histogram name="Power.UserBrightnessAdjustmentsPerSessionOnBattery"
-    units="units" expires_after="2020-05-03">
+    units="units" expires_after="2020-07-06">
   <owner>tbroch@chromium.org</owner>
   <owner>jiameng@chromium.org</owner>
   <summary>
@@ -120717,7 +120734,7 @@
 </histogram>
 
 <histogram name="Privacy.DoNotTrackSetting" enum="BooleanEnabled"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>mkwst@chromium.org</owner>
   <owner>msramek@chromium.org</owner>
   <summary>
@@ -120810,7 +120827,7 @@
 </histogram>
 
 <histogram name="Profile.AddNewUser" enum="ProfileAddNewUser"
-    expires_after="2020-04-19">
+    expires_after="2020-07-06">
   <owner>rogerta@chromium.org</owner>
   <summary>The frequency of ways that new user profiles are added.</summary>
 </histogram>
@@ -121219,7 +121236,7 @@
 </histogram>
 
 <histogram name="Profile.NumberOfNamedProfiles" units="count"
-    expires_after="2020-04-01">
+    expires_after="2020-07-06">
   <owner>feuunk@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <summary>
@@ -132607,7 +132624,7 @@
 </histogram>
 
 <histogram name="SBIRS.PSSLoadResult" enum="PlatformStateStoreLoadResult"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>grt@google.com</owner>
   <summary>The result of loading data from the platform state store.</summary>
 </histogram>
@@ -141695,8 +141712,9 @@
 </histogram>
 
 <histogram name="ShortcutsProvider.QueryIndexTime" units="ms"
-    expires_after="M81">
-  <owner>davidben@chromium.org</owner>
+    expires_after="2020-09-19">
+  <owner>manukh@chromium.org</owner>
+  <owner>chrome-omnibox-team@google.com</owner>
   <summary>
     The time it takes for the ShortcutsProvider to perform a query after the
     user has typed N characters.
@@ -147243,7 +147261,7 @@
 </histogram>
 
 <histogram name="Stability.Android.ProcessedRealMinidumps"
-    enum="AndroidProcessedMinidumps" expires_after="M81">
+    enum="AndroidProcessedMinidumps" expires_after="2021-01-06">
   <owner>mheikal@chromium.org</owner>
   <owner>smaier@chromium.org</owner>
   <owner>wnwen@chromium.org</owner>
@@ -147256,7 +147274,7 @@
 </histogram>
 
 <histogram name="Stability.Android.ProcessedSimulatedMinidumps"
-    enum="AndroidProcessedMinidumps" expires_after="M81">
+    enum="AndroidProcessedMinidumps" expires_after="2021-01-06">
   <owner>mheikal@chromium.org</owner>
   <owner>smaier@chromium.org</owner>
   <owner>wnwen@chromium.org</owner>
@@ -148112,7 +148130,7 @@
 </histogram>
 
 <histogram name="Startup.BrowserMainToRendererMain" units="ms"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>fdoray@chromium.org</owner>
   <summary>
     Time from the ChromeMain() entry in the browser process to the first
@@ -148146,7 +148164,7 @@
 </histogram>
 
 <histogram name="Startup.BrowserMessageLoopStartHardFaultCount" units="faults"
-    expires_after="2020-02-23">
+    expires_after="2020-07-06">
   <owner>chrisha@chromium.org</owner>
   <owner>fdoray@chromium.org</owner>
   <summary>
@@ -148279,7 +148297,7 @@
 </histogram>
 
 <histogram name="Startup.BrowserWindow.FirstPaint" units="ms"
-    expires_after="2020-04-26">
+    expires_after="2020-07-06">
   <owner>mblsha@yandex-team.ru</owner>
   <summary>
     Time from browser startup to the time the first Browser window has finished
@@ -148298,7 +148316,8 @@
   </summary>
 </histogram>
 
-<histogram name="Startup.BrowserWindowDisplay" units="ms" expires_after="M81">
+<histogram name="Startup.BrowserWindowDisplay" units="ms"
+    expires_after="2020-07-06">
   <owner>fdoray@chromium.org</owner>
   <summary>
     Time from browser startup to the time the browser window initially becomes
@@ -148331,7 +148350,7 @@
 </histogram>
 
 <histogram name="Startup.ColdStartWithExternalURLTime" units="ms"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>jif@chromium.org</owner>
   <summary>
     The duration of all initializations in a cold start triggered by an external
@@ -149044,7 +149063,7 @@
   </summary>
 </histogram>
 
-<histogram name="Startup.SystemUptime" units="ms" expires_after="M81">
+<histogram name="Startup.SystemUptime" units="ms" expires_after="2020-07-06">
   <owner>fdoray@chromium.org</owner>
   <summary>
     The time elapsed between system boot and Chrome browser process launch. This
@@ -149053,7 +149072,7 @@
 </histogram>
 
 <histogram name="Startup.Temperature" enum="StartupTemperature"
-    expires_after="2020-02-23">
+    expires_after="2020-07-06">
   <owner>chrisha@chromium.org</owner>
   <owner>fdoray@chromium.org</owner>
   <summary>
@@ -149215,7 +149234,7 @@
 </histogram>
 
 <histogram name="Storage.Blob.FileReaderLoader.FailureType"
-    enum="FileReaderLoaderFailureType" expires_after="M81">
+    enum="FileReaderLoaderFailureType" expires_after="2020-07-06">
   <owner>dmurph@chromium.org</owner>
   <summary>
     Recorded when an error occurs in the FileReaderLoader, which is used to load
@@ -149228,7 +149247,7 @@
 </histogram>
 
 <histogram name="Storage.Blob.FileReaderLoader.ReadError" enum="NetErrorCodes"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>dmurph@chromium.org</owner>
   <summary>
     The error code reported by the blob system while trying to read a blob in
@@ -149387,7 +149406,7 @@
 </histogram>
 
 <histogram base="true" name="Storage.Blob.SizeEvictedToDiskInKB" units="KB"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>ssid@chromium.org</owner>
   <summary>Records the total size of in-memory blobs evicted to disk.</summary>
 </histogram>
@@ -152345,7 +152364,7 @@
 </histogram>
 
 <histogram base="true" name="Sync.ModelTypeConfigurationTime.Ephemeral"
-    units="ms" expires_after="2020-05-01">
+    units="ms" expires_after="2020-07-06">
   <owner>jkrcal@chromium.org</owner>
   <owner>mastiz@chromium.org</owner>
   <summary>
@@ -152954,7 +152973,7 @@
 </histogram>
 
 <histogram name="Sync.PostedClientToServerMessageLatency" units="ms"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>mastiz@chromium.org</owner>
   <summary>
     Time taken for a client-initiated request to be sent over the network and
@@ -160263,7 +160282,7 @@
 </histogram>
 
 <histogram name="UMA.TruncatedEvents.UserAction" units="events"
-    expires_after="2020-06-28">
+    expires_after="2020-07-06">
   <owner>rkaplow@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -162074,7 +162093,7 @@
   </summary>
 </histogram>
 
-<histogram name="V8.GCBackgroundMarking" units="ms" expires_after="2020-05-03">
+<histogram name="V8.GCBackgroundMarking" units="ms" expires_after="2020-07-06">
   <owner>ulan@chromium.org</owner>
   <summary>
     Time spent in background tasks doing marking in one GC cycle. It is recorded
@@ -165333,7 +165352,7 @@
 </histogram>
 
 <histogram base="true" name="WebApk.Uninstall" enum="BooleanHit"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>pkotwicz@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>Records that a WebAPK was uninstalled.</summary>
@@ -165739,7 +165758,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioBuffer.Length" units="frames"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>rtoy@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <summary>
@@ -165749,7 +165768,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioBuffer.NumberOfChannels" units="units"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>rtoy@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <summary>
@@ -165773,7 +165792,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioBuffer.SampleRate384kHz" units="Hz"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>rtoy@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <summary>
@@ -165798,7 +165817,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioBuffer.SampleRateRatio384kHz" units="units"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>rtoy@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <summary>
@@ -165819,7 +165838,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioContext.MaxChannelsAvailable" units="units"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>rtoy@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <summary>
@@ -165852,7 +165871,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioDestination.CallbackBufferSize" units="units"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>rtoy@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <summary>
@@ -165982,7 +166001,7 @@
 </histogram>
 
 <histogram name="WebAudio.BiquadFilter.Type" enum="BiquadFilterType"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>rtoy@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <summary>
@@ -166004,7 +166023,7 @@
 </histogram>
 
 <histogram name="WebAudio.IIRFilterNode.Order" units="units"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>rtoy@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <summary>
@@ -166063,7 +166082,7 @@
 </histogram>
 
 <histogram name="WebAudio.PannerNode.PanningModel" enum="PanningModelType"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>rtoy@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <summary>
@@ -166076,7 +166095,7 @@
 </histogram>
 
 <histogram name="WebAudio.PushPullFIFO.UnderflowGlitches" enum="Boolean"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>rtoy@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <summary>
@@ -166087,7 +166106,7 @@
 </histogram>
 
 <histogram name="WebAudio.PushPullFIFO.UnderflowPercentage" units="%"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>rtoy@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <summary>
@@ -166754,7 +166773,7 @@
 </histogram>
 
 <histogram name="WebCore.IndexedDB.LevelDBOpenErrors.Corruption"
-    enum="LevelDBCorruptionTypes" expires_after="2020-05-03">
+    enum="LevelDBCorruptionTypes" expires_after="2020-07-06">
   <owner>dgrogan@chromium.org</owner>
   <summary>
     Types of corruption that LevelDB encounters when opening a database.
@@ -166860,7 +166879,7 @@
 </histogram>
 
 <histogram name="WebCore.IndexedDB.LevelDBWriteErrors.BFE"
-    enum="PlatformFileError" expires_after="2020-05-03">
+    enum="PlatformFileError" expires_after="2020-07-06">
   <owner>cmumford@chromium.org</owner>
   <summary>
     Errors (base::File::Error) encountered by a single LevelDBEnv method when
@@ -167162,7 +167181,7 @@
 </histogram>
 
 <histogram name="WebCore.IndexedDB.SchemaVersion" units="version"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>dmurph@chromium.org</owner>
   <summary>
     Records the schema version of the IndexedDB database read from disk.
@@ -167176,7 +167195,7 @@
 </histogram>
 
 <histogram name="WebCore.IndexedDB.SchemaVersion.Docs" units="version"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>dmurph@chromium.org</owner>
   <summary>
     Records the schema version of the IndexedDB database read from disk.
@@ -167413,7 +167432,7 @@
 </histogram>
 
 <histogram name="WebCore.IndexedDB.TransactionAbortReason" enum="IDBException"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>dmurph@chromium.org</owner>
   <summary>
     Recorded on the browser side (back end) when an IndexedDB transaction is
@@ -167993,7 +168012,7 @@
 </histogram>
 
 <histogram base="true" name="WebFont.HttpCacheStatus" enum="HttpCachePattern"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>kenjibaheux@chromium.org</owner>
   <owner>ksakamoto@chromium.org</owner>
   <summary>
@@ -168145,7 +168164,7 @@
 </histogram>
 
 <histogram name="WebFont.PackageFormat" enum="WebFontPackageFormat"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <obsolete>
     Removed Jan 2020.
   </obsolete>
@@ -168285,7 +168304,7 @@
 </histogram>
 
 <histogram name="WebP.DecodedImageFormat" enum="WebpDecodedFormat"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>droger@chromium.org</owner>
   <summary>
     Histogram for the format of decoded WebP images on iOS, as Chrome re-encodes
@@ -169046,7 +169065,7 @@
 </histogram>
 
 <histogram name="WebRTC.Audio.ReceiverDelayEstimateMs" units="ms"
-    expires_after="M81">
+    expires_after="2020-07-06">
   <owner>hlundin@chromium.org</owner>
   <summary>
     The sum of the jitter buffer delay and the sound card's buffering delay for
@@ -169861,7 +169880,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.SdpSemanticNegotiated"
-    enum="PeerConnectionSdpSemanticNegotiated" expires_after="2020-05-03">
+    enum="PeerConnectionSdpSemanticNegotiated" expires_after="2020-07-06">
   <owner>hta@chromium.org</owner>
   <summary>
     What SDP semantic (Unified Plan or Plan B) was detected when completing
@@ -169973,7 +169992,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.TimeToConnect" units="ms"
-    expires_after="2020-05-03">
+    expires_after="2020-07-06">
   <owner>qingsi@google.com</owner>
   <owner>jeroendb@google.com</owner>
   <summary>Time to setup a peer to peer call with PeerConnection.</summary>
@@ -184679,9 +184698,8 @@
       label="Password protection triggered by entering a password that
              matches either/both the sync password, signed-in non-syncing
              password, or a saved password. This is a superset of (and should
-             be equal to or larger than) SyncPasswordEntry and
-             ProtectedPasswordEntry/SavedPasswordEntry and
-             NonSyncPasswordEntry"/>
+             be equal to or larger than) SyncPasswordEntry +
+             SavedPasswordEntry + NonSyncPasswordEntry"/>
   <suffix name="GmailNonSyncPasswordEntry"
       label="Password protection triggered by entering a non-syncing gaia
              password that is associated with a Gmail account. This is a
@@ -184715,7 +184733,12 @@
   <suffix name="ProtectedPasswordEntry"
       label="Password protection triggered by entering a saved password that
              does NOT match a password that is currently signed-in. This is
-             the same as SavedPaswordEntry."/>
+             the same as SavedPaswordEntry.">
+    <obsolete>
+      Replaced by SavedPasswordEntry+SyncPasswordEntry+NonSyncPasswordEntry in
+      M77.
+    </obsolete>
+  </suffix>
   <suffix name="SavedPasswordEntry"
       label="Password protection triggered by entering a password saved in
              the password manager where the account is not signed-in to
diff --git a/tools/perf/core/tbmv3/trace_processor.py b/tools/perf/core/tbmv3/trace_processor.py
index 8ac87c2..0e66b05b 100644
--- a/tools/perf/core/tbmv3/trace_processor.py
+++ b/tools/perf/core/tbmv3/trace_processor.py
@@ -16,6 +16,12 @@
 EXPORT_JSON_QUERY_TEMPLATE = 'select export_json(%s)\n'
 METRICS_PATH = os.path.realpath(os.path.join(os.path.dirname(__file__),
                                              'metrics'))
+_TP_NOT_SUPPLIED_ERROR_MSG = """
+Proto trace format selected but trace processor executable is not supplied.
+Either pass --legacy-json-trace-format flag to force using the json format,
+or build the trace_processor_shell target and supply the path to the binary
+via the --trace-processor-path flag.
+"""
 
 MetricFiles = namedtuple('MetricFiles', ('sql', 'proto', 'config'))
 
@@ -27,8 +33,7 @@
 
 def _CheckTraceProcessor(trace_processor_path):
   if trace_processor_path is None:
-    raise RuntimeError('Trace processor executable is not supplied. '
-                       'Please use the --trace-processor-path flag.')
+    raise RuntimeError(_TP_NOT_SUPPLIED_ERROR_MSG)
   if not os.path.isfile(trace_processor_path):
     raise RuntimeError("Can't find trace processor executable at %s" %
                        trace_processor_path)
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index 25634ed..2d0d953 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -337,7 +337,6 @@
 crbug.com/1014655 [ android-webview ] system_health.common_mobile/browse:social:instagram:2019 [ Skip ]
 crbug.com/1036141 [ android-webview ] system_health.common_mobile/browse:shopping:lazada:2019 [ Skip ]
 crbug.com/1036143 [ android-pixel-2 ] system_health.common_mobile/browse:chrome:omnibox:2019 [ Skip ]
-crbug.com/1039734 [ android-go ] system_health.common_mobile/browse:news:washingtonpost:2019 [ Skip ]
 crbug.com/1039801 [ android-webview ] system_health.memory_mobile/browse:social:pinterest_infinite_scroll:2019 [ Skip ]
 
 # Benchmark: system_health.memory_desktop
diff --git a/ui/accessibility/BUILD.gn b/ui/accessibility/BUILD.gn
index a51cbdce..efc671b8 100644
--- a/ui/accessibility/BUILD.gn
+++ b/ui/accessibility/BUILD.gn
@@ -108,6 +108,7 @@
     "ax_tree_source.h",
     "ax_tree_source_checker.h",
     "ax_tree_update.h",
+    "ax_tree_update_forward.h",
     "null_ax_action_target.cc",
     "null_ax_action_target.h",
     "platform/ax_android_constants.cc",
diff --git a/ui/accessibility/ax_tree_update_forward.h b/ui/accessibility/ax_tree_update_forward.h
new file mode 100644
index 0000000..c59dfaa
--- /dev/null
+++ b/ui/accessibility/ax_tree_update_forward.h
@@ -0,0 +1,18 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_ACCESSIBILITY_AX_TREE_UPDATE_FORWARD_H_
+#define UI_ACCESSIBILITY_AX_TREE_UPDATE_FORWARD_H_
+
+namespace ui {
+
+struct AXNodeData;
+struct AXTreeData;
+template <typename A, typename B>
+struct AXTreeUpdateBase;
+using AXTreeUpdate = AXTreeUpdateBase<AXNodeData, AXTreeData>;
+
+}  // namespace ui
+
+#endif  // UI_ACCESSIBILITY_AX_TREE_UPDATE_FORWARD_H_
diff --git a/ui/aura/native_window_occlusion_tracker_win.cc b/ui/aura/native_window_occlusion_tracker_win.cc
index 920ed3d9..a49a34f 100644
--- a/ui/aura/native_window_occlusion_tracker_win.cc
+++ b/ui/aura/native_window_occlusion_tracker_win.cc
@@ -263,8 +263,7 @@
 void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
     EnableOcclusionTrackingForWindow(HWND hwnd) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  NativeWindowOcclusionState default_state;
-  root_window_hwnds_occlusion_state_[hwnd] = default_state;
+  root_window_hwnds_occlusion_state_[hwnd] = Window::OcclusionState::UNKNOWN;
   if (global_event_hooks_.empty())
     RegisterEventHooks();
 
@@ -355,38 +354,26 @@
       SkIRect::MakeLTRB(screen_left, screen_top,
                         screen_left + GetSystemMetrics(SM_CXVIRTUALSCREEN),
                         screen_top + GetSystemMetrics(SM_CYVIRTUALSCREEN)));
+  num_root_windows_with_unknown_occlusion_state_ = 0;
 
   for (auto& root_window_pair : root_window_hwnds_occlusion_state_) {
-    root_window_pair.second.unoccluded_region.setEmpty();
     HWND hwnd = root_window_pair.first;
 
     // IsIconic() checks for a minimized window. Immediately set the state of
     // minimized windows to HIDDEN.
     if (IsIconic(hwnd)) {
-      root_window_pair.second.occlusion_state = Window::OcclusionState::HIDDEN;
+      root_window_pair.second = Window::OcclusionState::HIDDEN;
     } else if (IsWindowOnCurrentVirtualDesktop(hwnd) == false) {
       // If window is not on the current virtual desktop, immediately
       // set the state of the window to OCCLUDED.
-      root_window_pair.second.occlusion_state =
-          Window::OcclusionState::OCCLUDED;
+      root_window_pair.second = Window::OcclusionState::OCCLUDED;
       // Don't unregister event hooks when not on current desktop. There's no
       // notification when that changes, so we can't reregister event hooks.
       should_unregister_event_hooks = false;
     } else {
-      root_window_pair.second.occlusion_state = Window::OcclusionState::UNKNOWN;
-      RECT window_rect;
-      if (GetWindowRect(hwnd, &window_rect) != 0) {
-        root_window_pair.second.unoccluded_region =
-            SkRegion(SkIRect::MakeLTRB(window_rect.left, window_rect.top,
-                                       window_rect.right, window_rect.bottom));
-        // Clip the unoccluded region by the screen dimensions, to handle the
-        // case of the app window being partly off screen.
-        root_window_pair.second.unoccluded_region.op(screen_region,
-                                                     SkRegion::kIntersect_Op);
-      }
-      // If call to GetWindowRect fails, window will be treated as occluded,
-      // because unoccluded_region will be empty.
+      root_window_pair.second = Window::OcclusionState::UNKNOWN;
       should_unregister_event_hooks = false;
+      num_root_windows_with_unknown_occlusion_state_++;
     }
   }
   // Unregister event hooks if all native windows are minimized.
@@ -394,6 +381,7 @@
     UnregisterEventHooks();
   } else {
     base::flat_set<DWORD> current_pids_with_visible_windows;
+    unoccluded_desktop_region_ = screen_region;
     // Calculate unoccluded region if there is a non-minimized native window.
     // Also compute |current_pids_with_visible_windows| as we enumerate
     // the windows.
@@ -425,27 +413,13 @@
                     });
     }
   }
-  // Determine new occlusion status and post a task to the browser ui
-  // thread to update the window occlusion state on the root windows.
-  base::flat_map<HWND, Window::OcclusionState> window_occlusion_states;
-
-  for (auto& root_window_pair : root_window_hwnds_occlusion_state_) {
-    Window::OcclusionState new_state;
-    if (root_window_pair.second.occlusion_state !=
-        Window::OcclusionState::UNKNOWN) {
-      new_state = root_window_pair.second.occlusion_state;
-    } else {
-      new_state = root_window_pair.second.unoccluded_region.isEmpty()
-                      ? Window::OcclusionState::OCCLUDED
-                      : Window::OcclusionState::VISIBLE;
-    }
-    window_occlusion_states[root_window_pair.first] = new_state;
-    root_window_pair.second.occlusion_state = new_state;
-  }
+  // Post a task to the browser ui thread to update the window occlusion state
+  // on the root windows.
   ui_thread_task_runner_->PostTask(
       FROM_HERE,
       base::BindOnce(&NativeWindowOcclusionTrackerWin::UpdateOcclusionState,
-                     base::Unretained(g_tracker), window_occlusion_states));
+                     base::Unretained(g_tracker),
+                     root_window_hwnds_occlusion_state_));
 }
 
 void NativeWindowOcclusionTrackerWin::WindowOcclusionCalculator::
@@ -524,46 +498,57 @@
         base::flat_set<DWORD>* current_pids_with_visible_windows) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
+  SkRegion curr_unoccluded_destkop = unoccluded_desktop_region_;
   gfx::Rect window_rect;
-  // Check if |hwnd| is a root_window; if so, we're done figuring out
-  // if it's occluded because we've seen all the windows "over" it.
-  // TODO(davidbienvenu): Explore checking if occlusion state has been
-  // computed for all |root_window_hwnds_occlusion_state_|, and if so, skipping
-  // further oclcusion calculations. However, we still want to keep computing
-  // |current_pids_with_visible_windows_|, so this function always returns true.
-  auto it = root_window_hwnds_occlusion_state_.find(hwnd);
-  if (it != root_window_hwnds_occlusion_state_.end() &&
-      it->second.occlusion_state != Window::OcclusionState::HIDDEN) {
-    it->second.occlusion_state = it->second.unoccluded_region.isEmpty()
-                                     ? Window::OcclusionState::OCCLUDED
-                                     : Window::OcclusionState::VISIBLE;
+  bool window_is_occluding =
+      WindowCanOccludeOtherWindowsOnCurrentVirtualDesktop(hwnd, &window_rect);
+  if (window_is_occluding) {
+    // Hook this window's process with EVENT_OBJECT_LOCATION_CHANGE, if we are
+    // not already doing so.
+    DWORD pid;
+    GetWindowThreadProcessId(hwnd, &pid);
+    current_pids_with_visible_windows->insert(pid);
+    if (!base::Contains(process_event_hooks_, pid))
+      RegisterEventHookForProcess(pid);
+
+    // If no more root windows to consider, return true so we can continue
+    // looking for windows we haven't hooked.
+    if (num_root_windows_with_unknown_occlusion_state_ == 0)
+      return true;
+
+    SkRegion window_region(SkIRect::MakeLTRB(window_rect.x(), window_rect.y(),
+                                             window_rect.right(),
+                                             window_rect.bottom()));
+    unoccluded_desktop_region_.op(window_region, SkRegion::kDifference_Op);
+  } else if (num_root_windows_with_unknown_occlusion_state_ == 0) {
+    // This window can't occlude other windows, but we've determined the
+    // occlusion state of all root windows, so we can return.
+    return true;
   }
 
-  if (!WindowCanOccludeOtherWindowsOnCurrentVirtualDesktop(hwnd, &window_rect))
+  // Check if |hwnd| is a root window; if so, we're done figuring out
+  // if it's occluded because we've seen all the windows "over" it.
+  auto it = root_window_hwnds_occlusion_state_.find(hwnd);
+  if (it == root_window_hwnds_occlusion_state_.end() ||
+      it->second != Window::OcclusionState::UNKNOWN) {
     return true;
-  // We are interested in this window, but are not currently hooking it with
-  // EVENT_OBJECT_LOCATION_CHANGE, so we need to hook it. We check
-  // this by seeing if its PID is in |process_event_hooks_|.
-  DWORD pid;
-  GetWindowThreadProcessId(hwnd, &pid);
-  current_pids_with_visible_windows->insert(pid);
-  if (!base::Contains(process_event_hooks_, pid))
-    RegisterEventHookForProcess(pid);
+  }
 
-  SkRegion window_region(SkIRect::MakeLTRB(window_rect.x(), window_rect.y(),
-                                           window_rect.right(),
-                                           window_rect.bottom()));
+  // On Win7, default theme makes root windows have complex regions by
+  // default. But we can still check if their bounding rect is occluded.
+  if (!window_is_occluding) {
+    RECT rect;
+    if (::GetWindowRect(hwnd, &rect) != 0) {
+      SkRegion window_region(
+          SkIRect::MakeLTRB(rect.left, rect.top, rect.right, rect.bottom));
 
-  for (auto& root_window_pair : root_window_hwnds_occlusion_state_) {
-    if (root_window_pair.second.occlusion_state !=
-        Window::OcclusionState::UNKNOWN)
-      continue;
-    if (!root_window_pair.second.unoccluded_region.op(
-            window_region, SkRegion::kDifference_Op)) {
-      root_window_pair.second.occlusion_state =
-          Window::OcclusionState::OCCLUDED;
+      curr_unoccluded_destkop.op(window_region, SkRegion::kDifference_Op);
     }
   }
+  it->second = (unoccluded_desktop_region_ == curr_unoccluded_destkop)
+                   ? Window::OcclusionState::OCCLUDED
+                   : Window::OcclusionState::VISIBLE;
+  num_root_windows_with_unknown_occlusion_state_--;
   return true;
 }
 
diff --git a/ui/aura/native_window_occlusion_tracker_win.h b/ui/aura/native_window_occlusion_tracker_win.h
index 0b433367..7746998 100644
--- a/ui/aura/native_window_occlusion_tracker_win.h
+++ b/ui/aura/native_window_occlusion_tracker_win.h
@@ -78,17 +78,6 @@
     friend class NativeWindowOcclusionTrackerTest;
     friend class test::AuraTestHelper;
 
-    struct NativeWindowOcclusionState {
-      // The region of the native window that is not occluded by other windows.
-      SkRegion unoccluded_region;
-
-      // The current occlusion state of the native window. Default to UNKNOWN
-      // because we do not know the state starting out. More information on
-      // these states can be found in aura::Window.
-      aura::Window::OcclusionState occlusion_state =
-          aura::Window::OcclusionState::UNKNOWN;
-    };
-
     // Registers event hooks, if not registered.
     void MaybeRegisterEventHooks();
 
@@ -184,7 +173,7 @@
 
     // Map of root app window hwnds and their occlusion state. This contains
     // both visible and hidden windows.
-    base::flat_map<HWND, NativeWindowOcclusionState>
+    base::flat_map<HWND, Window::OcclusionState>
         root_window_hwnds_occlusion_state_;
 
     // Values returned by SetWinEventHook are stored so that hooks can be
@@ -207,6 +196,19 @@
     // calculating window occlusion.
     bool window_is_moving_ = false;
 
+    // Used to determine if a root window is occluded. As we iterate through the
+    // hwnds in z-order, we subtract each opaque window's rect from
+    // |unoccluded_desktop_region_|. When we get to a root window, we subtract
+    // it from |unoccluded_desktop_region_|, and if |unoccluded_desktop_region_|
+    // doesn't change, the root window was already occluded.
+    SkRegion unoccluded_desktop_region_;
+
+    // Keeps track of how many root windows we need to compute the occlusion
+    // state of in a call to ComputeNativeWindowOcclusionStatus. Once we've
+    // determined the state of all root windows, we can stop subtracting
+    // windows from |unoccluded_desktop_region_|.
+    int num_root_windows_with_unknown_occlusion_state_;
+
     // Only used on Win10+.
     Microsoft::WRL::ComPtr<IVirtualDesktopManager> virtual_desktop_manager_;
 
diff --git a/ui/base/accelerators/accelerator.cc b/ui/base/accelerators/accelerator.cc
index a3e869a7..025a82c 100644
--- a/ui/base/accelerators/accelerator.cc
+++ b/ui/base/accelerators/accelerator.cc
@@ -176,6 +176,9 @@
 #endif
   }
 
+#if defined(OS_MACOSX)
+  shortcut = ApplyShortFormModifiers(shortcut);
+#else
   // Checking whether the character used for the accelerator is alphanumeric.
   // If it is not, then we need to adjust the string later on if the locale is
   // right-to-left. See below for more information of why such adjustment is
@@ -188,11 +191,7 @@
     shortcut_rtl.assign(shortcut);
   }
 
-#if defined(OS_MACOSX)
-  shortcut = ApplyShortFormModifiers(shortcut);
-#else
   shortcut = ApplyLongFormModifiers(shortcut);
-#endif
 
   // For some reason, menus in Windows ignore standard Unicode directionality
   // marks (such as LRE, PDF, etc.). On RTL locales, we use RTL menus and
@@ -223,6 +222,7 @@
     shortcut_rtl.append(shortcut, 0, shortcut.length() - key_length - 1);
     shortcut.swap(shortcut_rtl);
   }
+#endif  // OS_MACOSX
 
   return shortcut;
 }
diff --git a/ui/base/resource/resource_bundle.cc b/ui/base/resource/resource_bundle.cc
index 4221d6a..758b85c8 100644
--- a/ui/base/resource/resource_bundle.cc
+++ b/ui/base/resource/resource_bundle.cc
@@ -73,7 +73,7 @@
 const char kPakFileExtension[] = ".pak";
 #endif
 
-ResourceBundle* g_shared_instance_ = NULL;
+ResourceBundle* g_shared_instance_ = nullptr;
 
 base::FilePath GetResourcesPakFilePath(const std::string& pak_name) {
   base::FilePath path;
@@ -266,7 +266,7 @@
 void ResourceBundle::InitSharedInstanceWithPakFileRegion(
     base::File pak_file,
     const base::MemoryMappedFile::Region& region) {
-  InitSharedInstance(NULL);
+  InitSharedInstance(nullptr);
   auto data_pack = std::make_unique<DataPack>(SCALE_FACTOR_100P);
   if (!data_pack->LoadFromFileRegion(std::move(pak_file), region)) {
     LOG(WARNING) << "failed to load pak file";
@@ -279,7 +279,7 @@
 
 // static
 void ResourceBundle::InitSharedInstanceWithPakPath(const base::FilePath& path) {
-  InitSharedInstance(NULL);
+  InitSharedInstance(nullptr);
   g_shared_instance_->LoadTestResources(path, path);
 
   g_shared_instance_->InitDefaultFontList();
@@ -288,18 +288,18 @@
 // static
 void ResourceBundle::CleanupSharedInstance() {
   delete g_shared_instance_;
-  g_shared_instance_ = NULL;
+  g_shared_instance_ = nullptr;
 }
 
 // static
 bool ResourceBundle::HasSharedInstance() {
-  return g_shared_instance_ != NULL;
+  return g_shared_instance_ != nullptr;
 }
 
 // static
 ResourceBundle& ResourceBundle::GetSharedInstance() {
   // Must call InitSharedInstance before this function.
-  CHECK(g_shared_instance_ != NULL);
+  CHECK(g_shared_instance_ != nullptr);
   return *g_shared_instance_;
 }
 
@@ -579,24 +579,25 @@
 base::RefCountedMemory* ResourceBundle::LoadDataResourceBytesForScale(
     int resource_id,
     ScaleFactor scale_factor) const {
-  base::RefCountedMemory* bytes = nullptr;
-  if (delegate_)
-    bytes = delegate_->LoadDataResourceBytes(resource_id, scale_factor);
-
-  if (!bytes) {
-    base::StringPiece data =
-        GetRawDataResourceForScale(resource_id, scale_factor);
-    if (!data.empty()) {
-      if (HasGzipHeader(data) || HasBrotliHeader(data)) {
-        base::RefCountedString* bytes_string = new base::RefCountedString();
-        DecompressIfNeeded(data, &(bytes_string->data()));
-        bytes = bytes_string;
-      } else {
-        bytes = new base::RefCountedStaticMemory(data.data(), data.length());
-      }
-    }
+  if (delegate_) {
+    base::RefCountedMemory* bytes =
+        delegate_->LoadDataResourceBytes(resource_id, scale_factor);
+    if (bytes)
+      return bytes;
   }
-  return bytes;
+
+  base::StringPiece data =
+      GetRawDataResourceForScale(resource_id, scale_factor);
+  if (data.empty())
+    return nullptr;
+
+  if (HasGzipHeader(data) || HasBrotliHeader(data)) {
+    base::RefCountedString* bytes_string = new base::RefCountedString();
+    DecompressIfNeeded(data, &(bytes_string->data()));
+    return bytes_string;
+  }
+
+  return new base::RefCountedStaticMemory(data.data(), data.length());
 }
 
 base::StringPiece ResourceBundle::GetRawDataResource(int resource_id) const {
@@ -608,8 +609,9 @@
     ScaleFactor scale_factor) const {
   base::StringPiece data;
   if (delegate_ &&
-      delegate_->GetRawDataResource(resource_id, scale_factor, &data))
+      delegate_->GetRawDataResource(resource_id, scale_factor, &data)) {
     return data;
+  }
 
   if (scale_factor != ui::SCALE_FACTOR_100P) {
     for (size_t i = 0; i < data_packs_.size(); i++) {
@@ -626,8 +628,9 @@
          data_packs_[i]->GetScaleFactor() == ui::SCALE_FACTOR_300P ||
          data_packs_[i]->GetScaleFactor() == ui::SCALE_FACTOR_NONE) &&
         data_packs_[i]->GetStringPiece(static_cast<uint16_t>(resource_id),
-                                       &data))
+                                       &data)) {
       return data;
+    }
   }
 
   return base::StringPiece();
@@ -854,7 +857,7 @@
 
 // static
 void ResourceBundle::InitSharedInstance(Delegate* delegate) {
-  DCHECK(g_shared_instance_ == NULL) << "ResourceBundle initialized twice";
+  DCHECK(g_shared_instance_ == nullptr) << "ResourceBundle initialized twice";
   g_shared_instance_ = new ResourceBundle(delegate);
   std::vector<ScaleFactor> supported_scale_factors;
 #if defined(OS_IOS)
diff --git a/ui/base/resource/resource_bundle.h b/ui/base/resource/resource_bundle.h
index fc3fab98..102bb47 100644
--- a/ui/base/resource/resource_bundle.h
+++ b/ui/base/resource/resource_bundle.h
@@ -99,7 +99,7 @@
     // default resource.
     virtual gfx::Image GetNativeImageNamed(int resource_id) = 0;
 
-    // Return a ref counted memory resource or NULL to attempt retrieval of the
+    // Return a ref counted memory resource or null to attempt retrieval of the
     // default resource.
     virtual base::RefCountedMemory* LoadDataResourceBytes(
         int resource_id,
@@ -219,7 +219,7 @@
   // loading code of ResourceBundle.
   gfx::Image& GetNativeImageNamed(int resource_id);
 
-  // Loads the raw bytes of a scale independent data resource.
+  // Loads the raw bytes of a scale independent data resource or null.
   base::RefCountedMemory* LoadDataResourceBytes(int resource_id) const;
 
   // Whether the |resource_id| is gzipped in this bundle. False is also returned
@@ -233,7 +233,7 @@
   // Loads the raw bytes of a data resource nearest the scale factor
   // |scale_factor| into |bytes|. If the resource is compressed, decompress
   // before returning. Use ResourceHandle::SCALE_FACTOR_NONE for scale
-  // independent image resources (such as wallpaper). Returns nullptr if we fail
+  // independent image resources (such as wallpaper). Returns null if we fail
   // to read the resource.
   base::RefCountedMemory* LoadDataResourceBytesForScale(
       int resource_id,
@@ -461,7 +461,7 @@
   base::string16 GetLocalizedStringImpl(int resource_id);
 
   // This pointer is guaranteed to outlive the ResourceBundle instance and may
-  // be NULL.
+  // be null.
   Delegate* delegate_;
 
   // Protects |locale_resources_data_|.
diff --git a/ui/views/controls/label_unittest.cc b/ui/views/controls/label_unittest.cc
index 04543b3f..e971fdfc 100644
--- a/ui/views/controls/label_unittest.cc
+++ b/ui/views/controls/label_unittest.cc
@@ -260,14 +260,14 @@
   DISALLOW_COPY_AND_ASSIGN(LabelSelectionTest);
 };
 
-// Crashes on Linux only. http://crbug.com/612406
+TEST_F(LabelTest, FontPropertySymbol) {
 #if defined(OS_LINUX)
-#define MAYBE_FontPropertySymbol DISABLED_FontPropertySymbol
+  // On linux, the fonts are mocked with a custom FontConfig. The "Courier New"
+  // family name is mapped to Cousine-Regular.ttf (see: $build/test_fonts/*).
+  std::string font_name("Courier New");
 #else
-#define MAYBE_FontPropertySymbol FontPropertySymbol
-#endif
-TEST_F(LabelTest, MAYBE_FontPropertySymbol) {
   std::string font_name("symbol");
+#endif
   gfx::Font font(font_name, 26);
   label()->SetFontList(gfx::FontList(font));
   gfx::Font font_used = label()->font_list().GetPrimaryFont();
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/BrowserFragmentImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/BrowserFragmentImpl.java
index 798b5d7d..542a42be 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/BrowserFragmentImpl.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/BrowserFragmentImpl.java
@@ -42,6 +42,7 @@
 
     public static void addObserver(Observer observer) {
         sLifecycleObservers.addObserver(observer);
+        if (sNumAttachedBrowserFragments > 0) observer.onFirstBrowserFragmentAttached();
     }
 
     public static void removeObserver(Observer observer) {
@@ -55,7 +56,7 @@
                 profileManager.getProfile(fragmentArgs.getString(BrowserFragmentArgs.PROFILE_NAME));
     }
 
-    private void incrementBrowserFramentsAndNotifyObservers() {
+    private void incrementBrowserFragmentsAndNotifyObservers() {
         assert sNumAttachedBrowserFragments >= 0;
         sNumAttachedBrowserFragments++;
         if (sNumAttachedBrowserFragments != 1) return;
@@ -80,7 +81,7 @@
         mContext = ClassLoaderContextWrapperFactory.get(context);
         if (mBrowser != null) { // On first creation, onAttach is called before onCreate
             mBrowser.onFragmentAttached(mContext, new FragmentWindowAndroid(mContext, this));
-            incrementBrowserFramentsAndNotifyObservers();
+            incrementBrowserFragmentsAndNotifyObservers();
         }
     }
 
@@ -91,7 +92,7 @@
         mBrowser = new BrowserImpl(mProfile, savedInstanceState);
         if (mContext != null) {
             mBrowser.onFragmentAttached(mContext, new FragmentWindowAndroid(mContext, this));
-            incrementBrowserFramentsAndNotifyObservers();
+            incrementBrowserFragmentsAndNotifyObservers();
         }
     }
 
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/WebLayerFactoryImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/WebLayerFactoryImpl.java
index dbf80a6..4289b9d0 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/WebLayerFactoryImpl.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/WebLayerFactoryImpl.java
@@ -18,8 +18,8 @@
  */
 @UsedByReflection("WebLayer")
 public final class WebLayerFactoryImpl extends IWebLayerFactory.Stub {
-    private final int mClientMajorVersion;
-    private final String mClientVersion;
+    private static int sClientMajorVersion;
+    private static String sClientVersion;
 
     /**
      * This function is called by the client using reflection.
@@ -37,8 +37,8 @@
     }
 
     private WebLayerFactoryImpl(String clientVersion, int clientMajorVersion) {
-        mClientMajorVersion = clientMajorVersion;
-        mClientVersion = clientVersion;
+        sClientMajorVersion = clientMajorVersion;
+        sClientVersion = clientVersion;
     }
 
     /**
@@ -48,7 +48,7 @@
     @Override
     public boolean isClientSupported() {
         StrictModeWorkaround.apply();
-        return Math.abs(mClientMajorVersion - getImplementationMajorVersion()) <= 3;
+        return Math.abs(sClientMajorVersion - getImplementationMajorVersion()) <= 3;
     }
 
     /**
@@ -60,6 +60,14 @@
         return VersionConstants.PRODUCT_MAJOR_VERSION;
     }
 
+    static int getClientMajorVersion() {
+        if (sClientMajorVersion == 0) {
+            throw new IllegalStateException(
+                    "This should only be called once WebLayer is initialized");
+        }
+        return sClientMajorVersion;
+    }
+
     /**
      * Returns the full version string of the implementation.
      */
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java
index 7b330ec..3baefd3 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/WebLayerImpl.java
@@ -111,6 +111,7 @@
                             @Override
                             public void onSuccess() {
                                 CrashReporterControllerImpl.getInstance().notifyNativeInitialized();
+                                configureNetworkChangeNotifier();
                                 loadedCallback.onReceiveValue(true);
                             }
                             @Override
@@ -134,6 +135,15 @@
                 .startBrowserProcessesSync(
                         /* singleProcess*/ false);
         CrashReporterControllerImpl.getInstance().notifyNativeInitialized();
+        configureNetworkChangeNotifier();
+    }
+
+    // Configure NetworkChangeNotifier to auto detect changes in network
+    // connectivity.
+    private void configureNetworkChangeNotifier() {
+        NetworkChangeNotifier.init();
+        NetworkChangeNotifier.setAutoDetectConnectivityState(
+                new WebLayerNetworkChangeNotifierRegistrationPolicy());
     }
 
     private void init(IObjectWrapper appContextWrapper, IObjectWrapper remoteContextWrapper) {
@@ -197,12 +207,6 @@
             LibraryLoader.getInstance().ensureInitialized();
         }
         GmsBridge.getInstance().setSafeBrowsingHandler();
-
-        // Configure NetworkChangeNotifier to auto detect changes in network
-        // connectivity.
-        NetworkChangeNotifier.init();
-        NetworkChangeNotifier.setAutoDetectConnectivityState(
-                new WebLayerNetworkChangeNotifierRegistrationPolicy());
     }
 
     @Override
diff --git a/weblayer/public/java/org/chromium/weblayer/WebLayer.java b/weblayer/public/java/org/chromium/weblayer/WebLayer.java
index 75aefad..5733dc8 100644
--- a/weblayer/public/java/org/chromium/weblayer/WebLayer.java
+++ b/weblayer/public/java/org/chromium/weblayer/WebLayer.java
@@ -141,6 +141,16 @@
         return getWebLayerLoader(context).getMajorVersion();
     }
 
+    // Internal version of getSupportedMajorVersion(). This should only be used when you know
+    // WebLayer has been initialized. Generally that means calling this from any non-static method.
+    static int getSupportedMajorVersionInternal() {
+        if (sLoader == null) {
+            throw new IllegalStateException(
+                    "This should only be called once WebLayer is initialized");
+        }
+        return sLoader.getMajorVersion();
+    }
+
     /**
      * Returns the Chrome version of the WebLayer implementation. This will return a full version
      * string such as "79.0.3945.0", while {@link getSupportedMajorVersion} will only return the