diff --git a/DEPS b/DEPS
index af0bf08..c04cc09 100644
--- a/DEPS
+++ b/DEPS
@@ -235,7 +235,7 @@
   # luci-go CIPD package version.
   # Make sure the revision is uploaded by infra-packagers builder.
   # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console
-  'luci_go': 'git_revision:320bf3ed60cd4d24549d0ea9ee3a94394f2665ce',
+  'luci_go': 'git_revision:4494da54d1ba43d9127c07630d452c11ba2c953e',
 
   # This can be overridden, e.g. with custom_vars, to build clang from HEAD
   # instead of downloading the prebuilt pinned revision.
@@ -304,7 +304,7 @@
   # 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': '5fa5d5958628088f44a784fa5f69a27ec60488d9',
+  'skia_revision': '941102c7554b3dd54f0bb34d3bd17e94181ba302',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # 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 ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '997c4c7b3d6bf1d0bc1e92267ae50d372f76a502',
+  'angle_revision': 'dae99340c9cc725ff0fef604d9e0d872edf4d4be',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -320,7 +320,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': 'a066864b6e4f48f013204605bbb52dfcc28d0ee6',
+  'pdfium_revision': 'aae3f4452ac46d64c705a1a117503d59000ebf5e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -331,7 +331,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
-  'fuchsia_version': 'version:12.20230323.3.1',
+  'fuchsia_version': 'version:12.20230324.0.1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling google-toolbox-for-mac
   # and whatever else without interference from each other.
@@ -431,7 +431,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': 'a0456433619385c6c03e634d6069161bcb80d535',
+  'dawn_revision': '8150d1cf81acc31935c8f5045aa94c5d458d7de8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -467,7 +467,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.
-  'cros_components_revision': '0631a9fae2b5f424dd1f938ba03a422b22755c90',
+  'cros_components_revision': '7a51813c5667bde2b91d09508bc1f1a76fbd9cc4',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -790,7 +790,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    'e4e0d6c5312163f362c568a5b7dd89e23a612bf7',
+    'dd09946e684919d30149408b5bbb3c8073d40d04',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1230,7 +1230,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'c799f76f30dec736e37da32da2395cb29ed4ede4',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'ec4dd35d180ae98d245132ae8374a25130712b8d',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -1847,7 +1847,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@7fa3159d78e09b7761f1cc5558bcd014529b4630',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@672a6d1840c9c91d62cee2c37fd45d731be6e9fe',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907',
@@ -1884,7 +1884,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'd1b65aa5a88f6efd900604dfcda840154e9f16e2',
 
   'src/third_party/webgpu-cts/src':
-    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '07ce6fa80556ad9ea530f68bd82ffcafede40728',
+    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '6143b5711c8a2f83963857036ba58aff555053d4',
 
   'src/third_party/webrtc':
     Var('webrtc_git') + '/src.git' + '@' + 'd3e765e4eb4af8eba0c63b6bfe2e17a12dc670dc',
@@ -1964,7 +1964,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': Var('chrome_git') + '/chrome/src-internal.git@9f5a9e63630393ca7e0e10fcca591a9874348387',
+    'url': Var('chrome_git') + '/chrome/src-internal.git@e889822517c15409579b1d84df59e2e339d51479',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 13257430..4ae52ee 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -809,6 +809,12 @@
              "ExoOrdinalMotion",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// Enables to check KeyEvent flag to see if the event is consumed by IME
+// or not (=decides using heuristics based on key code etc.).
+BASE_FEATURE(kExoConsumedByImeByFlag,
+             "ExoConsumedByImeByFlag",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // Allows RGB Keyboard to test new animations/patterns.
 BASE_FEATURE(kExperimentalRgbKeyboardPatterns,
              "ExperimentalRgbKeyboardPatterns",
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index bf34c731..c4b326e3 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -241,6 +241,7 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kExoLinuxDmabufV4);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kExoLinuxDmabufModifiers);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kExoOrdinalMotion);
+COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kExoConsumedByImeByFlag);
 COMPONENT_EXPORT(ASH_CONSTANTS)
 BASE_DECLARE_FEATURE(kExperimentalRgbKeyboardPatterns);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kFaceMLApp);
diff --git a/ash/system/input_device_settings/input_device_settings_metrics_manager.cc b/ash/system/input_device_settings/input_device_settings_metrics_manager.cc
index 7381e92..53b406a 100644
--- a/ash/system/input_device_settings/input_device_settings_metrics_manager.cc
+++ b/ash/system/input_device_settings/input_device_settings_metrics_manager.cc
@@ -4,11 +4,67 @@
 
 #include "ash/system/input_device_settings/input_device_settings_metrics_manager.h"
 
+#include "ash/public/mojom/input_device_settings.mojom-forward.h"
+#include "base/metrics/histogram_functions.h"
+
 namespace ash {
 
+namespace {
+
+enum class KeyboardType {
+  kExternal = 0,
+  kExternalChromeOS,
+  kInternal,
+};
+
+KeyboardType GetKeyboardType(const mojom::Keyboard& keyboard) {
+  if (!keyboard.is_external) {
+    return KeyboardType::kInternal;
+  } else if (keyboard.meta_key == mojom::MetaKey::kLauncher ||
+             keyboard.meta_key == mojom::MetaKey::kSearch) {
+    return KeyboardType::kExternalChromeOS;
+  } else {
+    return KeyboardType::kExternal;
+  }
+}
+
+}  // namespace
+
 InputDeviceSettingsMetricsManager::InputDeviceSettingsMetricsManager() =
     default;
 InputDeviceSettingsMetricsManager::~InputDeviceSettingsMetricsManager() =
     default;
 
+void InputDeviceSettingsMetricsManager::RecordKeyboardInitialMetrics(
+    const mojom::Keyboard& keyboard) {
+  // TODO(yyhyyh@): Only record the metrics once for each keyboard.
+  const KeyboardType keyboard_type = GetKeyboardType(keyboard);
+  switch (keyboard_type) {
+    case KeyboardType::kExternal:
+      base::UmaHistogramBoolean(
+          "ChromeOS.Settings.Device.Keyboard.External.BlockMetaFKeyRewrites."
+          "Initial",
+          keyboard.settings->suppress_meta_fkey_rewrites);
+      base::UmaHistogramBoolean(
+          "ChromeOS.Settings.Device.Keyboard.External.TopRowAreFKeys.Initial",
+          keyboard.settings->top_row_are_fkeys);
+      break;
+    case KeyboardType::kExternalChromeOS:
+      base::UmaHistogramBoolean(
+          "ChromeOS.Settings.Device.Keyboard.ExternalChromeOS."
+          "BlockMetaFKeyRewrites.Initial",
+          keyboard.settings->suppress_meta_fkey_rewrites);
+      base::UmaHistogramBoolean(
+          "ChromeOS.Settings.Device.Keyboard.ExternalChromeOS.TopRowAreFKeys."
+          "Initial",
+          keyboard.settings->top_row_are_fkeys);
+      break;
+    case KeyboardType::kInternal:
+      base::UmaHistogramBoolean(
+          "ChromeOS.Settings.Device.Keyboard.Internal.TopRowAreFKeys.Initial",
+          keyboard.settings->top_row_are_fkeys);
+      break;
+  }
+}
+
 }  // namespace ash
\ No newline at end of file
diff --git a/ash/system/input_device_settings/input_device_settings_metrics_manager.h b/ash/system/input_device_settings/input_device_settings_metrics_manager.h
index 8ce62beb..1ff9e4d 100644
--- a/ash/system/input_device_settings/input_device_settings_metrics_manager.h
+++ b/ash/system/input_device_settings/input_device_settings_metrics_manager.h
@@ -6,6 +6,7 @@
 #define ASH_SYSTEM_INPUT_DEVICE_SETTINGS_INPUT_DEVICE_SETTINGS_METRICS_MANAGER_H_
 
 #include "ash/ash_export.h"
+#include "ash/public/mojom/input_device_settings.mojom.h"
 
 namespace ash {
 
@@ -17,6 +18,8 @@
   InputDeviceSettingsMetricsManager& operator=(
       const InputDeviceSettingsMetricsManager&) = delete;
   ~InputDeviceSettingsMetricsManager();
+
+  void RecordKeyboardInitialMetrics(const mojom::Keyboard& keyboard);
 };
 
 }  // namespace ash
diff --git a/ash/system/input_device_settings/input_device_settings_metrics_manager_unittest.cc b/ash/system/input_device_settings/input_device_settings_metrics_manager_unittest.cc
index c5fac89..2d52eae 100644
--- a/ash/system/input_device_settings/input_device_settings_metrics_manager_unittest.cc
+++ b/ash/system/input_device_settings/input_device_settings_metrics_manager_unittest.cc
@@ -4,10 +4,19 @@
 
 #include "ash/system/input_device_settings/input_device_settings_metrics_manager.h"
 
+#include "ash/public/mojom/input_device_settings.mojom-shared.h"
+#include "ash/public/mojom/input_device_settings.mojom.h"
 #include "ash/test/ash_test_base.h"
+#include "base/test/metrics/histogram_tester.h"
 
 namespace ash {
 
+namespace {
+constexpr int kExternalKeyboardId = 1;
+constexpr int kExternalChromeOSKeyboardId = 2;
+constexpr int kInternalKeyboardId = 3;
+}  // namespace
+
 class InputDeviceSettingsMetricsManagerTest : public AshTestBase {
  public:
   InputDeviceSettingsMetricsManagerTest() = default;
@@ -32,8 +41,70 @@
   std::unique_ptr<InputDeviceSettingsMetricsManager> manager_;
 };
 
-TEST_F(InputDeviceSettingsMetricsManagerTest, InitializationTest) {
-  EXPECT_NE(manager_.get(), nullptr);
+TEST_F(InputDeviceSettingsMetricsManagerTest, RecordsKeyboardSettings) {
+  mojom::Keyboard keyboard_external;
+  keyboard_external.id = kExternalKeyboardId;
+  keyboard_external.is_external = true;
+  keyboard_external.meta_key = mojom::MetaKey::kCommand;
+  keyboard_external.settings = mojom::KeyboardSettings::New();
+  auto& settings_external = *keyboard_external.settings;
+  settings_external.top_row_are_fkeys = true;
+
+  mojom::Keyboard keyboard_external_chromeos;
+  keyboard_external_chromeos.id = kExternalChromeOSKeyboardId;
+  keyboard_external_chromeos.is_external = true;
+  keyboard_external_chromeos.meta_key = mojom::MetaKey::kSearch;
+  keyboard_external_chromeos.settings = mojom::KeyboardSettings::New();
+  auto& settings_external_chromeos = *keyboard_external_chromeos.settings;
+  settings_external_chromeos.top_row_are_fkeys = false;
+
+  mojom::Keyboard keyboard_internal;
+  keyboard_internal.id = kInternalKeyboardId;
+  keyboard_internal.is_external = false;
+  keyboard_internal.settings = mojom::KeyboardSettings::New();
+  auto& settings_internal = *keyboard_internal.settings;
+  settings_internal.top_row_are_fkeys = true;
+
+  // Initially expect no user preferences recorded.
+  base::HistogramTester histogram_tester;
+  manager_.get()->RecordKeyboardInitialMetrics(keyboard_external);
+
+  histogram_tester.ExpectTotalCount(
+      "ChromeOS.Settings.Device.Keyboard.External.TopRowAreFKeys.Initial",
+      /*expected_count=*/1u);
+  histogram_tester.ExpectTotalCount(
+      "ChromeOS.Settings.Device.Keyboard.ExternalChromeOS.TopRowAreFKeys."
+      "Initial",
+      /*expected_count=*/0u);
+  histogram_tester.ExpectTotalCount(
+      "ChromeOS.Settings.Device.Keyboard.Internal.TopRowAreFKeys.Initial",
+      /*expected_count=*/0u);
+
+  manager_.get()->RecordKeyboardInitialMetrics(keyboard_external_chromeos);
+
+  histogram_tester.ExpectTotalCount(
+      "ChromeOS.Settings.Device.Keyboard.External.TopRowAreFKeys.Initial",
+      /*expected_count=*/1u);
+  histogram_tester.ExpectTotalCount(
+      "ChromeOS.Settings.Device.Keyboard.ExternalChromeOS.TopRowAreFKeys."
+      "Initial",
+      /*expected_count=*/1u);
+  histogram_tester.ExpectTotalCount(
+      "ChromeOS.Settings.Device.Keyboard.Internal.TopRowAreFKeys.Initial",
+      /*expected_count=*/0u);
+
+  manager_.get()->RecordKeyboardInitialMetrics(keyboard_internal);
+
+  histogram_tester.ExpectTotalCount(
+      "ChromeOS.Settings.Device.Keyboard.External.TopRowAreFKeys.Initial",
+      /*expected_count=*/1u);
+  histogram_tester.ExpectTotalCount(
+      "ChromeOS.Settings.Device.Keyboard.ExternalChromeOS.TopRowAreFKeys."
+      "Initial",
+      /*expected_count=*/1u);
+  histogram_tester.ExpectTotalCount(
+      "ChromeOS.Settings.Device.Keyboard.Internal.TopRowAreFKeys.Initial",
+      /*expected_count=*/1u);
 }
 
 }  // namespace ash
\ No newline at end of file
diff --git a/ash/webui/camera_app_ui/resources/js/device/mode/index.ts b/ash/webui/camera_app_ui/resources/js/device/mode/index.ts
index 87e29d1..9c61b45 100644
--- a/ash/webui/camera_app_ui/resources/js/device/mode/index.ts
+++ b/ash/webui/camera_app_ui/resources/js/device/mode/index.ts
@@ -15,6 +15,7 @@
   Mode,
   Resolution,
 } from '../../type.js';
+import {getFpsRangeFromConstraints} from '../../util.js';
 import {StreamConstraints} from '../stream_constraints.js';
 
 import {
@@ -170,26 +171,12 @@
                 assertExists(this.getCaptureParams().videoSnapshotResolution));
           }
 
-          let minFrameRate = 0;
-          let maxFrameRate = 0;
-          if (constraints.video?.frameRate) {
-            const frameRate = constraints.video.frameRate;
-            if (typeof frameRate === 'number') {
-              minFrameRate = frameRate;
-              maxFrameRate = frameRate;
-            } else if (frameRate.exact) {
-              minFrameRate = frameRate.exact;
-              maxFrameRate = frameRate.exact;
-            } else if (frameRate.min && frameRate.max) {
-              minFrameRate = frameRate.min;
-              maxFrameRate = frameRate.max;
-            }
-            // TODO(wtlee): To set the fps range to the default value, we should
-            // remove the frameRate from constraints instead of using incomplete
-            // range.
-          }
-          await deviceOperator.setFpsRange(
-              deviceId, minFrameRate, maxFrameRate);
+          // TODO(wtlee): To set the fps range to the default value, we should
+          // remove the frameRate from constraints instead of using incomplete
+          // range.
+          const {minFps, maxFps} =
+              getFpsRangeFromConstraints(constraints.video?.frameRate);
+          await deviceOperator.setFpsRange(deviceId, minFps, maxFps);
         },
         fallbackMode: Mode.PHOTO,
       },
diff --git a/ash/webui/camera_app_ui/resources/js/device/mode/video.ts b/ash/webui/camera_app_ui/resources/js/device/mode/video.ts
index 525226a..cb9c7c5f 100644
--- a/ash/webui/camera_app_ui/resources/js/device/mode/video.ts
+++ b/ash/webui/camera_app_ui/resources/js/device/mode/video.ts
@@ -42,6 +42,7 @@
   Resolution,
   VideoType,
 } from '../../type.js';
+import {getFpsRangeFromConstraints} from '../../util.js';
 import {WaitableEvent} from '../../waitable_event.js';
 import {StreamConstraints} from '../stream_constraints.js';
 import {StreamManager} from '../stream_manager.js';
@@ -89,10 +90,14 @@
 const TIME_LAPSE_INITIAL_SPEED = 5;
 
 /**
- * Number of maximum frames recorded in a specific speed time-lapse video. If
- * the current number of frames exceeds, the speed must be increasd.
+ * Maximum duration for the time-lapse video in seconds.
  */
-const TIME_LAPSE_MAX_FRAMES = 5 * 30;
+const TIME_LAPSE_MAX_DURATION = 60;
+
+/**
+ * Default number of fps in case it's not defined from the original video.
+ */
+const TIME_LAPSE_DEFAULT_FRAME_RATE = 30;
 
 
 /**
@@ -283,6 +288,7 @@
       private readonly snapshotResolution: Resolution|null,
       facing: Facing,
       private readonly handler: VideoHandler,
+      private readonly frameRate: number,
   ) {
     super(video, facing);
 
@@ -742,17 +748,20 @@
    */
   private async captureTimeLapse(param: h264.EncoderParameters):
       Promise<TimeLapseSaver> {
+    const fps =
+        this.frameRate > 0 ? this.frameRate : TIME_LAPSE_DEFAULT_FRAME_RATE;
     const encoderConfig = getVideoEncoderConfig(param, this.captureResolution);
     const saver = await TimeLapseSaver.create(
-        encoderConfig, this.captureResolution, TIME_LAPSE_INITIAL_SPEED);
+        encoderConfig, this.captureResolution, fps, TIME_LAPSE_INITIAL_SPEED);
     const video = this.video.video;
 
     // Handles time-lapse speed adjustment.
+    const maxFrames = TIME_LAPSE_MAX_DURATION * fps;
     let speed = TIME_LAPSE_INITIAL_SPEED;
-    let speedCheckpoint = speed * TIME_LAPSE_MAX_FRAMES;
+    let speedCheckpoint = speed * maxFrames;
     function updateSpeed() {
       speed = speed * 2;
-      speedCheckpoint = speed * TIME_LAPSE_MAX_FRAMES;
+      speedCheckpoint = speed * maxFrames;
       saver.updateSpeed(speed);
     }
 
@@ -901,8 +910,10 @@
     }
     assert(this.previewVideo !== null);
     assert(this.facing !== null);
+    const frameRate =
+        getFpsRangeFromConstraints(this.constraints.video.frameRate).minFps;
     return new Video(
         this.previewVideo, captureConstraints, this.captureResolution,
-        this.snapshotResolution, this.facing, this.handler);
+        this.snapshotResolution, this.facing, this.handler, frameRate);
   }
 }
diff --git a/ash/webui/camera_app_ui/resources/js/models/ffmpeg/video_processor_args.ts b/ash/webui/camera_app_ui/resources/js/models/ffmpeg/video_processor_args.ts
index 96377b3..812583a5 100644
--- a/ash/webui/camera_app_ui/resources/js/models/ffmpeg/video_processor_args.ts
+++ b/ash/webui/camera_app_ui/resources/js/models/ffmpeg/video_processor_args.ts
@@ -66,14 +66,14 @@
 /**
  * Creates the command line arguments to ffmpeg for time-lapse recording.
  */
-export function createTimeLapseArgs({width, height}: Resolution):
-    VideoProcessorArgs {
+export function createTimeLapseArgs(
+    {width, height}: Resolution, fps: number): VideoProcessorArgs {
   // clang-format off
   const decoderArgs = [
     // input format
     '-f', 'h264',
     // force input framerate
-    '-r', '30',
+    '-r', `${fps}`,
     // specify video size
     '-s', `${width}x${height}`,
   ];
diff --git a/ash/webui/camera_app_ui/resources/js/models/video_saver.ts b/ash/webui/camera_app_ui/resources/js/models/video_saver.ts
index a2a28f77..07d9922 100644
--- a/ash/webui/camera_app_ui/resources/js/models/video_saver.ts
+++ b/ash/webui/camera_app_ui/resources/js/models/video_saver.ts
@@ -58,10 +58,10 @@
  * Creates a VideoProcessor instance for recording time-lapse.
  */
 async function createTimeLapseProcessor(
-    output: AsyncWriter,
-    resolution: Resolution): Promise<Comlink.Remote<VideoProcessor>> {
+    output: AsyncWriter, resolution: Resolution,
+    fps: number): Promise<Comlink.Remote<VideoProcessor>> {
   return new (await FFMpegVideoProcessor)(
-      Comlink.proxy(output), createTimeLapseArgs(resolution));
+      Comlink.proxy(output), createTimeLapseArgs(resolution, fps));
 }
 
 /**
@@ -203,7 +203,8 @@
 
   constructor(
       encoderConfig: VideoEncoderConfig,
-      private readonly resolution: Resolution, initialSpeed: number) {
+      private readonly resolution: Resolution, private readonly fps: number,
+      initialSpeed: number) {
     this.speed = initialSpeed;
     this.encoder = new VideoEncoder({
       error: (error) => {
@@ -251,7 +252,8 @@
     // TODO(b/236800499): Optimize file writing mechanism to make it faster.
     const file = await createPrivateTempVideoFile();
     const writer = await file.getWriter();
-    const processor = await createTimeLapseProcessor(writer, this.resolution);
+    const processor =
+        await createTimeLapseProcessor(writer, this.resolution, this.fps);
 
     const filteredChunk =
         this.frames.filter(({frameNo}) => frameNo % this.speed === 0);
@@ -268,13 +270,13 @@
    * Creates video saver with encoder using provided |encoderConfig|.
    */
   static async create(
-      encoderConfig: VideoEncoderConfig, resolution: Resolution,
+      encoderConfig: VideoEncoderConfig, resolution: Resolution, fps: number,
       initialSpeed: number): Promise<TimeLapseSaver> {
     const encoderSupport = await VideoEncoder.isConfigSupported(encoderConfig);
     if (!encoderSupport.supported) {
       throw new Error('Video encoder is not supported.');
     }
 
-    return new TimeLapseSaver(encoderConfig, resolution, initialSpeed);
+    return new TimeLapseSaver(encoderConfig, resolution, fps, initialSpeed);
   }
 }
diff --git a/ash/webui/camera_app_ui/resources/js/util.ts b/ash/webui/camera_app_ui/resources/js/util.ts
index 3c9b153..a1ee443 100644
--- a/ash/webui/camera_app_ui/resources/js/util.ts
+++ b/ash/webui/camera_app_ui/resources/js/util.ts
@@ -9,7 +9,7 @@
 import * as loadTimeData from './models/load_time_data.js';
 import * as state from './state.js';
 import * as tooltip from './tooltip.js';
-import {AspectRatioSet, Facing, Resolution} from './type.js';
+import {AspectRatioSet, Facing, FpsRange, Resolution} from './type.js';
 
 /**
  * Creates a canvas element for 2D drawing.
@@ -445,3 +445,24 @@
     return [[k, v]];
   }));
 }
+
+/**
+ * Returns FPS range from media track constraints.
+ */
+export function getFpsRangeFromConstraints(frameRate: ConstrainDouble|
+                                           undefined): FpsRange {
+  let minFps = 0;
+  let maxFps = 0;
+  // For devices that don't support constant frame rate, we pass {0,0} and let
+  // VCD fall back to the default range.
+  if (frameRate) {
+    if (typeof frameRate === 'number') {
+      minFps = frameRate;
+      maxFps = frameRate;
+    } else if (frameRate.exact) {
+      minFps = frameRate.exact;
+      maxFps = frameRate.exact;
+    }
+  }
+  return {minFps, maxFps};
+}
diff --git a/ash/webui/eche_app_ui/eche_stream_status_change_handler_unittest.cc b/ash/webui/eche_app_ui/eche_stream_status_change_handler_unittest.cc
index 923b761..d28813e9 100644
--- a/ash/webui/eche_app_ui/eche_stream_status_change_handler_unittest.cc
+++ b/ash/webui/eche_app_ui/eche_stream_status_change_handler_unittest.cc
@@ -103,9 +103,9 @@
 
   void TearDown() override {
     apps_launch_info_provider_.reset();
-    connection_status_handler_.reset();
     handler_->RemoveObserver(&fake_observer_);
     handler_.reset();
+    connection_status_handler_.reset();
   }
 
   void StartStreaming() { handler_->StartStreaming(); }
diff --git a/ash/webui/eche_app_ui/eche_tray_stream_status_observer_unittest.cc b/ash/webui/eche_app_ui/eche_tray_stream_status_observer_unittest.cc
index 1e077df..3132be8 100644
--- a/ash/webui/eche_app_ui/eche_tray_stream_status_observer_unittest.cc
+++ b/ash/webui/eche_app_ui/eche_tray_stream_status_observer_unittest.cc
@@ -76,8 +76,8 @@
   void TearDown() override {
     observer_.reset();
     apps_launch_info_provider_.reset();
-    connection_status_handler_.reset();
     stream_status_change_handler_.reset();
+    connection_status_handler_.reset();
     AshTestBase::TearDown();
   }
 
diff --git a/base/guid.cc b/base/guid.cc
index 548a40d4..a65b3ce5e 100644
--- a/base/guid.cc
+++ b/base/guid.cc
@@ -67,22 +67,10 @@
   return !GetCanonicalGUIDInternal(input, /*strict=*/false).empty();
 }
 
-bool IsValidGUID(StringPiece16 input) {
-  return !GetCanonicalGUIDInternal(input, /*strict=*/false).empty();
-}
-
 bool IsValidGUIDOutputString(StringPiece input) {
   return !GetCanonicalGUIDInternal(input, /*strict=*/true).empty();
 }
 
-std::string RandomDataToGUIDString(const uint64_t bytes[2]) {
-  return StringPrintf(
-      "%08x-%04x-%04x-%04x-%012llx", static_cast<uint32_t>(bytes[0] >> 32),
-      static_cast<uint32_t>((bytes[0] >> 16) & 0x0000ffff),
-      static_cast<uint32_t>(bytes[0] & 0x0000ffff),
-      static_cast<uint32_t>(bytes[1] >> 48), bytes[1] & 0x0000ffff'ffffffffULL);
-}
-
 // static
 GUID GUID::GenerateRandomV4() {
   uint8_t sixteen_bytes[kGuidV4InputLength];
@@ -125,7 +113,13 @@
   sixteen_bytes[1] |= 0x80000000'00000000ULL;
 
   GUID guid;
-  guid.lowercase_ = RandomDataToGUIDString(sixteen_bytes);
+  guid.lowercase_ =
+      StringPrintf("%08x-%04x-%04x-%04x-%012llx",
+                   static_cast<uint32_t>(sixteen_bytes[0] >> 32),
+                   static_cast<uint32_t>((sixteen_bytes[0] >> 16) & 0x0000ffff),
+                   static_cast<uint32_t>(sixteen_bytes[0] & 0x0000ffff),
+                   static_cast<uint32_t>(sixteen_bytes[1] >> 48),
+                   sixteen_bytes[1] & 0x0000ffff'ffffffffULL);
   return guid;
 }
 
diff --git a/base/guid.h b/base/guid.h
index 0e0b367..061810d 100644
--- a/base/guid.h
+++ b/base/guid.h
@@ -23,19 +23,17 @@
 
 namespace base {
 
-// DEPRECATED, use GUID::GenerateRandomV4() instead.
+// DEPRECATED(crbug.com/1195446): Use GUID::GenerateRandomV4() instead.
 BASE_EXPORT std::string GenerateGUID();
 
-// DEPRECATED, use GUID::ParseCaseInsensitive() and GUID::is_valid() instead.
+// DEPRECATED(crbug.com/1195446): Use GUID::ParseCaseInsensitive() and
+// GUID::is_valid() instead.
 BASE_EXPORT bool IsValidGUID(StringPiece input);
-BASE_EXPORT bool IsValidGUID(StringPiece16 input);
 
-// DEPRECATED, use GUID::ParseLowercase() and GUID::is_valid() instead.
+// DEPRECATED(crbug.com/1195446): Use GUID::ParseLowercase() and
+// GUID::is_valid() instead.
 BASE_EXPORT bool IsValidGUIDOutputString(StringPiece input);
 
-// For unit testing purposes only.  Do not use outside of tests.
-BASE_EXPORT std::string RandomDataToGUIDString(const uint64_t bytes[2]);
-
 class BASE_EXPORT GUID {
  public:
   // Length in bytes of the input required to format the input as a GUID in the
diff --git a/base/guid_unittest.cc b/base/guid_unittest.cc
index bf0ff60..e83cf9a3 100644
--- a/base/guid_unittest.cc
+++ b/base/guid_unittest.cc
@@ -16,19 +16,6 @@
 
 namespace base {
 
-TEST(GUIDTest, GUIDGeneratesAllZeroes) {
-  static constexpr uint64_t kBytes[] = {0, 0};
-  const std::string clientid = RandomDataToGUIDString(kBytes);
-  EXPECT_EQ("00000000-0000-0000-0000-000000000000", clientid);
-}
-
-TEST(GUIDTest, GUIDGeneratesCorrectly) {
-  static constexpr uint64_t kBytes[] = {0x0123456789ABCDEFULL,
-                                        0xFEDCBA9876543210ULL};
-  const std::string clientid = RandomDataToGUIDString(kBytes);
-  EXPECT_EQ("01234567-89ab-cdef-fedc-ba9876543210", clientid);
-}
-
 TEST(GUIDTest, DeprecatedGUIDCorrectlyFormatted) {
   constexpr int kIterations = 10;
   for (int i = 0; i < kIterations; ++i) {
@@ -128,20 +115,17 @@
   }
 }
 
-TEST(GUIDTest, Equality) {
-  static constexpr uint64_t kBytes[] = {0xDEADBEEFDEADBEEFULL,
-                                        0xDEADBEEFDEADBEEFULL};
-  const std::string clientid = RandomDataToGUIDString(kBytes);
+TEST(GUIDTest, EqualityAndRoundTrip) {
+  static constexpr char kCanonicalStr[] =
+      "deadbeef-dead-4eef-bead-beefdeadbeef";
 
-  static constexpr char kExpectedCanonicalStr[] =
-      "deadbeef-dead-beef-dead-beefdeadbeef";
-  ASSERT_EQ(kExpectedCanonicalStr, clientid);
+  const GUID from_lower =
+      GUID::ParseCaseInsensitive(ToLowerASCII(kCanonicalStr));
+  EXPECT_EQ(kCanonicalStr, from_lower.AsLowercaseString());
 
-  const GUID from_lower = GUID::ParseCaseInsensitive(ToLowerASCII(clientid));
-  EXPECT_EQ(kExpectedCanonicalStr, from_lower.AsLowercaseString());
-
-  const GUID from_upper = GUID::ParseCaseInsensitive(ToUpperASCII(clientid));
-  EXPECT_EQ(kExpectedCanonicalStr, from_upper.AsLowercaseString());
+  const GUID from_upper =
+      GUID::ParseCaseInsensitive(ToUpperASCII(kCanonicalStr));
+  EXPECT_EQ(kCanonicalStr, from_upper.AsLowercaseString());
 
   EXPECT_EQ(from_lower, from_upper);
 
diff --git a/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc b/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
index 2790909..b4062d79 100644
--- a/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
+++ b/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
@@ -58,6 +58,12 @@
              "UseLessHighResTimers",
              base::FEATURE_DISABLED_BY_DEFAULT);
 std::atomic_bool g_use_less_high_res_timers = false;
+
+// If enabled, high resolution timer will be used all the time on Windows. This
+// is for test only.
+BASE_FEATURE(kAlwaysUseHighResTimers,
+             "AlwaysUseHighResTimers",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 #endif
 
 std::atomic_bool g_align_wake_ups = false;
@@ -94,6 +100,9 @@
       FeatureList::IsEnabled(kExplicitHighResolutionTimerWin);
   g_use_less_high_res_timers.store(
       FeatureList::IsEnabled(kUseLessHighResTimers), std::memory_order_relaxed);
+  if (FeatureList::IsEnabled(kAlwaysUseHighResTimers)) {
+    Time::ActivateHighResolutionTimer(true);
+  }
 #endif
 }
 
diff --git a/base/values.cc b/base/values.cc
index 51547f0..bab5ccec 100644
--- a/base/values.cc
+++ b/base/values.cc
@@ -1285,10 +1285,6 @@
   return GetDict().SetByDottedPath(path, std::move(value));
 }
 
-Value* Value::SetIntPath(StringPiece path, int value) {
-  return GetDict().SetByDottedPath(path, value);
-}
-
 Value* Value::SetDoublePath(StringPiece path, double value) {
   return GetDict().SetByDottedPath(path, value);
 }
diff --git a/base/values.h b/base/values.h
index acedbb0..aa7c2d43 100644
--- a/base/values.h
+++ b/base/values.h
@@ -874,8 +874,6 @@
   // SetPath(...) call.
   //
   // DEPRECATED: Use `Value::Dict::SetByDottedPath()`.
-  Value* SetIntPath(StringPiece path, int value);
-  // DEPRECATED: Use `Value::Dict::SetByDottedPath()`.
   Value* SetDoublePath(StringPiece path, double value);
   // DEPRECATED: Use `Value::Dict::SetByDottedPath()`.
   Value* SetStringPath(StringPiece path, StringPiece value);
diff --git a/base/values_unittest.cc b/base/values_unittest.cc
index 8269d40..f2ae442d 100644
--- a/base/values_unittest.cc
+++ b/base/values_unittest.cc
@@ -1155,6 +1155,26 @@
   EXPECT_FALSE(found);
 }
 
+TEST(ValuesTest, SetBoolPath) {
+  Value::Dict root;
+  Value* inserted = root.SetByDottedPath("foo.bar", true);
+  Value* found = root.FindByDottedPath("foo.bar");
+  ASSERT_TRUE(found);
+  EXPECT_EQ(inserted, found);
+  ASSERT_TRUE(found->is_bool());
+  EXPECT_TRUE(found->GetBool());
+
+  // Overwrite with a different value.
+  root.SetByDottedPath("foo.bar", false);
+  found = root.FindByDottedPath("foo.bar");
+  ASSERT_TRUE(found);
+  ASSERT_TRUE(found->is_bool());
+  EXPECT_FALSE(found->GetBool());
+
+  // Can't change existing non-dictionary keys.
+  ASSERT_FALSE(root.SetByDottedPath("foo.bar.zoo", true));
+}
+
 TEST(ValuesTest, SetIntPath) {
   Value::Dict root;
   Value* inserted = root.SetByDottedPath("foo.bar", 123);
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index 51c0d0f..c044d2f 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-12.20230323.3.1
+12.20230324.0.1
diff --git a/cc/animation/animation_host.h b/cc/animation/animation_host.h
index 1f5f2e4..6da1f7b 100644
--- a/cc/animation/animation_host.h
+++ b/cc/animation/animation_host.h
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/memory/raw_ptr.h"
+#include "base/memory/raw_ptr_exclusion.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
@@ -266,7 +267,9 @@
   raw_ptr<MutatorHostClient> mutator_host_client_ = nullptr;
 
   // This is only non-null within the call scope of PushPropertiesTo().
-  const PropertyTrees* property_trees_ = nullptr;
+  // This field is not a raw_ptr<> because it was filtered by the rewriter for:
+  // #addr-of
+  RAW_PTR_EXCLUSION const PropertyTrees* property_trees_ = nullptr;
 
   // Exactly one of scroll_offset_animations_ and scroll_offset_animations_impl_
   // will be non-null for a given AnimationHost instance (the former if
diff --git a/cc/paint/decode_stashing_image_provider.h b/cc/paint/decode_stashing_image_provider.h
index db52dc3..a9b8cb28 100644
--- a/cc/paint/decode_stashing_image_provider.h
+++ b/cc/paint/decode_stashing_image_provider.h
@@ -6,6 +6,7 @@
 #define CC_PAINT_DECODE_STASHING_IMAGE_PROVIDER_H_
 
 #include "base/containers/stack_container.h"
+#include "base/memory/raw_ptr_exclusion.h"
 #include "cc/paint/image_provider.h"
 #include "cc/paint/paint_export.h"
 
@@ -32,7 +33,9 @@
   void Reset();
 
  private:
-  ImageProvider* source_provider_;
+  // This field is not a raw_ptr<> because it was filtered by the rewriter for:
+  // #union
+  RAW_PTR_EXCLUSION ImageProvider* source_provider_;
   base::StackVector<ScopedResult, 1> decoded_images_;
 };
 
diff --git a/cc/paint/paint_canvas.h b/cc/paint/paint_canvas.h
index 1b2e032..4628455 100644
--- a/cc/paint/paint_canvas.h
+++ b/cc/paint/paint_canvas.h
@@ -7,6 +7,7 @@
 
 #include "base/compiler_specific.h"
 #include "base/memory/raw_ptr.h"
+#include "base/memory/raw_ptr_exclusion.h"
 #include "base/memory/ref_counted.h"
 #include "build/build_config.h"
 #include "cc/paint/node_id.h"
@@ -236,8 +237,12 @@
   virtual void setNodeId(int) = 0;
 
  private:
-  printing::MetafileSkia* metafile_ = nullptr;
-  paint_preview::PaintPreviewTracker* tracker_ = nullptr;
+  // This field is not a raw_ptr<> because it was filtered by the rewriter for:
+  // #constexpr-ctor-field-initializer
+  RAW_PTR_EXCLUSION printing::MetafileSkia* metafile_ = nullptr;
+  // This field is not a raw_ptr<> because it was filtered by the rewriter for:
+  // #constexpr-ctor-field-initializer
+  RAW_PTR_EXCLUSION paint_preview::PaintPreviewTracker* tracker_ = nullptr;
 };
 
 class CC_PAINT_EXPORT PaintCanvasAutoRestore {
diff --git a/cc/paint/scoped_raster_flags.h b/cc/paint/scoped_raster_flags.h
index 4825405d..33441c2a 100644
--- a/cc/paint/scoped_raster_flags.h
+++ b/cc/paint/scoped_raster_flags.h
@@ -6,6 +6,7 @@
 #define CC_PAINT_SCOPED_RASTER_FLAGS_H_
 
 #include "base/containers/stack_container.h"
+#include "base/memory/raw_ptr_exclusion.h"
 #include "cc/paint/decode_stashing_image_provider.h"
 #include "cc/paint/paint_export.h"
 #include "cc/paint/paint_flags.h"
@@ -74,7 +75,9 @@
     return &*modified_flags_;
   }
 
-  const PaintFlags* original_flags_;
+  // This field is not a raw_ptr<> because it was filtered by the rewriter for:
+  // #union
+  RAW_PTR_EXCLUSION const PaintFlags* original_flags_;
   absl::optional<PaintFlags> modified_flags_;
   absl::optional<DecodeStashingImageProvider> decode_stashing_image_provider_;
   bool decode_failed_ = false;
diff --git a/cc/paint/skia_paint_canvas.h b/cc/paint/skia_paint_canvas.h
index 263b8976..dac9b33 100644
--- a/cc/paint/skia_paint_canvas.h
+++ b/cc/paint/skia_paint_canvas.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/compiler_specific.h"
+#include "base/memory/raw_ptr_exclusion.h"
 #include "build/build_config.h"
 #include "cc/paint/paint_canvas.h"
 #include "cc/paint/paint_flags.h"
@@ -175,10 +176,14 @@
 
   int GetMaxTextureSize() const;
 
-  SkCanvas* canvas_;
+  // This field is not a raw_ptr<> because it was filtered by the rewriter for:
+  // #union
+  RAW_PTR_EXCLUSION SkCanvas* canvas_;
   SkBitmap bitmap_;
   std::unique_ptr<SkCanvas> owned_;
-  ImageProvider* image_provider_ = nullptr;
+  // This field is not a raw_ptr<> because it was filtered by the rewriter for:
+  // #union
+  RAW_PTR_EXCLUSION ImageProvider* image_provider_ = nullptr;
 
   const ContextFlushes context_flushes_;
   int num_of_ops_ = 0;
diff --git a/cc/raster/playback_image_provider.h b/cc/raster/playback_image_provider.h
index e36406e..84c7cb1e 100644
--- a/cc/raster/playback_image_provider.h
+++ b/cc/raster/playback_image_provider.h
@@ -6,6 +6,7 @@
 #define CC_RASTER_PLAYBACK_IMAGE_PROVIDER_H_
 
 #include "base/containers/flat_map.h"
+#include "base/memory/raw_ptr_exclusion.h"
 #include "cc/cc_export.h"
 #include "cc/paint/image_id.h"
 #include "cc/paint/image_provider.h"
@@ -56,7 +57,9 @@
       const DrawImage& draw_image) override;
 
  private:
-  ImageDecodeCache* cache_;
+  // This field is not a raw_ptr<> because it was filtered by the rewriter for:
+  // #union
+  RAW_PTR_EXCLUSION ImageDecodeCache* cache_;
   TargetColorParams target_color_params_;
   absl::optional<Settings> settings_;
 };
diff --git a/cc/raster/scoped_grcontext_access.h b/cc/raster/scoped_grcontext_access.h
index 654a632c..115099b 100644
--- a/cc/raster/scoped_grcontext_access.h
+++ b/cc/raster/scoped_grcontext_access.h
@@ -5,6 +5,7 @@
 #ifndef CC_RASTER_SCOPED_GRCONTEXT_ACCESS_H_
 #define CC_RASTER_SCOPED_GRCONTEXT_ACCESS_H_
 
+#include "base/memory/raw_ptr_exclusion.h"
 #include "components/viz/common/gpu/raster_context_provider.h"
 #include "gpu/command_buffer/client/raster_interface.h"
 
@@ -23,7 +24,9 @@
   }
 
  private:
-  viz::RasterContextProvider* context_provider_;
+  // This field is not a raw_ptr<> because it was filtered by the rewriter for:
+  // #union
+  RAW_PTR_EXCLUSION viz::RasterContextProvider* context_provider_;
 };
 
 #endif  // CC_RASTER_SCOPED_GRCONTEXT_ACCESS_H_
diff --git a/cc/test/render_pass_test_utils.h b/cc/test/render_pass_test_utils.h
index e5bd02c..d850bb2 100644
--- a/cc/test/render_pass_test_utils.h
+++ b/cc/test/render_pass_test_utils.h
@@ -68,18 +68,26 @@
 
 // Adds a solid quad to a given render pass.
 template <typename RenderPassType>
-inline viz::SolidColorDrawQuad* AddQuad(RenderPassType* pass,
-                                        const gfx::Rect& rect,
-                                        SkColor4f color) {
+inline viz::SolidColorDrawQuad* AddTransparentQuad(RenderPassType* pass,
+                                                   const gfx::Rect& rect,
+                                                   SkColor4f color,
+                                                   float opacity) {
   viz::SharedQuadState* shared_state = pass->CreateAndAppendSharedQuadState();
   shared_state->SetAll(gfx::Transform(), rect, rect, gfx::MaskFilterInfo(),
-                       absl::nullopt, false, 1, SkBlendMode::kSrcOver, 0);
+                       absl::nullopt, false, opacity, SkBlendMode::kSrcOver, 0);
   auto* quad =
       pass->template CreateAndAppendDrawQuad<viz::SolidColorDrawQuad>();
   quad->SetNew(shared_state, rect, rect, color, false);
   return quad;
 }
 
+template <typename RenderPassType>
+inline viz::SolidColorDrawQuad* AddQuad(RenderPassType* pass,
+                                        const gfx::Rect& rect,
+                                        SkColor4f color) {
+  return AddTransparentQuad(pass, rect, color, 1.0);
+}
+
 // Adds a solid quad to a given render pass and sets is_clipped=true.
 viz::SolidColorDrawQuad* AddClippedQuad(viz::AggregatedRenderPass* pass,
                                         const gfx::Rect& rect,
diff --git a/cc/tiles/picture_layer_tiling.h b/cc/tiles/picture_layer_tiling.h
index d6f7da4..cb0b735 100644
--- a/cc/tiles/picture_layer_tiling.h
+++ b/cc/tiles/picture_layer_tiling.h
@@ -16,6 +16,7 @@
 #include <vector>
 
 #include "base/memory/raw_ptr.h"
+#include "base/memory/raw_ptr_exclusion.h"
 #include "cc/base/region.h"
 #include "cc/base/tiling_data.h"
 #include "cc/cc_export.h"
@@ -250,7 +251,9 @@
     bool AtEnd() const;
 
    private:
-    PictureLayerTiling* tiling_;
+    // This field is not a raw_ptr<> because it was filtered by the rewriter
+    // for: #union
+    RAW_PTR_EXCLUSION PictureLayerTiling* tiling_;
     PictureLayerTiling::TileMap::iterator iter_;
   };
 
diff --git a/cc/tiles/prioritized_tile.h b/cc/tiles/prioritized_tile.h
index b299802..0af3ffa0 100644
--- a/cc/tiles/prioritized_tile.h
+++ b/cc/tiles/prioritized_tile.h
@@ -5,6 +5,7 @@
 #ifndef CC_TILES_PRIORITIZED_TILE_H_
 #define CC_TILES_PRIORITIZED_TILE_H_
 
+#include "base/memory/raw_ptr_exclusion.h"
 #include "cc/cc_export.h"
 #include "cc/paint/paint_worklet_input.h"
 #include "cc/raster/raster_source.h"
@@ -50,8 +51,12 @@
   const PictureLayerTiling* source_tiling() const { return source_tiling_; }
 
  private:
-  Tile* tile_ = nullptr;
-  const PictureLayerTiling* source_tiling_ = nullptr;
+  // This field is not a raw_ptr<> because it was filtered by the rewriter for:
+  // #union
+  RAW_PTR_EXCLUSION Tile* tile_ = nullptr;
+  // This field is not a raw_ptr<> because it was filtered by the rewriter for:
+  // #union
+  RAW_PTR_EXCLUSION const PictureLayerTiling* source_tiling_ = nullptr;
   TilePriority priority_;
   bool is_occluded_ = false;
   bool is_process_for_images_only_ = false;
diff --git a/chrome/MAJOR_BRANCH_DATE b/chrome/MAJOR_BRANCH_DATE
index 0735fd7e..0f3b31e 100644
--- a/chrome/MAJOR_BRANCH_DATE
+++ b/chrome/MAJOR_BRANCH_DATE
@@ -1 +1 @@
-MAJOR_BRANCH_DATE=2023-02-24
+MAJOR_BRANCH_DATE=2023-03-24
diff --git a/chrome/VERSION b/chrome/VERSION
index b279ce0..2887bf0 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
-MAJOR=113
+MAJOR=114
 MINOR=0
-BUILD=5672
+BUILD=5673
 PATCH=0
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartFeedTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartFeedTest.java
index 11938a3c..0f1be1c 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartFeedTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartFeedTest.java
@@ -43,7 +43,6 @@
 import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.CriteriaHelper;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.JniMocker;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
index 44ec01a..f5f5c159 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
@@ -50,6 +50,7 @@
 import org.chromium.components.messages.PrimaryActionClickBehavior;
 import org.chromium.components.profile_metrics.BrowserProfileType;
 import org.chromium.components.ukm.UkmRecorder;
+import org.chromium.components.variations.SyntheticTrialAnnotationMode;
 import org.chromium.content_public.browser.ContentFeatureList;
 import org.chromium.ui.display.DisplayAndroid;
 import org.chromium.ui.display.DisplayAndroidManager;
@@ -916,15 +917,16 @@
                 : GLOBAL_DEFAULTS_ENABLED_COHORT_NAME + cohortId;
 
         if (!isControlGroup && !ChromeFeatureList.isEnabled(syntheticFeatureName)) {
-            UmaSessionStats.registerSyntheticFieldTrial(
-                    syntheticFeatureName, baseGroupName + ENABLED_GROUP_SUFFIX);
+            UmaSessionStats.registerSyntheticFieldTrial(syntheticFeatureName,
+                    baseGroupName + ENABLED_GROUP_SUFFIX, SyntheticTrialAnnotationMode.CURRENT_LOG);
         } else if (isControlGroup && !ChromeFeatureList.isEnabled(syntheticFeatureName)) {
-            UmaSessionStats.registerSyntheticFieldTrial(
-                    syntheticFeatureName, baseGroupName + CONTROL_GROUP_SUFFIX);
+            UmaSessionStats.registerSyntheticFieldTrial(syntheticFeatureName,
+                    baseGroupName + CONTROL_GROUP_SUFFIX, SyntheticTrialAnnotationMode.CURRENT_LOG);
         }
 
         String syntheticFeatureNameForUma = GLOBAL_DEFAULTS_COHORT_NAME + cohortId;
-        UmaSessionStats.registerSyntheticFieldTrial(syntheticFeatureNameForUma, baseGroupName);
+        UmaSessionStats.registerSyntheticFieldTrial(syntheticFeatureNameForUma, baseGroupName,
+                SyntheticTrialAnnotationMode.CURRENT_LOG);
     }
 
     private static void maybeRegisterSyntheticFieldTrials(
@@ -944,11 +946,11 @@
         }
 
         if (!isControlGroup && !ChromeFeatureList.isEnabled(syntheticFeatureName)) {
-            UmaSessionStats.registerSyntheticFieldTrial(
-                    syntheticFeatureName, baseGroupName + ENABLED_GROUP_SUFFIX);
+            UmaSessionStats.registerSyntheticFieldTrial(syntheticFeatureName,
+                    baseGroupName + ENABLED_GROUP_SUFFIX, SyntheticTrialAnnotationMode.CURRENT_LOG);
         } else if (isControlGroup && !ChromeFeatureList.isEnabled(syntheticFeatureName)) {
-            UmaSessionStats.registerSyntheticFieldTrial(
-                    syntheticFeatureName, baseGroupName + CONTROL_GROUP_SUFFIX);
+            UmaSessionStats.registerSyntheticFieldTrial(syntheticFeatureName,
+                    baseGroupName + CONTROL_GROUP_SUFFIX, SyntheticTrialAnnotationMode.CURRENT_LOG);
         }
     }
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tab/RequestDesktopUtilsUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tab/RequestDesktopUtilsUnitTest.java
index e6dc132..68575af7 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/tab/RequestDesktopUtilsUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/RequestDesktopUtilsUnitTest.java
@@ -156,7 +156,8 @@
         }
 
         @Implementation
-        public static void registerSyntheticFieldTrial(String trialName, String groupName) {
+        public static void registerSyntheticFieldTrial(
+                String trialName, String groupName, int annotationMode) {
             sGlobalDefaultsExperimentTrialName = trialName;
             sGlobalDefaultsExperimentGroupName = groupName;
         }
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 00d20eb..1923bea 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -620,7 +620,7 @@
             Open link in new <ph name="APP">$1<ex>Gmail App</ex> window</ph>
           </message>
           <message name="IDS_CONTENT_CONTEXT_OPENLINKWEBAPP_NEWTAB" desc="The name of the command to open a link in a new tab of the same app the user is currently in">
-            Open link in new <ph name="APP">$1<ex>Gmail App</ex> tab</ph>
+            Open link in new <ph name="APP">$1<ex>Gmail App</ex></ph> tab
           </message>
 
           <message name="IDS_CONTENT_CONTEXT_SAVELINKAS" desc="The name of the Save Link As command in the content area context menu">
@@ -889,7 +889,7 @@
             Open Link in new <ph name="APP">$1<ex>Gmail App</ex></ph> Window
           </message>
           <message name="IDS_CONTENT_CONTEXT_OPENLINKWEBAPP_NEWTAB" desc="In Title Case: The name of the command to open a link in a new tab of the same app the user is currently in">
-            Open Link in new <ph name="APP">$1<ex>Gmail App</ex> Tab</ph>
+            Open Link in new <ph name="APP">$1<ex>Gmail App</ex></ph> Tab
           </message>
 
           <message name="IDS_CONTENT_CONTEXT_SAVELINKAS" desc="In Title Case: The name of the Save Link As command in the content area context menu">
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 4732c84..7d60bc0 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -7338,6 +7338,10 @@
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
+    {"exo-consumed-by-ime-by-flag",
+     flag_descriptions::kExoConsumedByImeByFlagName,
+     flag_descriptions::kExoConsumedByImeByFlagDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(ash::features::kExoConsumedByImeByFlag)},
     {"exo-gamepad-vibration", flag_descriptions::kExoGamepadVibrationName,
      flag_descriptions::kExoGamepadVibrationDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kGamepadVibration)},
@@ -9840,6 +9844,15 @@
      kOsDesktop, FEATURE_VALUE_TYPE(::features::kGetTheMostOutOfProgram)},
 #endif
 
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID)
+    {"autofill-enable-payments-mandatory-reauth",
+     flag_descriptions::kAutofillEnablePaymentsMandatoryReauthName,
+     flag_descriptions::kAutofillEnablePaymentsMandatoryReauthDescription,
+     kOsMac | kOsWin | kOsAndroid,
+     FEATURE_VALUE_TYPE(
+         autofill::features::kAutofillEnablePaymentsMandatoryReauth)},
+#endif  // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID)
+
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
     // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/apps/app_service/promise_apps/promise_app_registry_cache.cc b/chrome/browser/apps/app_service/promise_apps/promise_app_registry_cache.cc
index 77c1f11..e626fced7 100644
--- a/chrome/browser/apps/app_service/promise_apps/promise_app_registry_cache.cc
+++ b/chrome/browser/apps/app_service/promise_apps/promise_app_registry_cache.cc
@@ -37,7 +37,16 @@
   update_in_progress_ = false;
 }
 
-const PromiseApp* PromiseAppRegistryCache::GetPromiseApp(
+// Retrieve a copy of all the registered promise apps.
+std::vector<PromiseAppPtr> PromiseAppRegistryCache::GetAllPromiseApps() const {
+  std::vector<PromiseAppPtr> promise_apps;
+  for (const auto& promise_pair : promise_app_map_) {
+    promise_apps.push_back(promise_pair.second.get()->Clone());
+  }
+  return promise_apps;
+}
+
+const PromiseApp* PromiseAppRegistryCache::GetPromiseAppForTesting(
     const PackageId& package_id) const {
   return FindPromiseApp(package_id);
 }
diff --git a/chrome/browser/apps/app_service/promise_apps/promise_app_registry_cache.h b/chrome/browser/apps/app_service/promise_apps/promise_app_registry_cache.h
index 7967908..76addc9 100644
--- a/chrome/browser/apps/app_service/promise_apps/promise_app_registry_cache.h
+++ b/chrome/browser/apps/app_service/promise_apps/promise_app_registry_cache.h
@@ -32,10 +32,13 @@
   // promise app with a matching package_id, then create a new promise app.
   void OnPromiseApp(PromiseAppPtr delta);
 
-  // Retrieve the registered promise app with the specified package_id. Returns
-  // nullptr if the promise app does not exist. This is the public read-only
-  // version of FindPromiseApp.
-  const PromiseApp* GetPromiseApp(const PackageId& package_id) const;
+  // Retrieve a copy of all the registered promise apps.
+  std::vector<PromiseAppPtr> GetAllPromiseApps() const;
+
+  // For testing only. Retrieve a read-only pointer to the promise app with the
+  // specified package_id. Returns nullptr if the promise app does not exist. Do
+  // not store the pointer as the promise app may be destroyed at any time.
+  const PromiseApp* GetPromiseAppForTesting(const PackageId& package_id) const;
 
  private:
   friend class PromiseAppRegistryCacheTest;
diff --git a/chrome/browser/apps/app_service/promise_apps/promise_app_registry_cache_unittest.cc b/chrome/browser/apps/app_service/promise_apps/promise_app_registry_cache_unittest.cc
index 5ac0e0c..8dad568b 100644
--- a/chrome/browser/apps/app_service/promise_apps/promise_app_registry_cache_unittest.cc
+++ b/chrome/browser/apps/app_service/promise_apps/promise_app_registry_cache_unittest.cc
@@ -3,8 +3,13 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/apps/app_service/promise_apps/promise_app_registry_cache.h"
+
+#include <sstream>
+
 #include "chrome/browser/apps/app_service/package_id.h"
 #include "chrome/browser/apps/app_service/promise_apps/promise_apps.h"
+#include "components/services/app_service/public/cpp/app_types.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace apps {
@@ -42,7 +47,8 @@
   // Register a promise app with no installation progress value.
   auto promise_app = std::make_unique<PromiseApp>(package_id);
   cache().OnPromiseApp(std::move(promise_app));
-  EXPECT_FALSE(cache().GetPromiseApp(package_id)->progress.has_value());
+  EXPECT_FALSE(
+      cache().GetPromiseAppForTesting(package_id)->progress.has_value());
   EXPECT_EQ(CountPromiseAppsRegistered(), 1);
 
   // Update the progress value for the correct app and confirm the progress
@@ -50,17 +56,39 @@
   auto promise_delta = std::make_unique<PromiseApp>(package_id);
   promise_delta->progress = progress_initial;
   cache().OnPromiseApp(std::move(promise_delta));
-  EXPECT_EQ(cache().GetPromiseApp(package_id)->progress, progress_initial);
+  EXPECT_EQ(cache().GetPromiseAppForTesting(package_id)->progress,
+            progress_initial);
 
   // Update the progress value again and check if it is the correct value.
   auto promise_delta_next = std::make_unique<PromiseApp>(package_id);
   promise_delta_next->progress = progress_next;
   cache().OnPromiseApp(std::move(promise_delta_next));
-  EXPECT_EQ(cache().GetPromiseApp(package_id)->progress, progress_next);
+  EXPECT_EQ(cache().GetPromiseAppForTesting(package_id)->progress,
+            progress_next);
 
   // All these changes should have applied to the same promise app instead
   // of creating new ones.
   EXPECT_EQ(CountPromiseAppsRegistered(), 1);
 }
 
+TEST_F(PromiseAppRegistryCacheTest, GetAllPromiseApps) {
+  // There should be no promise apps registered yet.
+  EXPECT_EQ(cache().GetAllPromiseApps().size(), 0u);
+
+  // Register some promise apps.
+  auto package_id_1 = PackageId(AppType::kArc, "test1");
+  auto promise_app_1 = std::make_unique<PromiseApp>(package_id_1);
+  cache().OnPromiseApp(std::move(promise_app_1));
+
+  auto package_id_2 = PackageId(AppType::kArc, "test2");
+  auto promise_app_2 = std::make_unique<PromiseApp>(package_id_2);
+  cache().OnPromiseApp(std::move(promise_app_2));
+
+  // Check that all the promise apps are being retrieved.
+  auto promise_app_list = cache().GetAllPromiseApps();
+  EXPECT_EQ(promise_app_list.size(), 2u);
+  EXPECT_EQ(promise_app_list[0]->package_id, package_id_1);
+  EXPECT_EQ(promise_app_list[1]->package_id, package_id_2);
+}
+
 }  // namespace apps
diff --git a/chrome/browser/apps/app_service/promise_apps/promise_apps.cc b/chrome/browser/apps/app_service/promise_apps/promise_apps.cc
index 8406dc0..8a63fe9 100644
--- a/chrome/browser/apps/app_service/promise_apps/promise_apps.cc
+++ b/chrome/browser/apps/app_service/promise_apps/promise_apps.cc
@@ -3,6 +3,9 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/apps/app_service/promise_apps/promise_apps.h"
+
+#include <iostream>
+
 #include "components/services/app_service/public/cpp/macros.h"
 
 namespace apps {
@@ -18,4 +21,15 @@
   return promise_app;
 }
 
+std::ostream& operator<<(std::ostream& out, const PromiseApp& promise_app) {
+  out << "Package_id: " << promise_app.package_id.ToString() << std::endl;
+  if (promise_app.progress.has_value()) {
+    out << "- Progress: " << promise_app.progress.value() << std::endl;
+  } else {
+    out << "- Progress: N/A" << std::endl;
+  }
+  out << "- Status: " << EnumToString(promise_app.status) << std::endl;
+  return out;
+}
+
 }  // namespace apps
diff --git a/chrome/browser/apps/app_service/promise_apps/promise_apps.h b/chrome/browser/apps/app_service/promise_apps/promise_apps.h
index 23cf3b1f5..f39f58d 100644
--- a/chrome/browser/apps/app_service/promise_apps/promise_apps.h
+++ b/chrome/browser/apps/app_service/promise_apps/promise_apps.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_APPS_APP_SERVICE_PROMISE_APPS_PROMISE_APPS_H_
 #define CHROME_BROWSER_APPS_APP_SERVICE_PROMISE_APPS_PROMISE_APPS_H_
 
+#include <ostream>
+
 #include "chrome/browser/apps/app_service/package_id.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -35,6 +37,8 @@
   std::unique_ptr<PromiseApp> Clone() const;
 };
 
+std::ostream& operator<<(std::ostream& out, const PromiseApp& promise_app);
+
 using PromiseAppPtr = std::unique_ptr<PromiseApp>;
 
 }  // namespace apps
diff --git a/chrome/browser/apps/app_service/publishers/arc_apps_unittest.cc b/chrome/browser/apps/app_service/publishers/arc_apps_unittest.cc
index 9df57dd..626b639 100644
--- a/chrome/browser/apps/app_service/publishers/arc_apps_unittest.cc
+++ b/chrome/browser/apps/app_service/publishers/arc_apps_unittest.cc
@@ -535,13 +535,15 @@
 
   // Verify that the promise app is not yet registered.
   const apps::PromiseApp* promise_app_before =
-      app_service_proxy()->PromiseAppRegistryCache().GetPromiseApp(package_id);
+      app_service_proxy()->PromiseAppRegistryCache().GetPromiseAppForTesting(
+          package_id);
   EXPECT_FALSE(promise_app_before);
 
   arc_test()->app_instance()->SendInstallationStarted(package_name);
 
   // Verify that the promise app is now registered.
   const apps::PromiseApp* promise_app_after =
-      app_service_proxy()->PromiseAppRegistryCache().GetPromiseApp(package_id);
+      app_service_proxy()->PromiseAppRegistryCache().GetPromiseAppForTesting(
+          package_id);
   EXPECT_TRUE(promise_app_after);
 }
diff --git a/chrome/browser/apps/app_service/publishers/bruschetta_apps.cc b/chrome/browser/apps/app_service/publishers/bruschetta_apps.cc
index ee7ce64..fe7ca0eda 100644
--- a/chrome/browser/apps/app_service/publishers/bruschetta_apps.cc
+++ b/chrome/browser/apps/app_service/publishers/bruschetta_apps.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/ash/crostini/crostini_util.h"
 #include "chrome/browser/ash/file_manager/fileapi_util.h"
 #include "chrome/browser/ash/file_manager/path_util.h"
+#include "chrome/browser/ash/guest_os/guest_os_launcher.h"
 #include "chrome/browser/ash/guest_os/guest_os_registry_service.h"
 #include "chrome/browser/ash/guest_os/guest_os_session_tracker.h"
 #include "chrome/browser/ash/guest_os/guest_os_share_path.h"
@@ -73,9 +74,9 @@
                    "Failed to share paths with Bruschetta: " + failure_reason);
     return;
   }
-  // TODO(b/265601951): Factor this out of CrostiniManager.
-  crostini::CrostiniManager::GetForProfile(profile)->LaunchContainerApplication(
-      container_id, registration.DesktopFileId(), args, registration.IsScaled(),
+  guest_os::launcher::LaunchApplication(
+      profile, container_id, registration.DesktopFileId(), args,
+      registration.IsScaled(),
       base::BindOnce(
           [](const std::string& app_id, LaunchCallback callback, bool success,
              const std::string& failure_reason) {
diff --git a/chrome/browser/apps/app_shim/app_shim_host_mac.cc b/chrome/browser/apps/app_shim/app_shim_host_mac.cc
index a5e17d0d..26244455b 100644
--- a/chrome/browser/apps/app_shim/app_shim_host_mac.cc
+++ b/chrome/browser/apps/app_shim/app_shim_host_mac.cc
@@ -120,6 +120,13 @@
   on_shim_connected_for_testing_ = std::move(closure);
 }
 
+base::ProcessId AppShimHost::GetAppShimPid() const {
+  if (bootstrap_) {
+    return bootstrap_->GetAppShimPid();
+  }
+  return base::kNullProcessId;
+}
+
 bool AppShimHost::HasBootstrapConnected() const {
   return bootstrap_ != nullptr;
 }
diff --git a/chrome/browser/apps/app_shim/app_shim_host_mac.h b/chrome/browser/apps/app_shim/app_shim_host_mac.h
index 0b3368d..ed5b945 100644
--- a/chrome/browser/apps/app_shim/app_shim_host_mac.h
+++ b/chrome/browser/apps/app_shim/app_shim_host_mac.h
@@ -114,6 +114,9 @@
 
   void SetOnShimConnectedForTesting(base::OnceClosure closure);
 
+  // Returns kNullProcessId if no process has connected to this host yet.
+  base::ProcessId GetAppShimPid() const;
+
  protected:
   void ChannelError(uint32_t custom_reason, const std::string& description);
 
diff --git a/chrome/browser/apps/app_shim/app_shim_manager_mac.cc b/chrome/browser/apps/app_shim/app_shim_manager_mac.cc
index aab4970..54c79ee7 100644
--- a/chrome/browser/apps/app_shim/app_shim_manager_mac.cc
+++ b/chrome/browser/apps/app_shim/app_shim_manager_mac.cc
@@ -492,6 +492,9 @@
 void AppShimManager::OnShimProcessConnected(
     std::unique_ptr<AppShimHostBootstrap> bootstrap) {
   DCHECK(crx_file::id_util::IdIsValid(bootstrap->GetAppId()));
+  if (app_shim_observer_) {
+    app_shim_observer_->OnShimProcessConnected(bootstrap->GetAppShimPid());
+  }
   switch (bootstrap->GetLaunchType()) {
     case chrome::mojom::AppShimLaunchType::kNormal: {
       const base::FilePath profile_path = bootstrap->GetProfilePath();
@@ -758,6 +761,11 @@
     std::unique_ptr<AppShimHostBootstrap> bootstrap,
     ProfileState* profile_state,
     chrome::mojom::AppShimLaunchResult result) {
+  if (app_shim_observer_) {
+    app_shim_observer_->OnShimProcessConnectedAndAllLaunchesDone(
+        bootstrap->GetAppShimPid(), result);
+  }
+
   // If we failed because the profile was locked, launch the profile manager.
   if (result == chrome::mojom::AppShimLaunchResult::kProfileLocked)
     LaunchProfilePicker();
@@ -1053,6 +1061,9 @@
 }
 
 void AppShimManager::OnShimReopen(AppShimHost* host) {
+  if (app_shim_observer_) {
+    app_shim_observer_->OnShimReopen(host->GetAppShimPid());
+  }
   auto found_app = apps_.find(host->GetAppId());
   DCHECK(found_app != apps_.end());
   AppState* app_state = found_app->second.get();
@@ -1075,6 +1086,9 @@
   LoadAndLaunchApp(
       app_state->IsMultiProfile() ? base::FilePath() : host->GetProfilePath(),
       params, base::DoNothing());
+  if (app_shim_observer_) {
+    app_shim_observer_->OnShimOpenedURLs(host->GetAppShimPid());
+  }
 }
 
 void AppShimManager::OnShimSelectedProfile(AppShimHost* host,
@@ -1095,6 +1109,9 @@
   LoadAndLaunchApp(
       app_state->IsMultiProfile() ? base::FilePath() : host->GetProfilePath(),
       params, base::DoNothing());
+  if (app_shim_observer_) {
+    app_shim_observer_->OnShimOpenedURLs(host->GetAppShimPid());
+  }
 }
 
 void AppShimManager::OnShimOpenAppWithOverrideUrl(AppShimHost* host,
diff --git a/chrome/browser/apps/app_shim/app_shim_manager_mac.h b/chrome/browser/apps/app_shim/app_shim_manager_mac.h
index fbda723bf..b68da26 100644
--- a/chrome/browser/apps/app_shim/app_shim_manager_mac.h
+++ b/chrome/browser/apps/app_shim/app_shim_manager_mac.h
@@ -207,6 +207,19 @@
   static base::ScopedCFTypeRef<SecRequirementRef>
       BuildAppShimRequirementFromFrameworkRequirementString(CFStringRef);
 
+  class AppShimObserver {
+   public:
+    virtual void OnShimProcessConnected(base::ProcessId pid) = 0;
+    virtual void OnShimProcessConnectedAndAllLaunchesDone(
+        base::ProcessId pid,
+        chrome::mojom::AppShimLaunchResult result) = 0;
+    virtual void OnShimReopen(base::ProcessId pid) = 0;
+    virtual void OnShimOpenedURLs(base::ProcessId pid) = 0;
+  };
+  void SetAppShimObserverForTesting(AppShimObserver* observer) {
+    app_shim_observer_ = observer;
+  }
+
  protected:
   typedef std::set<Browser*> BrowserSet;
 
@@ -381,6 +394,8 @@
   // The avatar menu instance used by all app shims.
   std::unique_ptr<AvatarMenu> avatar_menu_;
 
+  raw_ptr<AppShimObserver> app_shim_observer_ = nullptr;
+
   base::ScopedMultiSourceObservation<Profile, ProfileObserver>
       profile_observation_{this};
 
diff --git a/chrome/browser/ash/app_list/search/federated_metrics_manager_unittest.cc b/chrome/browser/ash/app_list/search/federated_metrics_manager_unittest.cc
index e12ce9b1e..ed02fbf 100644
--- a/chrome/browser/ash/app_list/search/federated_metrics_manager_unittest.cc
+++ b/chrome/browser/ash/app_list/search/federated_metrics_manager_unittest.cc
@@ -33,6 +33,7 @@
 using ash::federated::ScopedFakeServiceConnectionForTest;
 using ash::federated::ServiceConnection;
 using federated::FederatedMetricsManager;
+using testing::HasSubstr;
 
 class TestFederatedServiceController
     : public ash::federated::FederatedServiceController {
@@ -47,16 +48,26 @@
   bool IsServiceAvailable() const override { return true; }
 };
 
-class FederatedMetricsManagerTest : public testing::Test {
+// Parameterized by feature kLauncherQueryFederatedAnalyticsPHH.
+class FederatedMetricsManagerTest : public testing::Test,
+                                    public ::testing::WithParamInterface<bool> {
  public:
   FederatedMetricsManagerTest()
       : scoped_fake_for_test_(&fake_service_connection_),
         app_list_notifier_(&app_list_controller_) {
-    scoped_feature_list_.InitWithFeatures(
-        /*enabled_features=*/{ash::features::kFederatedService,
-                              search_features::
-                                  kLauncherQueryFederatedAnalyticsPHH},
-        /*disabled_features=*/{});
+    std::vector<base::test::FeatureRef> enabled_features = {
+        ash::features::kFederatedService};
+    std::vector<base::test::FeatureRef> disabled_features;
+
+    if (GetParam()) {
+      enabled_features.push_back(
+          search_features::kLauncherQueryFederatedAnalyticsPHH);
+    } else {
+      disabled_features.push_back(
+          search_features::kLauncherQueryFederatedAnalyticsPHH);
+    }
+
+    scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features);
   }
 
   FederatedMetricsManagerTest(const FederatedMetricsManagerTest&) = delete;
@@ -77,6 +88,19 @@
 
   base::HistogramTester* histogram_tester() { return histogram_tester_.get(); }
 
+  void ExpectNoFederatedLogs() {
+    const std::string histograms =
+        histogram_tester()->GetAllHistogramsRecorded();
+    EXPECT_THAT(
+        histograms,
+        Not(AnyOf(
+            HasSubstr(app_list::federated::kHistogramInitStatus),
+            HasSubstr(app_list::federated::kHistogramSearchSessionConclusion),
+            HasSubstr(app_list::federated::kHistogramReportStatus))));
+    // TODO(b/262611120): Check emptiness of federated service storage, once
+    // this functionality is available.
+  }
+
  protected:
   std::unique_ptr<base::HistogramTester> histogram_tester_;
   std::unique_ptr<FederatedMetricsManager> metrics_manager_;
@@ -93,30 +117,39 @@
   TestFederatedServiceController federated_service_controller_;
 };
 
-TEST_F(FederatedMetricsManagerTest, Quit) {
+INSTANTIATE_TEST_SUITE_P(LauncherQueryFA,
+                         FederatedMetricsManagerTest,
+                         testing::Bool());
+
+TEST_P(FederatedMetricsManagerTest, Quit) {
   metrics_manager_->OnSearchSessionStarted();
   // Search session ends without user taking other action (e.g. without
   // launching a result).
   metrics_manager_->OnSearchSessionEnded(u"fake_query");
   base::RunLoop().RunUntilIdle();
 
-  histogram_tester()->ExpectUniqueSample(
-      app_list::federated::kHistogramInitStatus,
-      app_list::federated::FederatedMetricsManager::InitStatus::kOk, 1);
+  const bool launcher_fa_enabled = GetParam();
+  if (launcher_fa_enabled) {
+    histogram_tester()->ExpectUniqueSample(
+        app_list::federated::kHistogramInitStatus,
+        app_list::federated::FederatedMetricsManager::InitStatus::kOk, 1);
 
-  histogram_tester()->ExpectUniqueSample(
-      app_list::federated::kHistogramSearchSessionConclusion,
-      ash::SearchSessionConclusion::kQuit, 1);
+    histogram_tester()->ExpectUniqueSample(
+        app_list::federated::kHistogramSearchSessionConclusion,
+        ash::SearchSessionConclusion::kQuit, 1);
 
-  histogram_tester()->ExpectUniqueSample(
-      app_list::federated::kHistogramReportStatus,
-      app_list::federated::FederatedMetricsManager::ReportStatus::kOk, 1);
+    histogram_tester()->ExpectUniqueSample(
+        app_list::federated::kHistogramReportStatus,
+        app_list::federated::FederatedMetricsManager::ReportStatus::kOk, 1);
 
-  // TODO(b/262611120): Check contents of logged example, once this
-  // functionality is available.
+    // TODO(b/262611120): Check contents of logged example, once this
+    // functionality is available.
+  } else {
+    ExpectNoFederatedLogs();
+  }
 }
 
-TEST_F(FederatedMetricsManagerTest, Launch) {
+TEST_P(FederatedMetricsManagerTest, Launch) {
   metrics_manager_->OnSearchSessionStarted();
   std::vector<Result> shown_results;
   Result launched_result = CreateFakeResult(Type::EXTENSION_APP, "fake_id");
@@ -127,23 +160,27 @@
   metrics_manager_->OnSearchSessionEnded(query);
   base::RunLoop().RunUntilIdle();
 
-  histogram_tester()->ExpectUniqueSample(
-      app_list::federated::kHistogramInitStatus,
-      app_list::federated::FederatedMetricsManager::InitStatus::kOk, 1);
+  const bool launcher_fa_enabled = GetParam();
+  if (launcher_fa_enabled) {
+    histogram_tester()->ExpectUniqueSample(
+        app_list::federated::kHistogramInitStatus,
+        app_list::federated::FederatedMetricsManager::InitStatus::kOk, 1);
 
-  // TODO
-  histogram_tester()->ExpectUniqueSample(
-      app_list::federated::kHistogramSearchSessionConclusion,
-      ash::SearchSessionConclusion::kLaunch, 1);
+    histogram_tester()->ExpectUniqueSample(
+        app_list::federated::kHistogramSearchSessionConclusion,
+        ash::SearchSessionConclusion::kLaunch, 1);
 
-  histogram_tester()->ExpectUniqueSample(
-      app_list::federated::kHistogramReportStatus,
-      app_list::federated::FederatedMetricsManager::ReportStatus::kOk, 1);
-  // TODO(b/262611120): Check contents of logged example, once this
-  // functionality is available.
+    histogram_tester()->ExpectUniqueSample(
+        app_list::federated::kHistogramReportStatus,
+        app_list::federated::FederatedMetricsManager::ReportStatus::kOk, 1);
+    // TODO(b/262611120): Check contents of logged example, once this
+    // functionality is available.
+  } else {
+    ExpectNoFederatedLogs();
+  }
 }
 
-TEST_F(FederatedMetricsManagerTest, AnswerCardSeen) {
+TEST_P(FederatedMetricsManagerTest, AnswerCardSeen) {
   metrics_manager_->OnSearchSessionStarted();
   std::vector<Result> shown_results;
   std::u16string query = u"fake_query";
@@ -152,23 +189,27 @@
   metrics_manager_->OnSearchSessionEnded(query);
   base::RunLoop().RunUntilIdle();
 
-  histogram_tester()->ExpectUniqueSample(
-      app_list::federated::kHistogramInitStatus,
-      app_list::federated::FederatedMetricsManager::InitStatus::kOk, 1);
+  const bool launcher_fa_enabled = GetParam();
+  if (launcher_fa_enabled) {
+    histogram_tester()->ExpectUniqueSample(
+        app_list::federated::kHistogramInitStatus,
+        app_list::federated::FederatedMetricsManager::InitStatus::kOk, 1);
 
-  // TODO
-  histogram_tester()->ExpectUniqueSample(
-      app_list::federated::kHistogramSearchSessionConclusion,
-      ash::SearchSessionConclusion::kAnswerCardSeen, 1);
+    histogram_tester()->ExpectUniqueSample(
+        app_list::federated::kHistogramSearchSessionConclusion,
+        ash::SearchSessionConclusion::kAnswerCardSeen, 1);
 
-  histogram_tester()->ExpectUniqueSample(
-      app_list::federated::kHistogramReportStatus,
-      app_list::federated::FederatedMetricsManager::ReportStatus::kOk, 1);
-  // TODO(b/262611120): Check contents of logged example, once this
-  // functionality is available.
+    histogram_tester()->ExpectUniqueSample(
+        app_list::federated::kHistogramReportStatus,
+        app_list::federated::FederatedMetricsManager::ReportStatus::kOk, 1);
+    // TODO(b/262611120): Check contents of logged example, once this
+    // functionality is available.
+  } else {
+    ExpectNoFederatedLogs();
+  }
 }
 
-TEST_F(FederatedMetricsManagerTest, AnswerCardSeenThenListResultLaunched) {
+TEST_P(FederatedMetricsManagerTest, AnswerCardSeenThenListResultLaunched) {
   // Tests that a Launch event takes precedence over an AnswerCardSeen event,
   // within the same search session.
   metrics_manager_->OnSearchSessionStarted();
@@ -184,22 +225,27 @@
   metrics_manager_->OnSearchSessionEnded(query);
   base::RunLoop().RunUntilIdle();
 
-  histogram_tester()->ExpectUniqueSample(
-      app_list::federated::kHistogramInitStatus,
-      app_list::federated::FederatedMetricsManager::InitStatus::kOk, 1);
+  const bool launcher_fa_enabled = GetParam();
+  if (launcher_fa_enabled) {
+    histogram_tester()->ExpectUniqueSample(
+        app_list::federated::kHistogramInitStatus,
+        app_list::federated::FederatedMetricsManager::InitStatus::kOk, 1);
 
-  histogram_tester()->ExpectUniqueSample(
-      app_list::federated::kHistogramSearchSessionConclusion,
-      ash::SearchSessionConclusion::kLaunch, 1);
+    histogram_tester()->ExpectUniqueSample(
+        app_list::federated::kHistogramSearchSessionConclusion,
+        ash::SearchSessionConclusion::kLaunch, 1);
 
-  histogram_tester()->ExpectUniqueSample(
-      app_list::federated::kHistogramReportStatus,
-      app_list::federated::FederatedMetricsManager::ReportStatus::kOk, 1);
-  // TODO(b/262611120): Check contents of logged example, once this
-  // functionality is available.
+    histogram_tester()->ExpectUniqueSample(
+        app_list::federated::kHistogramReportStatus,
+        app_list::federated::FederatedMetricsManager::ReportStatus::kOk, 1);
+    // TODO(b/262611120): Check contents of logged example, once this
+    // functionality is available.
+  } else {
+    ExpectNoFederatedLogs();
+  }
 }
 
-TEST_F(FederatedMetricsManagerTest, ZeroState) {
+TEST_P(FederatedMetricsManagerTest, ZeroState) {
   // Note: metrics_manager_->OnSearchSession{Started,Ended}() are not expected
   // to be called during zero state search.
 
@@ -216,19 +262,24 @@
                              shown_results, empty_query);
   base::RunLoop().RunUntilIdle();
 
-  histogram_tester()->ExpectUniqueSample(
-      app_list::federated::kHistogramInitStatus,
-      app_list::federated::FederatedMetricsManager::InitStatus::kOk, 1);
+  const bool launcher_fa_enabled = GetParam();
+  if (launcher_fa_enabled) {
+    histogram_tester()->ExpectUniqueSample(
+        app_list::federated::kHistogramInitStatus,
+        app_list::federated::FederatedMetricsManager::InitStatus::kOk, 1);
 
-  // Zero state search should not trigger any logging on user action.
-  histogram_tester()->ExpectTotalCount(
-      app_list::federated::kHistogramSearchSessionConclusion, 0);
-  histogram_tester()->ExpectTotalCount(
-      app_list::federated::kHistogramReportStatus, 0);
+    // Zero state search should not trigger any logging on user action.
+    histogram_tester()->ExpectTotalCount(
+        app_list::federated::kHistogramSearchSessionConclusion, 0);
+    histogram_tester()->ExpectTotalCount(
+        app_list::federated::kHistogramReportStatus, 0);
 
-  // Do not expect that any examples were logged to the federated service.
-  // TODO(b/262611120): Check contents of federated service storage, once this
-  // functionality is available.
+    // Do not expect that any examples were logged to the federated service.
+    // TODO(b/262611120): Check contents of federated service storage, once this
+    // functionality is available.
+  } else {
+    ExpectNoFederatedLogs();
+  }
 }
 
 }  // namespace
diff --git a/chrome/browser/ash/app_list/search/ranking/ranker_manager.cc b/chrome/browser/ash/app_list/search/ranking/ranker_manager.cc
index 75b1969..bd561ee0 100644
--- a/chrome/browser/ash/app_list/search/ranking/ranker_manager.cc
+++ b/chrome/browser/ash/app_list/search/ranking/ranker_manager.cc
@@ -103,9 +103,12 @@
       PersistentProto<MrfuCacheProto>(
           state_dir.AppendASCII("mrfu_categories.pb"), kStandardWriteDelay)));
 
-  if (search_features::IsLauncherKeywordExtractionScoringEnabled()) {
-    AddRanker(std::make_unique<KeywordRanker>());
-  }
+  // TODO(b/274921356): Temporarly comment out the `KeywordRanker` construction to avoid any 
+  // possible crashes. Re-enable it when we make sure this problem has been fixed.
+  //
+  // if (search_features::IsLauncherKeywordExtractionScoringEnabled()) {
+  //   AddRanker(std::make_unique<KeywordRanker>());
+  // }
 
   // 5. Result post-processing.
   // Nb. the best match ranker relies on score normalization, and the answer
diff --git a/chrome/browser/ash/app_list/search/util/keyword_cache.cc b/chrome/browser/ash/app_list/search/util/keyword_cache.cc
index 754ec1e..44a03a8 100644
--- a/chrome/browser/ash/app_list/search/util/keyword_cache.cc
+++ b/chrome/browser/ash/app_list/search/util/keyword_cache.cc
@@ -60,7 +60,12 @@
 double KeywordCache::CalculateBoostChange(const std::string& item) const {
   bool is_boosted = IsBoosted(item);
 
-  double selected_item_score = last_item_scores_.at(item);
+  auto it = last_item_scores_.find(item);
+  if (it == last_item_scores_.end()) {
+    return 0;
+  }
+  double selected_item_score = it->second;
+
   int rank = 0;
   int num_item_above = 0;
 
diff --git a/chrome/browser/ash/crosapi/crosapi_util.cc b/chrome/browser/ash/crosapi/crosapi_util.cc
index a440c251..b62ce12 100644
--- a/chrome/browser/ash/crosapi/crosapi_util.cc
+++ b/chrome/browser/ash/crosapi/crosapi_util.cc
@@ -610,8 +610,6 @@
   params->session_type = environment_provider->GetSessionType();
   params->default_paths = environment_provider->GetDefaultPaths();
 
-  params->device_account_gaia_id =
-      environment_provider->GetDeviceAccountGaiaId();
   const absl::optional<account_manager::Account> maybe_device_account =
       environment_provider->GetDeviceAccount();
   if (maybe_device_account) {
diff --git a/chrome/browser/ash/crosapi/environment_provider.cc b/chrome/browser/ash/crosapi/environment_provider.cc
index 87e3a73..0bef822 100644
--- a/chrome/browser/ash/crosapi/environment_provider.cc
+++ b/chrome/browser/ash/crosapi/environment_provider.cc
@@ -139,20 +139,6 @@
   return default_paths;
 }
 
-std::string EnvironmentProvider::GetDeviceAccountGaiaId() {
-  const user_manager::User* const user =
-      user_manager::UserManager::Get()->GetPrimaryUser();
-  if (!user)
-    return std::string();
-
-  const AccountId& account_id = user->GetAccountId();
-  if (account_id.GetAccountType() != AccountType::GOOGLE)
-    return std::string();
-
-  DCHECK(!account_id.GetGaiaId().empty());
-  return account_id.GetGaiaId();
-}
-
 absl::optional<account_manager::Account>
 EnvironmentProvider::GetDeviceAccount() {
   // Lacros doesn't support Multi-Login. Get the Primary User.
diff --git a/chrome/browser/ash/crosapi/environment_provider.h b/chrome/browser/ash/crosapi/environment_provider.h
index e32d5f6..f386ed93 100644
--- a/chrome/browser/ash/crosapi/environment_provider.h
+++ b/chrome/browser/ash/crosapi/environment_provider.h
@@ -32,10 +32,6 @@
   // the device account, not the Lacros profile.
   virtual crosapi::mojom::DefaultPathsPtr GetDefaultPaths();
 
-  // Deprecated. Use `GetDeviceAccount` instead.
-  // TODO(crbug.com/1195865): Remove this in M93.
-  virtual std::string GetDeviceAccountGaiaId();
-
   // Returns the account used to sign into the device. May be a Gaia account or
   // a Microsoft Active Directory account.
   // Returns a `nullopt` for Guest Sessions, Managed Guest Sessions,
diff --git a/chrome/browser/ash/crostini/crostini_manager.cc b/chrome/browser/ash/crostini/crostini_manager.cc
index ac0cfb5..eb2ee27 100644
--- a/chrome/browser/ash/crostini/crostini_manager.cc
+++ b/chrome/browser/ash/crostini/crostini_manager.cc
@@ -2046,35 +2046,6 @@
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
 
-void CrostiniManager::LaunchContainerApplication(
-    const guest_os::GuestId& container_id,
-    std::string desktop_file_id,
-    const std::vector<std::string>& files,
-    bool display_scaled,
-    CrostiniSuccessCallback callback) {
-  vm_tools::cicerone::LaunchContainerApplicationRequest request;
-  request.set_owner_id(owner_id_);
-  request.set_vm_name(container_id.vm_name);
-  request.set_container_name(container_id.container_name);
-  request.set_desktop_file_id(std::move(desktop_file_id));
-  if (display_scaled) {
-    request.set_display_scaling(
-        vm_tools::cicerone::LaunchContainerApplicationRequest::SCALED);
-  }
-  base::ranges::copy(files, google::protobuf::RepeatedFieldBackInserter(
-                                request.mutable_files()));
-
-  std::vector<vm_tools::cicerone::ContainerFeature> container_features =
-      GetContainerFeatures();
-  request.mutable_container_features()->Add(container_features.begin(),
-                                            container_features.end());
-
-  GetCiceroneClient()->LaunchContainerApplication(
-      std::move(request),
-      base::BindOnce(&CrostiniManager::OnLaunchContainerApplication,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
-}
-
 void CrostiniManager::GetContainerAppIcons(
     const guest_os::GuestId& container_id,
     std::vector<std::string> desktop_file_ids,
@@ -3317,20 +3288,6 @@
                                           container_id, result);
 }
 
-void CrostiniManager::OnLaunchContainerApplication(
-    CrostiniSuccessCallback callback,
-    absl::optional<vm_tools::cicerone::LaunchContainerApplicationResponse>
-        response) {
-  if (!response) {
-    LOG(ERROR) << "Failed to launch application. Empty response.";
-    std::move(callback).Run(/*success=*/false,
-                            "Failed to launch application. Empty response.");
-    return;
-  }
-
-  std::move(callback).Run(response->success(), response->failure_reason());
-}
-
 void CrostiniManager::OnGetContainerAppIcons(
     GetContainerAppIconsCallback callback,
     absl::optional<vm_tools::cicerone::ContainerAppIconResponse> response) {
diff --git a/chrome/browser/ash/crostini/crostini_manager.h b/chrome/browser/ash/crostini/crostini_manager.h
index a05842c7..c64c2f8 100644
--- a/chrome/browser/ash/crostini/crostini_manager.h
+++ b/chrome/browser/ash/crostini/crostini_manager.h
@@ -25,6 +25,7 @@
 #include "chrome/browser/ash/crostini/crostini_util.h"
 #include "chrome/browser/ash/crostini/termina_installer.h"
 #include "chrome/browser/ash/guest_os/guest_id.h"
+#include "chrome/browser/ash/guest_os/guest_os_launcher.h"
 #include "chrome/browser/ash/guest_os/guest_os_remover.h"
 #include "chrome/browser/ash/guest_os/guest_os_session_tracker.h"
 #include "chrome/browser/ash/guest_os/public/guest_os_mount_provider_registry.h"
@@ -347,13 +348,6 @@
   void CancelUpgradeContainer(const guest_os::GuestId& key,
                               CrostiniResultCallback callback);
 
-  // Asynchronously launches an app as specified by its desktop file id.
-  void LaunchContainerApplication(const guest_os::GuestId& container_id,
-                                  std::string desktop_file_id,
-                                  const std::vector<std::string>& files,
-                                  bool display_scaled,
-                                  CrostiniSuccessCallback callback);
-
   // Asynchronously gets app icons as specified by their desktop file ids.
   // |callback| is called after the method call finishes.
   using GetContainerAppIconsCallback =
@@ -754,7 +748,7 @@
 
   // Callback for CrostiniManager::LaunchContainerApplication.
   void OnLaunchContainerApplication(
-      CrostiniSuccessCallback callback,
+      guest_os::launcher::SuccessCallback callback,
       absl::optional<vm_tools::cicerone::LaunchContainerApplicationResponse>
           response);
 
diff --git a/chrome/browser/ash/crostini/crostini_util.cc b/chrome/browser/ash/crostini/crostini_util.cc
index 9e24411..664e7b6a 100644
--- a/chrome/browser/ash/crostini/crostini_util.cc
+++ b/chrome/browser/ash/crostini/crostini_util.cc
@@ -104,7 +104,7 @@
 
 void OnSharePathForLaunchApplication(
     Profile* profile,
-    const std::string& app_id,
+    const std::string& desktop_file_id,
     guest_os::GuestOsRegistryService::Registration registration,
     int64_t display_id,
     const std::vector<std::string>& args,
@@ -112,17 +112,18 @@
     bool success,
     const std::string& failure_reason) {
   if (!success) {
-    return OnLaunchFailed(
-        app_id, std::move(callback),
-        "failed to share paths to launch " + app_id + ":" + failure_reason,
-        CrostiniResult::SHARE_PATHS_FAILED);
+    return OnLaunchFailed(desktop_file_id, std::move(callback),
+                          "Failed to share paths to launch " + desktop_file_id +
+                              ": " + failure_reason,
+                          CrostiniResult::SHARE_PATHS_FAILED);
   }
-  const guest_os::GuestId container_id(registration.VmType(),
-                                       registration.VmName(),
-                                       registration.ContainerName());
-  crostini::CrostiniManager::GetForProfile(profile)->LaunchContainerApplication(
-      container_id, registration.DesktopFileId(), args, registration.IsScaled(),
-      base::BindOnce(OnApplicationLaunched, app_id, std::move(callback),
+  const guest_os::GuestId guest_id(registration.VmType(), registration.VmName(),
+                                   registration.ContainerName());
+  guest_os::launcher::LaunchApplication(
+      profile, guest_id, registration.DesktopFileId(), args,
+      registration.IsScaled(),
+      base::BindOnce(OnApplicationLaunched, desktop_file_id,
+                     std::move(callback),
                      crostini::CrostiniResult::UNKNOWN_ERROR));
 }
 
diff --git a/chrome/browser/ash/crostini/crostini_util.h b/chrome/browser/ash/crostini/crostini_util.h
index 4c6b860..63f109df 100644
--- a/chrome/browser/ash/crostini/crostini_util.h
+++ b/chrome/browser/ash/crostini/crostini_util.h
@@ -14,6 +14,7 @@
 #include "base/functional/callback_helpers.h"
 #include "chrome/browser/ash/crostini/crostini_simple_types.h"
 #include "chrome/browser/ash/guest_os/guest_id.h"
+#include "chrome/browser/ash/guest_os/guest_os_launcher.h"
 #include "chrome/browser/ash/guest_os/public/types.h"
 #include "chromeos/ash/components/dbus/cicerone/cicerone_service.pb.h"
 #include "components/services/app_service/public/cpp/intent.h"
@@ -80,11 +81,12 @@
 // Launch a Crostini App with a given set of files, given as absolute paths in
 // the container. For apps which can only be launched with a single file,
 // launch multiple instances.
-void LaunchCrostiniApp(Profile* profile,
-                       const std::string& app_id,
-                       int64_t display_id,
-                       const std::vector<LaunchArg>& args = {},
-                       CrostiniSuccessCallback callback = base::DoNothing());
+void LaunchCrostiniApp(
+    Profile* profile,
+    const std::string& app_id,
+    int64_t display_id,
+    const std::vector<LaunchArg>& args = {},
+    guest_os::launcher::SuccessCallback callback = base::DoNothing());
 
 void LaunchCrostiniAppWithIntent(
     Profile* profile,
@@ -92,7 +94,7 @@
     int64_t display_id,
     apps::IntentPtr intent,
     const std::vector<LaunchArg>& args = {},
-    CrostiniSuccessCallback callback = base::DoNothing());
+    guest_os::launcher::SuccessCallback callback = base::DoNothing());
 
 // Determine features to enable in the container on app/terminal launches.
 std::vector<vm_tools::cicerone::ContainerFeature> GetContainerFeatures();
diff --git a/chrome/browser/ash/eol_incentive_util.cc b/chrome/browser/ash/eol_incentive_util.cc
index 574bd989..0f66946 100644
--- a/chrome/browser/ash/eol_incentive_util.cc
+++ b/chrome/browser/ash/eol_incentive_util.cc
@@ -52,8 +52,7 @@
     return EolIncentiveType::kNone;
   }
 
-  const base::Time creation_time =
-      profile->GetPrefs()->GetTime(prefs::kProfileCreationTime);
+  const base::Time creation_time = profile->GetCreationTime();
   const base::TimeDelta time_since_creation = now - creation_time;
 
   // Only show the incentive for a user that has used the device longer than the
diff --git a/chrome/browser/ash/eol_notification.cc b/chrome/browser/ash/eol_notification.cc
index 63d9276..790915e 100644
--- a/chrome/browser/ash/eol_notification.cc
+++ b/chrome/browser/ash/eol_notification.cc
@@ -299,6 +299,14 @@
       NotificationHandler::Type::TRANSIENT, kEolNotificationId);
 }
 
+void EolNotification::OverrideClockForTesting(base::Clock* clock) {
+  if (!clock) {
+    clock_ = base::DefaultClock::GetInstance();
+  } else {
+    clock_ = clock;
+  }
+}
+
 void EolNotification::MaybeShowEolIncentiveNotification(
     base::Time eol_date,
     eol_incentive_util::EolIncentiveType incentive_type) {
diff --git a/chrome/browser/ash/eol_notification.h b/chrome/browser/ash/eol_notification.h
index ec81aff..01b36eef 100644
--- a/chrome/browser/ash/eol_notification.h
+++ b/chrome/browser/ash/eol_notification.h
@@ -44,6 +44,8 @@
   void Click(const absl::optional<int>& button_index,
              const absl::optional<std::u16string>& reply) override;
 
+  void OverrideClockForTesting(base::Clock* clock);
+
  private:
   friend class EolNotificationTest;
 
diff --git a/chrome/browser/ash/eol_notification_browsertest.cc b/chrome/browser/ash/eol_notification_browsertest.cc
new file mode 100644
index 0000000..0f66608
--- /dev/null
+++ b/chrome/browser/ash/eol_notification_browsertest.cc
@@ -0,0 +1,869 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ash/eol_notification.h"
+
+#include <memory>
+#include <string>
+
+#include "ash/constants/ash_features.h"
+#include "ash/constants/ash_switches.h"
+#include "ash/public/cpp/ash_view_ids.h"
+#include "ash/public/cpp/system_tray_test_api.h"
+#include "base/run_loop.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/test/simple_test_clock.h"
+#include "chrome/browser/ash/login/session/user_session_manager.h"
+#include "chrome/browser/ash/login/test/device_state_mixin.h"
+#include "chrome/browser/ash/login/test/guest_session_mixin.h"
+#include "chrome/browser/ash/login/test/logged_in_user_mixin.h"
+#include "chrome/browser/ash/login/test/session_manager_state_waiter.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/notifications/notification_display_service_tester.h"
+#include "chrome/browser/notifications/notification_test_util.h"
+#include "chrome/browser/notifications/notification_ui_manager.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/profiles/profile_manager_observer.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/test/base/mixin_based_in_process_browser_test.h"
+#include "chromeos/ash/components/dbus/update_engine/fake_update_engine_client.h"
+#include "chromeos/ash/components/dbus/update_engine/update_engine_client.h"
+#include "components/session_manager/core/session_manager.h"
+#include "content/public/test/browser_test.h"
+
+namespace ash {
+
+namespace {
+
+constexpr char kEolNotificationId[] = "chrome://product_eol";
+
+enum class TestCase {
+  kIncentivesDisabled,
+  kIncentivesWithoutOffer,
+  kIncentivesWithOffer,
+  kIncentivesWithOfferAndAUEWarning,
+};
+
+// Returns the "incentive_type" feature param to be used for a test case.
+std::string GetTestFeatureParamString(TestCase test_case) {
+  switch (test_case) {
+    case TestCase::kIncentivesDisabled:
+      NOTREACHED();
+      return "";
+    case TestCase::kIncentivesWithoutOffer:
+      return "no_offer";
+    case TestCase::kIncentivesWithOffer:
+      return "offer";
+    case TestCase::kIncentivesWithOfferAndAUEWarning:
+      return "offer_with_warning";
+  }
+}
+
+// Sets up a test's scoped feature list to run enable the provided test case.
+void SetUpScopedFeatureListForTestCase(
+    TestCase test_case,
+    base::test::ScopedFeatureList* scoped_feature_list) {
+  if (test_case == TestCase::kIncentivesDisabled) {
+    scoped_feature_list->InitAndDisableFeature(features::kEolIncentive);
+  } else {
+    scoped_feature_list->InitAndEnableFeatureWithParameters(
+        features::kEolIncentive,
+        {{"incentive_type", GetTestFeatureParamString(test_case)}});
+  }
+}
+
+// Possible results for `EolStatusMixin::SetUpTime()`.
+enum class TimeSetupResult {
+  kSuccess,
+  kInvalidNow,
+  kInvalidEol,
+  kInvalidProfileCreation
+};
+
+// Helper class to create NotificationDisplayServiceTester before notification
+// in the session shown.
+class NotificationDisplayServiceWaiter : public ProfileManagerObserver {
+ public:
+  NotificationDisplayServiceWaiter() {
+    g_browser_process->profile_manager()->AddObserver(this);
+  }
+
+  // ProfileManagerObserver:
+  void OnProfileAdded(Profile* profile) override {
+    g_browser_process->profile_manager()->RemoveObserver(this);
+    display_service_ =
+        std::make_unique<NotificationDisplayServiceTester>(profile);
+    run_loop_.Quit();
+  }
+
+  std::unique_ptr<NotificationDisplayServiceTester> Wait() {
+    run_loop_.Run();
+    return std::move(display_service_);
+  }
+
+ private:
+  std::unique_ptr<NotificationDisplayServiceTester> display_service_;
+  base::RunLoop run_loop_;
+};
+
+// Mixin that sets up session state to indicate certain EOL status:
+// It can override EOL date provided returned by update engine, the current time
+// used by EOL notification handler, and profile creation time.
+class EolStatusMixin : public InProcessBrowserTestMixin {
+ public:
+  explicit EolStatusMixin(InProcessBrowserTestMixinHost* mixin_host)
+      : InProcessBrowserTestMixin(mixin_host) {}
+
+  EolStatusMixin(const EolStatusMixin&) = delete;
+  EolStatusMixin& operator=(const EolStatusMixin&) = delete;
+
+  ~EolStatusMixin() override = default;
+
+  // InProcessBrowserTestMixin:
+  void SetUpInProcessBrowserTestFixture() override {
+    InProcessBrowserTestMixin::SetUpInProcessBrowserTestFixture();
+    update_engine_client_ = UpdateEngineClient::InitializeFakeForTest();
+  }
+
+  void SetUpOnMainThread() override {
+    InProcessBrowserTestMixin::SetUpOnMainThread();
+    UserSessionManager::GetInstance()
+        ->SetEolNotificationHandlerFactoryForTesting(
+            base::BindRepeating(&EolStatusMixin::CreateEolNotificationHandler,
+                                base::Unretained(this)));
+  }
+  void TearDownOnMainThread() override {
+    UserSessionManager::GetInstance()
+        ->SetEolNotificationHandlerFactoryForTesting(
+            UserSessionManager::EolNotificationHandlerFactoryCallback());
+
+    InProcessBrowserTestMixin::TearDownOnMainThread();
+  }
+
+  // Sets up times relevant to calculating EOL notification status.
+  // `now_string` - The time used by EOL notification handler.
+  // `eol_string` - The time reportted by fake update engine as device EOL.
+  // `profile_creation_string` - The time used to override user profile creation
+  // when EOL notification handler gets created.
+  // Callers should verify that the method returned kSuccess.
+  [[nodiscard]] TimeSetupResult SetUpTime(const char* now_string,
+                                          const char* eol_string,
+                                          const char* profile_creation_string) {
+    base::Time now;
+    if (!base::Time::FromUTCString(now_string, &now)) {
+      return TimeSetupResult::kInvalidNow;
+    }
+
+    base::Time eol;
+    if (!base::Time::FromUTCString(eol_string, &eol)) {
+      return TimeSetupResult::kInvalidEol;
+    }
+
+    if (!base::Time::FromUTCString(profile_creation_string,
+                                   &profile_creation_time_)) {
+      return TimeSetupResult::kInvalidProfileCreation;
+    }
+
+    clock_.SetNow(now);
+    update_engine_client_->set_eol_date(eol);
+    return TimeSetupResult::kSuccess;
+  }
+
+ private:
+  std::unique_ptr<EolNotification> CreateEolNotificationHandler(
+      Profile* profile) {
+    auto eol_notification = std::make_unique<EolNotification>(profile);
+    eol_notification->OverrideClockForTesting(&clock_);
+    if (!profile_creation_time_.is_null()) {
+      profile->SetCreationTimeForTesting(profile_creation_time_);
+    }
+    return eol_notification;
+  }
+
+  FakeUpdateEngineClient* update_engine_client_ = nullptr;
+  base::SimpleTestClock clock_;
+  base::Time profile_creation_time_;
+};
+
+}  // namespace
+
+// Tests that verify EOL notifications for regular users on non-managed devices.
+class EolNotificationTest : public MixinBasedInProcessBrowserTest,
+                            public ::testing::WithParamInterface<TestCase> {
+ public:
+  EolNotificationTest() {
+    SetUpScopedFeatureListForTestCase(GetParam(), &scoped_feature_list_);
+  }
+
+  bool NotificationHasClaimButton() {
+    return GetParam() != TestCase::kIncentivesDisabled;
+  }
+
+  std::u16string GetEolApproachingNotificationTitle(
+      const std::u16string& eol_month) const {
+    switch (GetParam()) {
+      case TestCase::kIncentivesDisabled:
+        return u"Updates end " + eol_month;
+      case TestCase::kIncentivesWithoutOffer:
+        return u"Security updates end soon. Upgrade to a new Chromebook.";
+      case TestCase::kIncentivesWithOffer:
+        return u"Save $50 or more on a new Chromebook, when you upgrade today";
+      case TestCase::kIncentivesWithOfferAndAUEWarning:
+        return u"Security updates end soon. Save $50 or more on a new "
+               u"Chromebook.";
+    }
+  }
+
+  std::u16string GetEolApproachingNotificationMessage(
+      const std::string& eol_month) const {
+    switch (GetParam()) {
+      case TestCase::kIncentivesDisabled:
+        return u"You'll still be able to use this Chrome device after that "
+               u"time, but it will no longer get automatic software and "
+               u"security updates";
+      case TestCase::kIncentivesWithoutOffer:
+        return base::UTF8ToUTF16(base::StringPrintf(
+            "You will stop getting security and software updates for this "
+            "Chromebook in %s. Upgrade your Chromebook for the best "
+            "experience.",
+            eol_month.c_str()));
+      case TestCase::kIncentivesWithOffer:
+      case TestCase::kIncentivesWithOfferAndAUEWarning:
+        return base::UTF8ToUTF16(
+            base::StringPrintf("You will stop getting security updates for "
+                               "this Chromebook in %s. Time to upgrade for "
+                               "the latest security and software. Offer "
+                               "terms apply.",
+                               eol_month.c_str()));
+    }
+  }
+
+  std::u16string GetRecentEolNotificationTitle() const {
+    switch (GetParam()) {
+      case TestCase::kIncentivesDisabled:
+        return u"Final software update";
+      case TestCase::kIncentivesWithoutOffer:
+        return u"Security updates have ended. Upgrade to a new Chromebook.";
+      case TestCase::kIncentivesWithOffer:
+        return u"Save $50 or more on a new Chromebook, when you upgrade today";
+      case TestCase::kIncentivesWithOfferAndAUEWarning:
+        return u"Security updates have ended. Save $50 or more on a new "
+               u"Chromebook.";
+    }
+  }
+
+  std::u16string GetRecentEolNotificationMessage() const {
+    switch (GetParam()) {
+      case TestCase::kIncentivesDisabled:
+        return u"This is the last automatic software and security update for "
+               u"this Chrome device. To get future updates, upgrade to a "
+               u"newer model.";
+      case TestCase::kIncentivesWithoutOffer:
+        return u"Your Chromebook is no longer receiving security and software "
+               u"updates. Upgrade your Chromebook for the best experience.";
+      case TestCase::kIncentivesWithOffer:
+      case TestCase::kIncentivesWithOfferAndAUEWarning:
+        return u"Your Chromebook is no longer receiving security updates. "
+               u"Time to upgrade for the latest security and software. "
+               u"Offer terms apply.";
+    }
+  }
+
+  bool ShowsNotificationWithOffer() const {
+    switch (GetParam()) {
+      case TestCase::kIncentivesDisabled:
+      case TestCase::kIncentivesWithoutOffer:
+        return false;
+      case TestCase::kIncentivesWithOffer:
+      case TestCase::kIncentivesWithOfferAndAUEWarning:
+        return true;
+    }
+  }
+
+ protected:
+  EolStatusMixin eol_status_mixin_{&mixin_host_};
+
+  ash::LoggedInUserMixin logged_in_user_mixin_{
+      &mixin_host_, LoggedInUserMixin::LogInType::kRegular,
+      embedded_test_server(), this};
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+// Tests that verify EOL notifications are not shown on managed devices.
+class ManagedDeviceEolNotificationTest
+    : public MixinBasedInProcessBrowserTest,
+      public ::testing::WithParamInterface<TestCase> {
+ public:
+  ManagedDeviceEolNotificationTest() {
+    SetUpScopedFeatureListForTestCase(GetParam(), &scoped_feature_list_);
+  }
+
+ protected:
+  EolStatusMixin eol_status_mixin_{&mixin_host_};
+
+  ash::DeviceStateMixin device_state_{
+      &mixin_host_,
+      ash::DeviceStateMixin::State::OOBE_COMPLETED_CLOUD_ENROLLED};
+
+  ash::LoggedInUserMixin logged_in_user_mixin_{
+      &mixin_host_,
+      LoggedInUserMixin::LogInType::kRegular,
+      embedded_test_server(),
+      this,
+      /*should_launch_browser=*/true,
+      AccountId::FromUserEmailGaiaId(policy::PolicyBuilder::kFakeUsername,
+                                     policy::PolicyBuilder::kFakeGaiaId)};
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+// Tests that verify EOL notifications with incentives are not shown for child
+// users.
+class ChildUserEolNotificationTest
+    : public MixinBasedInProcessBrowserTest,
+      public ::testing::WithParamInterface<TestCase> {
+ public:
+  ChildUserEolNotificationTest() {
+    SetUpScopedFeatureListForTestCase(GetParam(), &scoped_feature_list_);
+  }
+
+ protected:
+  EolStatusMixin eol_status_mixin_{&mixin_host_};
+
+  ash::LoggedInUserMixin logged_in_user_mixin_{
+      &mixin_host_,
+      LoggedInUserMixin::LogInType::kChild,
+      embedded_test_server(),
+      this,
+      /*should_launch_browser=*/true,
+      /*account_id=*/absl::nullopt,
+      /*include_initial_user=*/true,
+      /*use_embedded_policy_server=*/false};
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    EolNotificationTest,
+    ::testing::Values(TestCase::kIncentivesDisabled,
+                      TestCase::kIncentivesWithoutOffer,
+                      TestCase::kIncentivesWithOffer,
+                      TestCase::kIncentivesWithOfferAndAUEWarning));
+
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    ManagedDeviceEolNotificationTest,
+    ::testing::Values(TestCase::kIncentivesDisabled,
+                      TestCase::kIncentivesWithoutOffer,
+                      TestCase::kIncentivesWithOffer,
+                      TestCase::kIncentivesWithOfferAndAUEWarning));
+
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    ChildUserEolNotificationTest,
+    ::testing::Values(TestCase::kIncentivesDisabled,
+                      TestCase::kIncentivesWithoutOffer,
+                      TestCase::kIncentivesWithOffer,
+                      TestCase::kIncentivesWithOfferAndAUEWarning));
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest, ShowNotificationForEolApproaching) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"12 May 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+
+  NotificationDisplayServiceWaiter notifications_waiter;
+  logged_in_user_mixin_.LogInUser();
+
+  std::unique_ptr<NotificationDisplayServiceTester>
+      notification_display_service = notifications_waiter.Wait();
+  base::RunLoop().RunUntilIdle();
+
+  absl::optional<message_center::Notification> notification =
+      notification_display_service->GetNotification(kEolNotificationId);
+  ASSERT_TRUE(notification);
+
+  EXPECT_EQ(GetEolApproachingNotificationTitle(u"June 2023"),
+            notification->title());
+  EXPECT_EQ(GetEolApproachingNotificationMessage("June 2023"),
+            notification->message());
+
+  if (NotificationHasClaimButton()) {
+    notification_display_service->SimulateClick(
+        NotificationHandler::Type::TRANSIENT, notification->id(),
+        /*action_id=*/0, /*reply=*/absl::nullopt);
+    content::WebContents* active_contents =
+        chrome::FindLastActive()->tab_strip_model()->GetActiveWebContents();
+    ASSERT_TRUE(active_contents);
+    EXPECT_EQ(ShowsNotificationWithOffer()
+                  ? chrome::kEolIncentiveNotificationOfferURL
+                  : chrome::kEolIncentiveNotificationNoOfferURL,
+              active_contents->GetVisibleURL());
+  }
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest, NoTrayNoticeWhenEolApproaches) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"12 May 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+  logged_in_user_mixin_.LogInUser();
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_FALSE(SystemTrayTestApi().IsBubbleViewVisible(
+      VIEW_ID_QS_EOL_NOTICE_BUTTON, /*open_tray=*/true));
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest,
+                       PRE_EolApproachingNotificationNotReshown) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"12 May 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+
+  NotificationDisplayServiceWaiter notifications_waiter;
+  logged_in_user_mixin_.LogInUser();
+
+  std::unique_ptr<NotificationDisplayServiceTester>
+      notification_display_service = notifications_waiter.Wait();
+  base::RunLoop().RunUntilIdle();
+
+  absl::optional<message_center::Notification> notification =
+      notification_display_service->GetNotification(kEolNotificationId);
+  ASSERT_TRUE(notification);
+  notification_display_service->SimulateClick(
+      NotificationHandler::Type::TRANSIENT, notification->id(),
+      /*action_id=*/0, /*reply=*/absl::nullopt);
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest,
+                       EolApproachingNotificationNotReshown) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"12 May 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+
+  NotificationDisplayServiceWaiter notifications_waiter;
+  logged_in_user_mixin_.LogInUser();
+
+  std::unique_ptr<NotificationDisplayServiceTester>
+      notification_display_service = notifications_waiter.Wait();
+  base::RunLoop().RunUntilIdle();
+
+  absl::optional<message_center::Notification> notification =
+      notification_display_service->GetNotification(kEolNotificationId);
+  EXPECT_FALSE(notification);
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest,
+                       ShowEolApproachingNotificationForNewUsers) {
+  ASSERT_EQ(
+      TimeSetupResult::kSuccess,
+      eol_status_mixin_.SetUpTime(/*now_string=*/"12 May 2023",
+                                  /*eol_string=*/"01 June 2023",
+                                  /*profile_creation_string=*/"01 April 2023"));
+
+  NotificationDisplayServiceWaiter notifications_waiter;
+  logged_in_user_mixin_.LogInUser();
+
+  std::unique_ptr<NotificationDisplayServiceTester>
+      notification_display_service = notifications_waiter.Wait();
+  base::RunLoop().RunUntilIdle();
+
+  absl::optional<message_center::Notification> notification =
+      notification_display_service->GetNotification(kEolNotificationId);
+  ASSERT_TRUE(notification);
+
+  // Users that were created recently are not eligible for incentive
+  // notifications.
+  EXPECT_EQ(u"Updates end June 2023", notification->title());
+
+  notification_display_service->SimulateClick(
+      NotificationHandler::Type::TRANSIENT, notification->id(),
+      /*action_id=*/0, /*reply=*/absl::nullopt);
+  content::WebContents* active_contents =
+      chrome::FindLastActive()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(active_contents);
+  EXPECT_EQ(chrome::kAutoUpdatePolicyURL, active_contents->GetVisibleURL());
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest, ShowRecentEolNotification) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"03 June 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+
+  NotificationDisplayServiceWaiter notifications_waiter;
+  logged_in_user_mixin_.LogInUser();
+
+  std::unique_ptr<NotificationDisplayServiceTester>
+      notification_display_service = notifications_waiter.Wait();
+  base::RunLoop().RunUntilIdle();
+
+  absl::optional<message_center::Notification> notification =
+      notification_display_service->GetNotification(kEolNotificationId);
+  ASSERT_TRUE(notification);
+
+  EXPECT_EQ(GetRecentEolNotificationTitle(), notification->title());
+  EXPECT_EQ(GetRecentEolNotificationMessage(), notification->message());
+
+  if (NotificationHasClaimButton()) {
+    notification_display_service->SimulateClick(
+        NotificationHandler::Type::TRANSIENT, notification->id(),
+        /*action_id=*/0, /*reply=*/absl::nullopt);
+    content::WebContents* active_contents =
+        chrome::FindLastActive()->tab_strip_model()->GetActiveWebContents();
+    ASSERT_TRUE(active_contents);
+    EXPECT_EQ(ShowsNotificationWithOffer()
+                  ? chrome::kEolIncentiveNotificationOfferURL
+                  : chrome::kEolIncentiveNotificationNoOfferURL,
+              active_contents->GetVisibleURL());
+  }
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest,
+                       PRE_RecentEolNotificationNotReshown) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"03 June 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+
+  NotificationDisplayServiceWaiter notifications_waiter;
+  logged_in_user_mixin_.LogInUser();
+
+  std::unique_ptr<NotificationDisplayServiceTester>
+      notification_display_service = notifications_waiter.Wait();
+  base::RunLoop().RunUntilIdle();
+
+  absl::optional<message_center::Notification> notification =
+      notification_display_service->GetNotification(kEolNotificationId);
+  ASSERT_TRUE(notification);
+
+  notification_display_service->SimulateClick(
+      NotificationHandler::Type::TRANSIENT, notification->id(),
+      /*action_id=*/0, /*reply=*/absl::nullopt);
+
+  // Verify quick settings notice still shows.
+  EXPECT_EQ(
+      GetParam() != TestCase::kIncentivesDisabled,
+      SystemTrayTestApi().IsBubbleViewVisible(VIEW_ID_QS_EOL_NOTICE_BUTTON,
+                                              /*open_tray=*/true));
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest, RecentEolNotificationNotReshown) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"03 June 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+
+  NotificationDisplayServiceWaiter notifications_waiter;
+  logged_in_user_mixin_.LogInUser();
+
+  std::unique_ptr<NotificationDisplayServiceTester>
+      notification_display_service = notifications_waiter.Wait();
+  base::RunLoop().RunUntilIdle();
+
+  absl::optional<message_center::Notification> notification =
+      notification_display_service->GetNotification(kEolNotificationId);
+  EXPECT_EQ(GetParam() == TestCase::kIncentivesDisabled, !!notification);
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest, PRE_ShowTrayNoticeSoonAfterEol) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"03 June 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+  logged_in_user_mixin_.LogInUser();
+  base::RunLoop().RunUntilIdle();
+
+  const bool incentives_enabled = GetParam() != TestCase::kIncentivesDisabled;
+  SystemTrayTestApi tray_test_api;
+  ASSERT_EQ(incentives_enabled,
+            tray_test_api.IsBubbleViewVisible(VIEW_ID_QS_EOL_NOTICE_BUTTON,
+                                              /*open_tray=*/true));
+  if (!incentives_enabled) {
+    return;
+  }
+
+  tray_test_api.ClickBubbleView(VIEW_ID_QS_EOL_NOTICE_BUTTON);
+
+  content::WebContents* active_contents =
+      chrome::FindLastActive()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(active_contents);
+  EXPECT_EQ(ShowsNotificationWithOffer()
+                ? chrome::kEolIncentiveNotificationOfferURL
+                : chrome::kEolIncentiveNotificationNoOfferURL,
+            active_contents->GetVisibleURL());
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest, ShowTrayNoticeSoonAfterEol) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"03 June 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+  logged_in_user_mixin_.LogInUser();
+  base::RunLoop().RunUntilIdle();
+
+  SystemTrayTestApi tray_test_api;
+  EXPECT_EQ(GetParam() != TestCase::kIncentivesDisabled,
+            tray_test_api.IsBubbleViewVisible(VIEW_ID_QS_EOL_NOTICE_BUTTON,
+                                              /*open_tray=*/true));
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest, NoTrayNoticeOnLockScreen) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"03 June 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+  logged_in_user_mixin_.LogInUser();
+  base::RunLoop().RunUntilIdle();
+
+  SessionManagerClient::Get()->RequestLockScreen();
+  SessionStateWaiter(session_manager::SessionState::LOCKED).Wait();
+
+  SystemTrayTestApi tray_test_api;
+  EXPECT_FALSE(tray_test_api.IsBubbleViewVisible(VIEW_ID_QS_EOL_NOTICE_BUTTON,
+                                                 /*open_tray=*/true));
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest, NoTrayNoticeBeforeLogin) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"03 June 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+  base::RunLoop().RunUntilIdle();
+
+  SystemTrayTestApi tray_test_api;
+  EXPECT_FALSE(tray_test_api.IsBubbleViewVisible(VIEW_ID_QS_EOL_NOTICE_BUTTON,
+                                                 /*open_tray=*/true));
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest, NoTrayNoticeForNewUsers) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"03 June 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 May 2023"));
+  logged_in_user_mixin_.LogInUser();
+  base::RunLoop().RunUntilIdle();
+
+  SystemTrayTestApi tray_test_api;
+  EXPECT_FALSE(tray_test_api.IsBubbleViewVisible(VIEW_ID_QS_EOL_NOTICE_BUTTON,
+                                                 /*open_tray=*/true));
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest,
+                       ShowRecentEolNotificationForNewUsers) {
+  ASSERT_EQ(
+      TimeSetupResult::kSuccess,
+      eol_status_mixin_.SetUpTime(/*now_string=*/"03 June 2023",
+                                  /*eol_string=*/"01 June 2023",
+                                  /*profile_creation_string=*/"05 May 2023"));
+
+  NotificationDisplayServiceWaiter notifications_waiter;
+  logged_in_user_mixin_.LogInUser();
+
+  std::unique_ptr<NotificationDisplayServiceTester>
+      notification_display_service = notifications_waiter.Wait();
+  base::RunLoop().RunUntilIdle();
+
+  absl::optional<message_center::Notification> notification =
+      notification_display_service->GetNotification(kEolNotificationId);
+  ASSERT_TRUE(notification);
+
+  // Recently created users are not eligible for incentives notifications.
+  EXPECT_EQ(u"Final software update", notification->title());
+
+  notification_display_service->SimulateClick(
+      NotificationHandler::Type::TRANSIENT, notification->id(),
+      /*action_id=*/0, /*reply=*/absl::nullopt);
+  content::WebContents* active_contents =
+      chrome::FindLastActive()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(active_contents);
+  EXPECT_EQ(chrome::kEolNotificationURL, active_contents->GetVisibleURL());
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest, ShowNonRecentEolNotification) {
+  ASSERT_EQ(
+      TimeSetupResult::kSuccess,
+      eol_status_mixin_.SetUpTime(/*now_string=*/"03 July 2023",
+                                  /*eol_string=*/"01 June 2023",
+                                  /*profile_creation_string=*/"05 May 2020"));
+
+  NotificationDisplayServiceWaiter notifications_waiter;
+  logged_in_user_mixin_.LogInUser();
+
+  std::unique_ptr<NotificationDisplayServiceTester>
+      notification_display_service = notifications_waiter.Wait();
+  base::RunLoop().RunUntilIdle();
+
+  absl::optional<message_center::Notification> notification =
+      notification_display_service->GetNotification(kEolNotificationId);
+  ASSERT_TRUE(notification);
+
+  // Users should not see incentivized notification if they log in long after
+  // EOL.
+  EXPECT_EQ(u"Final software update", notification->title());
+
+  notification_display_service->SimulateClick(
+      NotificationHandler::Type::TRANSIENT, notification->id(),
+      /*action_id=*/0, /*reply=*/absl::nullopt);
+  content::WebContents* active_contents =
+      chrome::FindLastActive()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(active_contents);
+  EXPECT_EQ(chrome::kEolNotificationURL, active_contents->GetVisibleURL());
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest, PRE_ShowTrayNoticeLongAfterEol) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"03 August 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+  logged_in_user_mixin_.LogInUser();
+  base::RunLoop().RunUntilIdle();
+
+  const bool incentives_enabled = GetParam() != TestCase::kIncentivesDisabled;
+  SystemTrayTestApi tray_test_api;
+  ASSERT_EQ(incentives_enabled,
+            tray_test_api.IsBubbleViewVisible(VIEW_ID_QS_EOL_NOTICE_BUTTON,
+                                              /*open_tray=*/true));
+  if (!incentives_enabled) {
+    return;
+  }
+
+  tray_test_api.ClickBubbleView(VIEW_ID_QS_EOL_NOTICE_BUTTON);
+
+  content::WebContents* active_contents =
+      chrome::FindLastActive()->tab_strip_model()->GetActiveWebContents();
+  ASSERT_TRUE(active_contents);
+  EXPECT_EQ(chrome::kEolIncentiveNotificationNoOfferURL,
+            active_contents->GetVisibleURL());
+}
+
+IN_PROC_BROWSER_TEST_P(EolNotificationTest, ShowTrayNoticeLongAfterEol) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"03 August 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+  logged_in_user_mixin_.LogInUser();
+  base::RunLoop().RunUntilIdle();
+
+  SystemTrayTestApi tray_test_api;
+  EXPECT_EQ(GetParam() != TestCase::kIncentivesDisabled,
+            tray_test_api.IsBubbleViewVisible(VIEW_ID_QS_EOL_NOTICE_BUTTON,
+                                              /*open_tray=*/true));
+}
+
+IN_PROC_BROWSER_TEST_P(ManagedDeviceEolNotificationTest,
+                       NoEolApproachingNotification) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"12 May 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+
+  NotificationDisplayServiceWaiter notifications_waiter;
+  logged_in_user_mixin_.LogInUser();
+
+  std::unique_ptr<NotificationDisplayServiceTester>
+      notification_display_service = notifications_waiter.Wait();
+  base::RunLoop().RunUntilIdle();
+
+  absl::optional<message_center::Notification> notification =
+      notification_display_service->GetNotification(kEolNotificationId);
+  EXPECT_FALSE(notification);
+}
+
+IN_PROC_BROWSER_TEST_P(ManagedDeviceEolNotificationTest,
+                       NoEolPassedNotification) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"03 June 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+
+  NotificationDisplayServiceWaiter notifications_waiter;
+  logged_in_user_mixin_.LogInUser();
+
+  std::unique_ptr<NotificationDisplayServiceTester>
+      notification_display_service = notifications_waiter.Wait();
+  base::RunLoop().RunUntilIdle();
+
+  absl::optional<message_center::Notification> notification =
+      notification_display_service->GetNotification(kEolNotificationId);
+  EXPECT_FALSE(notification);
+}
+
+IN_PROC_BROWSER_TEST_P(ManagedDeviceEolNotificationTest, NoTrayNotice) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"03 June 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+  logged_in_user_mixin_.LogInUser();
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_FALSE(SystemTrayTestApi().IsBubbleViewVisible(
+      VIEW_ID_QS_EOL_NOTICE_BUTTON, /*open_tray=*/true));
+}
+
+IN_PROC_BROWSER_TEST_P(ChildUserEolNotificationTest,
+                       NoEolApproachingNotification) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"12 May 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+
+  NotificationDisplayServiceWaiter notifications_waiter;
+  logged_in_user_mixin_.LogInUser();
+
+  std::unique_ptr<NotificationDisplayServiceTester>
+      notification_display_service = notifications_waiter.Wait();
+  base::RunLoop().RunUntilIdle();
+
+  absl::optional<message_center::Notification> notification =
+      notification_display_service->GetNotification(kEolNotificationId);
+  ASSERT_TRUE(notification);
+
+  EXPECT_EQ(u"Updates end June 2023", notification->title());
+}
+
+IN_PROC_BROWSER_TEST_P(ChildUserEolNotificationTest, NoEolPassedNotification) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"03 June 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+
+  NotificationDisplayServiceWaiter notifications_waiter;
+  logged_in_user_mixin_.LogInUser();
+
+  std::unique_ptr<NotificationDisplayServiceTester>
+      notification_display_service = notifications_waiter.Wait();
+  base::RunLoop().RunUntilIdle();
+
+  absl::optional<message_center::Notification> notification =
+      notification_display_service->GetNotification(kEolNotificationId);
+  ASSERT_TRUE(notification);
+
+  EXPECT_EQ(u"Final software update", notification->title());
+}
+
+IN_PROC_BROWSER_TEST_P(ChildUserEolNotificationTest, NoTrayNotice) {
+  ASSERT_EQ(TimeSetupResult::kSuccess,
+            eol_status_mixin_.SetUpTime(
+                /*now_string=*/"03 June 2023", /*eol_string=*/"01 June 2023",
+                /*profile_creation_string=*/"05 December 2021"));
+  logged_in_user_mixin_.LogInUser();
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_FALSE(SystemTrayTestApi().IsBubbleViewVisible(
+      VIEW_ID_QS_EOL_NOTICE_BUTTON, /*open_tray=*/true));
+}
+
+}  // namespace ash
diff --git a/chrome/browser/ash/guest_os/guest_os_launcher.cc b/chrome/browser/ash/guest_os/guest_os_launcher.cc
index 7d69e47d..7ef3ffa 100644
--- a/chrome/browser/ash/guest_os/guest_os_launcher.cc
+++ b/chrome/browser/ash/guest_os/guest_os_launcher.cc
@@ -172,4 +172,46 @@
   }
 }
 
+void LaunchApplication(Profile* profile,
+                       const guest_os::GuestId& guest_id,
+                       std::string desktop_file_id,
+                       const std::vector<std::string>& files,
+                       bool display_scaled,
+                       SuccessCallback callback) {
+  vm_tools::cicerone::LaunchContainerApplicationRequest request;
+  request.set_owner_id(crostini::CryptohomeIdForProfile(profile));
+  request.set_vm_name(guest_id.vm_name);
+  request.set_container_name(guest_id.container_name);
+  request.set_desktop_file_id(std::move(desktop_file_id));
+  if (display_scaled) {
+    request.set_display_scaling(
+        vm_tools::cicerone::LaunchContainerApplicationRequest::SCALED);
+  }
+  base::ranges::copy(files, google::protobuf::RepeatedFieldBackInserter(
+                                request.mutable_files()));
+
+  const std::vector<vm_tools::cicerone::ContainerFeature> container_features =
+      crostini::GetContainerFeatures();
+  request.mutable_container_features()->Add(container_features.begin(),
+                                            container_features.end());
+
+  ash::CiceroneClient::Get()->LaunchContainerApplication(
+      std::move(request),
+      base::BindOnce(
+          [](SuccessCallback callback,
+             absl::optional<
+                 vm_tools::cicerone::LaunchContainerApplicationResponse>
+                 response) {
+            if (!response) {
+              std::move(callback).Run(/*success=*/false,
+                                      "Failed to launch application. Empty "
+                                      "LaunchContainerApplicationResponse.");
+              return;
+            }
+            std::move(callback).Run(response->success(),
+                                    response->failure_reason());
+          },
+          std::move(callback)));
+}
+
 }  // namespace guest_os::launcher
diff --git a/chrome/browser/ash/guest_os/guest_os_launcher.h b/chrome/browser/ash/guest_os/guest_os_launcher.h
index 5b2a793..62f15d8 100644
--- a/chrome/browser/ash/guest_os/guest_os_launcher.h
+++ b/chrome/browser/ash/guest_os/guest_os_launcher.h
@@ -5,9 +5,14 @@
 #ifndef CHROME_BROWSER_ASH_GUEST_OS_GUEST_OS_LAUNCHER_H_
 #define CHROME_BROWSER_ASH_GUEST_OS_GUEST_OS_LAUNCHER_H_
 
+#include <string>
+#include <vector>
+
 #include "chrome/browser/ash/borealis/infra/expected.h"
+#include "chrome/browser/ash/guest_os/guest_id.h"
 #include "chromeos/ash/components/dbus/vm_launch/launch.pb.h"
 
+class Profile;
 namespace guest_os::launcher {
 
 using ResponseType =
@@ -15,9 +20,23 @@
 
 using LaunchCallback = base::OnceCallback<void(ResponseType)>;
 
+using SuccessCallback =
+    base::OnceCallback<void(bool success, const std::string& failure_reason)>;
+
+// Launched the VM if necessary, then runs the callback on both success and
+// failure.
 void EnsureLaunched(const vm_tools::launch::EnsureVmLaunchedRequest& request,
                     LaunchCallback response_callback);
 
+// Asynchronously launches an app as specified by its desktop file id, in the
+// specified guest, then runs the callback.
+void LaunchApplication(Profile* profile,
+                       const guest_os::GuestId& guest_id,
+                       std::string desktop_file_id,
+                       const std::vector<std::string>& files,
+                       bool display_scaled,
+                       SuccessCallback callback);
+
 }  // namespace guest_os::launcher
 
 #endif  // CHROME_BROWSER_ASH_GUEST_OS_GUEST_OS_LAUNCHER_H_
diff --git a/chrome/browser/ash/input_method/ime_service_connector.cc b/chrome/browser/ash/input_method/ime_service_connector.cc
index e1c03e7..31fa582a 100644
--- a/chrome/browser/ash/input_method/ime_service_connector.cc
+++ b/chrome/browser/ash/input_method/ime_service_connector.cc
@@ -169,6 +169,15 @@
     return;
   }
 
+  // If the currently active request does not match the url being requested,
+  // then revert to the previous logic of dropping new requests while the
+  // current request is in progress.
+  if (url_loader_) {
+    base::FilePath empty_path;
+    std::move(callback).Run(empty_path);
+    return;
+  }
+
   // Reset the download context before triggering a new download request.
   active_request_url_ = url.spec();
   download_callbacks_.clear();
@@ -182,6 +191,7 @@
 }
 
 void ImeServiceConnector::HandleDownloadResponse(base::FilePath file_path) {
+  // Notify any download callbacks registered for the current request.
   base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
       FROM_HERE,
       base::BindOnce(&ImeServiceConnector::NotifyAllDownloadListeners,
@@ -193,6 +203,10 @@
     std::move(download_callbacks_.back()).Run(file_path);
     download_callbacks_.pop_back();
   }
+
+  // Clear the currently active request info.
+  url_loader_.reset();
+  active_request_url_ = absl::nullopt;
 }
 
 }  // namespace input_method
diff --git a/chrome/browser/ash/login/session/user_session_manager.cc b/chrome/browser/ash/login/session/user_session_manager.cc
index 1782159..fd09418a 100644
--- a/chrome/browser/ash/login/session/user_session_manager.cc
+++ b/chrome/browser/ash/login/session/user_session_manager.cc
@@ -2154,7 +2154,11 @@
   std::map<Profile*, std::unique_ptr<EolNotification>, ProfileCompare>::iterator
       iter = eol_notification_handler_.find(profile);
   if (iter == eol_notification_handler_.end()) {
-    auto eol_notification = std::make_unique<EolNotification>(profile);
+    auto eol_notification =
+        eol_notification_handler_test_factory_.is_null()
+            ? std::make_unique<EolNotification>(profile)
+            : eol_notification_handler_test_factory_.Run(profile);
+
     iter = eol_notification_handler_
                .insert(std::make_pair(profile, std::move(eol_notification)))
                .first;
@@ -2416,6 +2420,12 @@
       ->MaybeShowReleaseNotesNotification();
 }
 
+void UserSessionManager::SetEolNotificationHandlerFactoryForTesting(
+    const EolNotificationHandlerFactoryCallback&
+        eol_notification_handler_factory) {
+  eol_notification_handler_test_factory_ = eol_notification_handler_factory;
+}
+
 base::WeakPtr<UserSessionManager>
 UserSessionManager::GetUserSessionManagerAsWeakPtr() {
   return weak_factory_.GetWeakPtr();
diff --git a/chrome/browser/ash/login/session/user_session_manager.h b/chrome/browser/ash/login/session/user_session_manager.h
index c80aa203..81f91901 100644
--- a/chrome/browser/ash/login/session/user_session_manager.h
+++ b/chrome/browser/ash/login/session/user_session_manager.h
@@ -338,6 +338,12 @@
   // milestone.
   void MaybeShowHelpAppDiscoverNotification(Profile* profile);
 
+  using EolNotificationHandlerFactoryCallback =
+      base::RepeatingCallback<std::unique_ptr<EolNotification>(
+          Profile* profile)>;
+  void SetEolNotificationHandlerFactoryForTesting(
+      const EolNotificationHandlerFactoryCallback& eol_notification_factory);
+
   base::WeakPtr<UserSessionManager> GetUserSessionManagerAsWeakPtr();
 
  protected:
@@ -630,6 +636,9 @@
   std::unique_ptr<OnboardingUserActivityCounter>
       onboarding_user_activity_counter_;
 
+  // Callback that allows tests to inject a test EolNotification implementation.
+  EolNotificationHandlerFactoryCallback eol_notification_handler_test_factory_;
+
   base::WeakPtrFactory<UserSessionManager> weak_factory_{this};
 };
 
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index cfbed0fd..8f08129 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -3333,7 +3333,8 @@
     return false;
 
   switch (operation) {
-    case AttributionReportingOperation::kSource: {
+    case AttributionReportingOperation::kSource:
+    case AttributionReportingOperation::kOsSource: {
       DCHECK(source_origin);
       DCHECK(reporting_origin);
       bool allowed = privacy_sandbox_settings->IsAttributionReportingAllowed(
@@ -3351,7 +3352,8 @@
       DCHECK(reporting_origin);
       return privacy_sandbox_settings->IsAttributionReportingAllowed(
           *source_origin, *reporting_origin);
-    case AttributionReportingOperation::kTrigger: {
+    case AttributionReportingOperation::kTrigger:
+    case AttributionReportingOperation::kOsTrigger: {
       DCHECK(destination_origin);
       DCHECK(reporting_origin);
       bool allowed = privacy_sandbox_settings->IsAttributionReportingAllowed(
diff --git a/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc b/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
index bcc0c014..5901c9a 100644
--- a/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
+++ b/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
@@ -392,15 +392,18 @@
 }
 
 void OnWebAppInstallabilityChecked(
-    Profile* profile,
+    base::WeakPtr<Profile> profile,
     InstallOrLaunchWebAppCallback callback,
     std::unique_ptr<content::WebContents> web_contents,
     InstallableCheckResult result,
     absl::optional<web_app::AppId> app_id) {
+  if (!profile) {
+    return;
+  }
   switch (result) {
     case InstallableCheckResult::kAlreadyInstalled:
       DCHECK(app_id);
-      LaunchWebApp(*app_id, profile);
+      LaunchWebApp(*app_id, profile.get());
       std::move(callback).Run(InstallOrLaunchWebAppResult::kSuccess);
       return;
     case InstallableCheckResult::kNotInstallable:
@@ -408,7 +411,7 @@
       return;
     case InstallableCheckResult::kInstallable:
       content::WebContents* containing_contents = web_contents.get();
-      chrome::ScopedTabbedBrowserDisplayer displayer(profile);
+      chrome::ScopedTabbedBrowserDisplayer displayer(profile.get());
       const GURL& url = web_contents->GetLastCommittedURL();
       chrome::AddWebContents(displayer.browser(), nullptr,
                              std::move(web_contents), url,
@@ -589,7 +592,7 @@
       web_contents->GetWeakPtr();
   provider->scheduler().FetchInstallabilityForChromeManagement(
       web_app_url, web_contents_ptr,
-      base::BindOnce(&OnWebAppInstallabilityChecked, profile,
+      base::BindOnce(&OnWebAppInstallabilityChecked, profile->GetWeakPtr(),
                      std::move(callback), std::move(web_contents)));
 }
 
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/signinbottomsheet/SigninBottomSheetCoordinator.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/signinbottomsheet/SigninBottomSheetCoordinator.java
index b523280..d863a28 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/signinbottomsheet/SigninBottomSheetCoordinator.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/signinbottomsheet/SigninBottomSheetCoordinator.java
@@ -24,6 +24,7 @@
 import org.chromium.components.signin.base.GoogleServiceAuthError;
 import org.chromium.components.signin.identitymanager.AccountInfoServiceProvider;
 import org.chromium.ui.base.WindowAndroid;
+import org.chromium.ui.widget.Toast;
 
 /** Coordinator for displaying the signin flow in the bottom sheet. */
 public class SigninBottomSheetCoordinator implements AccountPickerDelegate {
@@ -31,6 +32,7 @@
     private final WindowAndroid mWindowAndroid;
     private final BottomSheetController mController;
     private final SigninManager mSigninManager;
+    private boolean mSetTestToast;
     private AccountPickerBottomSheetCoordinator mAccountPickerBottomSheetCoordinator;
 
     public SigninBottomSheetCoordinator(
@@ -39,6 +41,7 @@
         mController = controller;
         mProfile = profile;
         mSigninManager = IdentityServicesProvider.get().getSigninManager(mProfile);
+        mSetTestToast = false;
     }
 
     @Override
@@ -49,26 +52,33 @@
             String accountEmail, Callback<GoogleServiceAuthError> onSignInErrorCallback) {
         Account account = AccountUtils.createAccountFromName(accountEmail);
         AccountInfoServiceProvider.get().getAccountInfoByEmail(accountEmail).then(accountInfo -> {
-            mSigninManager.signin(account, new SigninManager.SignInCallback() {
-                @Override
-                public void onSignInComplete() {
-                    RecordHistogram.recordBooleanHistogram(
-                            "ContentSuggestions.Feed.SignInFromFeedAction.SignInSuccessful", true);
-                    mController.hideContent(mController.getCurrentSheetContent(), true);
-                }
+            if (mSigninManager.isSigninAllowed()) {
+                mSigninManager.signin(account, new SigninManager.SignInCallback() {
+                    @Override
+                    public void onSignInComplete() {
+                        RecordHistogram.recordBooleanHistogram(
+                                "ContentSuggestions.Feed.SignInFromFeedAction.SignInSuccessful",
+                                true);
+                        mController.hideContent(mController.getCurrentSheetContent(), true);
+                    }
 
-                @Override
-                public void onSignInAborted() {
-                    RecordHistogram.recordBooleanHistogram(
-                            "ContentSuggestions.Feed.SignInFromFeedAction.SignInSuccessful", false);
-                    // onSignInErrorCallback is called by the WebSigninBridge which is not
-                    // implemented in this signin flow as we do not need to wait for cookies to
-                    // propagate before proceeding with the Feed refresh. Instead of calling
-                    // AccountPickerBottomSheetMediator.onSigninFailed() from the signin bridge we
-                    // directly perform the creation of the "try again" bottom sheet view:
-                    mAccountPickerBottomSheetCoordinator.setTryAgainBottomSheetView();
-                }
-            });
+                    @Override
+                    public void onSignInAborted() {
+                        RecordHistogram.recordBooleanHistogram(
+                                "ContentSuggestions.Feed.SignInFromFeedAction.SignInSuccessful",
+                                false);
+                        // onSignInErrorCallback is called by the WebSigninBridge which is not
+                        // implemented in this signin flow as we do not need to wait for cookies to
+                        // propagate before proceeding with the Feed refresh. Instead of calling
+                        // AccountPickerBottomSheetMediator.onSigninFailed() from the signin bridge
+                        // we directly perform the creation of the "try again" bottom sheet view:
+                        mAccountPickerBottomSheetCoordinator.setTryAgainBottomSheetView();
+                    }
+                });
+            } else {
+                makeSigninNotAllowedToast();
+                mController.hideContent(mController.getCurrentSheetContent(), true);
+            }
         });
     }
 
@@ -82,6 +92,13 @@
                 mWindowAndroid, mController, this, new BottomSheetStrings());
     }
 
+    private void makeSigninNotAllowedToast() {
+        if (mSetTestToast) return;
+        Toast.makeText(mWindowAndroid.getActivity().get(),
+                     R.string.sign_in_to_chrome_disabled_by_user_summary, Toast.LENGTH_SHORT)
+                .show();
+    }
+
     @VisibleForTesting
     public View getBottomSheetViewForTesting() {
         return mAccountPickerBottomSheetCoordinator.getBottomSheetViewForTesting();
@@ -93,6 +110,11 @@
         this.mAccountPickerBottomSheetCoordinator = accountPickerBottomSheetCoordinator;
     }
 
+    @VisibleForTesting
+    public void setToastOverrideForTesting() {
+        this.mSetTestToast = true;
+    }
+
     /** Stores bottom sheet strings for signin from back of card entry point */
     public static class BottomSheetStrings implements AccountPickerBottomSheetStrings {
         /** Returns the title string for the bottom sheet dialog. */
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/signinbottomsheet/SigninBottomSheetCoordinatorTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/signinbottomsheet/SigninBottomSheetCoordinatorTest.java
index 06cc87f..37010a7 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/signinbottomsheet/SigninBottomSheetCoordinatorTest.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/signinbottomsheet/SigninBottomSheetCoordinatorTest.java
@@ -8,6 +8,7 @@
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -28,6 +29,7 @@
 import org.chromium.chrome.browser.signin.services.SigninManager;
 import org.chromium.chrome.browser.ui.signin.account_picker.AccountPickerBottomSheetCoordinator;
 import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule;
+import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.signin.AccountUtils;
 import org.chromium.components.signin.base.CoreAccountInfo;
@@ -49,6 +51,9 @@
     private BottomSheetController mBottomSheetControllerMock;
 
     @Mock
+    private BottomSheetContent mBottomSheetContentMock;
+
+    @Mock
     private WindowAndroid mWindowAndroidMock;
 
     @Mock
@@ -71,6 +76,7 @@
         IdentityServicesProvider.setInstanceForTests(mock(IdentityServicesProvider.class));
         when(IdentityServicesProvider.get().getSigninManager(mProfileMock))
                 .thenReturn(mSigninManagerMock);
+        when(mSigninManagerMock.isSigninAllowed()).thenReturn(true);
         mCoreAccountInfo = mAccountManagerTestRule.addAccount(TEST_EMAIL);
         mSigninCoordinator = new SigninBottomSheetCoordinator(
                 mWindowAndroidMock, mBottomSheetControllerMock, mProfileMock);
@@ -109,4 +115,13 @@
         mSigninCoordinator.signIn(TEST_EMAIL, error -> {});
         histogramWatcher.assertExpected();
     }
+
+    @Test
+    public void testSignInNotAllowed() {
+        when(mSigninManagerMock.isSigninAllowed()).thenReturn(false);
+        mSigninCoordinator.setToastOverrideForTesting();
+        mSigninCoordinator.signIn(TEST_EMAIL, error -> {});
+        verify(mSigninManagerMock, never())
+                .signin(eq(AccountUtils.createAccountFromName(TEST_EMAIL)), any());
+    }
 }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 34f915c..8c044f9 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -544,6 +544,11 @@
     "expiry_milestone": 116
   },
   {
+    "name": "autofill-enable-payments-mandatory-reauth",
+    "owners": [ "vinnypersky@google.com", "sujiezhu@google.com" ],
+    "expiry_milestone": 125
+  },
+  {
     "name": "autofill-enable-ranking-formula-address-profiles",
     "owners": [ "alexandertekle@google.com", "koerber@google.com" ],
     "expiry_milestone": 120
@@ -3609,6 +3614,11 @@
     "expiry_milestone": 83
   },
   {
+    "name": "exo-consumed-by-ime-by-flag",
+    "owners": [ "hidehiko" ],
+    "expiry_milestone": 120
+  },
+  {
     "name": "exo-gamepad-vibration",
     "owners": [ "prabirmsp" ],
     "expiry_milestone": 90
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index dd747bf..34332d9d 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -425,6 +425,13 @@
     "When enabled, offers will be displayed in the keyboard accessory when "
     "available.";
 
+const char kAutofillEnablePaymentsMandatoryReauthName[] =
+    "Enable mandatory re-auth for payments autofill";
+const char kAutofillEnablePaymentsMandatoryReauthDescription[] =
+    "When enabled, in use-cases where we would not have triggered any "
+    "user-visible authentication to autofill payment methods, we will trigger "
+    "a device authentication.";
+
 const char kAutofillEnableRankingFormulaAddressProfilesName[] =
     "Enable new Autofill suggestion ranking formula for profiles";
 const char kAutofillEnableRankingFormulaAddressProfilesDescription[] =
@@ -5577,6 +5584,12 @@
 const char kEolIncentiveDescription[] =
     "Allows end of life incentives to be shown within the system ui.";
 
+const char kExoConsumedByImeByFlagName[] =
+    "Use the consumed bit from IME in exo";
+const char kExoConsumedByImeByFlagDescription[] =
+    "To see whether a key event is consumed or not, this let exo to use a bit"
+    " from IME directly, instead of using heuristics based on key code etc.";
+
 const char kExoGamepadVibrationName[] = "Gamepad Vibration for Exo Clients";
 const char kExoGamepadVibrationDescription[] =
     "Allow Exo clients like Android to request vibration events for gamepads "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 441bd3e..43aa66e 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -244,6 +244,9 @@
 extern const char kAutofillEnableOffersInClankKeyboardAccessoryName[];
 extern const char kAutofillEnableOffersInClankKeyboardAccessoryDescription[];
 
+extern const char kAutofillEnablePaymentsMandatoryReauthName[];
+extern const char kAutofillEnablePaymentsMandatoryReauthDescription[];
+
 extern const char kAutofillEnableRankingFormulaAddressProfilesName[];
 extern const char kAutofillEnableRankingFormulaAddressProfilesDescription[];
 
@@ -3199,6 +3202,9 @@
 extern const char kEolResetDismissedPrefsName[];
 extern const char kEolResetDismissedPrefsDescription[];
 
+extern const char kExoConsumedByImeByFlagName[];
+extern const char kExoConsumedByImeByFlagDescription[];
+
 extern const char kExoGamepadVibrationName[];
 extern const char kExoGamepadVibrationDescription[];
 
diff --git a/chrome/browser/policy/messaging_layer/upload/file_upload_impl.cc b/chrome/browser/policy/messaging_layer/upload/file_upload_impl.cc
index 9fcb203..5e09feb 100644
--- a/chrome/browser/policy/messaging_layer/upload/file_upload_impl.cc
+++ b/chrome/browser/policy/messaging_layer/upload/file_upload_impl.cc
@@ -62,14 +62,6 @@
 constexpr char kUploadProtocolHeader[] = "X-Goog-Upload-Protocol";
 constexpr char kUploadIdHeader[] = "X-GUploader-UploadID";
 
-// Deletes original file (called on a thread pool upon successful upload).
-void DeleteOriginalFile(const std::string origin_path) {
-  const auto delete_result = base::DeleteFile(base::FilePath(origin_path));
-  if (!delete_result) {
-    LOG(WARNING) << "Failed to delete file=" << origin_path;
-  }
-}
-
 // Helper for network response, headers analysis and status retrieval.
 StatusOr<std::string> CheckResponseAndGetStatus(
     const std::unique_ptr<::network::SimpleURLLoader> url_loader,
@@ -783,11 +775,6 @@
       return;
     }
 
-    // Delete file upon success (on a thread pool, don't wait for completion).
-    base::ThreadPool::PostTask(
-        FROM_HERE, {base::TaskPriority::BEST_EFFORT, base::MayBlock()},
-        base::BindOnce(&DeleteOriginalFile, std::string(origin_path_)));
-
     Complete(base::StrCat({"Upload_id=", upload_id}));
   }
 
@@ -996,6 +983,13 @@
   (new FinalContext(session_token, GetWeakPtr(), std::move(result_cb)))->Run();
 }
 
+void FileUploadDelegate::DoDeleteFile(base::StringPiece origin_path) {
+  const auto delete_result = base::DeleteFile(base::FilePath(origin_path));
+  if (!delete_result) {
+    LOG(WARNING) << "Failed to delete file=" << origin_path;
+  }
+}
+
 base::WeakPtr<FileUploadDelegate> FileUploadDelegate::GetWeakPtr() {
   return weak_ptr_factory_.GetWeakPtr();
 }
diff --git a/chrome/browser/policy/messaging_layer/upload/file_upload_impl.h b/chrome/browser/policy/messaging_layer/upload/file_upload_impl.h
index 2d38190..2c8988d 100644
--- a/chrome/browser/policy/messaging_layer/upload/file_upload_impl.h
+++ b/chrome/browser/policy/messaging_layer/upload/file_upload_impl.h
@@ -64,6 +64,8 @@
       base::OnceCallback<void(StatusOr<std::string /*access_parameters*/>)> cb)
       override;
 
+  void DoDeleteFile(base::StringPiece origin_path) override;
+
   // Called once authentication is finished (with token or failure status).
   void OnAccessTokenResult(
       base::StringPiece origin_path,
diff --git a/chrome/browser/policy/messaging_layer/upload/file_upload_impl_unittest.cc b/chrome/browser/policy/messaging_layer/upload/file_upload_impl_unittest.cc
index 4c1c452..a37c2c11 100644
--- a/chrome/browser/policy/messaging_layer/upload/file_upload_impl_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/upload/file_upload_impl_unittest.cc
@@ -340,10 +340,6 @@
                 }));
   }
 
-  void EnsureOriginFileIsErased() {
-    task_environment_.RunUntilIdle();  // Let file deletion finish.
-    EXPECT_FALSE(base::PathExists(origin_path_));
-  }
   std::string origin_path() const { return origin_path_.MaybeAsASCII(); }
 
   content::BrowserTaskEnvironment task_environment_{
@@ -885,8 +881,6 @@
   ASSERT_OK(result) << result.status();
   ASSERT_THAT(result.ValueOrDie(),
               StrEq(base::StrCat({"Upload_id=", kUploadId})));
-
-  EnsureOriginFileIsErased();
 }
 
 TEST_F(FileUploadDelegateTest, FinishFailures) {
@@ -1005,4 +999,13 @@
               Property(&Status::error_message, "No upload ID returned")));
   }
 }
+
+TEST_F(FileUploadDelegateTest, DeleteFile) {
+  // Prepare the delegate.
+  std::unique_ptr<FileUploadJob::Delegate> delegate =
+      PrepareFileUploadDelegate();
+
+  delegate->DoDeleteFile(origin_path());
+  EXPECT_FALSE(base::PathExists(base::FilePath(origin_path())));
+}
 }  // namespace reporting
diff --git a/chrome/browser/policy/messaging_layer/upload/file_upload_job.cc b/chrome/browser/policy/messaging_layer/upload/file_upload_job.cc
index d91e4d13..7149d13 100644
--- a/chrome/browser/policy/messaging_layer/upload/file_upload_job.cc
+++ b/chrome/browser/policy/messaging_layer/upload/file_upload_job.cc
@@ -277,10 +277,43 @@
 
 FileUploadJob::~FileUploadJob() = default;
 
+base::ScopedClosureRunner FileUploadJob::CompletionCb(
+    base::OnceClosure done_cb) {
+  return base::ScopedClosureRunner(
+      base::BindPostTaskToCurrentDefault(base::BindOnce(
+          [](base::WeakPtr<FileUploadJob> job, base::OnceClosure done_cb) {
+            // If `job` has not been destructed yet,
+            // analyze its status and delete the file, if it has completed with
+            // success or the last retry failed.
+            if (job) {
+              DCHECK_CALLED_ON_VALID_SEQUENCE(job->job_sequence_checker_);
+              DCHECK(job->event_helper_)
+                  << "Event must be associated with the job";
+              if (!job->tracker_.access_parameters().empty() ||  // success
+                  (job->tracker_.has_status() &&
+                   job->settings_.retry_count() <= 0)) {  // last retry
+                // Perform deletion on a thread pool, do not wait for completion
+                // and do not report the outcome.
+                base::ThreadPool::PostTask(
+                    FROM_HERE,
+                    {base::TaskPriority::BEST_EFFORT, base::MayBlock()},
+                    base::BindOnce(&Delegate::DoDeleteFile,
+                                   base::Unretained(job->delegate_),
+                                   std::string(job->settings_.origin_path())));
+              }
+            }
+            // Execute the callback regardless of whether the `job` exists or
+            // not.
+            std::move(done_cb).Run();
+          },
+          weak_ptr_factory_.GetWeakPtr(), std::move(done_cb))));
+}
+
 void FileUploadJob::Initiate(base::OnceClosure done_cb) {
-  base::ScopedClosureRunner done(std::move(done_cb));
   DCHECK_CALLED_ON_VALID_SEQUENCE(job_sequence_checker_);
   DCHECK(event_helper_) << "Event must be associated with the job";
+  base::ScopedClosureRunner done(
+      FileUploadJob::CompletionCb(std::move(done_cb)));
   if (tracker_.has_status()) {
     // Error detected earlier.
     return;
@@ -338,9 +371,10 @@
 
 void FileUploadJob::NextStep(const ScopedReservation& scoped_reservation,
                              base::OnceClosure done_cb) {
-  base::ScopedClosureRunner done(std::move(done_cb));
   DCHECK_CALLED_ON_VALID_SEQUENCE(job_sequence_checker_);
   DCHECK(event_helper_) << "Event must be associated with the job";
+  base::ScopedClosureRunner done(
+      FileUploadJob::CompletionCb(std::move(done_cb)));
   if (tracker_.has_status()) {
     // Error detected earlier.
     return;
@@ -406,9 +440,10 @@
 }
 
 void FileUploadJob::Finalize(base::OnceClosure done_cb) {
-  base::ScopedClosureRunner done(std::move(done_cb));
   DCHECK_CALLED_ON_VALID_SEQUENCE(job_sequence_checker_);
   DCHECK(event_helper_) << "Event must be associated with the job";
+  base::ScopedClosureRunner done(
+      FileUploadJob::CompletionCb(std::move(done_cb)));
   if (tracker_.has_status()) {
     // Error detected earlier.
     return;
diff --git a/chrome/browser/policy/messaging_layer/upload/file_upload_job.h b/chrome/browser/policy/messaging_layer/upload/file_upload_job.h
index f8ef1a2..7423dc80 100644
--- a/chrome/browser/policy/messaging_layer/upload/file_upload_job.h
+++ b/chrome/browser/policy/messaging_layer/upload/file_upload_job.h
@@ -78,6 +78,11 @@
         base::OnceCallback<void(StatusOr<std::string /*access_parameters*/>)>
             cb) = 0;
 
+    // Asynchronously deletes the original file (either upon success, or when
+    // the failure happened when `retry_count` dropped to 0). Doesn't wait for
+    // completion and doesn't report the outcome.
+    virtual void DoDeleteFile(base::StringPiece origin_path) = 0;
+
    protected:
     Delegate() = default;
   };
@@ -223,6 +228,11 @@
   void DoneFinalize(base::ScopedClosureRunner done,
                     StatusOr<std::string /*access_parameters*/> result);
 
+  // Creates scoped closure runner that augments `done_cb` with the ability to
+  // asynchronously delete the original file upon success or the failure that
+  // happened when `retry_count` dropped to 0.
+  base::ScopedClosureRunner CompletionCb(base::OnceClosure done_cb);
+
   // Post event.
   static void AddRecordToStorage(Priority priority,
                                  Record record_copy,
diff --git a/chrome/browser/policy/messaging_layer/upload/file_upload_job_unittest.cc b/chrome/browser/policy/messaging_layer/upload/file_upload_job_unittest.cc
index 2cb6e3b3..0c9d978 100644
--- a/chrome/browser/policy/messaging_layer/upload/file_upload_job_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/upload/file_upload_job_unittest.cc
@@ -31,6 +31,7 @@
 using ::testing::Lt;
 using ::testing::Property;
 using ::testing::StrEq;
+using ::testing::StrictMock;
 
 namespace reporting {
 namespace {
@@ -66,6 +67,11 @@
        base::OnceCallback<void(StatusOr<std::string /*access_parameters*/>)>
            cb),
       (override));
+
+  MOCK_METHOD(void,
+              DoDeleteFile,
+              (base::StringPiece /*origin_path*/),
+              (override));
 };
 
 class FileUploadJobTest : public ::testing::Test {
@@ -92,7 +98,7 @@
 
   FileUploadJob::TestEnvironment manager_test_env_;
 
-  MockFileUploadJobDelegate mock_delegate_;
+  StrictMock<MockFileUploadJobDelegate> mock_delegate_;
 
   scoped_refptr<ResourceManager> memory_resource_;
 };
@@ -150,6 +156,9 @@
                         StatusOr<std::string /*access_parameters*/>)> cb) {
             std::move(cb).Run("http://destination");
           }));
+  test::TestCallbackAutoWaiter waiter;
+  EXPECT_CALL(mock_delegate_, DoDeleteFile(StrEq("/tmp/file")))
+      .WillOnce(Invoke(&waiter, &test::TestCallbackAutoWaiter::Signal));
   RunAsyncJobAndWait(*job, &FileUploadJob::Finalize);
   ASSERT_FALSE(job->tracker().has_status());
   ASSERT_THAT(job->tracker().session_token(), IsEmpty());
@@ -173,6 +182,9 @@
       job->GetWeakPtr(), Priority::IMMEDIATE, std::move(record_copy),
       std::move(log_upload_event)));
   EXPECT_CALL(mock_delegate_, DoInitiate).Times(0);
+  test::TestCallbackAutoWaiter waiter;
+  EXPECT_CALL(mock_delegate_, DoDeleteFile(StrEq("/tmp/file")))
+      .WillOnce(Invoke(&waiter, &test::TestCallbackAutoWaiter::Signal));
   RunAsyncJobAndWait(*job, &FileUploadJob::Initiate);
   ASSERT_TRUE(job->tracker().has_status());
   EXPECT_THAT(job->tracker().status(),
@@ -205,8 +217,46 @@
                                     std::string /*session_token*/>>)> cb) {
             std::move(cb).Run(Status(error::CANCELLED, "Declined in test"));
           }));
+  test::TestCallbackAutoWaiter waiter;
+  EXPECT_CALL(mock_delegate_, DoDeleteFile(StrEq("/tmp/file")))
+      .WillOnce(Invoke(&waiter, &test::TestCallbackAutoWaiter::Signal));
   RunAsyncJobAndWait(*job, &FileUploadJob::Initiate);
   ASSERT_TRUE(job->tracker().has_status());
+  EXPECT_THAT(job->settings().retry_count(), Eq(0));
+  EXPECT_THAT(
+      job->tracker().status(),
+      AllOf(Property(&StatusProto::code, Eq(error::CANCELLED)),
+            Property(&StatusProto::error_message, StrEq("Declined in test"))));
+}
+
+TEST_F(FileUploadJobTest, FailToInitiateWithMoreRetries) {
+  ::ash::reporting::LogUploadEvent log_upload_event;
+  auto& init_settings = *log_upload_event.mutable_upload_settings();
+  init_settings.set_origin_path("/tmp/file");
+  init_settings.set_retry_count(2);
+  init_settings.set_upload_parameters("http://upload");
+  log_upload_event.mutable_upload_tracker();
+  Record record_copy;
+  ASSERT_TRUE(log_upload_event.SerializeToString(record_copy.mutable_data()));
+  record_copy.set_destination(Destination::LOG_UPLOAD);
+  auto job = std::make_unique<FileUploadJob>(log_upload_event.upload_settings(),
+                                             log_upload_event.upload_tracker(),
+                                             &mock_delegate_);
+  job->SetEventHelperForTest(std::make_unique<FileUploadJob::EventHelper>(
+      job->GetWeakPtr(), Priority::IMMEDIATE, std::move(record_copy),
+      std::move(log_upload_event)));
+  EXPECT_CALL(mock_delegate_, DoInitiate(Not(IsEmpty()), Not(IsEmpty()), _))
+      .WillOnce(Invoke(
+          [](base::StringPiece origin_path, base::StringPiece upload_parameters,
+             base::OnceCallback<void(
+                 StatusOr<std::pair<int64_t /*total*/,
+                                    std::string /*session_token*/>>)> cb) {
+            std::move(cb).Run(Status(error::CANCELLED, "Declined in test"));
+          }));
+  EXPECT_CALL(mock_delegate_, DoDeleteFile).Times(0);
+  RunAsyncJobAndWait(*job, &FileUploadJob::Initiate);
+  ASSERT_TRUE(job->tracker().has_status());
+  EXPECT_THAT(job->settings().retry_count(), Eq(1));
   EXPECT_THAT(
       job->tracker().status(),
       AllOf(Property(&StatusProto::code, Eq(error::CANCELLED)),
@@ -231,6 +281,7 @@
       job->GetWeakPtr(), Priority::IMMEDIATE, std::move(record_copy),
       std::move(log_upload_event)));
   EXPECT_CALL(mock_delegate_, DoInitiate).Times(0);
+  EXPECT_CALL(mock_delegate_, DoDeleteFile).Times(0);
   RunAsyncJobAndWait(*job, &FileUploadJob::Initiate);
   ASSERT_TRUE(job->tracker().has_status());
   EXPECT_THAT(
@@ -288,8 +339,71 @@
             EXPECT_THAT(uploaded, AllOf(Ge(0L), Lt(total)));
             std::move(cb).Run(Status(error::CANCELLED, "Declined in test"));
           }));
+  test::TestCallbackAutoWaiter waiter;
+  EXPECT_CALL(mock_delegate_, DoDeleteFile(StrEq("/tmp/file")))
+      .WillOnce(Invoke(&waiter, &test::TestCallbackAutoWaiter::Signal));
   ScopedReservation scoped_reservation(0uL, memory_resource_);
-  for (size_t i = 0u; i < 3u; ++i) {
+  for (size_t i = 0u; i < 2u; ++i) {
+    RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
+  }
+  ASSERT_TRUE(job->tracker().has_status());
+  EXPECT_THAT(
+      job->tracker().status(),
+      AllOf(Property(&StatusProto::code, Eq(error::CANCELLED)),
+            Property(&StatusProto::error_message, StrEq("Declined in test"))));
+}
+
+TEST_F(FileUploadJobTest, FailToPerformNextStepWithMoreRetries) {
+  ::ash::reporting::LogUploadEvent log_upload_event;
+  auto& init_settings = *log_upload_event.mutable_upload_settings();
+  init_settings.set_origin_path("/tmp/file");
+  init_settings.set_retry_count(2);
+  init_settings.set_upload_parameters("http://upload");
+  log_upload_event.mutable_upload_tracker();
+  Record record_copy;
+  ASSERT_TRUE(log_upload_event.SerializeToString(record_copy.mutable_data()));
+  record_copy.set_destination(Destination::LOG_UPLOAD);
+  auto job = std::make_unique<FileUploadJob>(log_upload_event.upload_settings(),
+                                             log_upload_event.upload_tracker(),
+                                             &mock_delegate_);
+  job->SetEventHelperForTest(std::make_unique<FileUploadJob::EventHelper>(
+      job->GetWeakPtr(), Priority::IMMEDIATE, std::move(record_copy),
+      std::move(log_upload_event)));
+  EXPECT_CALL(mock_delegate_, DoInitiate(Not(IsEmpty()), Not(IsEmpty()), _))
+      .WillOnce(Invoke(
+          [](base::StringPiece origin_path, base::StringPiece upload_parameters,
+             base::OnceCallback<void(
+                 StatusOr<std::pair<int64_t /*total*/,
+                                    std::string /*session_token*/>>)> cb) {
+            std::move(cb).Run(std::make_pair(300L, "ABC"));
+          }));
+  RunAsyncJobAndWait(*job, &FileUploadJob::Initiate);
+  ASSERT_FALSE(job->tracker().has_status());
+  EXPECT_THAT(job->settings().retry_count(), Eq(1));
+
+  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _, _))
+      .WillOnce(Invoke(
+          [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
+             base::OnceCallback<void(
+                 StatusOr<std::pair<int64_t /*uploaded*/,
+                                    std::string /*session_token*/>>)> cb) {
+            EXPECT_THAT(uploaded, AllOf(Ge(0L), Lt(total)));
+            std::move(cb).Run(
+                std::make_pair(uploaded + 100L, std::string(session_token)));
+          }))
+      .WillOnce(Invoke(
+          [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
+             base::OnceCallback<void(
+                 StatusOr<std::pair<int64_t /*uploaded*/,
+                                    std::string /*session_token*/>>)> cb) {
+            EXPECT_THAT(uploaded, AllOf(Ge(0L), Lt(total)));
+            std::move(cb).Run(Status(error::CANCELLED, "Declined in test"));
+          }));
+  EXPECT_CALL(mock_delegate_, DoDeleteFile).Times(0);
+  ScopedReservation scoped_reservation(0uL, memory_resource_);
+  for (size_t i = 0u; i < 2u; ++i) {
     RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
   }
   ASSERT_TRUE(job->tracker().has_status());
@@ -352,6 +466,71 @@
                         StatusOr<std::string /*access_parameters*/>)> cb) {
             std::move(cb).Run(Status(error::CANCELLED, "Declined in test"));
           }));
+  test::TestCallbackAutoWaiter waiter;
+  EXPECT_CALL(mock_delegate_, DoDeleteFile(StrEq("/tmp/file")))
+      .WillOnce(Invoke(&waiter, &test::TestCallbackAutoWaiter::Signal));
+  RunAsyncJobAndWait(*job, &FileUploadJob::Finalize);
+  ASSERT_TRUE(job->tracker().has_status());
+  EXPECT_THAT(
+      job->tracker().status(),
+      AllOf(Property(&StatusProto::code, Eq(error::CANCELLED)),
+            Property(&StatusProto::error_message, StrEq("Declined in test"))));
+}
+
+TEST_F(FileUploadJobTest, FailToFinalizeWithMoreRetries) {
+  ::ash::reporting::LogUploadEvent log_upload_event;
+  auto& init_settings = *log_upload_event.mutable_upload_settings();
+  init_settings.set_origin_path("/tmp/file");
+  init_settings.set_retry_count(2);
+  init_settings.set_upload_parameters("http://upload");
+  log_upload_event.mutable_upload_tracker();
+  Record record_copy;
+  ASSERT_TRUE(log_upload_event.SerializeToString(record_copy.mutable_data()));
+  record_copy.set_destination(Destination::LOG_UPLOAD);
+  auto job = std::make_unique<FileUploadJob>(log_upload_event.upload_settings(),
+                                             log_upload_event.upload_tracker(),
+                                             &mock_delegate_);
+  job->SetEventHelperForTest(std::make_unique<FileUploadJob::EventHelper>(
+      job->GetWeakPtr(), Priority::IMMEDIATE, std::move(record_copy),
+      std::move(log_upload_event)));
+  EXPECT_CALL(mock_delegate_, DoInitiate(Not(IsEmpty()), Not(IsEmpty()), _))
+      .WillOnce(Invoke(
+          [](base::StringPiece origin_path, base::StringPiece upload_parameters,
+             base::OnceCallback<void(
+                 StatusOr<std::pair<int64_t /*total*/,
+                                    std::string /*session_token*/>>)> cb) {
+            std::move(cb).Run(std::make_pair(300L, "ABC"));
+          }));
+  RunAsyncJobAndWait(*job, &FileUploadJob::Initiate);
+  ASSERT_FALSE(job->tracker().has_status());
+  EXPECT_THAT(job->settings().retry_count(), Eq(1));
+
+  EXPECT_CALL(mock_delegate_, DoNextStep(_, _, StrEq("ABC"), _, _))
+      .Times(3)
+      .WillRepeatedly(
+          [](int64_t total, int64_t uploaded, base::StringPiece session_token,
+             ScopedReservation scoped_reservation,
+             base::OnceCallback<void(
+                 StatusOr<std::pair<int64_t /*uploaded*/,
+                                    std::string /*session_token*/>>)> cb) {
+            EXPECT_THAT(uploaded, AllOf(Ge(0L), Lt(total)));
+            std::move(cb).Run(
+                std::make_pair(uploaded + 100L, std::string(session_token)));
+          });
+  ScopedReservation scoped_reservation(0uL, memory_resource_);
+  for (size_t i = 0u; i < 3u; ++i) {
+    RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
+    ASSERT_FALSE(job->tracker().has_status());
+  }
+
+  EXPECT_CALL(mock_delegate_, DoFinalize(StrEq("ABC"), _))
+      .WillOnce(
+          Invoke([](base::StringPiece session_token,
+                    base::OnceCallback<void(
+                        StatusOr<std::string /*access_parameters*/>)> cb) {
+            std::move(cb).Run(Status(error::CANCELLED, "Declined in test"));
+          }));
+  EXPECT_CALL(mock_delegate_, DoDeleteFile).Times(0);
   RunAsyncJobAndWait(*job, &FileUploadJob::Finalize);
   ASSERT_TRUE(job->tracker().has_status());
   EXPECT_THAT(
@@ -407,6 +586,9 @@
   }
 
   EXPECT_CALL(mock_delegate_, DoFinalize).Times(0);
+  test::TestCallbackAutoWaiter waiter;
+  EXPECT_CALL(mock_delegate_, DoDeleteFile(StrEq("/tmp/file")))
+      .WillOnce(Invoke(&waiter, &test::TestCallbackAutoWaiter::Signal));
   RunAsyncJobAndWait(*job, &FileUploadJob::Finalize);
   ASSERT_TRUE(job->tracker().has_status());
   EXPECT_THAT(job->tracker().status(),
@@ -454,6 +636,9 @@
             std::move(cb).Run(
                 std::make_pair(uploaded + 500L, std::string(session_token)));
           });
+  test::TestCallbackAutoWaiter waiter;
+  EXPECT_CALL(mock_delegate_, DoDeleteFile(StrEq("/tmp/file")))
+      .WillOnce(Invoke(&waiter, &test::TestCallbackAutoWaiter::Signal));
   ScopedReservation scoped_reservation(0uL, memory_resource_);
   RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
   ASSERT_FALSE(job->tracker().has_status());
@@ -513,6 +698,9 @@
             std::move(cb).Run(
                 std::make_pair(uploaded - 1L, std::string(session_token)));
           });
+  test::TestCallbackAutoWaiter waiter;
+  EXPECT_CALL(mock_delegate_, DoDeleteFile(StrEq("/tmp/file")))
+      .WillOnce(Invoke(&waiter, &test::TestCallbackAutoWaiter::Signal));
   ScopedReservation scoped_reservation(0uL, memory_resource_);
   RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
   ASSERT_FALSE(job->tracker().has_status());
@@ -569,6 +757,9 @@
                         StatusOr<std::string /*access_parameters*/>)> cb) {
             std::move(cb).Run("http://destination");
           }));
+  test::TestCallbackAutoWaiter waiter;
+  EXPECT_CALL(mock_delegate_, DoDeleteFile(StrEq("/tmp/file")))
+      .WillOnce(Invoke(&waiter, &test::TestCallbackAutoWaiter::Signal));
   RunAsyncJobAndWait(*job, &FileUploadJob::Finalize);
   ASSERT_FALSE(job->tracker().has_status());
   ASSERT_THAT(job->tracker().session_token(), IsEmpty());
@@ -596,6 +787,7 @@
   EXPECT_CALL(mock_delegate_, DoInitiate).Times(0);
   EXPECT_CALL(mock_delegate_, DoNextStep).Times(0);
   EXPECT_CALL(mock_delegate_, DoFinalize).Times(0);
+  EXPECT_CALL(mock_delegate_, DoDeleteFile).Times(0);
   ScopedReservation scoped_reservation(0uL, memory_resource_);
   RunAsyncJobAndWait(*job, &FileUploadJob::NextStep, scoped_reservation);
   ASSERT_TRUE(job->tracker().has_status());
@@ -627,6 +819,7 @@
   EXPECT_CALL(mock_delegate_, DoInitiate).Times(0);
   EXPECT_CALL(mock_delegate_, DoNextStep).Times(0);
   EXPECT_CALL(mock_delegate_, DoFinalize).Times(0);
+  EXPECT_CALL(mock_delegate_, DoDeleteFile).Times(0);
   RunAsyncJobAndWait(*job, &FileUploadJob::Finalize);
   ASSERT_TRUE(job->tracker().has_status());
   EXPECT_THAT(
@@ -659,6 +852,7 @@
                                       std::string /*session_token*/>>)> cb) {
               std::move(cb).Run(std::make_pair(300L, "ABC"));
             }));
+    EXPECT_CALL(mock_delegate_, DoDeleteFile).Times(0);
 
     // Attempt to add and initiate jobs multiple times.
     for (size_t i = 0u; i < kJobsCount; ++i) {
@@ -744,6 +938,7 @@
               std::move(cb).Run(
                   std::make_pair(uploaded + 100L, std::string(session_token)));
             });
+    EXPECT_CALL(mock_delegate_, DoDeleteFile).Times(0);
 
     // Attempt to add and step jobs multiple times.
     for (size_t i = 0u; i < kJobsCount; ++i) {
@@ -826,6 +1021,11 @@
               std::move(cb).Run("http://destination");
             }));
 
+    // File will be deleted only once too!
+    waiter.Attach(1);
+    EXPECT_CALL(mock_delegate_, DoDeleteFile(StrEq("/tmp/file")))
+        .WillOnce(Invoke(&waiter, &test::TestCallbackAutoWaiter::Signal));
+
     // Attempt to add and finalize jobs multiple times.
     for (size_t i = 0u; i < kJobsCount; ++i) {
       ::ash::reporting::LogUploadEvent log_upload_event;
@@ -973,6 +1173,9 @@
                           StatusOr<std::string /*access_parameters*/>)> cb) {
               std::move(cb).Run("http://destination");
             }));
+    waiter.Attach(1);  // File deletion.
+    EXPECT_CALL(mock_delegate_, DoDeleteFile(StrEq("/tmp/file")))
+        .WillOnce(Invoke(&waiter, &test::TestCallbackAutoWaiter::Signal));
     FileUploadJob::Manager::GetInstance()->sequenced_task_runner()->PostTask(
         FROM_HERE,
         base::BindOnce(&FileUploadJob::Finalize, job_weak_ptr,
diff --git a/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc b/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc
index e6234d4..4c1f5be 100644
--- a/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc
@@ -101,6 +101,11 @@
        base::OnceCallback<void(StatusOr<std::string /*access_parameters*/>)>
            cb),
       (override));
+
+  MOCK_METHOD(void,
+              DoDeleteFile,
+              (base::StringPiece /*origin_path*/),
+              (override));
 };
 
 // Tests for generic events handling.
diff --git a/chrome/browser/policy/messaging_layer/upload/record_handler_upload_unittest.cc b/chrome/browser/policy/messaging_layer/upload/record_handler_upload_unittest.cc
index 49293653..491de193 100644
--- a/chrome/browser/policy/messaging_layer/upload/record_handler_upload_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/upload/record_handler_upload_unittest.cc
@@ -113,6 +113,11 @@
        base::OnceCallback<void(StatusOr<std::string /*access_parameters*/>)>
            cb),
       (override));
+
+  MOCK_METHOD(void,
+              DoDeleteFile,
+              (base::StringPiece /*origin_path*/),
+              (override));
 };
 
 // Tests for generic events handling.
diff --git a/chrome/browser/resources/app_service_internals/app_service_internals.html b/chrome/browser/resources/app_service_internals/app_service_internals.html
index d81c223c..36c52d4 100644
--- a/chrome/browser/resources/app_service_internals/app_service_internals.html
+++ b/chrome/browser/resources/app_service_internals/app_service_internals.html
@@ -17,6 +17,12 @@
       <li><a href="#preferred-app-[[item.id]]">[[item.name]]</a></li>
     </template>
   </ul>
+  <li><a href="#promise-apps">Promise Apps</a></li>
+  <ul>
+    <template is="dom-repeat" items="[[promiseAppList_]]">
+      <li><a href="#promise-app-[[item.id]]">[[item.name]]</a></li>
+    </template>
+  </ul>
 </ul>
 
 <section>
@@ -38,4 +44,13 @@
       <pre>[[item.preferredFilters]]</pre>
     </div>
   </template>
+
+  <h2 id="promise-apps">Promise Apps</h2>
+
+  <template is="dom-repeat" items="[[promiseAppList_]]">
+    <div id="promise-app-[[item.id]]">
+      <h3>[[item.name]]</h3>
+      <pre>[[item.debugInfo]]</pre>
+    </div>
+  </template>
 </section>
diff --git a/chrome/browser/resources/app_service_internals/app_service_internals.ts b/chrome/browser/resources/app_service_internals/app_service_internals.ts
index de22503..9232f2c 100644
--- a/chrome/browser/resources/app_service_internals/app_service_internals.ts
+++ b/chrome/browser/resources/app_service_internals/app_service_internals.ts
@@ -5,7 +5,7 @@
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './app_service_internals.html.js';
-import {AppInfo, AppServiceInternalsPageHandler, PreferredAppInfo} from './app_service_internals.mojom-webui.js';
+import {AppInfo, AppServiceInternalsPageHandler, PreferredAppInfo, PromiseAppInfo} from './app_service_internals.mojom-webui.js';
 
 export class AppServiceInternalsElement extends PolymerElement {
   static get is() {
@@ -20,6 +20,7 @@
     return {
       appList_: Array,
       preferredAppList_: Array,
+      promiseAppList_: Array,
     };
   }
 
@@ -28,6 +29,8 @@
   private hashChangeListener_ = () => this.onHashChanged_();
   /** List containing preferred app debug information for installed apps. */
   private preferredAppList_: PreferredAppInfo[] = [];
+  /** List containing debug information for all promise apps. */
+  private promiseAppList_: PromiseAppInfo[] = [];
 
   override ready() {
     super.ready();
@@ -37,7 +40,7 @@
       this.appList_ = (await remote.getApps()).appList;
       this.preferredAppList_ =
           (await remote.getPreferredApps()).preferredAppList;
-
+      this.promiseAppList_ = (await remote.getPromiseApps()).promiseAppList;
       this.onHashChanged_();
       window.addEventListener('hashchange', this.hashChangeListener_);
     })();
diff --git a/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html b/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html
index 716c209..c4b3595 100644
--- a/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html
+++ b/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html
@@ -7,6 +7,12 @@
     margin-inline-start: 8px;
   }
 
+  :host-context(.focus-outline-visible) #showAllButton:focus,
+  #showAllButton:focus-visible {
+    box-shadow: var(--ntp-focus-shadow);
+    outline: none;
+  }
+
   #showAllButton {
     background-color: var(--color-new-tab-page-module-background);
     border: none;
@@ -46,6 +52,15 @@
     grid-row: 2 / 3;
   }
 
+  /* Set styles for high contrast mode in Windows. */
+  @media (forced-colors: active) {
+    /* Set focus outline since box-shadow isn't visible in hcm */
+    :host-context(.focus-outline-visible) #showAllButton:focus,
+    #showAllButton:focus-visible {
+      outline: var(--cr-focus-outline-hcm);
+    }
+  }
+
   /* At less than 768px + 2*18px side gaps, switch to the one column
      presentation. */
   @media (max-width: 803px) {
diff --git a/chrome/browser/resources/new_tab_page/modules/history_clusters/suggest_tile.html b/chrome/browser/resources/new_tab_page/modules/history_clusters/suggest_tile.html
index dd02bac..341cfda6 100644
--- a/chrome/browser/resources/new_tab_page/modules/history_clusters/suggest_tile.html
+++ b/chrome/browser/resources/new_tab_page/modules/history_clusters/suggest_tile.html
@@ -13,7 +13,8 @@
     text-decoration: none;
   }
 
-  :host-context(.focus-outline-visible) :focus {
+  :host-context(.focus-outline-visible) :focus,
+  :focus-visible {
     box-shadow: var(--ntp-focus-shadow);
     outline: none;
   }
diff --git a/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html b/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html
index adec8d62..a8cee28a 100644
--- a/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html
+++ b/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html
@@ -15,7 +15,9 @@
     text-decoration: none;
   }
 
-  :host-context(.focus-outline-visible) :focus {
+  :host-context(.focus-outline-visible) :focus,
+  :focus-visible {
+    border-radius: 12px;
     box-shadow: var(--ntp-focus-shadow);
     outline: none;
   }
diff --git a/chrome/browser/resources/side_panel/companion/companion.ts b/chrome/browser/resources/side_panel/companion/companion.ts
index 65b87498..5cc9a0d 100644
--- a/chrome/browser/resources/side_panel/companion/companion.ts
+++ b/chrome/browser/resources/side_panel/companion/companion.ts
@@ -10,13 +10,6 @@
 
 
 function initialize() {
-  companionProxy.callbackRouter.onInitializePage.addListener(
-      (initialUrl: string) => {
-        const frame = document.body.querySelector('iframe');
-        assert(frame);
-        frame.src = initialUrl;
-      });
-
   // When the url is changed, we update our iframe src to pass new parameters.
   companionProxy.callbackRouter.onURLChanged.addListener((newUrl: string) => {
     const frame = document.body.querySelector('iframe');
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 60994f80..75458c8 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1692,6 +1692,9 @@
       "webui/side_panel/companion/companion_page_handler.h",
       "webui/side_panel/companion/companion_side_panel_untrusted_ui.cc",
       "webui/side_panel/companion/companion_side_panel_untrusted_ui.h",
+      "webui/side_panel/companion/companion_url_builder.cc",
+      "webui/side_panel/companion/companion_url_builder.h",
+      "webui/side_panel/companion/constants.h",
       "webui/side_panel/customize_chrome/customize_chrome_colors.cc",
       "webui/side_panel/customize_chrome/customize_chrome_colors.h",
       "webui/side_panel/customize_chrome/customize_chrome_page_handler.cc",
@@ -1822,6 +1825,7 @@
       "//chrome/browser/ui/webui/new_tab_page_third_party:mojo_bindings",
       "//chrome/browser/ui/webui/side_panel/bookmarks:mojo_bindings",
       "//chrome/browser/ui/webui/side_panel/companion:mojo_bindings",
+      "//chrome/browser/ui/webui/side_panel/companion/proto",
       "//chrome/browser/ui/webui/side_panel/customize_chrome:mojo_bindings",
       "//chrome/browser/ui/webui/side_panel/reading_list:mojo_bindings",
       "//chrome/browser/ui/webui/side_panel/user_notes:mojo_bindings",
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index 299d1a0d7..21611d4 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -290,6 +290,9 @@
       <message name="IDS_SIGN_IN_TO_CHROME_DISABLED_SUMMARY" desc="A descriptive line of text that appears under the 'Sign in to Chrome' option, in Chrome Settings on Android. The text explains why 'Sign in to Chrome' is disabled. 'Administrator' refers to the IT administrator of the company/organization that owns the user’s device.">
         Disabled by the administrator of this device
       </message>
+      <message name="IDS_SIGN_IN_TO_CHROME_DISABLED_BY_USER_SUMMARY" desc="A descriptive line of text that appears when a user tries to signin when signin is disabled by the Google Services option in settings. The text explains why 'Sign in to Chrome' is not available.">
+        Not available on your device
+      </message>
       <message name="IDS_SIGN_IN_GOOGLE_ACTIVITY_CONTROLS_TITLE" desc="Title of Google activity controls preference in signed in accounts settings screen">
         Google activity controls
       </message>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGN_IN_TO_CHROME_DISABLED_BY_USER_SUMMARY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGN_IN_TO_CHROME_DISABLED_BY_USER_SUMMARY.png.sha1
new file mode 100644
index 0000000..58b103d2
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGN_IN_TO_CHROME_DISABLED_BY_USER_SUMMARY.png.sha1
@@ -0,0 +1 @@
+ff000a9dc3e0cecfb71597667d90ac50a2b1b3e5
\ No newline at end of file
diff --git a/chrome/browser/ui/global_media_controls/cast_media_notification_producer.cc b/chrome/browser/ui/global_media_controls/cast_media_notification_producer.cc
index 5914e6f..0dd8363 100644
--- a/chrome/browser/ui/global_media_controls/cast_media_notification_producer.cc
+++ b/chrome/browser/ui/global_media_controls/cast_media_notification_producer.cc
@@ -33,18 +33,15 @@
   }
   std::unique_ptr<media_router::CastMediaSource> source =
       media_router::CastMediaSource::FromMediaSource(route.media_source());
-  if (!source) {
-    return true;
-  }
   if (media_router::GlobalMediaControlsCastStartStopEnabled(profile)) {
     // Show local site-initiated Mirroring routes.
-    if (route.is_local() &&
+    if (source && route.is_local() &&
         media_router::IsSiteInitiatedMirroringSource(source->source_id())) {
       return false;
     }
     // Hide a route if it contains a Streaming App, i.e. Tab/Desktop Mirroring
     // and Remote Playback routes.
-    if (source->ContainsStreamingApp()) {
+    if (source && source->ContainsStreamingApp()) {
       return true;
     }
   } else if (route.controller_type() !=
diff --git a/chrome/browser/ui/global_media_controls/cast_media_notification_producer_unittest.cc b/chrome/browser/ui/global_media_controls/cast_media_notification_producer_unittest.cc
index ca2bfcd..db621f8 100644
--- a/chrome/browser/ui/global_media_controls/cast_media_notification_producer_unittest.cc
+++ b/chrome/browser/ui/global_media_controls/cast_media_notification_producer_unittest.cc
@@ -61,17 +61,20 @@
 TEST_F(CastMediaNotificationProducerTest, AddAndRemoveRoute) {
   const std::string route_id_1 = "route-id-1";
   const std::string route_id_2 = "route-id-2";
+  const std::string route_id_3 = "route-id-3";
   MediaRoute cast_route = CreateRoute(route_id_1);
   MediaRoute site_initiated_mirroring_route =
       CreateRoute(route_id_2, "cast:0F5096E8");
+  MediaRoute dial_route = CreateRoute(route_id_3, "dial:123456");
 
   EXPECT_CALL(item_manager_, OnItemsChanged());
   notification_producer_->OnRoutesUpdated(
-      {cast_route, site_initiated_mirroring_route});
+      {cast_route, site_initiated_mirroring_route, dial_route});
   testing::Mock::VerifyAndClearExpectations(&item_manager_);
-  EXPECT_EQ(2u, notification_producer_->GetActiveItemCount());
+  EXPECT_EQ(3u, notification_producer_->GetActiveItemCount());
   EXPECT_NE(nullptr, notification_producer_->GetMediaItem(route_id_1));
   EXPECT_NE(nullptr, notification_producer_->GetMediaItem(route_id_2));
+  EXPECT_NE(nullptr, notification_producer_->GetMediaItem(route_id_3));
 
   EXPECT_CALL(item_manager_, OnItemsChanged());
   notification_producer_->OnRoutesUpdated({});
diff --git a/chrome/browser/ui/views/chrome_typography.cc b/chrome/browser/ui/views/chrome_typography.cc
index 49ecea32..cbf0a00 100644
--- a/chrome/browser/ui/views/chrome_typography.cc
+++ b/chrome/browser/ui/views/chrome_typography.cc
@@ -6,6 +6,7 @@
 
 #include "build/build_config.h"
 #include "chrome/browser/ui/views/location_bar/location_bar_view.h"
+#include "components/omnibox/browser/omnibox_field_trial.h"
 #include "ui/base/default_style.h"
 #include "ui/base/pointer/touch_ui_controller.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -72,26 +73,41 @@
       break;
     }
     case CONTEXT_OMNIBOX_PRIMARY:
+    case CONTEXT_OMNIBOX_POPUP:
+    case CONTEXT_OMNIBOX_SECTION_HEADER:
     case CONTEXT_OMNIBOX_DEEMPHASIZED: {
+      const bool is_touch_ui = ui::TouchUiController::Get()->touch_ui();
+      const bool use_gm3_text_style =
+          OmniboxFieldTrial::IsGM3TextStyleEnabled();
+
+      int desired_font_size = is_touch_ui ? 15 : 14;
+      if (use_gm3_text_style) {
+        desired_font_size = is_touch_ui
+                                ? OmniboxFieldTrial::kFontSizeTouchUI.Get()
+                                : OmniboxFieldTrial::kFontSizeNonTouchUI.Get();
+      }
+
       const int omnibox_primary_delta =
           GetFontSizeDeltaBoundedByAvailableHeight(
-              LocationBarView::GetAvailableTextHeight(),
-              ui::TouchUiController::Get()->touch_ui() ? 15 : 14);
+              LocationBarView::GetAvailableTextHeight(), desired_font_size);
       details.size_delta = omnibox_primary_delta;
-      if (context == CONTEXT_OMNIBOX_DEEMPHASIZED)
+      if (context == CONTEXT_OMNIBOX_DEEMPHASIZED && !use_gm3_text_style) {
         --details.size_delta;
-      break;
-    }
-    case CONTEXT_OMNIBOX_DECORATION: {
-      // Use 11 for both touchable and non-touchable. The touchable spec
-      // specifies 11 explicitly. Historically, non-touchable would take the
-      // primary omnibox font and incrementally reduce its size until it fit.
-      // In default configurations, it would obtain 11. Deriving fonts is slow,
-      // so don't bother starting at 14.
-      const int omnibox_decoration_delta =
-          GetFontSizeDeltaBoundedByAvailableHeight(
-              LocationBarView::GetAvailableDecorationTextHeight(), 11);
-      details.size_delta = omnibox_decoration_delta;
+      }
+
+      if (use_gm3_text_style) {
+        if (context == CONTEXT_OMNIBOX_SECTION_HEADER) {
+          --details.size_delta;
+        }
+
+        if (context == CONTEXT_OMNIBOX_PRIMARY ||
+            context == CONTEXT_OMNIBOX_SECTION_HEADER) {
+          details.weight = gfx::Font::Weight::MEDIUM;
+        } else if (context == CONTEXT_OMNIBOX_POPUP ||
+                   context == CONTEXT_OMNIBOX_DEEMPHASIZED) {
+          details.weight = gfx::Font::Weight::NORMAL;
+        }
+      }
       break;
     }
 #if BUILDFLAG(IS_WIN)
diff --git a/chrome/browser/ui/views/chrome_typography.h b/chrome/browser/ui/views/chrome_typography.h
index 007d880f..1d039ba 100644
--- a/chrome/browser/ui/views/chrome_typography.h
+++ b/chrome/browser/ui/views/chrome_typography.h
@@ -35,13 +35,31 @@
   // Text of the number of tabs in the tab counter used in tablet mode.
   CONTEXT_TAB_COUNTER,
 
-  // Text in the location bar entry, and primary text in the omnibox dropdown.
+  // Text used in the following UI contexts:
+  //   - Omnibox query row text entry
+  //   - Location icon view in the Omnibox
+  //   - Omnibox pedals / action chips (omnibox_suggestion_button_row_view.cc)
+  //
+  // This context is also used in the following UI components, but likely has
+  // little to no effect in terms of typography (font size, weight, etc.):
+  //   - Custom tab bar used by PWAs (custom_tab_bar_view.cc)
+  //   - Picture-in-Picture view (picture_in_picture_browser_frame_view.cc)
   CONTEXT_OMNIBOX_PRIMARY,
 
-  // Text that goes inside location bar decorations such as the keyword hint.
-  CONTEXT_OMNIBOX_DECORATION,
+  // Primary text in the omnibox dropdown.
+  CONTEXT_OMNIBOX_POPUP,
 
-  // Text in omnibox answer results that is slightly smaller than primary font.
+  // Text in the suggestions section header in the omnibox dropdown.
+  CONTEXT_OMNIBOX_SECTION_HEADER,
+
+  // Text used in the following UI contexts:
+  //   - Omnibox answer results
+  //   - Two-line entity suggestions (description)
+  //
+  // This context is also used in the following UI components, but likely has
+  // little to no effect in terms of typography (font size, font weight, etc.):
+  //   - Additional text view in the Omnibox
+  //   - Error messages in password manager (manage_passwords_details_view.cc)
   CONTEXT_OMNIBOX_DEEMPHASIZED,
 
   // Text for titles, body text and buttons that appear in dialogs attempting to
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_item_unittest.cc b/chrome/browser/ui/views/extensions/extensions_menu_item_unittest.cc
index 54753d0fe..33ca236b 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_item_unittest.cc
+++ b/chrome/browser/ui/views/extensions/extensions_menu_item_unittest.cc
@@ -70,7 +70,8 @@
   controller_->SetActionName(initial_extension_name_);
   controller_->SetTooltip(initial_tooltip_);
   auto menu_item = std::make_unique<ExtensionMenuItemView>(
-      browser(), std::move(controller), true);
+      browser(), std::move(controller), true,
+      /*is_site_permissions_button_visible=*/false);
   primary_button_ = menu_item->primary_action_button_for_testing();
   pin_button_ = menu_item->pin_button_for_testing();
   context_menu_button_ = menu_item->context_menu_button_for_testing();
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_item_view.cc b/chrome/browser/ui/views/extensions/extensions_menu_item_view.cc
index f8828cd..5a13462 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_item_view.cc
+++ b/chrome/browser/ui/views/extensions/extensions_menu_item_view.cc
@@ -70,6 +70,7 @@
     Browser* browser,
     std::unique_ptr<ToolbarActionViewController> controller,
     bool allow_pinning,
+    bool is_site_permissions_button_visible,
     views::Button::PressedCallback site_permissions_button_callback)
     : browser_(browser),
       controller_(std::move(controller)),
@@ -121,6 +122,7 @@
                                 vector_icons::kSubmenuArrowIcon,
                                 ui::kColorIcon))))
                     .CopyAddressTo(&site_permissions_button_)
+                    .SetVisible(is_site_permissions_button_visible)
                     // Margin to align the main and secondary row text. Icon
                     // size and horizontal insets should be the values used by
                     // the extensions menu button.
@@ -205,7 +207,11 @@
   UpdatePinButton();
 }
 
-void ExtensionMenuItemView::Update() {
+void ExtensionMenuItemView::Update(bool is_site_permissions_button_visible) {
+  if (site_permissions_button_) {
+    site_permissions_button_->SetVisible(is_site_permissions_button_visible);
+  }
+
   view_controller()->UpdateState();
 }
 
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_item_view.h b/chrome/browser/ui/views/extensions/extensions_menu_item_view.h
index 11817fd..36a5afdd 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_item_view.h
+++ b/chrome/browser/ui/views/extensions/extensions_menu_item_view.h
@@ -32,6 +32,7 @@
       Browser* browser,
       std::unique_ptr<ToolbarActionViewController> controller,
       bool allow_pinning,
+      bool is_site_permissions_button_visible,
       views::Button::PressedCallback site_permissions_button_callback =
           base::RepeatingClosure(base::NullCallback()));
   ExtensionMenuItemView(const ExtensionMenuItemView&) = delete;
@@ -42,7 +43,7 @@
   void OnThemeChanged() override;
 
   // Updates the controller and child views to be on sync with the parent views.
-  void Update();
+  void Update(bool is_site_permissions_button_visible);
 
   // Updates the pin button.
   void UpdatePinButton();
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc
index a1c6bb3f..1a6c40f 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc
+++ b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.cc
@@ -51,10 +51,10 @@
   return l10n_util::GetStringUTF16(label_id);
 }
 
-// Converts a view to a ExtensionMenuItemView. This cannot
-// be used to *determine* if a view is an ExtensionMenuItemView (it
-// should only be used when the view is known to be one). It is only used as an
-// extra measure to prevent bad static casts.
+// Converts a view to a ExtensionMenuItemView. This cannot be used to
+// *determine* if a view is an ExtensionMenuItemView (it should only be used
+// when the view is known to be one). It is only used as an extra measure to
+// prevent bad static casts.
 ExtensionMenuItemView* GetAsMenuItem(views::View* view) {
   DCHECK(views::IsViewClass<ExtensionMenuItemView>(view));
   return views::AsViewClass<ExtensionMenuItemView>(view);
@@ -225,9 +225,11 @@
     std::unique_ptr<ExtensionActionViewController> action_controller,
     extensions::ExtensionId extension_id,
     bool allow_pinning,
+    bool is_site_permissions_button_visible,
     int index) {
   auto item = std::make_unique<ExtensionMenuItemView>(
       browser_, std::move(action_controller), allow_pinning,
+      is_site_permissions_button_visible,
       base::BindRepeating(
           &ExtensionsMenuNavigationHandler::OpenSitePermissionsPage,
           base::Unretained(navigation_handler_), extension_id));
@@ -263,11 +265,6 @@
       GetSiteSettingToggleText(is_site_settings_toggle_on));
   site_settings_toggle_->SetAccessibleName(
       GetSiteSettingToggleText(is_site_settings_toggle_on));
-
-  // Update menu items.
-  for (auto* view : menu_items_->children()) {
-    GetAsMenuItem(view)->Update();
-  }
 }
 
 void ExtensionsMenuMainPageView::UpdatePinButtons() {
@@ -276,8 +273,8 @@
   }
 }
 
-std::vector<ExtensionMenuItemView*>
-ExtensionsMenuMainPageView::GetMenuItemsForTesting() const {
+std::vector<ExtensionMenuItemView*> ExtensionsMenuMainPageView::GetMenuItems()
+    const {
   std::vector<ExtensionMenuItemView*> menu_item_views;
   for (views::View* view : menu_items_->children()) {
     menu_item_views.push_back(GetAsMenuItem(view));
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.h b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.h
index f5509f9..135307c 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.h
+++ b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view.h
@@ -45,12 +45,17 @@
       std::unique_ptr<ExtensionActionViewController> action_controller,
       extensions::ExtensionId extension_id,
       bool allow_pinning,
+      bool is_site_permissions_button_visible,
       int index);
 
   // Removes the menu item corresponding to `action_id`.
   void RemoveMenuItem(const ToolbarActionsModel::ActionId& action_id);
 
-  // Updates the page with the given parameters.
+  // Returns the menu items.
+  std::vector<ExtensionMenuItemView*> GetMenuItems() const;
+
+  // Updates the page with the given parameters. Does not update the menu items
+  // (menu item updates are handled directly in such view).
   void Update(std::u16string current_site,
               bool is_site_settings_toggle_visible,
               bool is_site_settings_toggle_on);
@@ -65,7 +70,6 @@
   views::ToggleButton* GetSiteSettingsToggleForTesting() {
     return site_settings_toggle_;
   }
-  std::vector<ExtensionMenuItemView*> GetMenuItemsForTesting() const;
 
  private:
   content::WebContents* GetActiveWebContents() const;
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc
index d1e99a6..1c594531 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc
+++ b/chrome/browser/ui/views/extensions/extensions_menu_main_page_view_unittest.cc
@@ -17,14 +17,18 @@
 #include "chrome/browser/ui/views/extensions/extensions_menu_view_controller.h"
 #include "chrome/browser/ui/views/extensions/extensions_toolbar_button.h"
 #include "chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h"
+#include "extensions/browser/permissions_manager.h"
 #include "extensions/browser/test_extension_registry_observer.h"
 #include "extensions/common/extension_features.h"
+#include "extensions/test/permissions_manager_waiter.h"
 #include "extensions/test/test_extension_dir.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "ui/views/view_utils.h"
 
 namespace {
 
+using PermissionsManager = extensions::PermissionsManager;
+
 // A scoper that manages a Browser instance created by BrowserWithTestWindowTest
 // beyond the default instance it creates in SetUp.
 class AdditionalBrowser {
@@ -85,6 +89,10 @@
   void ClickPinButton(ExtensionMenuItemView* menu_item);
   void ClickSitePermissionsButton(ExtensionMenuItemView* menu_item);
 
+  content::WebContentsTester* web_contents_tester() {
+    return web_contents_tester_;
+  }
+
   ExtensionsMenuMainPageView* main_page();
   ExtensionsMenuSitePermissionsPageView* site_permissions_page();
   std::vector<ExtensionMenuItemView*> menu_items();
@@ -149,8 +157,7 @@
 std::vector<ExtensionMenuItemView*>
 ExtensionsMenuMainPageViewUnitTest::menu_items() {
   ExtensionsMenuMainPageView* page = main_page();
-  return page ? page->GetMenuItemsForTesting()
-              : std::vector<ExtensionMenuItemView*>();
+  return page ? page->GetMenuItems() : std::vector<ExtensionMenuItemView*>();
 }
 
 void ExtensionsMenuMainPageViewUnitTest::SetUp() {
@@ -301,14 +308,21 @@
       InstallExtensionWithHostPermissions("Extension A", {"<all_urls>"});
   InstallExtensionWithHostPermissions("Extension B", {"<all_urls>"});
 
+  // Navigate to a page that extensions request access, and open the menu.
+  web_contents_tester()->NavigateAndCommit(GURL("http://www.example.com"));
   ShowMenu();
 
   std::vector<ExtensionMenuItemView*> items = menu_items();
   ASSERT_EQ(items.size(), 2u);
   EXPECT_EQ(items[0]->view_controller()->GetId(), extensionA->id());
 
-  ClickSitePermissionsButton(items[0]);
+  // Site permissions button should be visible for both extensions.
+  EXPECT_TRUE(items[0]->site_permissions_button_for_testing()->GetVisible());
+  EXPECT_TRUE(items[1]->site_permissions_button_for_testing()->GetVisible());
 
+  // Clicking on an extension's site permission button should open its site
+  // permission page in the menu.
+  ClickSitePermissionsButton(items[0]);
   ExtensionsMenuSitePermissionsPageView* page = site_permissions_page();
   ASSERT_TRUE(page);
   EXPECT_EQ(page->extension_id(), extensionA->id());
@@ -466,3 +480,94 @@
     EXPECT_FALSE(views::IsViewClass<ToolbarActionView>(child));
   }
 }
+
+// Tests that extension's site permission button is always hidden when site is
+// restricted.
+TEST_F(ExtensionsMenuMainPageViewUnitTest, RestrictedSite) {
+  constexpr char kExtension[] = "Extension";
+  constexpr char kEnterpriseExtension[] = "Enterprise extension";
+  InstallExtension(kExtension);
+  InstallEnterpriseExtension(kEnterpriseExtension,
+                             /*host_permissions=*/{"<all_urls>"});
+
+  const GURL restricted_url("chrome://extensions");
+  auto restricted_origin = url::Origin::Create(restricted_url);
+  web_contents_tester()->NavigateAndCommit(restricted_url);
+
+  // By default, site settings is set to "customize by extension".
+  PermissionsManager* permissions_manager = PermissionsManager::Get(profile());
+  EXPECT_EQ(permissions_manager->GetUserSiteSetting(restricted_origin),
+            PermissionsManager::UserSiteSetting::kCustomizeByExtension);
+
+  ShowMenu();
+  ASSERT_EQ(menu_items().size(), 2u);
+
+  // Both extension's site permissions button should be hidden.
+  EXPECT_FALSE(
+      menu_items()[0]->site_permissions_button_for_testing()->GetVisible());
+  EXPECT_FALSE(
+      menu_items()[1]->site_permissions_button_for_testing()->GetVisible());
+
+  // Change site settings to "block all extensions".
+  extensions::PermissionsManagerWaiter waiter(
+      PermissionsManager::Get(browser()->profile()));
+  permissions_manager->UpdateUserSiteSetting(
+      restricted_origin,
+      PermissionsManager::UserSiteSetting::kBlockAllExtensions);
+  waiter.WaitForUserPermissionsSettingsChange();
+
+  // Both extension's site permission button should still be hidden (restricted
+  // sites have priority over enterprise extensions).
+  EXPECT_FALSE(
+      menu_items()[0]->site_permissions_button_for_testing()->GetVisible());
+  EXPECT_FALSE(
+      menu_items()[1]->site_permissions_button_for_testing()->GetVisible());
+}
+
+// Test that an enterprise extension's site permissions button is shown based on
+// the user site setting and extension site interaction.
+TEST_F(ExtensionsMenuMainPageViewUnitTest, EnterpriseExtension) {
+  constexpr char kExtension[] = "Enterprise extension";
+  constexpr char kExtensionWithPermissions[] =
+      "Enterprise extension with host permissions";
+  InstallEnterpriseExtension(kExtension, /*host_permissions=*/{});
+  InstallEnterpriseExtension(kExtensionWithPermissions,
+                             /*host_permissions=*/{"<all_urls>"});
+
+  const GURL url(u"http://www.example.com");
+  auto url_origin = url::Origin::Create(url);
+  web_contents_tester()->NavigateAndCommit(url);
+
+  // By default, user site setting is set to "customize by extension".
+  PermissionsManager* permissions_manager = PermissionsManager::Get(profile());
+  EXPECT_EQ(permissions_manager->GetUserSiteSetting(url_origin),
+            PermissionsManager::UserSiteSetting::kCustomizeByExtension);
+
+  // Open menu and verify extensions are in the expected order.
+  ShowMenu();
+  ASSERT_EQ(menu_items().size(), 2u);
+  std::vector<std::string> expected_items{kExtension,
+                                          kExtensionWithPermissions};
+  EXPECT_EQ(GetNamesFromMenuItems(menu_items()), expected_items);
+
+  // Enterprise extension's site permission button is always visible when user
+  // can customize site access by extension.
+  EXPECT_TRUE(
+      menu_items()[0]->site_permissions_button_for_testing()->GetVisible());
+  EXPECT_TRUE(
+      menu_items()[1]->site_permissions_button_for_testing()->GetVisible());
+
+  extensions::PermissionsManagerWaiter waiter(
+      PermissionsManager::Get(browser()->profile()));
+  permissions_manager->UpdateUserSiteSetting(
+      url_origin, PermissionsManager::UserSiteSetting::kBlockAllExtensions);
+  waiter.WaitForUserPermissionsSettingsChange();
+
+  // Enterprise extension's site permission button is still visible when
+  // user has blocked all extensions but enterprise extension still has access
+  // (policy his priority over user settings).
+  EXPECT_FALSE(
+      menu_items()[0]->site_permissions_button_for_testing()->GetVisible());
+  EXPECT_TRUE(
+      menu_items()[1]->site_permissions_button_for_testing()->GetVisible());
+}
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_test_util.cc b/chrome/browser/ui/views/extensions/extensions_menu_test_util.cc
index 0eae75c..0dbba6c 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_test_util.cc
+++ b/chrome/browser/ui/views/extensions/extensions_menu_test_util.cc
@@ -244,7 +244,7 @@
             ->GetControllerForTesting()
             ->GetMainPageViewForTesting();
     DCHECK(main_page);
-    menu_items = main_page->GetMenuItemsForTesting();
+    menu_items = main_page->GetMenuItems();
 
   } else {
     menu_items = menu_view_->extensions_menu_items_for_testing();
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_view.cc b/chrome/browser/ui/views/extensions/extensions_menu_view.cc
index 8d1e081..e999cf6 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_view.cc
+++ b/chrome/browser/ui/views/extensions/extensions_menu_view.cc
@@ -306,7 +306,8 @@
   // be added to the view hierarchy, which takes ownership.
   auto* item = new ExtensionMenuItemView(
       browser_, std::move(controller),
-      extensions_container_->CanShowActionsInToolbar());
+      extensions_container_->CanShowActionsInToolbar(),
+      /*is_site_permissions_button_visible=*/false);
   extensions_menu_items_.insert(item);
   InsertMenuItem(item);
   // Sanity check that the item was added.
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc b/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc
index 18a17267..7dad89bf 100644
--- a/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc
+++ b/chrome/browser/ui/views/extensions/extensions_menu_view_controller.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ui/views/extensions/extensions_menu_view_controller.h"
 
 #include "base/i18n/case_conversion.h"
+#include "base/notreached.h"
 #include "chrome/browser/extensions/site_permissions_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
@@ -13,9 +14,11 @@
 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/extensions/extensions_dialogs_utils.h"
+#include "chrome/browser/ui/views/extensions/extensions_menu_item_view.h"
 #include "chrome/browser/ui/views/extensions/extensions_menu_main_page_view.h"
 #include "chrome/browser/ui/views/extensions/extensions_menu_site_permissions_page_view.h"
 #include "content/public/browser/web_contents.h"
+#include "extensions/browser/extension_system.h"
 #include "extensions/browser/permissions_manager.h"
 #include "ui/base/metadata/metadata_types.h"
 #include "ui/views/bubble/bubble_dialog_delegate_view.h"
@@ -68,6 +71,16 @@
   return views::AsViewClass<ExtensionsMenuSitePermissionsPageView>(page);
 }
 
+// Returns whether `extension` cannot have its site access modified by the user
+// because of policy.
+bool HasEnterpriseForcedAccess(const extensions::Extension& extension,
+                               Profile& profile) {
+  extensions::ManagementPolicy* policy =
+      extensions::ExtensionSystem::Get(&profile)->management_policy();
+  return !policy->UserMayModifySettings(&extension, nullptr) ||
+         policy->MustRemainInstalled(&extension, nullptr);
+}
+
 // Returns whether the site setting toggle for `web_contents` should be visible.
 bool IsSiteSettingsToggleVisible(
     const raw_ptr<ToolbarActionsModel> toolbar_model,
@@ -84,6 +97,42 @@
          extensions::PermissionsManager::UserSiteSetting::kCustomizeByExtension;
 }
 
+// Returns whether the site permissions button should be visible.
+bool IsSitePermissionsButtonVisible(const extensions::Extension& extension,
+                                    Profile& profile,
+                                    const ToolbarActionsModel& toolbar_model,
+                                    content::WebContents& web_contents) {
+  // Button is never visible when site is restricted.
+  if (toolbar_model.IsRestrictedUrl(web_contents.GetLastCommittedURL())) {
+    return false;
+  }
+
+  PermissionsManager::UserSiteSetting user_site_setting =
+      extensions::PermissionsManager::Get(&profile)->GetUserSiteSetting(
+          web_contents.GetPrimaryMainFrame()->GetLastCommittedOrigin());
+  switch (user_site_setting) {
+    case PermissionsManager::UserSiteSetting::kCustomizeByExtension: {
+      // Extensions should always display the button.
+      return true;
+    }
+    case PermissionsManager::UserSiteSetting::kBlockAllExtensions: {
+      // Extension should only display the button when it's an enterprise
+      // extension and has granted access.
+      bool enterprise_forced_access =
+          HasEnterpriseForcedAccess(extension, profile);
+      SitePermissionsHelper::SiteInteraction site_interaction =
+          SitePermissionsHelper(&profile).GetSiteInteraction(extension,
+                                                             &web_contents);
+      return enterprise_forced_access &&
+             site_interaction ==
+                 SitePermissionsHelper::SiteInteraction::kGranted;
+    }
+    case PermissionsManager::UserSiteSetting::kGrantAllExtensions: {
+      NOTREACHED_NORETURN();
+    }
+  }
+}
+
 }  // namespace
 
 ExtensionsMenuViewController::ExtensionsMenuViewController(
@@ -181,6 +230,20 @@
         IsSiteSettingsToggleOn(browser_, web_contents);
     main_page->Update(current_site, is_site_settings_toggle_visible,
                       is_site_settings_toggle_on);
+
+    std::vector<ExtensionMenuItemView*> menu_items = main_page->GetMenuItems();
+    for (auto* menu_item : menu_items) {
+      const extensions::Extension* extension =
+          extensions::ExtensionRegistry::Get(browser_->profile())
+              ->enabled_extensions()
+              .GetByID(menu_item->view_controller()->GetId());
+      CHECK(extension);
+
+      bool is_site_permissions_button_visible = IsSitePermissionsButtonVisible(
+          *extension, *browser_->profile(), *toolbar_model_,
+          *GetActiveWebContents());
+      menu_item->Update(is_site_permissions_button_visible);
+    }
   }
 }
 
@@ -202,10 +265,14 @@
   std::unique_ptr<ExtensionActionViewController> action_controller =
       ExtensionActionViewController::Create(action_id, browser_,
                                             extensions_container_);
+  bool is_site_permissions_button_visible = IsSitePermissionsButtonVisible(
+      *action_controller->extension(), *browser_->profile(), *toolbar_model_,
+      *GetActiveWebContents());
 
   main_page->CreateAndInsertMenuItem(
       std::move(action_controller), action_id,
-      extensions_container_->CanShowActionsInToolbar(), index);
+      extensions_container_->CanShowActionsInToolbar(),
+      is_site_permissions_button_visible, index);
 
   // TODO(crbug.com/1390952): Update requests access section once such section
   // is implemented (if the extension added requests site access, it needs to be
@@ -355,8 +422,12 @@
     std::unique_ptr<ExtensionActionViewController> action_controller =
         ExtensionActionViewController::Create(sorted_ids[i], browser_,
                                               extensions_container_);
+    bool is_site_permissions_button_visible = IsSitePermissionsButtonVisible(
+        *action_controller->extension(), *browser_->profile(), *toolbar_model_,
+        *GetActiveWebContents());
     main_page->CreateAndInsertMenuItem(std::move(action_controller),
-                                       sorted_ids[i], allow_pinning, i);
+                                       sorted_ids[i], allow_pinning,
+                                       is_site_permissions_button_visible, i);
   }
 }
 
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc
index 368ffa63..1c890d4 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc
@@ -18,6 +18,7 @@
 #include "extensions/browser/notification_types.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_builder.h"
+#include "extensions/common/mojom/manifest.mojom-shared.h"
 #include "extensions/common/value_builder.h"
 #include "extensions/test/permissions_manager_waiter.h"
 #include "ui/events/base_event_utils.h"
@@ -71,13 +72,23 @@
 }
 
 scoped_refptr<const extensions::Extension>
+ExtensionsToolbarUnitTest::InstallEnterpriseExtension(
+    const std::string& name,
+    const std::vector<std::string>& host_permissions) {
+  return InstallExtension(name, {}, host_permissions,
+                          extensions::mojom::ManifestLocation::kExternalPolicy);
+}
+
+scoped_refptr<const extensions::Extension>
 ExtensionsToolbarUnitTest::InstallExtension(
     const std::string& name,
     const std::vector<std::string>& permissions,
-    const std::vector<std::string>& host_permissions) {
+    const std::vector<std::string>& host_permissions,
+    extensions::mojom::ManifestLocation location) {
   scoped_refptr<const extensions::Extension> extension =
       extensions::ExtensionBuilder(name)
           .SetManifestVersion(3)
+          .SetLocation(location)
           .AddPermissions(permissions)
           .SetManifestKey("host_permissions", ToListValue(host_permissions))
           .SetID(crx_file::id_util::GenerateId(name))
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h
index 7ded1105b..f038034 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h
@@ -62,12 +62,18 @@
       const std::string& name,
       const std::vector<std::string>& permissions);
 
-  // Adds the specified `extension` with the given `host_permissions` and
-  // `permissions`.
+  scoped_refptr<const extensions::Extension> InstallEnterpriseExtension(
+      const std::string& name,
+      const std::vector<std::string>& host_permissions);
+
+  // Adds the specified `extension` with the given `host_permissions`,
+  // `permissions` and `location`.
   scoped_refptr<const extensions::Extension> InstallExtension(
       const std::string& name,
       const std::vector<std::string>& permissions,
-      const std::vector<std::string>& host_permissions);
+      const std::vector<std::string>& host_permissions,
+      extensions::mojom::ManifestLocation location =
+          extensions::mojom::ManifestLocation::kUnpacked);
 
   // Reloads the extension of the given `extension_id`.
   void ReloadExtension(const extensions::ExtensionId& extension_id);
diff --git a/chrome/browser/ui/views/omnibox/omnibox_row_view.cc b/chrome/browser/ui/views/omnibox/omnibox_row_view.cc
index 79cfdc9..a67fbcd 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_row_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_row_view.cc
@@ -61,7 +61,7 @@
     header_label_->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT);
 
     const gfx::FontList& font =
-        views::style::GetFont(CONTEXT_OMNIBOX_PRIMARY,
+        views::style::GetFont(CONTEXT_OMNIBOX_SECTION_HEADER,
                               views::style::STYLE_PRIMARY)
             .DeriveWithWeight(gfx::Font::Weight::MEDIUM);
     header_label_->SetFontList(font);
diff --git a/chrome/browser/ui/views/omnibox/omnibox_text_view.cc b/chrome/browser/ui/views/omnibox/omnibox_text_view.cc
index 30c02f2..8efd2c7 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_text_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_text_view.cc
@@ -274,7 +274,7 @@
   render_text->SetElideBehavior(gfx::ELIDE_TAIL);
   const gfx::FontList& font = views::style::GetFont(
       (use_deemphasized_font_ ? CONTEXT_OMNIBOX_DEEMPHASIZED
-                              : CONTEXT_OMNIBOX_PRIMARY),
+                              : CONTEXT_OMNIBOX_POPUP),
       kTextStyle);
   render_text->SetFontList(font);
   render_text->SetText(text);
diff --git a/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog_manager.cc b/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog_manager.cc
index 2bd1b76..31bcadf 100644
--- a/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog_manager.cc
+++ b/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog_manager.cc
@@ -40,14 +40,17 @@
  public:
   explicit TailoredSecurityDialogModelDelegate(
       const char* kOutcomeMetricName,
+      base::UserMetricsAction accept_user_action,
       base::UserMetricsAction settings_user_action)
       : kOutcomeMetricName_(kOutcomeMetricName),
+        accept_user_action_(accept_user_action),
         settings_user_action_(settings_user_action) {}
 
   void OnDialogAccepted() {
     // Just count the click.
     base::UmaHistogramEnumeration(kOutcomeMetricName_,
                                   TailoredSecurityOutcome::kAccepted);
+    base::RecordAction(accept_user_action_);
   }
 
   void OnDialogRejected(Browser* browser) {
@@ -74,6 +77,7 @@
 
  private:
   const std::string kOutcomeMetricName_;
+  const base::UserMetricsAction accept_user_action_;
   const base::UserMetricsAction settings_user_action_;
   base::WeakPtrFactory<TailoredSecurityDialogModelDelegate> weak_factory_{this};
 };
@@ -84,6 +88,8 @@
       : TailoredSecurityDialogModelDelegate(
             kDisabledDialogOutcome,
             base::UserMetricsAction("SafeBrowsing.AccountIntegration."
+                                    "DisabledDialog.OkButtonClicked"),
+            base::UserMetricsAction("SafeBrowsing.AccountIntegration."
                                     "DisabledDialog.SettingsButtonClicked")) {}
 };
 
@@ -93,6 +99,8 @@
       : TailoredSecurityDialogModelDelegate(
             kEnabledDialogOutcome,
             base::UserMetricsAction("SafeBrowsing.AccountIntegration."
+                                    "EnabledDialog.OkButtonClicked"),
+            base::UserMetricsAction("SafeBrowsing.AccountIntegration."
                                     "EnabledDialog.SettingsButtonClicked")) {}
 };
 
@@ -143,6 +151,8 @@
     std::move(close_dialog_callback_).Run();
   }
   close_dialog_callback_ = model_delegate_ptr->GetCloseDialogCallback();
+  base::RecordAction(base::UserMetricsAction(
+      "SafeBrowsing.AccountIntegration.EnabledDialog.Shown"));
   constrained_window::ShowBrowserModal(std::move(dialog_model),
                                        browser->window()->GetNativeWindow());
 }
@@ -185,6 +195,8 @@
     std::move(close_dialog_callback_).Run();
   }
   close_dialog_callback_ = model_delegate_ptr->GetCloseDialogCallback();
+  base::RecordAction(base::UserMetricsAction(
+      "SafeBrowsing.AccountIntegration.DisabledDialog.Shown"));
   constrained_window::ShowBrowserModal(std::move(dialog_model),
                                        browser->window()->GetNativeWindow());
 }
diff --git a/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog_manager_browsertest.cc b/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog_manager_browsertest.cc
index b4fc09b5..340af332 100644
--- a/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog_manager_browsertest.cc
+++ b/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog_manager_browsertest.cc
@@ -181,6 +181,37 @@
 }
 
 IN_PROC_BROWSER_TEST_P(TailoredSecurityDesktopDialogManagerTest,
+                       EnabledDialogRecordsUserActionOnShow) {
+  base::UserActionTester uat;
+  EXPECT_EQ(
+      uat.GetActionCount("SafeBrowsing.AccountIntegration.EnabledDialog.Shown"),
+      0);
+
+  ShowTailoredSecurityEnabledDialog(browser());
+
+  EXPECT_EQ(
+      uat.GetActionCount("SafeBrowsing.AccountIntegration.EnabledDialog.Shown"),
+      1);
+}
+
+IN_PROC_BROWSER_TEST_P(TailoredSecurityDesktopDialogManagerTest,
+                       EnabledDialogOkButtonRecordsUserAction) {
+  base::UserActionTester uat;
+  auto* dialog = ShowTailoredSecurityEnabledDialog(browser());
+  auto* bubble_delegate = dialog->widget_delegate()->AsBubbleDialogDelegate();
+  EXPECT_EQ(
+      uat.GetActionCount(
+          "SafeBrowsing.AccountIntegration.EnabledDialog.OkButtonClicked"),
+      0);
+
+  ClickButton(bubble_delegate, bubble_delegate->GetOkButton());
+  EXPECT_EQ(
+      uat.GetActionCount(
+          "SafeBrowsing.AccountIntegration.EnabledDialog.OkButtonClicked"),
+      1);
+}
+
+IN_PROC_BROWSER_TEST_P(TailoredSecurityDesktopDialogManagerTest,
                        EnabledDialogCancelButtonRecordsUserAction) {
   base::UserActionTester uat;
   auto* dialog = ShowTailoredSecurityEnabledDialog(browser());
@@ -237,6 +268,35 @@
 }
 
 IN_PROC_BROWSER_TEST_P(TailoredSecurityDesktopDialogManagerTest,
+                       DisabledDialogRecordsUserActionOnShow) {
+  base::UserActionTester uat;
+  EXPECT_EQ(uat.GetActionCount(
+                "SafeBrowsing.AccountIntegration.DisabledDialog.Shown"),
+            0);
+
+  ShowTailoredSecurityDisabledDialog(browser());
+
+  EXPECT_EQ(uat.GetActionCount(
+                "SafeBrowsing.AccountIntegration.DisabledDialog.Shown"),
+            1);
+}
+
+IN_PROC_BROWSER_TEST_P(TailoredSecurityDesktopDialogManagerTest,
+                       DisabledDialogOkButtonRecordsUserAction) {
+  base::UserActionTester uat;
+  auto* dialog = ShowTailoredSecurityDisabledDialog(browser());
+  auto* bubble_delegate = dialog->widget_delegate()->AsBubbleDialogDelegate();
+  EXPECT_EQ(uat.GetActionCount("SafeBrowsing.AccountIntegration.DisabledDialog."
+                               "OkButtonClicked"),
+            0);
+
+  ClickButton(bubble_delegate, bubble_delegate->GetOkButton());
+  EXPECT_EQ(uat.GetActionCount("SafeBrowsing.AccountIntegration.DisabledDialog."
+                               "OkButtonClicked"),
+            1);
+}
+
+IN_PROC_BROWSER_TEST_P(TailoredSecurityDesktopDialogManagerTest,
                        DisabledDialogCancelButtonRecordsUserAction) {
   base::UserActionTester uat;
   auto* dialog = ShowTailoredSecurityDisabledDialog(browser());
diff --git a/chrome/browser/ui/views/site_data/page_specific_site_data_dialog_interactive_uitest.cc b/chrome/browser/ui/views/site_data/page_specific_site_data_dialog_interactive_uitest.cc
index 3ca19bb..a1610e4 100644
--- a/chrome/browser/ui/views/site_data/page_specific_site_data_dialog_interactive_uitest.cc
+++ b/chrome/browser/ui/views/site_data/page_specific_site_data_dialog_interactive_uitest.cc
@@ -125,9 +125,11 @@
         NavigateWebContents(kWebContentsElementId, third_party_cookie_page_url),
         Do(base::BindOnce(
             [](content::CookieChangeObserver* cookie_observer) {
+              /* TODO(jam): enable this after fixing.
               if (cookie_observer) {
                 cookie_observer->Wait();
               }
+              */
             },
             cookie_observer)),
         PressButton(kLocationIconElementId),
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
index a14cecf..a16c7f3 100644
--- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
@@ -1562,7 +1562,7 @@
     // expected to open a new one, so only wait for a new browser to be added
     // if there wasn't an open one already.
     app_browser_ = GetBrowserForAppId(profile(), app_id);
-    LaunchFromAppShim(site, /*urls=*/{});
+    LaunchFromAppShim(site, /*urls=*/{}, /*wait_for_complete_launch=*/true);
     if (!app_browser_) {
       browser_added_waiter.Wait();
       app_browser_ = browser_added_waiter.browser_added();
@@ -1570,7 +1570,7 @@
     active_app_id_ = app_id;
     EXPECT_TRUE(AppBrowserController::IsForWebApp(app_browser(), app_id));
   } else {
-    LaunchFromAppShim(site, /*urls=*/{});
+    LaunchFromAppShim(site, /*urls=*/{}, /*wait_for_complete_launch=*/true);
   }
 #else
   if (is_open_in_app_browser) {
@@ -3826,7 +3826,7 @@
     urls.push_back(net::FilePathToFileURL(path));
   }
 
-  LaunchFromAppShim(site, urls);
+  LaunchFromAppShim(site, urls, /*wait_for_complete_launch=*/false);
 #else
   StartupBrowserCreator browser_creator;
   base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
@@ -3853,20 +3853,108 @@
 }
 
 #if BUILDFLAG(IS_MAC)
-void WebAppIntegrationTestDriver::LaunchFromAppShim(
+class AppShimLaunchWaiter : public apps::AppShimManager::AppShimObserver {
+ public:
+  explicit AppShimLaunchWaiter(bool wait_for_complete_launch)
+      : wait_for_complete_launch_(wait_for_complete_launch) {}
+
+  base::WeakPtr<AppShimLaunchWaiter> AsWeakPtr() {
+    return weak_factory_.GetWeakPtr();
+  }
+
+  bool did_launch() const { return did_launch_; }
+
+  void OnLaunchStarted(base::Process process) {
+    if (!process.IsValid()) {
+      LOG(INFO) << "App Shim quit before finishing launch";
+      loop_.Quit();
+      return;
+    }
+    expected_pid_ = process.Pid();
+    LOG(INFO) << "Waiting for App Shim with PID " << *expected_pid_;
+    MaybeQuitLoop();
+  }
+
+  void Wait() { loop_.Run(); }
+
+  void OnShimTerminated() {
+    LOG(INFO) << "App Shim terminated while launching";
+    loop_.Quit();
+  }
+
+  void OnShimProcessConnected(base::ProcessId pid) override {
+    LOG(INFO) << "Got App Shim connection from " << pid;
+    if (!wait_for_complete_launch_) {
+      launched_shims_.insert(pid);
+      did_launch_ = true;
+      MaybeQuitLoop();
+    }
+  }
+
+  void OnShimProcessConnectedAndAllLaunchesDone(
+      base::ProcessId pid,
+      chrome::mojom::AppShimLaunchResult result) override {
+    LOG(INFO) << "Finished launching App Shim " << pid << " with result "
+              << result;
+    did_launch_ = true;
+    launched_shims_.insert(pid);
+    MaybeQuitLoop();
+  }
+
+  void OnShimReopen(base::ProcessId pid) override {
+    LOG(INFO) << "Reopened App Shim " << pid;
+    did_launch_ = true;
+    launched_shims_.insert(pid);
+    MaybeQuitLoop();
+  }
+
+  void OnShimOpenedURLs(base::ProcessId pid) override {
+    LOG(INFO) << "App Shim opened URLs " << pid;
+    did_launch_ = true;
+    launched_shims_.insert(pid);
+    MaybeQuitLoop();
+  }
+
+ private:
+  void MaybeQuitLoop() {
+    if (expected_pid_.has_value() &&
+        launched_shims_.find(*expected_pid_) != launched_shims_.end()) {
+      loop_.Quit();
+    }
+  }
+
+  bool wait_for_complete_launch_ = true;
+
+  base::RunLoop loop_;
+  std::set<base::ProcessId> launched_shims_;
+  absl::optional<base::ProcessId> expected_pid_;
+  bool did_launch_ = false;
+  base::WeakPtrFactory<AppShimLaunchWaiter> weak_factory_{this};
+};
+
+bool WebAppIntegrationTestDriver::LaunchFromAppShim(
     Site site,
-    const std::vector<GURL>& urls) {
+    const std::vector<GURL>& urls,
+    bool wait_for_complete_launch) {
   AppId app_id = GetAppIdBySiteMode(site);
   std::string app_name = GetSiteConfiguration(site).app_name;
   base::FilePath app_path = GetShortcutPath(
       override_registration_->test_override->chrome_apps_folder(), app_name,
       app_id);
-  base::RunLoop loop;
-  LaunchShimForTesting(
-      app_path, urls,
-      base::BindLambdaForTesting([&](base::Process process) { loop.Quit(); }),
-      base::DoNothing());
-  loop.Run();
+
+  AppShimLaunchWaiter launch_waiter(wait_for_complete_launch);
+  apps::AppShimManager::Get()->SetAppShimObserverForTesting(&launch_waiter);
+
+  LaunchShimForTesting(app_path, urls,
+                       base::BindOnce(&AppShimLaunchWaiter::OnLaunchStarted,
+                                      launch_waiter.AsWeakPtr()),
+                       base::BindOnce(&AppShimLaunchWaiter::OnShimTerminated,
+                                      launch_waiter.AsWeakPtr()));
+  launch_waiter.Wait();
+
+  apps::AppShimManager::Get()->SetAppShimObserverForTesting(nullptr);
+
+  return launch_waiter.did_launch();
 }
 #endif
 
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h
index 79fa39c..4016600 100644
--- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h
+++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h
@@ -438,7 +438,9 @@
 
   void LaunchAppStartupBrowserCreator(const AppId& app_id);
 #if BUILDFLAG(IS_MAC)
-  void LaunchFromAppShim(Site site, const std::vector<GURL>& urls);
+  bool LaunchFromAppShim(Site site,
+                         const std::vector<GURL>& urls,
+                         bool wait_for_complete_launch);
 #endif
 
   void CheckAppSettingsAppState(Profile* profile, const AppState& app_state);
diff --git a/chrome/browser/ui/webui/app_service_internals/app_service_internals.mojom b/chrome/browser/ui/webui/app_service_internals/app_service_internals.mojom
index 24dd455..7645e24 100644
--- a/chrome/browser/ui/webui/app_service_internals/app_service_internals.mojom
+++ b/chrome/browser/ui/webui/app_service_internals/app_service_internals.mojom
@@ -30,6 +30,16 @@
   string preferred_filters;
 };
 
+// Contains debugging information for a single promise app.
+struct PromiseAppInfo {
+  // The package ID for the promise app.
+  string package_id;
+
+  // Preformatted plain-text containing information about the internal state of
+  // the promise app.
+  string debug_info;
+};
+
 // Handler providing access to App Service information from the
 // chrome://app-service-internals WebUI.
 interface AppServiceInternalsPageHandler {
@@ -38,5 +48,8 @@
   GetApps() => (array<AppInfo> app_list);
 
   // Returns an array of debug information about preferred apps.
-  GetPreferredApps() => (array<PreferredAppInfo> preferred_app_list_);
+  GetPreferredApps() => (array<PreferredAppInfo> preferred_app_list);
+
+  // Returns an array of debug information about every promise app.
+  GetPromiseApps() => (array<PromiseAppInfo> promise_app_list);
 };
diff --git a/chrome/browser/ui/webui/app_service_internals/app_service_internals_page_handler_impl.cc b/chrome/browser/ui/webui/app_service_internals/app_service_internals_page_handler_impl.cc
index 71c0f1be..91eb0d9 100644
--- a/chrome/browser/ui/webui/app_service_internals/app_service_internals_page_handler_impl.cc
+++ b/chrome/browser/ui/webui/app_service_internals/app_service_internals_page_handler_impl.cc
@@ -13,6 +13,8 @@
 #include "base/containers/flat_map.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
+#include "chrome/browser/apps/app_service/package_id.h"
+#include "chrome/browser/apps/app_service/promise_apps/promise_apps.h"
 #include "components/services/app_service/public/cpp/app_update.h"
 #include "components/services/app_service/public/cpp/intent_filter_util.h"
 #include "components/services/app_service/public/cpp/intent_util.h"
@@ -97,3 +99,31 @@
             [](const auto& a, const auto& b) { return a->name < b->name; });
   std::move(callback).Run(std::move(result));
 }
+
+void AppServiceInternalsPageHandlerImpl::GetPromiseApps(
+    GetPromiseAppsCallback callback) {
+  DCHECK(profile_);
+  std::vector<mojom::app_service_internals::PromiseAppInfoPtr> result;
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  auto* proxy = apps::AppServiceProxyFactory::GetForProfile(profile_);
+  if (!proxy) {
+    std::move(callback).Run(std::move(result));
+    return;
+  }
+  for (auto const& promise_app :
+       proxy->PromiseAppRegistryCache().GetAllPromiseApps()) {
+    std::stringstream debug_info;
+    debug_info << *promise_app;
+    result.emplace_back(absl::in_place,
+                        promise_app.get()->package_id.ToString(),
+                        debug_info.str());
+  }
+
+  std::sort(result.begin(), result.end(), [](const auto& a, const auto& b) {
+    return a->package_id < b->package_id;
+  });
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+  std::move(callback).Run(std::move(result));
+}
diff --git a/chrome/browser/ui/webui/app_service_internals/app_service_internals_page_handler_impl.h b/chrome/browser/ui/webui/app_service_internals/app_service_internals_page_handler_impl.h
index 4811076e..05cfeed 100644
--- a/chrome/browser/ui/webui/app_service_internals/app_service_internals_page_handler_impl.h
+++ b/chrome/browser/ui/webui/app_service_internals/app_service_internals_page_handler_impl.h
@@ -27,6 +27,7 @@
   // mojom::app_service_internals::AppServiceInternalsPageHandler:
   void GetApps(GetAppsCallback callback) override;
   void GetPreferredApps(GetPreferredAppsCallback callback) override;
+  void GetPromiseApps(GetPromiseAppsCallback callback) override;
 
  private:
   raw_ptr<Profile> profile_;
diff --git a/chrome/browser/ui/webui/side_panel/companion/companion.mojom b/chrome/browser/ui/webui/side_panel/companion/companion.mojom
index 2b5f7c3..7456892 100644
--- a/chrome/browser/ui/webui/side_panel/companion/companion.mojom
+++ b/chrome/browser/ui/webui/side_panel/companion/companion.mojom
@@ -20,9 +20,7 @@
 
 // WebUI page handler for request from Browser side. (C++ -> TypeScript)
 interface CompanionPage {
-  // Initialize the page with the initial main content URL.
-  OnInitializePage(string initial_url);
-
-  // Pass the current main content URL to frontend
+  // Pass the companion URL needed to request the iframe to the frontend for
+  // rendering.
   OnURLChanged(string new_url);
 };
diff --git a/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.cc b/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.cc
index 3dfe9bf..150be00c 100644
--- a/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.cc
+++ b/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.cc
@@ -8,12 +8,16 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/webui/side_panel/companion/companion_side_panel_untrusted_ui.h"
+#include "chrome/browser/ui/webui/side_panel/companion/companion_url_builder.h"
 #include "chrome/common/webui_url_constants.h"
 #include "components/prefs/pref_service.h"
 #include "components/unified_consent/pref_names.h"
 #include "content/public/browser/web_contents.h"
 #include "net/base/url_util.h"
 #include "url/gurl.h"
+
+namespace companion {
+
 CompanionPageHandler::CompanionPageHandler(
     mojo::PendingReceiver<side_panel::mojom::CompanionPageHandler> receiver,
     mojo::PendingRemote<side_panel::mojom::CompanionPage> page,
@@ -23,15 +27,17 @@
           browser->tab_strip_model()->GetActiveWebContents()),
       receiver_(this, std::move(receiver)),
       page_(std::move(page)),
-      companion_untrusted_ui_(companion_untrusted_ui) {
+      companion_untrusted_ui_(companion_untrusted_ui),
+      url_builder_(std::make_unique<CompanionUrlBuilder>(
+          browser->profile()->GetPrefs())) {
   DCHECK(browser);
-  InitializePage();
+  NotifyURLChanged();
 }
 
 CompanionPageHandler::~CompanionPageHandler() = default;
 
 void CompanionPageHandler::PrimaryPageChanged(content::Page& page) {
-  if (!IsMsbbEnabled()) {
+  if (!url_builder_->IsMsbbEnabled()) {
     return;
   }
   NotifyURLChanged();
@@ -43,43 +49,10 @@
   }
 }
 
-void CompanionPageHandler::InitializePage() {
-  if (!IsMsbbEnabled()) {
-    page_->OnInitializePage(GetCompanionURLWithQueryParams(GURL()).spec());
-    return;
-  }
-
-  page_->OnInitializePage(
-      GetCompanionURLWithQueryParams(web_contents()->GetVisibleURL()).spec());
-}
-
 void CompanionPageHandler::NotifyURLChanged() {
-  page_->OnURLChanged(
-      GetCompanionURLWithQueryParams(web_contents()->GetVisibleURL()).spec());
+  GURL companion_url =
+      url_builder_->BuildCompanionURL(web_contents()->GetVisibleURL());
+  page_->OnURLChanged(companion_url.spec());
 }
 
-GURL CompanionPageHandler::GetCompanionURLWithQueryParams(
-    GURL url_query_param_value) {
-  GURL url_with_query_params = GetHomepageURLForCompanion();
-
-  // Add relevant query parameters to the homepage URL.
-  if (!url_query_param_value.is_empty()) {
-    url_with_query_params = net::AppendOrReplaceQueryParameter(
-        url_with_query_params, kUrlQueryParameterKey,
-        url_query_param_value.spec());
-  }
-  url_with_query_params = net::AppendOrReplaceQueryParameter(
-      url_with_query_params, kOriginQueryParameterKey,
-      kOriginQueryParameterValue);
-  return url_with_query_params;
-}
-
-GURL CompanionPageHandler::GetHomepageURLForCompanion() {
-  return GURL(features::kHomepageURLForCompanion.Get());
-}
-
-bool CompanionPageHandler::IsMsbbEnabled() {
-  auto* profile = Profile::FromWebUI(companion_untrusted_ui_->web_ui());
-  return profile->GetPrefs()->GetBoolean(
-      unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled);
-}
+}  // namespace companion
diff --git a/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.h b/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.h
index 8a65d3829..c357f6d 100644
--- a/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.h
+++ b/chrome/browser/ui/webui/side_panel/companion/companion_page_handler.h
@@ -16,14 +16,8 @@
 class Browser;
 class CompanionSidePanelUntrustedUI;
 
-// Query parameter for the url of the main web content.
-inline constexpr char kUrlQueryParameterKey[] = "url";
-// Query parameter for the Chrome WebUI origin.
-inline constexpr char kOriginQueryParameterKey[] = "origin";
-// Query parameter value for the Chrome WebUI origin. This needs to be different
-// from the WebUI URL constant because it does not include the last '/'.
-inline constexpr char kOriginQueryParameterValue[] =
-    "chrome-untrusted://companion-side-panel.top-chrome";
+namespace companion {
+class CompanionUrlBuilder;
 
 class CompanionPageHandler : public side_panel::mojom::CompanionPageHandler,
                              public content::WebContentsObserver {
@@ -44,24 +38,15 @@
   void PrimaryPageChanged(content::Page& page) override;
 
  private:
-  // Notifies the companion page of the initial URL it should load if any.
-  // Otherwise, it will load the zero state.
-  void InitializePage();
-
   // Notifies the companion page of the visible URL when the active tab has
   // changed or when the primary page has changed on the active tab.
   void NotifyURLChanged();
-  bool IsMsbbEnabled();
-
-  // Returns the companion URL that will be loaded in the side panel with the
-  // URL query parameter set to `url_query_param_value` and the origin query
-  // parameter set the to URL of the WebUI.
-  GURL GetCompanionURLWithQueryParams(GURL url_query_param_value);
-  GURL GetHomepageURLForCompanion();
 
   mojo::Receiver<side_panel::mojom::CompanionPageHandler> receiver_;
   mojo::Remote<side_panel::mojom::CompanionPage> page_;
   raw_ptr<CompanionSidePanelUntrustedUI> companion_untrusted_ui_ = nullptr;
+  std::unique_ptr<CompanionUrlBuilder> url_builder_;
 };
+}  // namespace companion
 
 #endif  // CHROME_BROWSER_UI_WEBUI_SIDE_PANEL_COMPANION_COMPANION_PAGE_HANDLER_H_
diff --git a/chrome/browser/ui/webui/side_panel/companion/companion_side_panel_untrusted_ui.cc b/chrome/browser/ui/webui/side_panel/companion/companion_side_panel_untrusted_ui.cc
index e286499..9c53b47 100644
--- a/chrome/browser/ui/webui/side_panel/companion/companion_side_panel_untrusted_ui.cc
+++ b/chrome/browser/ui/webui/side_panel/companion/companion_side_panel_untrusted_ui.cc
@@ -55,7 +55,7 @@
 void CompanionSidePanelUntrustedUI::CreateCompanionPageHandler(
     mojo::PendingReceiver<side_panel::mojom::CompanionPageHandler> receiver,
     mojo::PendingRemote<side_panel::mojom::CompanionPage> page) {
-  companion_page_handler_ = std::make_unique<CompanionPageHandler>(
+  companion_page_handler_ = std::make_unique<companion::CompanionPageHandler>(
       std::move(receiver), std::move(page), browser_, this);
 }
 
diff --git a/chrome/browser/ui/webui/side_panel/companion/companion_url_builder.cc b/chrome/browser/ui/webui/side_panel/companion/companion_url_builder.cc
new file mode 100644
index 0000000..4b78734
--- /dev/null
+++ b/chrome/browser/ui/webui/side_panel/companion/companion_url_builder.cc
@@ -0,0 +1,89 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/side_panel/companion/companion_url_builder.h"
+
+#include "base/base64.h"
+#include "chrome/browser/ui/ui_features.h"
+#include "chrome/browser/ui/webui/side_panel/companion/constants.h"
+#include "chrome/browser/ui/webui/side_panel/companion/proto/companion_url_params.pb.h"
+#include "components/prefs/pref_service.h"
+#include "components/unified_consent/pref_names.h"
+#include "components/unified_consent/url_keyed_data_collection_consent_helper.h"
+#include "net/base/url_util.h"
+#include "url/gurl.h"
+
+namespace companion {
+namespace {
+
+// TODO(b/274714162): Update server side code soon after this change.
+// Query parameter for the companion url.
+inline constexpr char kQueryStringKey[] = "query";
+
+// Query parameter for the url of the main web content.
+inline constexpr char kUrlQueryParameterKey[] = "url";
+// Query parameter for the Chrome WebUI origin.
+inline constexpr char kOriginQueryParameterKey[] = "origin";
+// Query parameter value for the Chrome WebUI origin. This needs to be different
+// from the WebUI URL constant because it does not include the last '/'.
+inline constexpr char kOriginQueryParameterValue[] =
+    "chrome-untrusted://companion-side-panel.top-chrome";
+}  // namespace
+
+CompanionUrlBuilder::CompanionUrlBuilder(PrefService* pref_service)
+    : pref_service_(pref_service) {}
+
+CompanionUrlBuilder::~CompanionUrlBuilder() = default;
+
+bool CompanionUrlBuilder::IsMsbbEnabled() {
+  std::unique_ptr<unified_consent::UrlKeyedDataCollectionConsentHelper>
+      consent_helper = unified_consent::UrlKeyedDataCollectionConsentHelper::
+          NewAnonymizedDataCollectionConsentHelper(pref_service_);
+  return consent_helper->IsEnabled();
+}
+
+GURL CompanionUrlBuilder::BuildCompanionURL(GURL page_url) {
+  // Fill the protobuf with the required query params.
+  companion::proto::QueryParams url_params;
+  bool is_msbb_enabled = IsMsbbEnabled();
+  if (is_msbb_enabled) {
+    url_params.set_page_url(page_url.spec());
+  }
+  url_params.set_has_msbb_enabled(is_msbb_enabled);
+
+  // TODO(b/273652233): Uncomment.
+  // companion::proto::PromoState* promo_state =
+  // url_params.mutable_promo_state();
+  // promo_state->set_signin_promo_denial_count(
+  //     pref_service_->GetInteger(kSigninPromoDeclinedPref));
+  // promo_state->set_msbb_promo_denial_count(
+  //     pref_service_->GetInteger(kMsbbPromoDeclinedPref));
+  // promo_state->set_labs_promo_denial_count(
+  //     pref_service_->GetInteger(kLabsPromoDeclinedPref));
+
+  GURL url_with_query_params = GetHomepageURLForCompanion();
+  std::string base64_encoded_proto;
+  base::Base64Encode(url_params.SerializeAsString(), &base64_encoded_proto);
+  url_with_query_params = net::AppendOrReplaceQueryParameter(
+      url_with_query_params, kQueryStringKey, base64_encoded_proto);
+
+  // Add origin as a param allowing the page to be iframed.
+  url_with_query_params = net::AppendOrReplaceQueryParameter(
+      url_with_query_params, kOriginQueryParameterKey,
+      kOriginQueryParameterValue);
+
+  // TODO(b/274714162): Remove URL param.
+  if (is_msbb_enabled) {
+    url_with_query_params = net::AppendOrReplaceQueryParameter(
+        url_with_query_params, kUrlQueryParameterKey, page_url.spec());
+  }
+
+  return url_with_query_params;
+}
+
+GURL CompanionUrlBuilder::GetHomepageURLForCompanion() {
+  return GURL(features::kHomepageURLForCompanion.Get());
+}
+
+}  // namespace companion
diff --git a/chrome/browser/ui/webui/side_panel/companion/companion_url_builder.h b/chrome/browser/ui/webui/side_panel/companion/companion_url_builder.h
new file mode 100644
index 0000000..2838a6a
--- /dev/null
+++ b/chrome/browser/ui/webui/side_panel/companion/companion_url_builder.h
@@ -0,0 +1,43 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SIDE_PANEL_COMPANION_COMPANION_URL_BUILDER_H_
+#define CHROME_BROWSER_UI_WEBUI_SIDE_PANEL_COMPANION_COMPANION_URL_BUILDER_H_
+
+#include "base/memory/raw_ptr.h"
+#include "url/gurl.h"
+
+class PrefService;
+namespace companion {
+
+// Utility to build URL for the search companion request. The URL contains
+// various query parameters needed at the server side such as main page URL,
+// origin, promo state etc. The params are packed into a single protobuf for
+// schema consistency.
+class CompanionUrlBuilder {
+ public:
+  explicit CompanionUrlBuilder(PrefService* pref_service);
+  CompanionUrlBuilder(const CompanionUrlBuilder&) = delete;
+  CompanionUrlBuilder& operator=(const CompanionUrlBuilder&) = delete;
+  ~CompanionUrlBuilder();
+
+  // Returns the companion URL that will be loaded in the side panel with the
+  // query parameter set to the protobuf representation of the `page_url` and
+  // associated state.
+  GURL BuildCompanionURL(GURL page_url);
+
+  // Util method to check whether make searches and browsing better option is
+  // enabled in the settings.
+  bool IsMsbbEnabled();
+
+ private:
+  // The base URL for companion.
+  GURL GetHomepageURLForCompanion();
+
+  raw_ptr<PrefService> pref_service_;
+};
+
+}  // namespace companion
+
+#endif  // CHROME_BROWSER_UI_WEBUI_SIDE_PANEL_COMPANION_COMPANION_URL_BUILDER_H_
diff --git a/chrome/browser/ui/webui/side_panel/companion/companion_url_builder_unittest.cc b/chrome/browser/ui/webui/side_panel/companion/companion_url_builder_unittest.cc
new file mode 100644
index 0000000..a6ee9b4
--- /dev/null
+++ b/chrome/browser/ui/webui/side_panel/companion/companion_url_builder_unittest.cc
@@ -0,0 +1,128 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/side_panel/companion/companion_url_builder.h"
+
+#include "base/base64.h"
+#include "base/logging.h"
+#include "chrome/browser/ui/webui/side_panel/companion/constants.h"
+#include "chrome/browser/ui/webui/side_panel/companion/proto/companion_url_params.pb.h"
+#include "components/prefs/pref_registry_simple.h"
+#include "components/prefs/testing_pref_service.h"
+#include "components/unified_consent/pref_names.h"
+#include "net/base/url_util.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::ContainsRegex;
+using ::testing::MatchesRegex;
+
+namespace companion {
+namespace {
+constexpr char kUrl[] = "https://foo.com/";
+constexpr char kOrigin[] = "chrome-untrusted://companion-side-panel.top-chrome";
+}  // namespace
+
+class CompanionUrlBuilderTest : public testing::Test {
+ public:
+  CompanionUrlBuilderTest() = default;
+  ~CompanionUrlBuilderTest() override = default;
+
+  void SetUp() override {
+    pref_service_.registry()->RegisterBooleanPref(
+        unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled,
+        false);
+
+    pref_service_.registry()->RegisterIntegerPref(kSigninPromoDeclinedPref, 0);
+    pref_service_.registry()->RegisterIntegerPref(kMsbbPromoDeclinedPref, 0);
+    pref_service_.registry()->RegisterIntegerPref(kLabsPromoDeclinedPref, 0);
+
+    pref_service_.SetUserPref(
+        unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled,
+        base::Value(true));
+    pref_service_.SetUserPref(kSigninPromoDeclinedPref, base::Value(1));
+    url_builder_ = std::make_unique<CompanionUrlBuilder>(&pref_service_);
+  }
+
+ protected:
+  TestingPrefServiceSimple pref_service_;
+  std::unique_ptr<CompanionUrlBuilder> url_builder_;
+};
+
+TEST_F(CompanionUrlBuilderTest, MsbbOff) {
+  pref_service_.SetUserPref(
+      unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled,
+      base::Value(false));
+  pref_service_.SetUserPref(kSigninPromoDeclinedPref, base::Value(1));
+  EXPECT_FALSE(url_builder_->IsMsbbEnabled());
+
+  GURL page_url(kUrl);
+  GURL companion_url = url_builder_->BuildCompanionURL(page_url);
+
+  std::string value;
+  EXPECT_FALSE(net::GetValueForKeyInQuery(companion_url, "url", &value));
+
+  EXPECT_TRUE(net::GetValueForKeyInQuery(companion_url, "origin", &value));
+  EXPECT_EQ(value, kOrigin);
+
+  // Deserialize the query param into protobuf.
+  companion::proto::QueryParams proto;
+  std::string url_param;
+  EXPECT_TRUE(net::GetValueForKeyInQuery(companion_url, "query", &url_param));
+  auto base64_decoded = base::Base64Decode(url_param);
+  auto serialized_proto =
+      std::string(base64_decoded.value().begin(), base64_decoded.value().end());
+  EXPECT_TRUE(proto.ParseFromString(serialized_proto));
+
+  // URL shouldn't be sent when MSBB is off.
+  EXPECT_EQ(proto.page_url(), std::string());
+  EXPECT_FALSE(proto.has_msbb_enabled());
+}
+
+TEST_F(CompanionUrlBuilderTest, MsbbOn) {
+  GURL page_url(kUrl);
+  GURL companion_url = url_builder_->BuildCompanionURL(page_url);
+  EXPECT_TRUE(url_builder_->IsMsbbEnabled());
+
+  std::string value;
+  EXPECT_TRUE(net::GetValueForKeyInQuery(companion_url, "url", &value));
+  EXPECT_EQ(value, page_url.spec());
+
+  EXPECT_TRUE(net::GetValueForKeyInQuery(companion_url, "origin", &value));
+  EXPECT_EQ(value, kOrigin);
+
+  // Deserialize the query param into protobuf.
+  companion::proto::QueryParams proto;
+  std::string url_param;
+  EXPECT_TRUE(net::GetValueForKeyInQuery(companion_url, "query", &url_param));
+  auto base64_decoded = base::Base64Decode(url_param);
+  auto serialized_proto =
+      std::string(base64_decoded.value().begin(), base64_decoded.value().end());
+  EXPECT_TRUE(proto.ParseFromString(serialized_proto));
+
+  // Verify fields inside protobuf.
+  EXPECT_EQ(proto.page_url(), page_url.spec());
+  EXPECT_TRUE(proto.has_msbb_enabled());
+
+  // TODO(b/273652233): Uncomment.
+  // Verify promo state.
+  // EXPECT_TRUE(proto.has_promo_state());
+  // EXPECT_EQ(1, proto.promo_state().signin_promo_denial_count());
+  // EXPECT_EQ(0, proto.promo_state().msbb_promo_denial_count());
+  // EXPECT_EQ(0, proto.promo_state().labs_promo_denial_count());
+}
+
+TEST_F(CompanionUrlBuilderTest, NonProtobufParams) {
+  GURL page_url(kUrl);
+  GURL companion_url = url_builder_->BuildCompanionURL(page_url);
+
+  std::string value;
+  EXPECT_TRUE(net::GetValueForKeyInQuery(companion_url, "url", &value));
+  EXPECT_EQ(value, page_url.spec());
+
+  EXPECT_TRUE(net::GetValueForKeyInQuery(companion_url, "origin", &value));
+  EXPECT_EQ(value, kOrigin);
+}
+
+}  // namespace companion
diff --git a/chrome/browser/ui/webui/side_panel/companion/constants.h b/chrome/browser/ui/webui/side_panel/companion/constants.h
new file mode 100644
index 0000000..d1889e6
--- /dev/null
+++ b/chrome/browser/ui/webui/side_panel/companion/constants.h
@@ -0,0 +1,20 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_SIDE_PANEL_COMPANION_CONSTANTS_H_
+#define CHROME_BROWSER_UI_WEBUI_SIDE_PANEL_COMPANION_CONSTANTS_H_
+
+namespace companion {
+
+// Pref names for storing various promo states.
+const char kMsbbPromoDeclinedPref[] =
+    "Search.Companion.Promo.MSBB.Declined.Count";
+const char kSigninPromoDeclinedPref[] =
+    "Search.Companion.Promo.Signin.Declined.Count";
+const char kLabsPromoDeclinedPref[] =
+    "Search.Companion.Promo.Labs.Declined.Count";
+
+}  // namespace companion
+
+#endif  // CHROME_BROWSER_UI_WEBUI_SIDE_PANEL_COMPANION_CONSTANTS_H_
diff --git a/chrome/browser/ui/webui/side_panel/companion/proto/BUILD.gn b/chrome/browser/ui/webui/side_panel/companion/proto/BUILD.gn
new file mode 100644
index 0000000..27c51a1
--- /dev/null
+++ b/chrome/browser/ui/webui/side_panel/companion/proto/BUILD.gn
@@ -0,0 +1,10 @@
+# Copyright 2023 The Chromium Authors
+# Use of this source code is governed by a BSD - style license that can be
+# found in the LICENSE file.
+
+import("//third_party/protobuf/proto_library.gni")
+
+proto_library("proto") {
+  proto_in_dir = "//"
+  sources = [ "companion_url_params.proto" ]
+}
diff --git a/chrome/browser/ui/webui/side_panel/companion/proto/companion_url_params.proto b/chrome/browser/ui/webui/side_panel/companion/proto/companion_url_params.proto
new file mode 100644
index 0000000..34b2c2f0
--- /dev/null
+++ b/chrome/browser/ui/webui/side_panel/companion/proto/companion_url_params.proto
@@ -0,0 +1,30 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+syntax = "proto3";
+option optimize_for = LITE_RUNTIME;
+
+package companion.proto;
+
+// Information passed to the server side to make a decision on whether or not to
+// show various promos.
+message PromoState {
+  // Number of times the user has denied various promo requests in past.
+  int32 signin_promo_denial_count = 1;
+  int32 msbb_promo_denial_count = 2;
+  int32 labs_promo_denial_count = 3;
+}
+
+// This proto file is shared between Chrome and Server side and used to pack the
+// URL query params for the companion URL request.
+message QueryParams {
+  // URL of the main contents. Empty, if MSBB is off.
+  string page_url = 1;
+
+  // Whether make searches and browsing better has been enabled in the settings.
+  bool has_msbb_enabled = 2;
+
+  // State for driving promo related decisions.
+  PromoState promo_state = 3;
+}
diff --git a/chrome/browser/web_applications/chromeos_web_app_experiments.cc b/chrome/browser/web_applications/chromeos_web_app_experiments.cc
index 71975ff..73c50edf 100644
--- a/chrome/browser/web_applications/chromeos_web_app_experiments.cc
+++ b/chrome/browser/web_applications/chromeos_web_app_experiments.cc
@@ -27,6 +27,8 @@
     "https://www.office.com/",
 };
 
+const char kOneDriveBusinessDomain[] = "sharepoint.com";
+
 struct FallbackPageThemeColor {
   const char* page_url_piece;
   SkColor page_theme_color;
@@ -90,6 +92,13 @@
             : 0;
     best_score = std::max(best_score, score);
   }
+
+  // Check the OneDrive Business domain separately as this has a different URL
+  // format.
+  GURL url = GURL(url_spec);
+  if (url.DomainIs(kOneDriveBusinessDomain)) {
+    best_score = std::max(best_score, strlen(kOneDriveBusinessDomain));
+  }
   return best_score;
 }
 
diff --git a/chrome/browser/web_applications/commands/manifest_update_check_command.cc b/chrome/browser/web_applications/commands/manifest_update_check_command.cc
index 33e4c1e..e4c6f530 100644
--- a/chrome/browser/web_applications/commands/manifest_update_check_command.cc
+++ b/chrome/browser/web_applications/commands/manifest_update_check_command.cc
@@ -125,6 +125,9 @@
     webapps::InstallableStatusCode installable_status) {
   DCHECK_EQ(stage_, ManifestUpdateCheckStage::kDownloadingNewManifestData);
 
+  debug_log_.Set("manifest_url", manifest_url.spec());
+  debug_log_.Set("manifest_installable_result", base::ToString(installable_status));
+
   if (installable_status != webapps::InstallableStatusCode::NO_ERROR_DETECTED) {
     CompleteCommandAndSelfDestruct(ManifestUpdateCheckResult::kAppNotEligible);
     return;
@@ -169,6 +172,8 @@
     DownloadedIconsHttpResults icons_http_results) {
   DCHECK_EQ(stage_, ManifestUpdateCheckStage::kDownloadingNewManifestData);
 
+  debug_log_.Set("icon_download_result", base::ToString(result));
+
   RecordIconDownloadMetrics(result, icons_http_results);
 
   if (result != IconsDownloadedResult::kCompleted) {
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index efab59c8..dde6e81 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1679601280-1f3de2d387ec0fe09258a51133c012d5b0b9f283.profdata
+chrome-mac-arm-main-1679635282-0863c2c534f4c0d9b12baa3a63c66641a78e80a9.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 11c418d..5cd87f1c2 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1679594402-4993277604a6dadd6d6b732fecba08859a8baef0.profdata
+chrome-mac-main-1679615944-80d7dde0610b855ab49ea608b492f651613da4c8.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 8802608..e5549dfa 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1679594402-64cdf14a13f598989a60336d5a937e641c150871.profdata
+chrome-win32-main-1679615944-bebf56cb20bf453640564a8a54e7ea9a8ad3c696.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 5bb4db10..04b70a4 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1679594402-559f0f55784157947cc49c7bea88715453008fdb.profdata
+chrome-win64-main-1679625652-16cd7c4f4549e3c7d8b4346f04ef19d237251651.profdata
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 85956df4..dbbd673 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3335,6 +3335,7 @@
         sources += [
           "../browser/apps/platform_apps/api/arc_apps_private/arc_apps_private_apitest.cc",
           "../browser/apps/platform_apps/api/enterprise_remote_apps/enterprise_remote_apps_apitest.cc",
+          "../browser/ash/eol_notification_browsertest.cc",
           "../browser/ash/extensions/accessibility_features_apitest.cc",
           "../browser/ash/extensions/autotest_private/autotest_private_apitest.cc",
           "../browser/ash/extensions/default_keyboard_extension_browser_test.cc",
@@ -7161,6 +7162,7 @@
       "../browser/ui/webui/settings/site_settings_helper_unittest.cc",
       "../browser/ui/webui/settings/site_settings_permissions_handler_unittest.cc",
       "../browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler_unittest.cc",
+      "../browser/ui/webui/side_panel/companion/companion_url_builder_unittest.cc",
       "../browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc",
       "../browser/ui/webui/side_panel/reading_list/reading_list_page_handler_unittest.cc",
       "../browser/ui/webui/side_panel/user_notes/user_notes_page_handler_unittest.cc",
@@ -7354,6 +7356,7 @@
       "//chrome/browser/ui/webui/discards:mojo_bindings",
       "//chrome/browser/ui/webui/downloads:mojo_bindings",
       "//chrome/browser/ui/webui/new_tab_page:mojo_bindings",
+      "//chrome/browser/ui/webui/side_panel/companion/proto",
       "//chrome/browser/ui/webui/side_panel/customize_chrome:mojo_bindings",
       "//chrome/browser/ui/webui/side_panel/user_notes:mojo_bindings",
       "//chrome/browser/web_applications:web_applications_test_support",
diff --git a/chromeos/crosapi/mojom/crosapi.mojom b/chromeos/crosapi/mojom/crosapi.mojom
index 5ad7867..564d8ec 100644
--- a/chromeos/crosapi/mojom/crosapi.mojom
+++ b/chromeos/crosapi/mojom/crosapi.mojom
@@ -995,14 +995,8 @@
   [MinVersion=6]
   DefaultPaths? default_paths@6;
 
-  // Device Account's obfuscated Gaia id, if present.
-  // This is null for older versions of ash, for Active Directory sessions,
-  // Guest sessions, Managed Guest sessions, Demo mode, and Kiosks.
-  // Added in M89.
-  // Deprecated in M91. Use `device_account` (field id 16)  instead.
-  // TODO(crbug.com/1195865): Remove this in M93.
   [MinVersion=7]
-  string? device_account_gaia_id@7;
+  string? REMOVED_7@7;
 
   // Whether or not metrics reporting in ash is managed by policy. This is
   // passed independently because the metrics reporting state is controlled by
@@ -1341,13 +1335,7 @@
   // Added in M89.
   DefaultPaths? default_paths@1;
 
-  // Device Account's obfuscated Gaia id, if present.
-  // This is null for older versions of ash, for Active Directory sessions,
-  // Guest sessions, Managed Guest sessions, Demo mode, and Kiosks.
-  // Added in M89.
-  // Deprecated in M91. Use `device_account` (field id 16)  instead.
-  // TODO(crbug.com/1195865): Remove this in M93.
-  string? device_account_gaia_id@2;
+  string? REMOVED_2@2;
 
   // Primary user ID hash. Used to set CROS_USER_ID_HASH env var in crosh.
   // Do not use this to construct paths, use DefaultPaths for that purpose.
diff --git a/chromeos/startup/browser_params_proxy.cc b/chromeos/startup/browser_params_proxy.cc
index 7d3f5b7..0331cb6 100644
--- a/chromeos/startup/browser_params_proxy.cc
+++ b/chromeos/startup/browser_params_proxy.cc
@@ -54,13 +54,6 @@
   return BrowserInitParams::Get()->default_paths;
 }
 
-const absl::optional<std::string>& BrowserParamsProxy::DeviceAccountGaiaId()
-    const {
-  if (IsLaunchedWithPostLoginParams())
-    return BrowserPostLoginParams::Get()->device_account_gaia_id;
-  return BrowserInitParams::Get()->device_account_gaia_id;
-}
-
 crosapi::mojom::MetricsReportingManaged BrowserParamsProxy::AshMetricsManaged()
     const {
   return BrowserInitParams::Get()->ash_metrics_managed;
diff --git a/chromeos/startup/browser_params_proxy.h b/chromeos/startup/browser_params_proxy.h
index 7959f424..547b146 100644
--- a/chromeos/startup/browser_params_proxy.h
+++ b/chromeos/startup/browser_params_proxy.h
@@ -34,8 +34,6 @@
 
   const crosapi::mojom::DefaultPathsPtr& DefaultPaths() const;
 
-  const absl::optional<std::string>& DeviceAccountGaiaId() const;
-
   crosapi::mojom::MetricsReportingManaged AshMetricsManaged() const;
 
   crosapi::mojom::ExoImeSupport ExoImeSupport() const;
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc
index bba6eb6..d50fcbe 100644
--- a/components/autofill/core/common/autofill_payments_features.cc
+++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -105,6 +105,13 @@
              "AutofillEnableOffersInClankKeyboardAccessory",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// When enabled, in use-cases where we would not have triggered any user-visible
+// authentication to autofill payment methods, we will trigger a device
+// authentication.
+BASE_FEATURE(kAutofillEnablePaymentsMandatoryReauth,
+             "AutofillEnablePaymentsMandatoryReauth",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // When enabled, some extra metrics logging for Autofill Downstream will start.
 BASE_FEATURE(kAutofillEnableRemadeDownstreamMetrics,
              "AutofillEnableRemadeDownstreamMetrics",
diff --git a/components/autofill/core/common/autofill_payments_features.h b/components/autofill/core/common/autofill_payments_features.h
index 365e5609..5bfa0c27 100644
--- a/components/autofill/core/common/autofill_payments_features.h
+++ b/components/autofill/core/common/autofill_payments_features.h
@@ -26,6 +26,7 @@
 BASE_DECLARE_FEATURE(kAutofillEnableNewSaveCardBubbleUi);
 BASE_DECLARE_FEATURE(kAutofillEnableOfferNotificationForPromoCodes);
 BASE_DECLARE_FEATURE(kAutofillEnableOffersInClankKeyboardAccessory);
+BASE_DECLARE_FEATURE(kAutofillEnablePaymentsMandatoryReauth);
 BASE_DECLARE_FEATURE(kAutofillEnableRemadeDownstreamMetrics);
 BASE_DECLARE_FEATURE(kAutofillEnableStickyManualFallbackForCards);
 BASE_DECLARE_FEATURE(kAutofillEnableUpdateVirtualCardEnrollment);
diff --git a/components/exo/keyboard_unittest.cc b/components/exo/keyboard_unittest.cc
index 1689b72..8489097 100644
--- a/components/exo/keyboard_unittest.cc
+++ b/components/exo/keyboard_unittest.cc
@@ -7,6 +7,7 @@
 #include "ash/accelerators/accelerator_controller_impl.h"
 #include "ash/accessibility/accessibility_controller_impl.h"
 #include "ash/constants/app_types.h"
+#include "ash/constants/ash_features.h"
 #include "ash/constants/ash_pref_names.h"
 #include "ash/keyboard/keyboard_controller_impl.h"
 #include "ash/public/cpp/external_arc/overlay/arc_overlay_manager.h"
@@ -18,6 +19,7 @@
 #include "ash/wm/desks/desks_test_util.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "base/run_loop.h"
+#include "base/test/scoped_feature_list.h"
 #include "components/exo/buffer.h"
 #include "components/exo/keyboard_delegate.h"
 #include "components/exo/keyboard_device_configuration_delegate.h"
@@ -37,6 +39,7 @@
 #include "ui/events/devices/device_data_manager.h"
 #include "ui/events/event_constants.h"
 #include "ui/events/keycodes/dom/dom_code.h"
+#include "ui/events/ozone/events_ozone.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/events/types/event_type.h"
 #include "ui/views/controls/textfield/textfield.h"
@@ -58,6 +61,26 @@
   ~KeyboardTest() override = default;
 };
 
+class KeyboardKeyTest : public KeyboardTest,
+                        public testing::WithParamInterface<bool> {
+ public:
+  void SetUp() override {
+    if (GetParam()) {
+      feature_list_.InitAndEnableFeature(
+          ash::features::kExoConsumedByImeByFlag);
+    } else {
+      feature_list_.InitAndDisableFeature(
+          ash::features::kExoConsumedByImeByFlag);
+    }
+    KeyboardTest::SetUp();
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+INSTANTIATE_TEST_SUITE_P(, KeyboardKeyTest, ::testing::Bool());
+
 class MockKeyboardDelegate : public KeyboardDelegate {
  public:
   MockKeyboardDelegate() = default;
@@ -266,7 +289,7 @@
   testing::Mock::VerifyAndClearExpectations(delegate_ptr);
 }
 
-TEST_F(KeyboardTest, OnKeyboardKey) {
+TEST_P(KeyboardKeyTest, OnKeyboardKey) {
   auto shell_surface = test::ShellSurfaceBuilder({10, 10}).BuildShellSurface();
   auto* surface = shell_surface->surface_for_testing();
 
@@ -422,7 +445,7 @@
   testing::Mock::VerifyAndClearExpectations(delegate_ptr);
 }
 
-TEST_F(KeyboardTest, OnKeyboardKey_NotSendKeyIfConsumedByIme) {
+TEST_P(KeyboardKeyTest, OnKeyboardKey_NotSendKeyIfConsumedByIme) {
   auto shell_surface = test::ShellSurfaceBuilder({10, 10}).BuildShellSurface();
   auto* surface = shell_surface->surface_for_testing();
 
@@ -462,7 +485,13 @@
       .Times(0);
   seat.set_physical_code_for_currently_processing_event_for_testing(
       ui::DomCode::US_A);
-  generator.PressKey(ui::VKEY_A, 0);
+
+  {
+    ui::KeyEvent event(ui::ET_KEY_PRESSED, ui::VKEY_A, 0);
+    ui::SetKeyboardImeFlags(&event, ui::kPropertyKeyboardImeHandledFlag);
+    event.set_source_device_id(0);
+    generator.Dispatch(&event);
+  }
   testing::Mock::VerifyAndClearExpectations(&observer);
   testing::Mock::VerifyAndClearExpectations(delegate_ptr);
 
@@ -501,7 +530,7 @@
   input_method->SetFocusedTextInputClient(nullptr);
 }
 
-TEST_F(KeyboardTest, OnKeyboardKey_KeyboardInhibit) {
+TEST_P(KeyboardKeyTest, OnKeyboardKey_KeyboardInhibit) {
   auto shell_surface = test::ShellSurfaceBuilder({10, 10}).BuildShellSurface();
   auto* surface = shell_surface->surface_for_testing();
 
diff --git a/components/exo/shell_surface_util.cc b/components/exo/shell_surface_util.cc
index 077d1b6a..41082d0b 100644
--- a/components/exo/shell_surface_util.cc
+++ b/components/exo/shell_surface_util.cc
@@ -6,9 +6,11 @@
 
 #include <memory>
 
+#include "ash/constants/ash_features.h"
 #include "ash/public/cpp/window_properties.h"
 #include "ash/wm/desks/desks_controller.h"
 #include "ash/wm/desks/desks_util.h"
+#include "base/feature_list.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/trace_event/trace_event.h"
 #include "chromeos/ui/base/window_properties.h"
@@ -25,6 +27,7 @@
 #include "ui/aura/window_targeter.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/events/event.h"
+#include "ui/events/ozone/events_ozone.h"
 #include "ui/views/widget/widget.h"
 #include "ui/wm/core/window_util.h"
 
@@ -314,6 +317,12 @@
 }
 
 bool ConsumedByIme(aura::Window* window, const ui::KeyEvent& event) {
+  // TODO(crbug.com/1401822): remove the old behavior, once the fix is
+  // stabilized.
+  if (base::FeatureList::IsEnabled(ash::features::kExoConsumedByImeByFlag)) {
+    return ui::GetKeyboardImeFlags(event) & ui::kPropertyKeyboardImeHandledFlag;
+  }
+
   // Check if IME consumed the event, to avoid it to be doubly processed.
   // First let us see whether IME is active and is in text input mode.
   views::Widget* widget = views::Widget::GetTopLevelWidgetForNativeView(window);
diff --git a/components/exo/text_input_unittest.cc b/components/exo/text_input_unittest.cc
index 5020d14..5174bf7 100644
--- a/components/exo/text_input_unittest.cc
+++ b/components/exo/text_input_unittest.cc
@@ -7,8 +7,10 @@
 #include <memory>
 #include <string>
 
+#include "ash/constants/ash_features.h"
 #include "ash/keyboard/ui/keyboard_ui_controller.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
 #include "components/exo/buffer.h"
 #include "components/exo/seat.h"
 #include "components/exo/shell_surface.h"
@@ -24,6 +26,7 @@
 #include "ui/base/ime/composition_text.h"
 #include "ui/base/ime/input_method_observer.h"
 #include "ui/events/keycodes/dom/dom_code.h"
+#include "ui/events/ozone/events_ozone.h"
 #include "ui/views/widget/widget.h"
 
 using testing::_;
@@ -221,6 +224,29 @@
   buffer_.reset();
 }
 
+// Test for both kExoConsumedByImeByFlag enabled and disabled.
+class TextInputTestWithConsumedByIme
+    : public TextInputTest,
+      public testing::WithParamInterface<bool> {
+ public:
+  void SetUp() override {
+    if (GetParam()) {
+      feature_list_.InitAndEnableFeature(
+          ash::features::kExoConsumedByImeByFlag);
+    } else {
+      feature_list_.InitAndDisableFeature(
+          ash::features::kExoConsumedByImeByFlag);
+    }
+
+    TextInputTest::SetUp();
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+INSTANTIATE_TEST_SUITE_P(, TextInputTestWithConsumedByIme, ::testing::Bool());
+
 TEST_F(TextInputTest, Activate) {
   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, text_input()->GetTextInputType());
   EXPECT_EQ(ui::TEXT_INPUT_MODE_DEFAULT, text_input()->GetTextInputMode());
@@ -557,17 +583,18 @@
   EXPECT_FALSE(text_input()->HasCompositionText());
 }
 
-TEST_F(TextInputTest, InsertChar) {
+TEST_P(TextInputTestWithConsumedByIme, InsertChar) {
   text_input()->Activate(seat(), surface(),
                          ui::TextInputClient::FOCUS_REASON_OTHER);
 
   ui::KeyEvent ev(ui::ET_KEY_PRESSED, ui::VKEY_RETURN, 0);
+  ui::SetKeyboardImeFlags(&ev, ui::kPropertyKeyboardImeHandledFlag);
 
   EXPECT_CALL(*delegate(), SendKey(testing::Ref(ev))).Times(1);
   text_input()->InsertChar(ev);
 }
 
-TEST_F(TextInputTest, InsertCharCtrlV) {
+TEST_P(TextInputTestWithConsumedByIme, InsertCharCtrlV) {
   text_input()->Activate(seat(), surface(),
                          ui::TextInputClient::FOCUS_REASON_OTHER);
 
@@ -578,12 +605,13 @@
   text_input()->InsertChar(ev);
 }
 
-TEST_F(TextInputTest, InsertCharNormalKey) {
+TEST_P(TextInputTestWithConsumedByIme, InsertCharNormalKey) {
   text_input()->Activate(seat(), surface(),
                          ui::TextInputClient::FOCUS_REASON_OTHER);
 
   char16_t ch = 'x';
   ui::KeyEvent ev(ch, ui::VKEY_X, ui::DomCode::NONE, 0);
+  ui::SetKeyboardImeFlags(&ev, ui::kPropertyKeyboardImeHandledFlag);
 
   EXPECT_CALL(*delegate(), SendKey(testing::Ref(ev))).Times(1);
   text_input()->InsertChar(ev);
diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc
index e75dd05..fad4ec8 100644
--- a/components/omnibox/browser/omnibox_field_trial.cc
+++ b/components/omnibox/browser/omnibox_field_trial.cc
@@ -29,6 +29,7 @@
 #include "components/variations/variations_associated_data.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
 #include "ui/base/pointer/touch_ui_controller.h"
+#include "ui/base/ui_base_features.h"
 
 using metrics::OmniboxEventProto;
 
@@ -708,6 +709,39 @@
     "OmniboxRichSuggestionVerticalMargin",
     4);
 
+bool OmniboxFieldTrial::IsGM3TextStyleEnabled() {
+  return features::IsChromeRefresh2023() ||
+         base::FeatureList::IsEnabled(omnibox::kOmniboxSteadyStateTextStyle);
+}
+
+// In order to control the value of this "font size" param via Finch, the
+// kOmniboxSteadyStateTextStyle feature flag must be enabled.
+//
+// Enabling only the kChromeRefresh2023 flag, while leaving the
+// kOmniboxSteadyStateTextStyle flag disabled, will result in the param being
+// locked to its default value and ignoring any overrides provided via Finch.
+//
+// If neither kChromeRefresh2023 nor kOmniboxSteadyStateTextStyle are enabled,
+// then this "font size" param will have zero effect on Chrome UI.
+const base::FeatureParam<int> OmniboxFieldTrial::kFontSizeTouchUI(
+    &omnibox::kOmniboxSteadyStateTextStyle,
+    "OmniboxFontSizeTouchUI",
+    15);
+
+// In order to control the value of this "font size" param via Finch, the
+// kOmniboxSteadyStateTextStyle feature flag must be enabled.
+//
+// Enabling only the kChromeRefresh2023 flag, while leaving the
+// kOmniboxSteadyStateTextStyle flag disabled, will result in the param being
+// locked to its default value and ignoring any overrides provided via Finch.
+//
+// If neither kChromeRefresh2023 nor kOmniboxSteadyStateTextStyle are enabled,
+// then this "font size" param will have zero effect on Chrome UI.
+const base::FeatureParam<int> OmniboxFieldTrial::kFontSizeNonTouchUI(
+    &omnibox::kOmniboxSteadyStateTextStyle,
+    "OmniboxFontSizeNonTouchUI",
+    12);
+
 const char OmniboxFieldTrial::kBundledExperimentFieldTrialName[] =
     "OmniboxBundledExperimentV1";
 const char OmniboxFieldTrial::kDisableProvidersRule[] = "DisableProviders";
diff --git a/components/omnibox/browser/omnibox_field_trial.h b/components/omnibox/browser/omnibox_field_trial.h
index a3bd4a69..48dfb87b 100644
--- a/components/omnibox/browser/omnibox_field_trial.h
+++ b/components/omnibox/browser/omnibox_field_trial.h
@@ -401,6 +401,14 @@
 // suggestions.
 extern const base::FeatureParam<int> kRichSuggestionVerticalMargin;
 
+// Omnibox GM3 - text style.
+// Returns true if the feature to enable GM3 text styling is enabled.
+bool IsGM3TextStyleEnabled();
+// Specifies the omnibox font size (Touch UI).
+extern const base::FeatureParam<int> kFontSizeTouchUI;
+// Specifies the omnibox font size (non-Touch UI).
+extern const base::FeatureParam<int> kFontSizeNonTouchUI;
+
 // ---------------------------------------------------------
 // Clipboard URL suggestions:
 
diff --git a/components/saved_tab_groups/saved_tab_group_model_unittest.cc b/components/saved_tab_groups/saved_tab_group_model_unittest.cc
index 3b9fce33..6b3e229 100644
--- a/components/saved_tab_groups/saved_tab_group_model_unittest.cc
+++ b/components/saved_tab_groups/saved_tab_group_model_unittest.cc
@@ -26,20 +26,6 @@
 
 namespace {
 
-base::GUID GenerateNextGUID() {
-  static uint64_t guid_increment;
-  if (!guid_increment) {
-    guid_increment = 0;
-  }
-
-  uint64_t kBytes[] = {0, guid_increment};
-  base::GUID guid =
-      base::GUID::ParseCaseInsensitive(base::RandomDataToGUIDString(kBytes));
-
-  guid_increment++;
-  return guid;
-}
-
 void CompareSavedTabGroupTabs(const std::vector<SavedTabGroupTab>& v1,
                               const std::vector<SavedTabGroupTab>& v2) {
   ASSERT_EQ(v1.size(), v2.size());
@@ -88,7 +74,7 @@
 }
 
 SavedTabGroup CreateTestSavedTabGroup() {
-  base::GUID id = GenerateNextGUID();
+  base::GUID id = base::GUID::GenerateRandomV4();
   const std::u16string title = u"Test Test";
   const tab_groups::TabGroupColorId& color = tab_groups::TabGroupColorId::kBlue;
 
@@ -183,9 +169,9 @@
 class SavedTabGroupModelTest : public ::testing::Test {
  protected:
   SavedTabGroupModelTest()
-      : id_1_(GenerateNextGUID()),
-        id_2_(GenerateNextGUID()),
-        id_3_(GenerateNextGUID()) {}
+      : id_1_(base::GUID::GenerateRandomV4()),
+        id_2_(base::GUID::GenerateRandomV4()),
+        id_3_(base::GUID::GenerateRandomV4()) {}
 
   ~SavedTabGroupModelTest() override { RemoveTestData(); }
 
@@ -263,7 +249,8 @@
   EXPECT_TRUE(saved_tab_group_model_->Contains(id_1_));
   EXPECT_TRUE(saved_tab_group_model_->Contains(id_2_));
   EXPECT_TRUE(saved_tab_group_model_->Contains(id_3_));
-  EXPECT_FALSE(saved_tab_group_model_->Contains(GenerateNextGUID()));
+  EXPECT_FALSE(
+      saved_tab_group_model_->Contains(base::GUID::GenerateRandomV4()));
 }
 
 // Tests that the SavedTabGroupModel::GetIndexOf preserves the order the
@@ -300,7 +287,7 @@
 // Tests that SavedTabGroupModel::Add adds an extra element into the model and
 // keeps the data.
 TEST_F(SavedTabGroupModelTest, AddNewElement) {
-  base::GUID id_4 = GenerateNextGUID();
+  base::GUID id_4 = base::GUID::GenerateRandomV4();
   const std::u16string title_4 = u"Test Test";
   const tab_groups::TabGroupColorId& color_4 =
       tab_groups::TabGroupColorId::kBlue;
@@ -976,13 +963,13 @@
 TEST_F(SavedTabGroupModelObserverTest, MoveElement) {
   SavedTabGroup stg_1(std::u16string(u"stg_1"),
                       tab_groups::TabGroupColorId::kGrey, {},
-                      GenerateNextGUID());
+                      base::GUID::GenerateRandomV4());
   SavedTabGroup stg_2(std::u16string(u"stg_2"),
                       tab_groups::TabGroupColorId::kGrey, {},
-                      GenerateNextGUID());
+                      base::GUID::GenerateRandomV4());
   SavedTabGroup stg_3(std::u16string(u"stg_3"),
                       tab_groups::TabGroupColorId::kGrey, {},
-                      GenerateNextGUID());
+                      base::GUID::GenerateRandomV4());
 
   saved_tab_group_model_->Add(stg_1);
   saved_tab_group_model_->Add(stg_2);
@@ -1002,7 +989,7 @@
   SavedTabGroup matching_group = CreateTestSavedTabGroup();
   base::GUID matching_group_guid = matching_group.saved_guid();
 
-  base::GUID matching_tab_guid = GenerateNextGUID();
+  base::GUID matching_tab_guid = base::GUID::GenerateRandomV4();
   base::Token matching_local_tab_id = base::Token::CreateRandom();
 
   SavedTabGroupTab tab(GURL(url::kAboutBlankURL), std::u16string(u"title"),
@@ -1023,8 +1010,8 @@
       saved_tab_group_model_->GetGroupContainingTab(matching_local_tab_id));
 
   // Expect GetGroupContainingTab to return null when there is no match.
-  EXPECT_EQ(nullptr,
-            saved_tab_group_model_->GetGroupContainingTab(GenerateNextGUID()));
+  EXPECT_EQ(nullptr, saved_tab_group_model_->GetGroupContainingTab(
+                         base::GUID::GenerateRandomV4()));
   EXPECT_EQ(nullptr,
             saved_tab_group_model_->GetGroupContainingTab(base::Token()));
 }
diff --git a/components/viz/common/quads/aggregated_render_pass.cc b/components/viz/common/quads/aggregated_render_pass.cc
index 70eb59f..0258de73 100644
--- a/components/viz/common/quads/aggregated_render_pass.cc
+++ b/components/viz/common/quads/aggregated_render_pass.cc
@@ -210,6 +210,15 @@
   return copy_pass;
 }
 
+bool AggregatedRenderPass::ShouldDrawWithBlending() const {
+  for (auto* quad : quad_list) {
+    if (quad->ShouldDrawWithBlending()) {
+      return true;
+    }
+  }
+  return false;
+}
+
 void AggregatedRenderPass::AsValueInto(
     base::trace_event::TracedValue* value) const {
   RenderPassInternal::AsValueInto(value);
diff --git a/components/viz/common/quads/aggregated_render_pass.h b/components/viz/common/quads/aggregated_render_pass.h
index 31a8646..d36ccf28 100644
--- a/components/viz/common/quads/aggregated_render_pass.h
+++ b/components/viz/common/quads/aggregated_render_pass.h
@@ -89,6 +89,9 @@
     return quad_list.AllocateAndConstruct<DrawQuadType>();
   }
 
+  // Indicates if any its quad needs to draw with blending.
+  bool ShouldDrawWithBlending() const;
+
   // Uniquely identifies the render pass in the aggregated frame.
   AggregatedRenderPassId id;
 
diff --git a/components/viz/service/display/surface_aggregator.cc b/components/viz/service/display/surface_aggregator.cc
index 4f82f6b..1af9f7b5 100644
--- a/components/viz/service/display/surface_aggregator.cc
+++ b/components/viz/service/display/surface_aggregator.cc
@@ -988,12 +988,14 @@
   gfx::Rect output_rect = root_render_pass->output_rect;
 
   // An extra color conversion pass is only done if the display's color
-  // space is unsuitable as a blending color space.
+  // space is unsuitable as a blending color space and the root render pass
+  // requires blending.
   bool needs_color_conversion_pass =
       !display_color_spaces_
            .GetOutputColorSpace(root_render_pass->content_color_usage,
                                 root_render_pass->has_transparent_background)
            .IsSuitableForBlending();
+  needs_color_conversion_pass &= root_render_pass->ShouldDrawWithBlending();
 
   // If we added or removed the color conversion pass, we need to add full
   // damage to the current-root renderpass (and also the new-root renderpass,
diff --git a/components/viz/service/display/surface_aggregator_unittest.cc b/components/viz/service/display/surface_aggregator_unittest.cc
index 76b4ce6..19f488b99 100644
--- a/components/viz/service/display/surface_aggregator_unittest.cc
+++ b/components/viz/service/display/surface_aggregator_unittest.cc
@@ -167,6 +167,17 @@
       return quad;
     }
 
+    static Quad TransparentSolidColorQuad(SkColor4f color,
+                                          const gfx::Rect& rect,
+                                          float opacity) {
+      Quad quad;
+      quad.material = DrawQuad::Material::kSolidColor;
+      quad.color = color;
+      quad.rect = rect;
+      quad.opacity = opacity;
+      return quad;
+    }
+
     static Quad YUVVideoQuad(const gfx::Rect& rect,
                              bool per_quad_damage_output = false) {
       Quad quad;
@@ -295,7 +306,7 @@
                             std::vector<SurfaceRange>* referenced_surfaces) {
     switch (desc.material) {
       case DrawQuad::Material::kSolidColor:
-        cc::AddQuad(pass, desc.rect, desc.color);
+        cc::AddTransparentQuad(pass, desc.rect, desc.color, desc.opacity);
         break;
       case DrawQuad::Material::kSurfaceContent:
         referenced_surfaces->emplace_back(desc.surface_range);
@@ -6131,7 +6142,8 @@
       {Quad::SolidColorQuad(SkColors::kWhite, gfx::Rect(5, 5)),
        Quad::SolidColorQuad(SkColors::kLtGray, gfx::Rect(5, 5))},
       {Quad::SolidColorQuad(SkColors::kGray, gfx::Rect(5, 5)),
-       Quad::SolidColorQuad(SkColors::kDkGray, gfx::Rect(5, 5))}};
+       Quad::TransparentSolidColorQuad(SkColors::kDkGray, gfx::Rect(5, 5),
+                                       0.5)}};
 
   gfx::DisplayColorSpaces display_color_spaces(gfx::ColorSpace::CreateSRGB());
   display_color_spaces.SetOutputColorSpaceAndBufferFormat(
@@ -6156,8 +6168,9 @@
   passes[1].damage_rect = partial_damage_rect;
   passes[0].damage_rect = child_pass_damage_rect;
 
-  // HDR content with a transparent background will get an extra RenderPass
-  // converting to SCRGB-linear.
+  // The root pass of HDR content with a transparent background will get an
+  // extra RenderPass converting to SCRGB-linear, if any content drawn to the
+  // root pass requires blending.
   aggregator_.SetDisplayColorSpaces(display_color_spaces);
   {
     SubmitCompositorFrame(root_sink_.get(), passes,
@@ -6185,8 +6198,9 @@
               aggregated_frame.render_pass_list[0]->damage_rect);
   }
 
-  // HDR content with an opaque background will get an extra RenderPass
-  // converting to HDR10.
+  // The root pass of HDR content with a transparent background will get an
+  // extra RenderPass converting to HDR10, if any content drawn to the root pass
+  // requires blending.
   passes[1].has_transparent_background = false;
   {
     SubmitCompositorFrame(root_sink_.get(), passes,
@@ -6215,6 +6229,33 @@
               aggregated_frame.render_pass_list[1]->damage_rect);
   }
 
+  // The root pass of HDR content with a transparent background won't get an
+  // extra RenderPass, if all content drawn to the root pass doesn't require
+  // blending.
+  quads[1][1] = Quad::SolidColorQuad(SkColors::kDkGray, gfx::Rect(5, 5));
+  passes[1] = Pass(quads[1], CompositorRenderPassId{1}, kSurfaceSize);
+  passes[1].has_transparent_background = false;
+  passes[1].damage_rect = partial_damage_rect;
+  {
+    SubmitCompositorFrame(root_sink_.get(), passes,
+                          root_surface_id_.local_surface_id(),
+                          device_scale_factor);
+    SurfaceId surface_id(root_sink_->frame_sink_id(),
+                         root_surface_id_.local_surface_id());
+
+    auto aggregated_frame = AggregateFrame(surface_id);
+
+    EXPECT_EQ(2u, aggregated_frame.render_pass_list.size());
+    EXPECT_EQ(gfx::ContentColorUsage::kHDR,
+              aggregated_frame.render_pass_list[0]->content_color_usage);
+    EXPECT_EQ(gfx::ContentColorUsage::kHDR,
+              aggregated_frame.render_pass_list[1]->content_color_usage);
+
+    // The root pass has full damage because the intermediate pass was removed.
+    EXPECT_EQ(full_damage_rect,
+              aggregated_frame.render_pass_list[1]->damage_rect);
+  }
+
   // This simulates the situation where we don't have HDR capabilities. Opaque
   // content can be drawn into a BT2020 buffer as 10-10-10-2, but transparent
   // content needs to bump up to 16-bit, and therefore (until we find a way
@@ -6246,14 +6287,18 @@
     EXPECT_EQ(gfx::ContentColorUsage::kHDR,
               aggregated_frame.render_pass_list[1]->content_color_usage);
 
-    // The root pass has full damage because the intermediate pass was removed.
-    EXPECT_EQ(full_damage_rect,
+    // The root pass has partial damage.
+    EXPECT_EQ(partial_damage_rect,
               aggregated_frame.render_pass_list[1]->damage_rect);
   }
 
-  // When the root pass has a transparent background, we'll end up getting a
-  // color conversion pass.
+  // When the root pass has a transparent background and any content drawn to it
+  // requires blending, we'll end up getting a color conversion pass.
+  quads[1][1] =
+      Quad::TransparentSolidColorQuad(SkColors::kDkGray, gfx::Rect(5, 5), 0.5);
+  passes[1] = Pass(quads[1], CompositorRenderPassId{1}, kSurfaceSize);
   passes[1].has_transparent_background = true;
+  passes[1].damage_rect = partial_damage_rect;
   {
     SubmitCompositorFrame(root_sink_.get(), passes,
                           root_surface_id_.local_surface_id(),
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.cc b/content/browser/attribution_reporting/attribution_manager_impl.cc
index 78e6722..5258f81 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl.cc
+++ b/content/browser/attribution_reporting/attribution_manager_impl.cc
@@ -1244,19 +1244,19 @@
   const url::Origin* destination_origin;
   switch (registration.GetType()) {
     case OsRegistrationType::kSource:
-      operation = ContentBrowserClient::AttributionReportingOperation::kSource;
+      operation =
+          ContentBrowserClient::AttributionReportingOperation::kOsSource;
       source_origin = &registration.top_level_origin;
       destination_origin = nullptr;
       break;
     case OsRegistrationType::kTrigger:
-      operation = ContentBrowserClient::AttributionReportingOperation::kTrigger;
+      operation =
+          ContentBrowserClient::AttributionReportingOperation::kOsTrigger;
       source_origin = nullptr;
       destination_origin = &registration.top_level_origin;
       break;
   }
 
-  // TODO(https://crbug.com/1420704): Support separate behavior on webview for
-  // allowing these.
   if (!IsOperationAllowed(storage_partition_.get(), operation,
                           RenderFrameHost::FromID(render_frame_id),
                           source_origin, destination_origin,
diff --git a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
index e935cb4e..47e81de 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
@@ -1176,7 +1176,7 @@
   EXPECT_CALL(
       browser_client,
       IsAttributionReportingOperationAllowed(
-          _, ContentBrowserClient::AttributionReportingOperation::kSource, _,
+          _, ContentBrowserClient::AttributionReportingOperation::kOsSource, _,
           Pointee(kTopLevelOrigin4), IsNull(),
           Pointee(url::Origin::Create(kRegistrationUrl4))))
       .WillOnce(Return(false));
@@ -1251,7 +1251,7 @@
   EXPECT_CALL(
       browser_client,
       IsAttributionReportingOperationAllowed(
-          _, ContentBrowserClient::AttributionReportingOperation::kTrigger, _,
+          _, ContentBrowserClient::AttributionReportingOperation::kOsTrigger, _,
           IsNull(), Pointee(kTopLevelOrigin4),
           Pointee(url::Origin::Create(kRegistrationUrl4))))
       .WillOnce(Return(false));
diff --git a/content/browser/devtools/devtools_instrumentation.cc b/content/browser/devtools/devtools_instrumentation.cc
index 7a418a1..e4bb8af 100644
--- a/content/browser/devtools/devtools_instrumentation.cc
+++ b/content/browser/devtools/devtools_instrumentation.cc
@@ -434,6 +434,10 @@
     const base::UnguessableToken& initiator_devtools_navigation_token,
     PrerenderFinalStatus status,
     const std::string& disallowed_api_method) {
+  if (!ftn) {
+    return;
+  }
+
   std::string initiating_frame_id =
       ftn->current_frame_host()->devtools_frame_token().ToString();
   DispatchToAgents(ftn, &protocol::PreloadHandler::DidCancelPrerender,
@@ -446,6 +450,10 @@
     const base::UnguessableToken& initiator_devtools_navigation_token,
     const GURL& prefetch_url,
     PreloadingTriggeringOutcome status) {
+  if (!ftn) {
+    return;
+  }
+
   std::string initiating_frame_id =
       ftn->current_frame_host()->devtools_frame_token().ToString();
   DispatchToAgents(ftn, &protocol::PreloadHandler::DidUpdatePrefetchStatus,
diff --git a/content/browser/renderer_host/browsing_context_state.cc b/content/browser/renderer_host/browsing_context_state.cc
index 46a2cc2..274e46d 100644
--- a/content/browser/renderer_host/browsing_context_state.cc
+++ b/content/browser/renderer_host/browsing_context_state.cc
@@ -204,7 +204,7 @@
                   replication_state->permissions_policy_header);
             },
             std::ref(replication_state_)),
-        /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
+        /*group_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
   }
   return changed;
 }
@@ -271,7 +271,7 @@
                                                                  unique_name);
           },
           std::ref(name), std::ref(unique_name)),
-      /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
+      /*group_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
   replication_state_->unique_name = unique_name;
   replication_state_->name = name;
 }
@@ -294,7 +294,7 @@
                 origin, is_potentially_trustworthy_unique_origin);
           },
           std::ref(origin), std::ref(is_potentially_trustworthy_unique_origin)),
-      /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
+      /*group_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
 
   replication_state_->origin = origin;
   replication_state_->has_potentially_trustworthy_unique_origin =
@@ -313,7 +313,7 @@
                 policy);
           },
           policy),
-      /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
+      /*group_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
   replication_state_->insecure_request_policy = policy;
 }
 
@@ -331,7 +331,7 @@
                 insecure_navigations_set);
           },
           std::ref(insecure_navigations_set)),
-      /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
+      /*group_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
   replication_state_->insecure_navigations_set = insecure_navigations_set;
 }
 
@@ -344,7 +344,7 @@
                 ->SetHadStickyUserActivationBeforeNavigation(value);
           },
           value),
-      /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
+      /*group_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
   replication_state_->has_received_user_gesture_before_nav = value;
 }
 
@@ -360,7 +360,7 @@
                 is_ad_frame);
           },
           is_ad_frame),
-      /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
+      /*group_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
 }
 
 void BrowsingContextState::ActiveFrameCountIsZero(
@@ -402,7 +402,7 @@
                 frame_policy);
           },
           base::Unretained(parent_group), std::ref(frame_policy)),
-      /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
+      /*group_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
 }
 
 void BrowsingContextState::OnDidStartLoading() {
@@ -410,7 +410,7 @@
       base::BindRepeating([](RenderFrameProxyHost* proxy) {
         proxy->GetAssociatedRemoteFrame()->DidStartLoading();
       }),
-      /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
+      /*group_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
 }
 
 void BrowsingContextState::OnDidStopLoading() {
@@ -418,7 +418,7 @@
       base::BindRepeating([](RenderFrameProxyHost* proxy) {
         proxy->GetAssociatedRemoteFrame()->DidStopLoading();
       }),
-      /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
+      /*group_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
 }
 
 void BrowsingContextState::ResetProxyHosts() {
@@ -457,18 +457,19 @@
           },
           base::Unretained(parent_->GetSiteInstance()->group()),
           std::ref(properties)),
-      /*instance_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
+      /*group_to_skip=*/nullptr, /*outer_delegate_proxy=*/nullptr);
 }
 
 void BrowsingContextState::ExecuteRemoteFramesBroadcastMethod(
     base::RepeatingCallback<void(RenderFrameProxyHost*)> callback,
-    SiteInstance* instance_to_skip,
+    SiteInstanceGroup* group_to_skip,
     RenderFrameProxyHost* outer_delegate_proxy) {
   for (const auto& pair : proxy_hosts_) {
     if (outer_delegate_proxy == pair.second.get())
       continue;
-    if (pair.second->GetSiteInstance() == instance_to_skip)
+    if (pair.second->site_instance_group() == group_to_skip) {
       continue;
+    }
     if (!pair.second->is_render_frame_proxy_live())
       continue;
     callback.Run(pair.second.get());
diff --git a/content/browser/renderer_host/browsing_context_state.h b/content/browser/renderer_host/browsing_context_state.h
index 58fe7c3..a2e48c226 100644
--- a/content/browser/renderer_host/browsing_context_state.h
+++ b/content/browser/renderer_host/browsing_context_state.h
@@ -261,7 +261,7 @@
 
   void ExecuteRemoteFramesBroadcastMethod(
       base::RepeatingCallback<void(RenderFrameProxyHost*)> callback,
-      SiteInstance* instance_to_skip,
+      SiteInstanceGroup* group_to_skip,
       RenderFrameProxyHost* outer_delegate_proxy);
 
   using TraceProto = perfetto::protos::pbzero::BrowsingContextState;
diff --git a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
index 11f58a4..e8d5d93 100644
--- a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
+++ b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
@@ -21052,6 +21052,84 @@
 };
 }  // namespace
 
+// Test to highlight the difference in behavior for relative urls in an
+// about:blank popup. The expectations in this test can be directly compared to
+// those for the "Navigate the popup main frame to a same-document URL." case
+// in the test NavigationStateChangedForInitialNavigationEntry immediately
+// below.
+IN_PROC_BROWSER_TEST_P(NavigationControllerBrowserTest,
+                       RelativeURLInAboutBlankPopup) {
+  GURL url1 = embedded_test_server()->GetURL("/title1.html");
+  EXPECT_TRUE(NavigateToURL(shell(), url1));
+  FrameTreeNode* root = contents()->GetPrimaryFrameTree().root();
+  // Pop open a new window without specifying a URL.
+  ShellAddedObserver new_shell_observer;
+  EXPECT_TRUE(ExecJs(root, "var w = window.open()"));
+  Shell* new_shell = new_shell_observer.GetShell();
+  WebContentsImpl* new_contents =
+      static_cast<WebContentsImpl*>(new_shell->web_contents());
+  EXPECT_TRUE(WaitForLoadStop(new_contents));
+
+  // Observe NavigationStateChanged calls.
+  AllNavigationStateChangedDelegate all_navigation_state_changed_delegate;
+  new_contents->SetDelegate(&all_navigation_state_changed_delegate);
+  EXPECT_EQ(0, all_navigation_state_changed_delegate.call_count());
+  ASSERT_NE(new_contents, shell()->web_contents());
+  FrameTreeNode* new_root = new_contents->GetPrimaryFrameTree().root();
+
+  NavigationControllerImpl& controller = new_contents->GetController();
+  // The new window is on the initial NavigationEntry.
+  EXPECT_EQ(1, controller.GetEntryCount());
+  EXPECT_TRUE(controller.GetLastCommittedEntry()->IsInitialEntry());
+
+  if (blink::features::IsNewBaseUrlInheritanceBehaviorEnabled()) {
+    EXPECT_NE("about:blank",
+              EvalJs(new_root, "document.baseURI").ExtractString());
+  } else {
+    EXPECT_EQ("about:blank",
+              EvalJs(new_root, "document.baseURI").ExtractString());
+  }
+
+  // Navigate the popup main frame to a same-document relative URL.
+  FrameNavigateParamsCapturer capturer(new_root);
+  EXPECT_TRUE(ExecJs(new_root, "location.href = '#foo';"));
+  capturer.Wait();
+
+  if (blink::features::IsNewBaseUrlInheritanceBehaviorEnabled()) {
+    // When an about:blank popup inherits its base url from the initiator,
+    // it will not be able to do same-document navigations without specifying an
+    // absolute url.
+
+    EXPECT_EQ(embedded_test_server()->GetURL("/title1.html#foo"),
+              new_root->current_url());
+    EXPECT_EQ(NAVIGATION_TYPE_MAIN_FRAME_NEW_ENTRY, capturer.navigation_type());
+    EXPECT_FALSE(capturer.is_same_document());
+
+    // The navigation is a cross-document navigation from the initial empty
+    // document, so we committed a new non-initial NavigationEntry that replaced
+    // the initial entry.
+    EXPECT_TRUE(capturer.did_replace_entry());
+    EXPECT_EQ(1, controller.GetEntryCount());
+    EXPECT_FALSE(controller.GetLastCommittedEntry()->IsInitialEntry());
+  } else {
+    // When the new inheritance behavior is disabled, an about:blank popup will
+    // have about:blank for the baseURI also, and so relative URLs can be used
+    // for same document navigations.
+
+    EXPECT_EQ(GURL("about:blank#foo"), new_root->current_url());
+    EXPECT_EQ(NAVIGATION_TYPE_MAIN_FRAME_EXISTING_ENTRY,
+              capturer.navigation_type());
+    EXPECT_TRUE(capturer.is_same_document());
+
+    // The navigation is a same-document navigation from the initial empty
+    // document, so we committed a new initial NavigationEntry that replaced the
+    // previous initial NavigationEntry.
+    EXPECT_TRUE(capturer.did_replace_entry());
+    EXPECT_EQ(1, controller.GetEntryCount());
+    EXPECT_TRUE(controller.GetLastCommittedEntry()->IsInitialEntry());
+  }
+}
+
 // Tests that committing iframes and doing same-document navigations with the
 // initial NavigationEntry dispatches the expected NavigationStateChanged calls.
 IN_PROC_BROWSER_TEST_P(NavigationControllerBrowserTest,
@@ -21120,7 +21198,7 @@
   {
     // Navigate the popup main frame to a same-document URL.
     FrameNavigateParamsCapturer capturer(new_root);
-    EXPECT_TRUE(ExecJs(new_root, "location.href = '#foo';"));
+    EXPECT_TRUE(ExecJs(new_root, "location.href = 'about:blank#foo';"));
     capturer.Wait();
     EXPECT_EQ(GURL("about:blank#foo"), new_root->current_url());
     EXPECT_EQ(NAVIGATION_TYPE_MAIN_FRAME_EXISTING_ENTRY,
diff --git a/content/browser/renderer_host/navigation_entry_impl.cc b/content/browser/renderer_host/navigation_entry_impl.cc
index 56dae18..6038fa2 100644
--- a/content/browser/renderer_host/navigation_entry_impl.cc
+++ b/content/browser/renderer_host/navigation_entry_impl.cc
@@ -846,10 +846,20 @@
   // by main frames, because loadData* navigations can only happen on the main
   // frame.
   bool is_for_main_frame = (root_node()->frame_entry == &frame_entry);
+  // Even if the frame_entry was originally about:blank or about:srcdoc and had
+  // an initiator_base_url, there's no guarantee here that `dest_url` will be
+  // either about:blank or about:srcdoc. In that case make sure we don't
+  // propagate initiator_base_url.
+  // TODO(creis): Look into how this case can be avoided so that dest_url
+  // doesn't diverge from other parameters in frame_entry.
+  const absl::optional<GURL> initiator_base_url =
+      (dest_url.IsAboutBlank() || dest_url.IsAboutSrcdoc())
+          ? frame_entry.initiator_base_url()
+          : absl::nullopt;
   return blink::mojom::CommonNavigationParams::New(
-      dest_url, frame_entry.initiator_origin(),
-      frame_entry.initiator_base_url(), std::move(dest_referrer),
-      GetTransitionType(), navigation_type, blink::NavigationDownloadPolicy(),
+      dest_url, frame_entry.initiator_origin(), initiator_base_url,
+      std::move(dest_referrer), GetTransitionType(), navigation_type,
+      blink::NavigationDownloadPolicy(),
       // It's okay to pass false for `should_replace_entry` because we never
       // replace an entry on session history / reload / restore navigation. New
       // navigation that may use replacement create their CommonNavigationParams
diff --git a/content/browser/renderer_host/page_impl.cc b/content/browser/renderer_host/page_impl.cc
index 50b94cf..64feb889 100644
--- a/content/browser/renderer_host/page_impl.cc
+++ b/content/browser/renderer_host/page_impl.cc
@@ -170,7 +170,7 @@
       ->render_manager()
       ->ExecuteRemoteFramesBroadcastMethod(
           std::move(remote_frames_broadcast_callback),
-          main_document_->GetSiteInstance());
+          main_document_->GetSiteInstance()->group());
 }
 
 void PageImpl::SetActivationStartTime(base::TimeTicks activation_start) {
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc
index fd8779c..0c39b117 100644
--- a/content/browser/renderer_host/render_frame_host_manager.cc
+++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -4532,7 +4532,7 @@
 
 void RenderFrameHostManager::ExecuteRemoteFramesBroadcastMethod(
     RemoteFramesBroadcastMethodCallback callback,
-    SiteInstanceImpl* instance_to_skip) {
+    SiteInstanceGroup* group_to_skip) {
   DCHECK(!frame_tree_node_->parent());
 
   // When calling a ExecuteRemoteFramesBroadcastMethod() for an inner
@@ -4541,7 +4541,7 @@
   RenderFrameProxyHost* outer_delegate_proxy =
       IsMainFrameForInnerDelegate() ? GetProxyToOuterDelegate() : nullptr;
   render_frame_host_->browsing_context_state()
-      ->ExecuteRemoteFramesBroadcastMethod(callback, instance_to_skip,
+      ->ExecuteRemoteFramesBroadcastMethod(callback, group_to_skip,
                                            outer_delegate_proxy);
 }
 
diff --git a/content/browser/renderer_host/render_frame_host_manager.h b/content/browser/renderer_host/render_frame_host_manager.h
index 768ec498..ae868640 100644
--- a/content/browser/renderer_host/render_frame_host_manager.h
+++ b/content/browser/renderer_host/render_frame_host_manager.h
@@ -525,11 +525,11 @@
 
   // Executes a RemoteMainFrame Mojo method to every instance in |proxy_hosts|.
   // This should only be called in the top-level RenderFrameHostManager.
-  // The |callback| is called synchronously and the |instance_to_skip| won't
+  // The |callback| is called synchronously and the |group_to_skip| won't
   // be referenced after this method returns.
   void ExecuteRemoteFramesBroadcastMethod(
       RemoteFramesBroadcastMethodCallback callback,
-      SiteInstanceImpl* instance_to_skip = nullptr);
+      SiteInstanceGroup* group_to_skip = nullptr);
 
   // Returns a const reference to the map of proxy hosts. The keys are
   // SiteInstanceGroup IDs, the values are RenderFrameProxyHosts.
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index cba4284..1e18f774 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -3445,6 +3445,7 @@
     blink::switches::kDefaultTileHeight,
     blink::switches::kDisableImageAnimationResync,
     blink::switches::kDisableLowResTiling,
+    blink::switches::kDisableNewBaseUrlInheritanceBehavior,
     blink::switches::kDisablePreferCompositingToLCDText,
     blink::switches::kDisableRGBA4444Textures,
     blink::switches::kDisableThreadedScrolling,
diff --git a/content/browser/site_per_process_oopsif_browsertest.cc b/content/browser/site_per_process_oopsif_browsertest.cc
index 0c0622c..5e78628 100644
--- a/content/browser/site_per_process_oopsif_browsertest.cc
+++ b/content/browser/site_per_process_oopsif_browsertest.cc
@@ -19,6 +19,27 @@
 
 namespace content {
 
+// Test class that runs with kNewBaseUrlInheritanceBehavior enabled.
+class BaseUrlInheritanceBehaviorIframeTest : public ContentBrowserTest {
+ public:
+  BaseUrlInheritanceBehaviorIframeTest() {
+    feature_list_.InitAndEnableFeature(
+        blink::features::kNewBaseUrlInheritanceBehavior);
+  }
+
+  void SetUpOnMainThread() override {
+    // Support multiple sites on the test server.
+    host_resolver()->AddRule("*", "127.0.0.1");
+  }
+  void StartEmbeddedServer() {
+    SetupCrossSiteRedirector(embedded_test_server());
+    ASSERT_TRUE(embedded_test_server()->Start());
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};  // class NewBaseUrlInheritanceBehaviorIframeTest
+
 // Test class to allow testing srcdoc functionality both with and without
 // `kIsolateSandboxedIframes` enabled. The tests verify the correct operation of
 // plumbing of both srcdoc attribute values, as well as the srcdoc frame's
@@ -2208,6 +2229,67 @@
   EXPECT_EQ(GURL(), root->current_frame_host()->GetInheritedBaseUrl());
 }
 
+// A test to verify that a new about:blank mainframe inherits its base url
+// from its initiator.
+IN_PROC_BROWSER_TEST_F(BaseUrlInheritanceBehaviorIframeTest,
+                       PopupsInheritBaseUrl) {
+  StartEmbeddedServer();
+  GURL main_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetPrimaryFrameTree()
+                            .root();
+
+  ShellAddedObserver new_shell_observer;
+  EXPECT_TRUE(ExecJs(root, "var w = window.open()"));
+  Shell* new_shell = new_shell_observer.GetShell();
+  WebContentsImpl* new_contents =
+      static_cast<WebContentsImpl*>(new_shell->web_contents());
+  EXPECT_TRUE(WaitForLoadStop(new_contents));
+  ASSERT_NE(new_contents, shell()->web_contents());
+
+  // The popup should get the same base URL as its initiator.
+  FrameTreeNode* new_root = new_contents->GetPrimaryFrameTree().root();
+  EXPECT_EQ(EvalJs(root, "document.baseURI").ExtractString(),
+            EvalJs(new_root, "document.baseURI").ExtractString());
+}
+
+IN_PROC_BROWSER_TEST_F(BaseUrlInheritanceBehaviorIframeTest,
+                       AboutBlankInheritsBaseUrlFromSiblingInitiator) {
+  StartEmbeddedServer();
+  GURL main_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetPrimaryFrameTree()
+                            .root();
+
+  // Create siblings.
+  EXPECT_TRUE(ExecJs(root,
+                     "var frm = document.createElement('iframe'); "
+                     "frm.src = 'about:blank'; "
+                     "frm.id = 'frm1'; "
+                     "document.body.appendChild(frm);"));
+  ASSERT_EQ(1U, root->child_count());
+  FrameTreeNode* child1 = root->child_at(0);
+
+  EXPECT_TRUE(ExecJs(root,
+                     "var frm = document.createElement('iframe'); "
+                     "frm.id = 'frm2'; "
+                     "document.body.appendChild(frm);"));
+  ASSERT_EQ(2U, root->child_count());
+  FrameTreeNode* child2 = root->child_at(1);
+
+  // First child navigates to about:blank on second child.
+  EXPECT_TRUE(ExecJs(child1,
+                     "var base = document.createElement('base'); "
+                     "base.href = 'https://example.com'; "
+                     "document.head.appendChild(base); "
+                     "window.top.window[1].location.href = 'about:blank';"));
+  // Make sure second child inherited base url from the first child.
+  EXPECT_EQ(GURL("https://example.com"),
+            GetFrameBaseUrl(child2->current_frame_host()));
+}
+
 INSTANTIATE_TEST_SUITE_P(All,
                          SitePerProcessIsolatedSandboxedIframeTest,
                          testing::ValuesIn(RenderDocumentFeatureLevelValues()));
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 5500a0c..01e7953e 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -862,16 +862,18 @@
     kReport,
     kSourceVerboseDebugReport,
     kTriggerVerboseDebugReport,
+    kOsSource,
+    kOsTrigger,
     kAny,
   };
 
   // Allows the embedder to control if Attribution Reporting API operations can
   // happen in a given context. Origins must be provided for a given operation
   // as follows:
-  //   - `kSource` must provide a non-null `source_origin` and
+  //   - `kSource` and `kOsSource` must provide a non-null `source_origin` and
   //   `reporting_origin`
-  //   - `kTrigger` must provide a non-null `destination_origin` and
-  //   `reporting_origin`
+  //   - `kTrigger` and `kOsTrigger` must provide a non-null
+  //   `destination_origin` and `reporting_origin`
   //   - `kReport` must provide all non-null origins
   //   - `kAny` may provide all null origins. It checks whether conversion
   //   measurement is allowed anywhere in `browser_context`, returning false if
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc
index 08b2ca19..2822e768 100644
--- a/content/public/test/render_view_test.cc
+++ b/content/public/test/render_view_test.cc
@@ -471,7 +471,8 @@
 
   web_view_ =
       agent_scheduling_group_->CreateWebView(std::move(view_params),
-                                             /*was_created_by_renderer=*/false);
+                                             /*was_created_by_renderer=*/false,
+                                             /*base_url=*/blink::WebURL());
 
   RenderFrameWasShownWaiter waiter(
       RenderFrame::FromWebFrame(web_view_->MainFrame()->ToWebLocalFrame()));
diff --git a/content/renderer/agent_scheduling_group.cc b/content/renderer/agent_scheduling_group.cc
index ecbfc8a9..c56013285 100644
--- a/content/renderer/agent_scheduling_group.cc
+++ b/content/renderer/agent_scheduling_group.cc
@@ -293,12 +293,14 @@
       params->web_preferences.enable_scroll_animator, PassKey());
 
   CreateWebView(std::move(params),
-                /*was_created_by_renderer=*/false);
+                /*was_created_by_renderer=*/false,
+                /*base_url=*/blink::WebURL());
 }
 
 blink::WebView* AgentSchedulingGroup::CreateWebView(
     mojom::CreateViewParamsPtr params,
-    bool was_created_by_renderer) {
+    bool was_created_by_renderer,
+    const blink::WebURL& base_url) {
   DCHECK(RenderThread::IsMainThread());
 
   blink::WebFrame* opener_frame = nullptr;
@@ -345,7 +347,7 @@
           /*is_for_scalable_page=*/params->type !=
               mojom::ViewWidgetType::kFencedFrame,
           std::move(params->replication_state),
-          params->devtools_main_frame_token, std::move(local_params));
+          params->devtools_main_frame_token, std::move(local_params), base_url);
     } else {
       // Create a local provisional main frame and a placeholder RemoteFrame as
       // a placeholder main frame for the new WebView. This can only happen for
diff --git a/content/renderer/agent_scheduling_group.h b/content/renderer/agent_scheduling_group.h
index ac8503f7..dd5d8f5a 100644
--- a/content/renderer/agent_scheduling_group.h
+++ b/content/renderer/agent_scheduling_group.h
@@ -33,6 +33,7 @@
 }  // namespace IPC
 
 namespace blink {
+class WebURL;
 class WebView;
 }  // namespace blink
 
@@ -79,7 +80,8 @@
 
   // Create a new WebView in this AgentSchedulingGroup.
   blink::WebView* CreateWebView(mojom::CreateViewParamsPtr params,
-                                bool was_created_by_renderer);
+                                bool was_created_by_renderer,
+                                const blink::WebURL& base_url);
 
  protected:
   // mojom::AgentSchedulingGroup:
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index b0ec203b..91f25d7 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -519,18 +519,18 @@
     }
   }
 
-  if (common_params.url.IsAboutSrcdoc()) {
-    // Pass on the `initiator_base_url`sent via the common_params. This will be
-    // picked up in DocumentLoader.
-    if (blink::features::IsNewBaseUrlInheritanceBehaviorEnabled()) {
-      // It's possible for initiator_base_url to be empty if this is an error
-      // srcdoc page. See
-      // NavigationRequestBrowserTest.OriginForSrcdocErrorPageInSubframe.
-      navigation_params->fallback_srcdoc_base_url =
-          common_params.initiator_base_url
-              ? WebURL(common_params.initiator_base_url.value())
-              : WebURL();
-    }
+  // Pass on the `initiator_base_url` sent via the common_params for srcdoc and
+  // about:blank documents. This will be picked up in DocumentLoader.
+  // Note: It's possible for initiator_base_url to be empty if this is an
+  // error srcdoc page. See test
+  // NavigationRequestBrowserTest.OriginForSrcdocErrorPageInSubframe.
+  if (blink::features::IsNewBaseUrlInheritanceBehaviorEnabled() &&
+      common_params.initiator_base_url &&
+      (common_params.url.IsAboutSrcdoc() || common_params.url.IsAboutBlank())) {
+    navigation_params->fallback_base_url =
+        common_params.initiator_base_url.value();
+  } else {
+    navigation_params->fallback_base_url = WebURL();
   }
 }
 
@@ -1424,7 +1424,8 @@
     bool is_for_scalable_page,
     blink::mojom::FrameReplicationStatePtr replication_state,
     const base::UnguessableToken& devtools_frame_token,
-    mojom::CreateLocalMainFrameParamsPtr params) {
+    mojom::CreateLocalMainFrameParamsPtr params,
+    const blink::WebURL& base_url) {
   // A main frame RenderFrame must have a RenderWidget.
   DCHECK_NE(MSG_ROUTING_NONE, params->widget_params->routing_id);
 
@@ -1441,7 +1442,7 @@
       // This conversion is a little sad, as this often comes from a
       // WebString...
       WebString::FromUTF8(replication_state->name),
-      replication_state->frame_policy.sandbox_flags);
+      replication_state->frame_policy.sandbox_flags, base_url);
   if (!params->is_on_initial_empty_document)
     render_frame->frame_->SetIsNotOnInitialEmptyDocument();
 
@@ -4594,9 +4595,6 @@
   // RenderFrameProxies in other processes.
   WebSecurityOrigin frame_origin = frame_document.GetSecurityOrigin();
   params->origin = frame_origin;
-  // Note: since we get the security origin from the `frame_document`, we also
-  // get the base url from it too.
-  params->initiator_base_url = frame_document.BaseURL();
 
   params->permissions_policy_header = permissions_policy_header;
   params->document_policy_header = document_policy_header;
@@ -4615,6 +4613,12 @@
   // for virtual URLs (e.g. the "history URL" is shown for loadDataWithBaseURL
   // instead of this URL).
   params->url = GetLoadingUrl();
+  // Note: since we get the security origin from the `frame_document`, we also
+  // get the base url from it too.
+  if (blink::features::IsNewBaseUrlInheritanceBehaviorEnabled() &&
+      (params->url.IsAboutBlank() || params->url.IsAboutSrcdoc())) {
+    params->initiator_base_url = frame_document.BaseURL();
+  }
 
   // TODO(https://crbug.com/1158101): Reconsider how we calculate
   // should_update_history.
@@ -5427,8 +5431,9 @@
   auto params = blink::mojom::OpenURLParams::New();
   params->url = info->url_request.Url();
   params->initiator_origin = info->url_request.RequestorOrigin();
-  if (info->requestor_base_url.IsValid())
+  if (info->requestor_base_url.IsValid()) {
     params->initiator_base_url = info->requestor_base_url;
+  }
   params->post_body = blink::GetRequestBodyForWebURLRequest(info->url_request);
   DCHECK_EQ(!!params->post_body, IsHttpPost(info->url_request));
   params->extra_headers =
@@ -6204,8 +6209,8 @@
     const blink::SessionStorageNamespaceId& session_storage_namespace_id,
     bool& consumed_user_gesture,
     const absl::optional<blink::Impression>& impression,
-    const absl::optional<blink::WebPictureInPictureWindowOptions>&
-        pip_options) {
+    const absl::optional<blink::WebPictureInPictureWindowOptions>& pip_options,
+    const blink::WebURL& base_url) {
   consumed_user_gesture = false;
   mojom::CreateNewWindowParamsPtr params = mojom::CreateNewWindowParams::New();
 
@@ -6361,9 +6366,9 @@
   view_params->hidden = is_background_tab;
   view_params->never_composited = never_composited;
 
-  WebView* web_view =
-      agent_scheduling_group_.CreateWebView(std::move(view_params),
-                                            /*was_created_by_renderer=*/true);
+  WebView* web_view = agent_scheduling_group_.CreateWebView(
+      std::move(view_params),
+      /*was_created_by_renderer=*/true, base_url);
 
   if (reply->wait_for_debugger) {
     blink::WebFrameWidget* frame_widget =
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 89f908fd..07e9bb1 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -184,7 +184,8 @@
       bool is_for_scalable_page,
       blink::mojom::FrameReplicationStatePtr replication_state,
       const base::UnguessableToken& devtools_frame_token,
-      mojom::CreateLocalMainFrameParamsPtr params);
+      mojom::CreateLocalMainFrameParamsPtr params,
+      const blink::WebURL& base_url);
 
   // Creates a new RenderFrame with |routing_id|. If |previous_frame_token| is
   // not provided, it creates the Blink WebLocalFrame and inserts it into
@@ -638,7 +639,8 @@
       bool& consumed_user_gesture,
       const absl::optional<blink::Impression>& impression,
       const absl::optional<blink::WebPictureInPictureWindowOptions>&
-          pip_options) override;
+          pip_options,
+      const blink::WebURL& base_url) override;
 
   // Dispatches the current state of selection on the webpage to the browser if
   // it has changed or if the forced flag is passed. The forced flag is used
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
index d1f61c4..aca884d3 100644
--- a/content/renderer/render_view_browsertest.cc
+++ b/content/renderer/render_view_browsertest.cc
@@ -969,7 +969,7 @@
       blink::kWebNavigationPolicyNewForegroundTab,
       network::mojom::WebSandboxFlags::kNone,
       blink::AllocateSessionStorageNamespaceId(), consumed_user_gesture,
-      absl::nullopt, absl::nullopt);
+      absl::nullopt, absl::nullopt, /*base_url=*/blink::WebURL());
   auto popup_navigation_info = std::make_unique<blink::WebNavigationInfo>();
   popup_navigation_info->url_request = std::move(popup_request);
   popup_navigation_info->frame_type =
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc
index 1594a768..9bf4a27 100644
--- a/content/test/test_render_frame.cc
+++ b/content/test/test_render_frame.cc
@@ -26,6 +26,7 @@
 #include "services/network/public/mojom/url_response_head.mojom.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
+#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/permissions_policy/permissions_policy.h"
 #include "third_party/blink/public/mojom/frame/frame.mojom.h"
 #include "third_party/blink/public/mojom/frame/frame_replication_state.mojom.h"
@@ -358,7 +359,7 @@
           blink::WebString::FromUTF8(charset), data);
     }
     if (url.IsAboutSrcdoc()) {
-      navigation_params->fallback_srcdoc_base_url = info->requestor_base_url;
+      navigation_params->fallback_base_url = info->requestor_base_url;
     }
 
     navigation_params->policy_container->policies.sandbox_flags =
diff --git a/docs/dangling_ptr_guide.md b/docs/dangling_ptr_guide.md
index a68de20..93c53cf 100644
--- a/docs/dangling_ptr_guide.md
+++ b/docs/dangling_ptr_guide.md
@@ -8,20 +8,26 @@
 See also the general instructions about the dangling pointer detector:
 [docs/dangling_ptr.md](./dangling_ptr.md)
 
-**Table of content**
-- [`Case 1` I don’t own the affected component](#i-don_t-own-the-affected-component)
-- [`Case 2` The dangling pointer does not own the deleted object.](#the-dangling-pointer-does-not-own-the-deleted-object)
-  - [Incorrect destruction order](#incorrect-destruction-order)
-  - [Observer callback](#observer-callback)
-  - [Challenging lifespan](#challenging-lifespan)
-  - [Fallback solution](#fallback-solution)
-- [`Case 3` The pointer manages ownership over the object](#the-pointer-manages-ownership-over-the-object)
-  - [Smart pointers](#smart-pointers)
-  - [Object vended from C API](#object-vended-from-c-api)
-  - [Object conditionally owned](#object-conditionally-owned)
-  - [Fallback solution](#fallback-solution-1)
+**Table of contents**
+- [What to do about dangling pointers](#what-to-do-about-dangling-pointers)
+  - [`Case 1` I don’t own the affected component](#i-don_t-own-the-affected-component)
+  - [`Case 2` The dangling pointer does not own the deleted object.](#the-dangling-pointer-does-not-own-the-deleted-object)
+    - [Incorrect destruction order](#incorrect-destruction-order)
+    - [Observer callback](#observer-callback)
+    - [Challenging lifespan](#challenging-lifespan)
+    - [Fallback solution](#fallback-solution)
+  - [`Case 3` The pointer manages ownership over the object](#the-pointer-manages-ownership-over-the-object)
+    - [Smart pointers](#smart-pointers)
+    - [Object vended from C API](#object-vended-from-c-api)
+    - [Object conditionally owned](#object-conditionally-owned)
+    - [Fallback solution](#fallback-solution-1)
+- [FAQ - Why dangling pointers matter](#faq-why-dangling-pointers-matter)
 
-## `Case 1` I don’t own the affected component
+## What to do about dangling pointers
+
+There are a few common cases here.
+
+### `Case 1` I don’t own the affected component
 
 If you do not directly own the affected component, you **don't need** to solve
 the issue yourself… though doing so is a great way to learn about and improve
@@ -43,9 +49,9 @@
 pointer. Annotating the pointer makes the issue visible directly in the code,
 improving our knowledge of Chrome.
 
-## `Case 2` The dangling pointer does not own the deleted object
+### `Case 2` The dangling pointer does not own the deleted object
 
-### Incorrect destruction order
+#### Incorrect destruction order
 
 This represents ~25% of the dangling pointers.
 
@@ -58,7 +64,7 @@
 
 See [Fix member declaration order](https://docs.google.com/document/d/11YYsyPF9rQv_QFf982Khie3YuNPXV0NdhzJPojpZfco/edit?resourcekey=0-h1dr1uDzZGU7YWHth5TRAQ#bookmark=id.jgjtzldk9pvc) and [Fix reset ordering](https://docs.google.com/document/d/11YYsyPF9rQv_QFf982Khie3YuNPXV0NdhzJPojpZfco/edit?resourcekey=0-h1dr1uDzZGU7YWHth5TRAQ#bookmark=id.xdam727ioy4q) examples.
 
-### Observer callback
+#### Observer callback
 
 This represents ~4% of the dangling pointers.
 
@@ -66,7 +72,7 @@
 Chrome uses the observer pattern heavily. In some cases, the observer does not
 clear its pointer toward the observed class when notified of its destruction.
 
-### Challenging lifespan
+#### Challenging lifespan
 
 It can be challenging to deal with an object's lifespan. Sometimes, the lifetime
 of two objects are completely different.
@@ -81,7 +87,7 @@
 -   A [WeakPtr](https://docs.google.com/document/d/11YYsyPF9rQv_QFf982Khie3YuNPXV0NdhzJPojpZfco/edit?resourcekey=0-h1dr1uDzZGU7YWHth5TRAQ#bookmark=id.geuhahom0twd)
 -   [Calling a function](https://docs.google.com/document/d/11YYsyPF9rQv_QFf982Khie3YuNPXV0NdhzJPojpZfco/edit?resourcekey=0-h1dr1uDzZGU7YWHth5TRAQ#heading=h.wh99ri7bbq23)
 
-### Fallback solution
+#### Fallback solution
 
 As a last resort, when the situation is perfectly understood, and you believe it
 is better to let the pointer dangle, the raw_ptr can be annotated with
@@ -103,13 +109,13 @@
 **In emergency situations**: `DanglingUntriaged` can be used similarly, in case
 your patch needs to land as soon as possible.
 
-## `Case 3` The pointer manages ownership over the object
+### `Case 3` The pointer manages ownership over the object
 
 raw_ptr, just like raw pointers T*, are not meant to keep an object alive. It is
 preferable not to manage memory manually using them and new/delete. Calling
 delete on a raw_ptr will cause the raw_ptr to become immediately dangling.
 
-### Smart pointers
+#### Smart pointers
 
 First, consider replacing the raw_ptr with a smart pointer:
 
@@ -117,7 +123,7 @@
     [example](https://docs.google.com/document/d/11YYsyPF9rQv_QFf982Khie3YuNPXV0NdhzJPojpZfco/edit?resourcekey=0-h1dr1uDzZGU7YWHth5TRAQ#heading=h.6itq8twigqt3))
 -   scoped_refptr
 
-### Object vended from C API
+#### Object vended from C API
 
 In some cases, the object is vended by a C API. It means new/delete are not
 used, but some equivalent API. In this case, it still makes sense to use a
@@ -129,7 +135,7 @@
 [base::ScopedTempDir](https://source.chromium.org/chromium/chromium/src/+/main:base/files/scoped_temp_dir.h;l=25?q=ScopedTempDir&sq=&ss=chromium%2Fchromium%2Fsrc),
 ..
 
-### Object conditionally owned
+#### Object conditionally owned
 
 In some cases, the raw_ptr conditionally owns the memory, depending on some
 logic or some `is_owned` boolean. This can still use a unique_ptr
@@ -140,7 +146,7 @@
 raw_ptr<T> t_; // Reference `t_owned_` or an external object.
 ```
 
-### Fallback solution
+#### Fallback solution
 
 If no solution with a smart pointer is found:
 
@@ -163,3 +169,38 @@
 |Before|After |
 |--|--|
 |`ExternalAPIDelete(ptr_);`|`ExternalAPIDelete(ptr_.ExtractAsDangling());`|
+
+## FAQ - Why dangling pointers matter
+
+Q. Gee, this is a raw pointer. Does destroying it actually do anything?
+
+A. Yes. On some platforms raw_ptr<T> is a synonym for T*, but on many platforms
+(more every day) raw_ptr<T> is the interface to PartitionAlloc’s BackupRefPtr
+(BRP) Use-after-Free (UaF) protection mechanism. Destroying the pointer thus
+actually performs internal bookkeeping and may also null the pointer on
+destruction to trap use-after-destruct errors.
+
+Q. So BRP mitigates these dangling pointers. What's the problem with just
+keeping them if they are not used?
+
+A. When an object is deleted under BRP, if there are any dangling references
+remaining, the object must be quarantined and overwritten with a “zapped”
+pattern as opposed to being simply freed. This costs cycles and memory
+pressure. Even worse, it is still possible that the raw_ptr is converted to
+T* and used with the zap value, or even used after the quarantine is
+gone. Hence we are inventing mechanisms for finding dangling pointers so we
+may remove the ones we know about. BRP will then make it harder to write
+exploits with the ones we don’t know about in the wild.
+
+Q. Why do we care if this is “just a test”?
+
+A. Hitting dangling pointer warnings in tests blocks digging into actual
+cases further in the code.
+
+Q. Why should I think about lifetimes, anyway?
+
+A. Holding an address that we aren’t allowed to de-reference is a bad
+practice. It is a security and stability risk, a source of bugs that are
+extremely difficult to diagnose, and a hazard for future coders. Also see
+e.g. https://discourse.llvm.org/t/rfc-lifetime-annotations-for-c/61377 for
+some ideas about how this might play out in the future.
diff --git a/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc b/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc
index fe5b71a74..e558ca6c 100644
--- a/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc
+++ b/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc
@@ -40,6 +40,10 @@
 #include "chromeos/dbus/power/fake_power_manager_client.h"
 #endif
 
+#if BUILDFLAG(IS_OZONE)
+#include "ui/events/ozone/events_ozone.h"
+#endif
+
 namespace extensions {
 
 class ShellDesktopControllerAuraTest : public ShellTestBaseAura {
@@ -130,10 +134,11 @@
 
   // Dispatch a keypress on the window tree host to verify it is processed.
   ui::KeyEvent key_press(u'a', ui::VKEY_A, ui::DomCode::NONE, ui::EF_NONE);
-  ui::Event::Properties properties;
-  properties.emplace(ui::kPropertyKeyboardImeFlag,
-                     std::vector<uint8_t>{ui::kPropertyKeyboardImeIgnoredFlag});
-  key_press.SetProperties(properties);
+#if BUILDFLAG(IS_OZONE)
+  // Mark IME ignoring flag for ozone platform to be just a key event skipping
+  // IME handling, which is referred in some IME handling code based on ozone.
+  ui::SetKeyboardImeFlags(&key_press, ui::kPropertyKeyboardImeIgnoredFlag);
+#endif
   ui::EventDispatchDetails details =
       controller_->GetPrimaryHost()->dispatcher()->DispatchEvent(
           controller_->GetPrimaryHost()->window(), &key_press);
diff --git a/ios/chrome/browser/ui/ntp/feed_promos/BUILD.gn b/ios/chrome/browser/ui/ntp/feed_promos/BUILD.gn
index f6d9f739..7ae714d2 100644
--- a/ios/chrome/browser/ui/ntp/feed_promos/BUILD.gn
+++ b/ios/chrome/browser/ui/ntp/feed_promos/BUILD.gn
@@ -16,6 +16,7 @@
     "//ios/chrome/browser/ntp:features",
     "//ios/chrome/browser/shared/coordinator/chrome_coordinator",
     "//ios/chrome/browser/shared/public/commands",
+    "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/ui/ntp/metrics",
     "//ios/chrome/common/ui/confirmation_alert",
diff --git a/ios/chrome/browser/ui/ntp/feed_promos/feed_sign_in_promo_coordinator.mm b/ios/chrome/browser/ui/ntp/feed_promos/feed_sign_in_promo_coordinator.mm
index f8f54301..c46b184e 100644
--- a/ios/chrome/browser/ui/ntp/feed_promos/feed_sign_in_promo_coordinator.mm
+++ b/ios/chrome/browser/ui/ntp/feed_promos/feed_sign_in_promo_coordinator.mm
@@ -12,6 +12,7 @@
 #import "ios/chrome/browser/shared/public/commands/application_commands.h"
 #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
 #import "ios/chrome/browser/shared/public/commands/show_signin_command.h"
+#import "ios/chrome/browser/shared/public/features/features.h"
 #import "ios/chrome/browser/signin/chrome_account_manager_service.h"
 #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h"
 #import "ios/chrome/browser/ui/ntp/feed_promos/feed_sign_in_promo_view_controller.h"
@@ -47,54 +48,61 @@
 - (void)start {
   DCHECK(IsFeedCardMenuSignInPromoEnabled());
 
-  ChromeAccountManagerService* accountManagerService =
-      ChromeAccountManagerServiceFactory::GetForBrowserState(
-          self.browser->GetBrowserState());
-
-  // Show sign-in only flow when there's one or more device-level user account.
-  if (accountManagerService->HasIdentities()) {
-    [self showSignInFlowWithSignInOnly:YES];
-    return;
-  }
-
   self.feedMetricsRecorder = DiscoverFeedServiceFactory::GetForBrowserState(
                                  self.browser->GetBrowserState())
                                  ->GetFeedMetricsRecorder();
 
-  FeedSignInPromoViewController* signInPromoViewController =
-      [[FeedSignInPromoViewController alloc] init];
+  ChromeAccountManagerService* accountManagerService =
+      ChromeAccountManagerServiceFactory::GetForBrowserState(
+          self.browser->GetBrowserState());
 
-  signInPromoViewController.actionHandler = self;
+  BOOL hasUserIdentities = accountManagerService->HasIdentities();
 
-  if (@available(iOS 15, *)) {
-    signInPromoViewController.modalPresentationStyle =
-        UIModalPresentationPageSheet;
-    UISheetPresentationController* presentationController =
-        signInPromoViewController.sheetPresentationController;
-    presentationController.prefersEdgeAttachedInCompactHeight = YES;
-    presentationController.widthFollowsPreferredContentSizeWhenEdgeAttached =
-        YES;
-    presentationController.detents = @[
-      UISheetPresentationControllerDetent.mediumDetent,
-      UISheetPresentationControllerDetent.largeDetent
-    ];
-    presentationController.preferredCornerRadius = kHalfSheetCornerRadius;
+  // Launch the Sign-In only flow, since Sync is not needed for this feature.
+  // TODO(crbug.com/1382615): Currently we show sign-in only UI when it's
+  // enabled, or when the user has one or more device-level user identities.
+  // Remove else block and the user identity check when sign-in only UI is fully
+  // launched.
+  if (IsConsistencyNewAccountInterfaceEnabled() || hasUserIdentities) {
+    [self showSignInFlowWithSignInOnly:YES];
+    [self.feedMetricsRecorder
+        recordShowSignInOnlyUIWithUserId:hasUserIdentities];
   } else {
-    signInPromoViewController.modalPresentationStyle =
-        UIModalPresentationFormSheet;
-  }
+    FeedSignInPromoViewController* signInPromoViewController =
+        [[FeedSignInPromoViewController alloc] init];
 
-  [self.baseViewController
-      presentViewController:signInPromoViewController
-                   animated:YES
-                 completion:^() {
-                   const signin_metrics::AccessPoint access_point =
-                       signin_metrics::AccessPoint::
-                           ACCESS_POINT_NTP_FEED_CARD_MENU_PROMO;
-                   signin_metrics::
-                       RecordSigninImpressionUserActionForAccessPoint(
-                           access_point);
-                 }];
+    signInPromoViewController.actionHandler = self;
+
+    if (@available(iOS 15, *)) {
+      signInPromoViewController.modalPresentationStyle =
+          UIModalPresentationPageSheet;
+      UISheetPresentationController* presentationController =
+          signInPromoViewController.sheetPresentationController;
+      presentationController.prefersEdgeAttachedInCompactHeight = YES;
+      presentationController.widthFollowsPreferredContentSizeWhenEdgeAttached =
+          YES;
+      presentationController.detents = @[
+        UISheetPresentationControllerDetent.mediumDetent,
+        UISheetPresentationControllerDetent.largeDetent
+      ];
+      presentationController.preferredCornerRadius = kHalfSheetCornerRadius;
+    } else {
+      signInPromoViewController.modalPresentationStyle =
+          UIModalPresentationFormSheet;
+    }
+
+    [self.baseViewController
+        presentViewController:signInPromoViewController
+                     animated:YES
+                   completion:^() {
+                     const signin_metrics::AccessPoint access_point =
+                         signin_metrics::AccessPoint::
+                             ACCESS_POINT_NTP_FEED_CARD_MENU_PROMO;
+                     signin_metrics::
+                         RecordSigninImpressionUserActionForAccessPoint(
+                             access_point);
+                   }];
+  }
 }
 
 - (void)stop {
diff --git a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_constants.h b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_constants.h
index a3d5084..d44fdca 100644
--- a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_constants.h
+++ b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_constants.h
@@ -394,4 +394,9 @@
 extern const char kFeedSignInPromoUIContinueTapped[];
 extern const char kFeedSignInPromoUICancelTapped[];
 
+// User actions triggered when a user taps on Feed Back of Card menu
+// personalization options when not signed in.
+extern const char kShowFeedSignInOnlyUIWithUserId[];
+extern const char kShowFeedSignInOnlyUIWithoutUserId[];
+
 #endif  // IOS_CHROME_BROWSER_UI_NTP_METRICS_FEED_METRICS_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_constants.mm b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_constants.mm
index 7d04578f..c00f54e 100644
--- a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_constants.mm
+++ b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_constants.mm
@@ -189,3 +189,7 @@
     "ContentSuggestions.Feed.SignIn.FeedSignInPromoUIContinueTapped";
 const char kFeedSignInPromoUICancelTapped[] =
     "ContentSuggestions.Feed.SignIn.FeedSignInPromoUICancelTapped";
+const char kShowFeedSignInOnlyUIWithUserId[] =
+    "ContentSuggestions.Feed.SignIn.ShowFeedSignInOnlyUIWithUserId";
+const char kShowFeedSignInOnlyUIWithoutUserId[] =
+    "ContentSuggestions.Feed.SignIn.ShowFeedSignInOnlyUIWithoutUserId";
diff --git a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.h b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.h
index 4ff12159..9189549 100644
--- a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.h
+++ b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.h
@@ -278,6 +278,11 @@
 // Record metrics for when a user tapped on "Cancel" of the Sign-in promo UI.
 - (void)recordSignInPromoUICancelTapped;
 
+// Record metrics for when a user triggered a sign-in only flow from Discover
+// feed. `hasUserId` is YES when the user has one or more device-level
+// identities.
+- (void)recordShowSignInOnlyUIWithUserId:(BOOL)hasUserId;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_NTP_METRICS_FEED_METRICS_RECORDER_H_
diff --git a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.mm b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.mm
index b64a01d..54e0c5ef 100644
--- a/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.mm
+++ b/ios/chrome/browser/ui/ntp/metrics/feed_metrics_recorder.mm
@@ -800,6 +800,12 @@
   base::RecordAction(base::UserMetricsAction(kFeedSignInPromoUICancelTapped));
 }
 
+- (void)recordShowSignInOnlyUIWithUserId:(BOOL)hasUserId {
+  base::RecordAction(
+      hasUserId ? base::UserMetricsAction(kShowFeedSignInOnlyUIWithUserId)
+                : base::UserMetricsAction(kShowFeedSignInOnlyUIWithoutUserId));
+}
+
 #pragma mark - Private
 
 // Returns the UserSettingsOnStart value based on the user settings.
diff --git a/media/base/demuxer.h b/media/base/demuxer.h
index 1d2b832f3..34b7b4c 100644
--- a/media/base/demuxer.h
+++ b/media/base/demuxer.h
@@ -33,7 +33,7 @@
   kMediaUrlDemuxer,
   kFrameInjectingDemuxer,
   kStreamProviderDemuxer,
-  kHlsDemuxer,
+  kManifestDemuxer,
 };
 
 class MEDIA_EXPORT DemuxerHost {
diff --git a/media/filters/BUILD.gn b/media/filters/BUILD.gn
index ef4fcc5a..73969e006 100644
--- a/media/filters/BUILD.gn
+++ b/media/filters/BUILD.gn
@@ -251,8 +251,8 @@
     sources += [
       "hls_data_source_provider.cc",
       "hls_data_source_provider.h",
-      "hls_demuxer.cc",
-      "hls_demuxer.h",
+      "manifest_demuxer.cc",
+      "manifest_demuxer.h",
     ]
   }
 }
diff --git a/media/filters/demuxer_manager.cc b/media/filters/demuxer_manager.cc
index fa48d6f..245c603 100644
--- a/media/filters/demuxer_manager.cc
+++ b/media/filters/demuxer_manager.cc
@@ -21,7 +21,7 @@
 #include "url/gurl.h"
 
 #if BUILDFLAG(ENABLE_HLS_DEMUXER)
-#include "media/filters/hls_demuxer.h"
+#include "media/filters/manifest_demuxer.h"
 #endif  // BUILDFLAG(ENABLE_HLS_DEMUXER)
 
 namespace media {
@@ -573,9 +573,9 @@
 
 #if BUILDFLAG(ENABLE_HLS_DEMUXER)
 std::unique_ptr<Demuxer> DemuxerManager::CreateHlsDemuxer() {
-  return std::make_unique<HlsDemuxer>(media_task_runner_,
-                                      client_->GetHlsDataSourceProvider(),
-                                      loaded_url_, media_log_.get());
+  return std::make_unique<ManifestDemuxer>(media_task_runner_,
+                                           client_->GetHlsDataSourceProvider(),
+                                           loaded_url_, media_log_.get());
 }
 #endif
 
diff --git a/media/filters/hls_demuxer_unittest.cc b/media/filters/hls_demuxer_unittest.cc
deleted file mode 100644
index 04fd552..0000000
--- a/media/filters/hls_demuxer_unittest.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "media/filters/hls_demuxer.h"
-
-#include "base/task/single_thread_task_runner.h"
-#include "base/test/task_environment.h"
-#include "media/base/mock_media_log.h"
-#include "media/base/test_helpers.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::StrictMock;
-
-namespace media {
-
-class HlsDemuxerTest : public testing::Test {
- protected:
-  HlsDemuxerTest() { CreateNewDemuxer(); }
-  ~HlsDemuxerTest() override { Shutdown(); }
-
-  HlsDemuxerTest(const HlsDemuxerTest&) = delete;
-  HlsDemuxerTest& operator=(const HlsDemuxerTest&) = delete;
-
-  void Shutdown() {
-    if (demuxer_) {
-      demuxer_->Stop();
-    }
-    demuxer_.reset();
-    task_environment_.RunUntilIdle();
-  }
-
-  void CreateNewDemuxer() {
-    EXPECT_MEDIA_LOG(HlsDemuxerCtor());
-    demuxer_ = std::make_unique<HlsDemuxer>(
-        base::SingleThreadTaskRunner::GetCurrentDefault(), &media_log_);
-  }
-
-  base::test::TaskEnvironment task_environment_;
-  StrictMock<MockMediaLog> media_log_;
-  std::unique_ptr<HlsDemuxer> demuxer_;
-};
-
-TEST_F(HlsDemuxerTest, PreInitializationState) {
-  EXPECT_TRUE(demuxer_);
-  EXPECT_EQ(0u, demuxer_->GetAllStreams().size());
-  EXPECT_EQ("HlsDemuxer", demuxer_->GetDisplayName());
-  EXPECT_EQ(DemuxerType::kHlsDemuxer, demuxer_->GetDemuxerType());
-  EXPECT_EQ(base::TimeDelta(), demuxer_->GetStartTime());
-  EXPECT_EQ(base::Time(), demuxer_->GetTimelineOffset());
-  EXPECT_EQ(0u, demuxer_->GetMemoryUsage());
-  EXPECT_EQ(absl::nullopt, demuxer_->GetContainerForMetrics());
-}
-
-}  // namespace media
diff --git a/media/filters/hls_demuxer.cc b/media/filters/manifest_demuxer.cc
similarity index 79%
rename from media/filters/hls_demuxer.cc
rename to media/filters/manifest_demuxer.cc
index cda7603..d57cd2a 100644
--- a/media/filters/hls_demuxer.cc
+++ b/media/filters/manifest_demuxer.cc
@@ -1,8 +1,8 @@
-// Copyright 2022 The Chromium Authors
+// Copyright 2023 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "media/filters/hls_demuxer.h"
+#include "media/filters/manifest_demuxer.h"
 
 #include <vector>
 
@@ -19,7 +19,7 @@
 
 namespace media {
 
-HlsDemuxer::HlsDemuxer(
+ManifestDemuxer::ManifestDemuxer(
     scoped_refptr<base::SequencedTaskRunner> task_runner,
     base::SequenceBound<HlsDataSourceProvider> data_source_provider,
     GURL root_playlist_uri,
@@ -30,11 +30,11 @@
   DCHECK(data_source_provider);
 }
 
-HlsDemuxer::~HlsDemuxer() {
+ManifestDemuxer::~ManifestDemuxer() {
   DVLOG(1) << __func__;
 }
 
-std::vector<DemuxerStream*> HlsDemuxer::GetAllStreams() {
+std::vector<DemuxerStream*> ManifestDemuxer::GetAllStreams() {
   DVLOG(1) << __func__;
 
   // TODO(crbug/1266991): Consult underlying ChunkDemuxer for its streams
@@ -42,16 +42,16 @@
   return std::vector<DemuxerStream*>();
 }
 
-std::string HlsDemuxer::GetDisplayName() const {
-  return "HlsDemuxer";
+std::string ManifestDemuxer::GetDisplayName() const {
+  return "ManifestDemuxer";
 }
 
-DemuxerType HlsDemuxer::GetDemuxerType() const {
-  return DemuxerType::kHlsDemuxer;
+DemuxerType ManifestDemuxer::GetDemuxerType() const {
+  return DemuxerType::kManifestDemuxer;
 }
 
-void HlsDemuxer::Initialize(DemuxerHost* host,
-                            PipelineStatusCallback status_cb) {
+void ManifestDemuxer::Initialize(DemuxerHost* host,
+                                 PipelineStatusCallback status_cb) {
   DVLOG(1) << __func__ << "(host=" << host << ")";
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
@@ -63,27 +63,28 @@
   // displayname log when it is constructed (perhaps subtype it?).
 }
 
-void HlsDemuxer::AbortPendingReads() {
+void ManifestDemuxer::AbortPendingReads() {
   DVLOG(1) << __func__;
   // TODO(crbug/1266991): Let the wrapped ChunkDemuxer know to abort pending
   // reads, if any.
 }
 
-void HlsDemuxer::StartWaitingForSeek(base::TimeDelta seek_time) {
+void ManifestDemuxer::StartWaitingForSeek(base::TimeDelta seek_time) {
   DVLOG(1) << __func__ << "(seek_time=" << seek_time.InMicroseconds() << "us)";
   // TODO(crbug/1266991): Time Remapping.
   // TODO(crbug/1266991): Let the wrapped ChunkDemuxer know to start waiting for
   // a seek to `seek_time`.
 }
 
-void HlsDemuxer::CancelPendingSeek(base::TimeDelta seek_time) {
+void ManifestDemuxer::CancelPendingSeek(base::TimeDelta seek_time) {
   DVLOG(1) << __func__ << "(seek_time=" << seek_time.InMicroseconds() << "us)";
   // TODO(crbug/1266991): Time remapping.
   // TODO(crbug/1266991): Let the wrapped ChunkDemuxer know to cancel pending
   // seek for `seek_time`.
 }
 
-void HlsDemuxer::Seek(base::TimeDelta time, PipelineStatusCallback status_cb) {
+void ManifestDemuxer::Seek(base::TimeDelta time,
+                           PipelineStatusCallback status_cb) {
   DVLOG(1) << __func__ << "(time=" << time.InMicroseconds() << "us)";
   // TODO(crbug/1266991): This should be intercepted when performing time
   // remapping.
@@ -91,12 +92,12 @@
   // and give it `status_cb`.
 }
 
-bool HlsDemuxer::IsSeekable() const {
+bool ManifestDemuxer::IsSeekable() const {
   // The underlying wrapping ChunkDemuxer is seekable.
   return true;
 }
 
-void HlsDemuxer::Stop() {
+void ManifestDemuxer::Stop() {
   DVLOG(1) << __func__;
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
@@ -104,14 +105,14 @@
   // clear the host for it, invalidate any weak pointers we may have bound.
 }
 
-base::TimeDelta HlsDemuxer::GetStartTime() const {
+base::TimeDelta ManifestDemuxer::GetStartTime() const {
   // TODO(crbug/1266991): Is any time remapping of HLS start time necessary
   // here?
   DVLOG(2) << __func__ << " -> 0";
   return base::TimeDelta();
 }
 
-base::Time HlsDemuxer::GetTimelineOffset() const {
+base::Time ManifestDemuxer::GetTimelineOffset() const {
   // TODO(crbug/1266991): Implement this with the value of the
   // EXT-X-PROGRAM-DATETIME tag.
   // TODO(crbug/1266991): Moderate that tag with respect to any underlying
@@ -123,7 +124,7 @@
   return base::Time();
 }
 
-int64_t HlsDemuxer::GetMemoryUsage() const {
+int64_t ManifestDemuxer::GetMemoryUsage() const {
   // TODO(crbug/1266991): If we have a wrapped ChunkDemuxer, consider returning
   // its usage here.
   // TODO(crbug/1266991): Consider other potential significant memory usage
@@ -134,14 +135,14 @@
 }
 
 absl::optional<container_names::MediaContainerName>
-HlsDemuxer::GetContainerForMetrics() const {
+ManifestDemuxer::GetContainerForMetrics() const {
   DVLOG(1) << __func__;
   // TODO(crbug/1266991): Consider how this is used. HLS can involve multiple
   // stream types (mp2ts, mp4, etc). Refactor to report something useful.
   return absl::nullopt;
 }
 
-void HlsDemuxer::OnEnabledAudioTracksChanged(
+void ManifestDemuxer::OnEnabledAudioTracksChanged(
     const std::vector<MediaTrack::Id>& track_ids,
     base::TimeDelta curr_time,
     TrackChangeCB change_completed_cb) {
@@ -149,7 +150,7 @@
   // TODO(crbug/1266991): Handle this as necessary.
 }
 
-void HlsDemuxer::OnSelectedVideoTrackChanged(
+void ManifestDemuxer::OnSelectedVideoTrackChanged(
     const std::vector<MediaTrack::Id>& track_ids,
     base::TimeDelta curr_time,
     TrackChangeCB change_completed_cb) {
diff --git a/media/filters/hls_demuxer.h b/media/filters/manifest_demuxer.h
similarity index 82%
rename from media/filters/hls_demuxer.h
rename to media/filters/manifest_demuxer.h
index c713f99b..a8bd6285 100644
--- a/media/filters/hls_demuxer.h
+++ b/media/filters/manifest_demuxer.h
@@ -1,9 +1,9 @@
-// Copyright 2022 The Chromium Authors
+// Copyright 2023 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MEDIA_FILTERS_HLS_DEMUXER_H_
-#define MEDIA_FILTERS_HLS_DEMUXER_H_
+#ifndef MEDIA_FILTERS_MANIFEST_DEMUXER_H_
+#define MEDIA_FILTERS_MANIFEST_DEMUXER_H_
 
 #include <vector>
 
@@ -23,18 +23,18 @@
 
 namespace media {
 
-class MEDIA_EXPORT HlsDemuxer final : public Demuxer {
+class MEDIA_EXPORT ManifestDemuxer final : public Demuxer {
  public:
-  explicit HlsDemuxer(
+  explicit ManifestDemuxer(
       scoped_refptr<base::SequencedTaskRunner> task_runner,
       base::SequenceBound<HlsDataSourceProvider> data_source_provider,
       GURL root_playlist_uri,
       MediaLog* media_log);
-  ~HlsDemuxer() override;
-  HlsDemuxer(const HlsDemuxer&) = delete;
-  HlsDemuxer(HlsDemuxer&&) = delete;
-  HlsDemuxer& operator=(const HlsDemuxer&) = delete;
-  HlsDemuxer& operator=(HlsDemuxer&&) = delete;
+  ~ManifestDemuxer() override;
+  ManifestDemuxer(const ManifestDemuxer&) = delete;
+  ManifestDemuxer(ManifestDemuxer&&) = delete;
+  ManifestDemuxer& operator=(const ManifestDemuxer&) = delete;
+  ManifestDemuxer& operator=(ManifestDemuxer&&) = delete;
 
   // `media::MediaResource` implementation
   std::vector<DemuxerStream*> GetAllStreams() override;
@@ -72,4 +72,4 @@
 
 }  // namespace media
 
-#endif  // MEDIA_FILTERS_HLS_DEMUXER_H_
+#endif  // MEDIA_FILTERS_MANIFEST_DEMUXER_H_
diff --git a/remoting/client/chromoting_client_runtime_unittest.cc b/remoting/client/chromoting_client_runtime_unittest.cc
index f613a0a..61049f80 100644
--- a/remoting/client/chromoting_client_runtime_unittest.cc
+++ b/remoting/client/chromoting_client_runtime_unittest.cc
@@ -15,7 +15,13 @@
 
 // A simple test that starts and stop the runtime. This tests the runtime
 // operates properly and all threads and message loops are valid.
-TEST(ChromotingClientRuntimeTest, StartAndStop) {
+// TODO(https://crbug.com/1422163): Failing on iOS.
+#if BUILDFLAG(IS_IOS)
+#define MAYBE_StartAndStop DISABLED_StartAndStop
+#else
+#define MAYBE_StartAndStop StartAndStop
+#endif
+TEST(ChromotingClientRuntimeTest, MAYBE_StartAndStop) {
   ChromotingClientRuntime* runtime = ChromotingClientRuntime::GetInstance();
 
   ASSERT_TRUE(runtime);
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index ea3e5e5..ed2ca72 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -5919,9 +5919,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -5933,8 +5933,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
@@ -6089,9 +6089,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -6103,8 +6103,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
@@ -6242,9 +6242,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -6256,8 +6256,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.coverage.json b/testing/buildbot/chromium.coverage.json
index 55c5d64..4ab97df 100644
--- a/testing/buildbot/chromium.coverage.json
+++ b/testing/buildbot/chromium.coverage.json
@@ -25664,9 +25664,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -25678,8 +25678,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
@@ -25834,9 +25834,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -25848,8 +25848,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
@@ -25987,9 +25987,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -26001,8 +26001,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index fd8b71315..66e4d9c 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -50207,9 +50207,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -50220,8 +50220,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
@@ -50377,9 +50377,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -50390,8 +50390,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
@@ -50530,9 +50530,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -50543,8 +50543,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
@@ -52050,9 +52050,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -52063,8 +52063,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
@@ -52220,9 +52220,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -52233,8 +52233,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
@@ -52373,9 +52373,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -52386,8 +52386,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
@@ -53140,9 +53140,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -53153,8 +53153,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 0ae1fc0..de91b42 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -18450,12 +18450,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -18467,8 +18467,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
@@ -18640,12 +18640,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -18657,8 +18657,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
@@ -18808,12 +18808,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 113.0.5635.0",
+        "description": "Run with ash-chrome version 113.0.5650.0",
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -18825,8 +18825,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v113.0.5635.0",
-              "revision": "version:113.0.5635.0"
+              "location": "lacros_version_skew_tests_v113.0.5650.0",
+              "revision": "version:113.0.5650.0"
             }
           ],
           "dimension_sets": [
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 212cfb68..7004ca09 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -38,16 +38,16 @@
   },
   'LACROS_VERSION_SKEW_DEV': {
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5635.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v113.0.5650.0/test_ash_chrome',
     ],
-    'description': 'Run with ash-chrome version 113.0.5635.0',
+    'description': 'Run with ash-chrome version 113.0.5650.0',
     'identifier': 'Lacros version skew testing ash dev',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v113.0.5635.0',
-          'revision': 'version:113.0.5635.0',
+          'location': 'lacros_version_skew_tests_v113.0.5650.0',
+          'revision': 'version:113.0.5650.0',
         },
       ],
     },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index d0e8f57c..4086902 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -1537,13 +1537,17 @@
     "BFCachePerformanceManagerPolicy": [
         {
             "platforms": [
-                "android"
+                "chromeos",
+                "fuchsia",
+                "linux",
+                "mac",
+                "windows"
             ],
             "experiments": [
                 {
-                    "name": "EnabledPolicy_CacheSize3_20230324",
+                    "name": "EnabledPolicy_CacheSize6_20220921",
                     "params": {
-                        "cache_size": "3",
+                        "cache_size": "6",
                         "foreground_cache_size": "0"
                     },
                     "enable_features": [
@@ -1772,6 +1776,25 @@
             ]
         }
     ],
+    "BackForwardCacheSizeOnAndroid": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "ForegroundCacheSize1_CacheSize4_20221202",
+                    "params": {
+                        "cache_size": "4",
+                        "foreground_cache_size": "1"
+                    },
+                    "enable_features": [
+                        "BackForwardCacheSize"
+                    ]
+                }
+            ]
+        }
+    ],
     "BackForwardCache_NoMemoryLimit_Trial": [
         {
             "platforms": [
@@ -5404,7 +5427,6 @@
                     "name": "Enabled",
                     "enable_features": [
                         "GifRecording",
-                        "GifRendering",
                         "NotificationImageDrag"
                     ]
                 }
@@ -13662,6 +13684,7 @@
                 {
                     "name": "Enabled",
                     "enable_features": [
+                        "CrOSLateBootAudioFlexibleLoopback",
                         "VideoConference"
                     ]
                 }
diff --git a/third_party/blink/public/web/web_local_frame.h b/third_party/blink/public/web/web_local_frame.h
index 6da8676f..19c2169 100644
--- a/third_party/blink/public/web/web_local_frame.h
+++ b/third_party/blink/public/web/web_local_frame.h
@@ -140,7 +140,8 @@
       std::unique_ptr<blink::WebPolicyContainer> policy_container,
       WebFrame* opener = nullptr,
       const WebString& name = WebString(),
-      network::mojom::WebSandboxFlags = network::mojom::WebSandboxFlags::kNone);
+      network::mojom::WebSandboxFlags = network::mojom::WebSandboxFlags::kNone,
+      const WebURL& base_url = WebURL());
 
   // Used to create a provisional local frame. Currently, it's possible for a
   // provisional navigation not to commit (i.e. it might turn into a download),
diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h
index 082e8ec..ee528077 100644
--- a/third_party/blink/public/web/web_local_frame_client.h
+++ b/third_party/blink/public/web/web_local_frame_client.h
@@ -797,7 +797,8 @@
       const SessionStorageNamespaceId& session_storage_namespace_id,
       bool& consumed_user_gesture,
       const absl::optional<Impression>&,
-      const absl::optional<WebPictureInPictureWindowOptions>& pip_options) {
+      const absl::optional<WebPictureInPictureWindowOptions>& pip_options,
+      const WebURL& base_url) {
     return nullptr;
   }
 };
diff --git a/third_party/blink/public/web/web_navigation_params.h b/third_party/blink/public/web/web_navigation_params.h
index c13058bc..2f61dce5 100644
--- a/third_party/blink/public/web/web_navigation_params.h
+++ b/third_party/blink/public/web/web_navigation_params.h
@@ -281,14 +281,11 @@
   // a failed navigation.
   WebURL pre_redirect_url_for_failed_navigations;
 
-  // If `url` is about:srcdoc, this is the default base URL to use for the new
-  // document. It corresponds to the initiator's base URL snapshotted when the
-  // navigation started.
-  // Note: this value is only used when the NewBaseUrlInheritanceBehavior
-  // feature is enabled in the embedder.
-  // TODO(wjmaclean): Revisit the naming here when we expand to sending base
-  // URLs for about:blank.
-  WebURL fallback_srcdoc_base_url;
+  // If `url` is about:srcdoc or about:blank, this is the default base URL to
+  // use for the new document. It corresponds to the initiator's base URL
+  // snapshotted when the navigation started. Note: this value is only used when
+  // the NewBaseUrlInheritanceBehavior feature is enabled in the embedder.
+  WebURL fallback_base_url;
 
   // The net error code for failed navigation. Must be non-zero when
   // |unreachable_url| is non-null.
diff --git a/third_party/blink/renderer/core/css/container_query_test.cc b/third_party/blink/renderer/core/css/container_query_test.cc
index f66748c..71cf3cb 100644
--- a/third_party/blink/renderer/core/css/container_query_test.cc
+++ b/third_party/blink/renderer/core/css/container_query_test.cc
@@ -201,6 +201,7 @@
   EXPECT_FALSE(ParseAtContainer("@container (color-index >= 1) {}"));
   EXPECT_FALSE(ParseAtContainer("@container (grid) {}"));
   EXPECT_FALSE(ParseAtContainer("@container (resolution: 150dpi) {}"));
+  EXPECT_FALSE(ParseAtContainer("@container (resolution: calc(6x / 3)) {}"));
   EXPECT_FALSE(ParseAtContainer("@container size(width) {}"));
   EXPECT_FALSE(ParseAtContainer("@container test_name size(width) {}"));
 }
diff --git a/third_party/blink/renderer/core/css/css_image_set_option_value.cc b/third_party/blink/renderer/core/css/css_image_set_option_value.cc
index b88981f9..7ba1a349 100644
--- a/third_party/blink/renderer/core/css/css_image_set_option_value.cc
+++ b/third_party/blink/renderer/core/css/css_image_set_option_value.cc
@@ -7,6 +7,7 @@
 #include "base/memory/values_equivalent.h"
 #include "third_party/blink/renderer/core/css/css_gradient_value.h"
 #include "third_party/blink/renderer/core/css/css_image_value.h"
+#include "third_party/blink/renderer/core/css/css_numeric_literal_value.h"
 #include "third_party/blink/renderer/core/style/style_generated_image.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 
@@ -34,11 +35,10 @@
   return value;
 }
 
-const CSSNumericLiteralValue* ComputeResolution(
-    const CSSNumericLiteralValue* resolution) {
+const CSSPrimitiveValue* ComputeResolution(
+    const CSSPrimitiveValue* resolution) {
   if (RuntimeEnabledFeatures::CSSImageSetEnabled() && resolution &&
-      resolution->IsResolution() &&
-      resolution->GetType() != CSSPrimitiveValue::UnitType::kDotsPerPixel) {
+      resolution->IsResolution()) {
     return CSSNumericLiteralValue::Create(
         resolution->ComputeDotsPerPixel(),
         CSSPrimitiveValue::UnitType::kDotsPerPixel);
@@ -51,7 +51,7 @@
 
 CSSImageSetOptionValue::CSSImageSetOptionValue(
     const CSSValue* image,
-    const CSSNumericLiteralValue* resolution,
+    const CSSPrimitiveValue* resolution,
     const CSSImageSetTypeValue* type)
     : CSSValue(kImageSetOptionClass),
       image_(image),
@@ -97,7 +97,8 @@
 }
 
 bool CSSImageSetOptionValue::IsSupported() const {
-  return (!type_ || type_->IsSupported()) && (resolution_->DoubleValue() > 0.0);
+  return (!type_ || type_->IsSupported()) &&
+         (resolution_->ComputeDotsPerPixel() > 0.0);
 }
 
 String CSSImageSetOptionValue::CustomCSSText() const {
diff --git a/third_party/blink/renderer/core/css/css_image_set_option_value.h b/third_party/blink/renderer/core/css/css_image_set_option_value.h
index 7a224390..9efa14f4 100644
--- a/third_party/blink/renderer/core/css/css_image_set_option_value.h
+++ b/third_party/blink/renderer/core/css/css_image_set_option_value.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_IMAGE_SET_OPTION_VALUE_H_
 
 #include "third_party/blink/renderer/core/css/css_image_set_type_value.h"
-#include "third_party/blink/renderer/core/css/css_numeric_literal_value.h"
+#include "third_party/blink/renderer/core/css/css_primitive_value.h"
 #include "third_party/blink/renderer/core/css/css_to_length_conversion_data.h"
 #include "third_party/blink/renderer/core/css/css_value.h"
 #include "third_party/blink/renderer/core/dom/document.h"
@@ -23,10 +23,9 @@
 // <image-set-option> = [ <image> | <string> ] [<resolution> || type(<string>)]
 class CSSImageSetOptionValue : public CSSValue {
  public:
-  explicit CSSImageSetOptionValue(
-      const CSSValue* image,
-      const CSSNumericLiteralValue* resolution = nullptr,
-      const CSSImageSetTypeValue* type = nullptr);
+  explicit CSSImageSetOptionValue(const CSSValue* image,
+                                  const CSSPrimitiveValue* resolution = nullptr,
+                                  const CSSImageSetTypeValue* type = nullptr);
 
   // It is expected that CSSImageSetOptionValue objects should always have
   // non-null image and resolution values.
@@ -59,7 +58,7 @@
 
  private:
   Member<const CSSValue> image_;
-  Member<const CSSNumericLiteralValue> resolution_;
+  Member<const CSSPrimitiveValue> resolution_;
   Member<const CSSImageSetTypeValue> type_;
 };
 
diff --git a/third_party/blink/renderer/core/css/css_math_expression_node.cc b/third_party/blink/renderer/core/css/css_math_expression_node.cc
index 0fdf2b4..24afe1d 100644
--- a/third_party/blink/renderer/core/css/css_math_expression_node.cc
+++ b/third_party/blink/renderer/core/css/css_math_expression_node.cc
@@ -125,6 +125,14 @@
     case CSSPrimitiveValue::UnitType::kHertz:
     case CSSPrimitiveValue::UnitType::kKilohertz:
       return kCalcFrequency;
+
+    // Resolution units
+    case CSSPrimitiveValue::UnitType::kDotsPerPixel:
+    case CSSPrimitiveValue::UnitType::kX:
+    case CSSPrimitiveValue::UnitType::kDotsPerInch:
+    case CSSPrimitiveValue::UnitType::kDotsPerCentimeter:
+      return kCalcResolution;
+
     default:
       return kCalcOther;
   }
@@ -225,6 +233,7 @@
     case CalculationCategory::kCalcAngle:
     case CalculationCategory::kCalcTime:
     case CalculationCategory::kCalcFrequency:
+    case CalculationCategory::kCalcResolution:
       return true;
     default:
       return false;
@@ -330,6 +339,7 @@
     case kCalcAngle:
     case kCalcTime:
     case kCalcFrequency:
+    case kCalcResolution:
       return value_->DoubleValue() *
              CSSPrimitiveValue::ConversionToCanonicalUnitsScaleFactor(
                  value_->GetType());
@@ -349,6 +359,7 @@
     case kCalcFrequency:
     case kCalcPercentLength:
     case kCalcTime:
+    case kCalcResolution:
     case kCalcOther:
       NOTREACHED();
       break;
@@ -403,25 +414,28 @@
 
 static const CalculationCategory kAddSubtractResult[kCalcOther][kCalcOther] = {
     /* CalcNumber */ {kCalcNumber, kCalcOther, kCalcOther, kCalcOther,
-                      kCalcOther, kCalcOther, kCalcOther},
+                      kCalcOther, kCalcOther, kCalcOther, kCalcOther},
     /* CalcLength */
     {kCalcOther, kCalcLength, kCalcPercentLength, kCalcPercentLength,
-     kCalcOther, kCalcOther, kCalcOther},
+     kCalcOther, kCalcOther, kCalcOther, kCalcOther},
     /* CalcPercent */
     {kCalcOther, kCalcPercentLength, kCalcPercent, kCalcPercentLength,
-     kCalcOther, kCalcOther, kCalcOther},
+     kCalcOther, kCalcOther, kCalcOther, kCalcOther},
     /* CalcPercentLength */
     {kCalcOther, kCalcPercentLength, kCalcPercentLength, kCalcPercentLength,
-     kCalcOther, kCalcOther, kCalcOther},
+     kCalcOther, kCalcOther, kCalcOther, kCalcOther},
     /* CalcAngle  */
     {kCalcOther, kCalcOther, kCalcOther, kCalcOther, kCalcAngle, kCalcOther,
-     kCalcOther},
+     kCalcOther, kCalcOther},
     /* CalcTime */
     {kCalcOther, kCalcOther, kCalcOther, kCalcOther, kCalcOther, kCalcTime,
-     kCalcOther},
+     kCalcOther, kCalcOther},
     /* CalcFrequency */
     {kCalcOther, kCalcOther, kCalcOther, kCalcOther, kCalcOther, kCalcOther,
-     kCalcFrequency}};
+     kCalcFrequency, kCalcOther},
+    /* CalcResolution */
+    {kCalcOther, kCalcOther, kCalcOther, kCalcOther, kCalcOther, kCalcOther,
+     kCalcOther, kCalcResolution}};
 
 static CalculationCategory DetermineCategory(
     const CSSMathExpressionNode& left_side,
@@ -995,7 +1009,8 @@
 static bool HasCanonicalUnit(CalculationCategory category) {
   return category == kCalcNumber || category == kCalcLength ||
          category == kCalcPercent || category == kCalcAngle ||
-         category == kCalcTime || category == kCalcFrequency;
+         category == kCalcTime || category == kCalcFrequency ||
+         category == kCalcResolution;
 }
 
 absl::optional<double> CSSMathExpressionOperation::ComputeValueInCanonicalUnit()
@@ -1190,6 +1205,7 @@
     case kCalcFrequency:
     case kCalcLength:
     case kCalcPercent:
+    case kCalcResolution:
       switch (operator_) {
         case CSSMathOperator::kMultiply:
         case CSSMathOperator::kDivide: {
diff --git a/third_party/blink/renderer/core/css/css_math_expression_node.h b/third_party/blink/renderer/core/css/css_math_expression_node.h
index afd155f..5359ff2 100644
--- a/third_party/blink/renderer/core/css/css_math_expression_node.h
+++ b/third_party/blink/renderer/core/css/css_math_expression_node.h
@@ -64,6 +64,7 @@
   kCalcAngle,
   kCalcTime,
   kCalcFrequency,
+  kCalcResolution,
   kCalcOther,
 };
 
diff --git a/third_party/blink/renderer/core/css/css_math_function_value.cc b/third_party/blink/renderer/core/css/css_math_function_value.cc
index 7d5ef4b..55d051f 100644
--- a/third_party/blink/renderer/core/css/css_math_function_value.cc
+++ b/third_party/blink/renderer/core/css/css_math_function_value.cc
@@ -86,6 +86,11 @@
   return ClampToPermittedRange(expression_->ComputeLengthPx(length_resolver));
 }
 
+double CSSMathFunctionValue::ComputeDotsPerPixel() const {
+  DCHECK_EQ(kCalcResolution, expression_->Category());
+  return ClampToPermittedRange(*expression_->ComputeValueInCanonicalUnit());
+}
+
 bool CSSMathFunctionValue::AccumulateLengthArray(CSSLengthArray& length_array,
                                                  double multiplier) const {
   return expression_->AccumulateLengthArray(length_array, multiplier);
diff --git a/third_party/blink/renderer/core/css/css_math_function_value.h b/third_party/blink/renderer/core/css/css_math_function_value.h
index 550c090..18d43d2e 100644
--- a/third_party/blink/renderer/core/css/css_math_function_value.h
+++ b/third_party/blink/renderer/core/css/css_math_function_value.h
@@ -31,11 +31,13 @@
   bool MayHaveRelativeUnit() const;
 
   CalculationCategory Category() const { return expression_->Category(); }
+
   bool IsAngle() const { return Category() == kCalcAngle; }
   bool IsLength() const { return Category() == kCalcLength; }
   bool IsNumber() const { return Category() == kCalcNumber; }
   bool IsPercentage() const { return Category() == kCalcPercent; }
   bool IsTime() const { return Category() == kCalcTime; }
+  bool IsResolution() const { return Category() == kCalcResolution; }
 
   bool IsPx() const;
 
@@ -65,7 +67,7 @@
 
   // TODO(crbug.com/979895): The semantics of this function is still not very
   // clear. Do not add new callers before further refactoring and cleanups.
-  // |DoubleValue()| can be called only when the the math expression can be
+  // |DoubleValue()| can be called only when the math expression can be
   // resolved into a single numeric value *without any type conversion* (e.g.,
   // between px and em). Otherwise, it hits a DCHECK.
   double DoubleValue() const;
@@ -73,6 +75,7 @@
   double ComputeSeconds() const;
   double ComputeDegrees() const;
   double ComputeLengthPx(const CSSLengthResolver&) const;
+  double ComputeDotsPerPixel() const;
 
   bool AccumulateLengthArray(CSSLengthArray& length_array,
                              double multiplier) const;
diff --git a/third_party/blink/renderer/core/css/css_primitive_value.cc b/third_party/blink/renderer/core/css/css_primitive_value.cc
index b2a80ed0..cac61f63 100644
--- a/third_party/blink/renderer/core/css/css_primitive_value.cc
+++ b/third_party/blink/renderer/core/css/css_primitive_value.cc
@@ -130,11 +130,10 @@
 }
 
 bool CSSPrimitiveValue::IsResolution() const {
-  // TODO(crbug.com/983613): Either support math functions on resolutions; or
-  // provide a justification for not supporting it, and move this function to
-  // |CSSNumericLiteralValue|.
-  return IsNumericLiteralValue() &&
-         To<CSSNumericLiteralValue>(this)->IsResolution();
+  return (IsNumericLiteralValue() &&
+          To<CSSNumericLiteralValue>(this)->IsResolution()) ||
+         (IsMathFunctionValue() &&
+          To<CSSMathFunctionValue>(this)->IsResolution());
 }
 
 bool CSSPrimitiveValue::IsFlex() const {
@@ -265,9 +264,12 @@
 }
 
 double CSSPrimitiveValue::ComputeDotsPerPixel() const {
-  // TODO(crbug.com/983613): Either support math functions on resolutions; or
-  // provide a justification for not supporting it.
-  DCHECK(IsNumericLiteralValue());
+  DCHECK(IsResolution());
+
+  if (IsCalculated()) {
+    return To<CSSMathFunctionValue>(this)->ComputeDotsPerPixel();
+  }
+
   return To<CSSNumericLiteralValue>(this)->ComputeDotsPerPixel();
 }
 
diff --git a/third_party/blink/renderer/core/css/css_syntax_definition.cc b/third_party/blink/renderer/core/css/css_syntax_definition.cc
index 0e29a45..626ef4d 100644
--- a/third_party/blink/renderer/core/css/css_syntax_definition.cc
+++ b/third_party/blink/renderer/core/css/css_syntax_definition.cc
@@ -87,7 +87,7 @@
       return css_parsing_utils::ConsumeTime(
           range, context, CSSPrimitiveValue::ValueRange::kAll);
     case CSSSyntaxType::kResolution:
-      return css_parsing_utils::ConsumeResolution(range);
+      return css_parsing_utils::ConsumeResolution(range, context);
     case CSSSyntaxType::kTransformFunction:
       return css_parsing_utils::ConsumeTransformValue(range, context);
     case CSSSyntaxType::kTransformList:
diff --git a/third_party/blink/renderer/core/css/media_query_evaluator.cc b/third_party/blink/renderer/core/css/media_query_evaluator.cc
index f16f4264..6ebad1b 100644
--- a/third_party/blink/renderer/core/css/media_query_evaluator.cc
+++ b/third_party/blink/renderer/core/css/media_query_evaluator.cc
@@ -574,15 +574,12 @@
     return !!actual_resolution;
   }
 
-  if (!value.IsNumeric()) {
-    return false;
-  }
-
-  if (value.Unit() == CSSPrimitiveValue::UnitType::kNumber) {
+  if (value.IsNumeric() &&
+      value.Unit() == CSSPrimitiveValue::UnitType::kNumber) {
     return CompareValue(actual_resolution, ClampTo<float>(value.Value()), op);
   }
 
-  if (!CSSPrimitiveValue::IsResolution(value.Unit())) {
+  if (!value.IsResolution()) {
     return false;
   }
 
@@ -619,7 +616,7 @@
 static bool ResolutionMediaFeatureEval(const MediaQueryExpValue& value,
                                        MediaQueryOperator op,
                                        const MediaValues& media_values) {
-  return (!value.IsValid() || CSSPrimitiveValue::IsResolution(value.Unit())) &&
+  return (!value.IsValid() || value.IsResolution()) &&
          EvalResolution(value, op, media_values);
 }
 
diff --git a/third_party/blink/renderer/core/css/media_query_evaluator_test.cc b/third_party/blink/renderer/core/css/media_query_evaluator_test.cc
index 6964d4d..e0833173 100644
--- a/third_party/blink/renderer/core/css/media_query_evaluator_test.cc
+++ b/third_party/blink/renderer/core/css/media_query_evaluator_test.cc
@@ -69,6 +69,20 @@
     {"all and (grid: 0)", true},
     {"(resolution: 2dppx)", true},
     {"(resolution: 1dppx)", false},
+    {"(resolution: calc(2x))", true},
+    {"(resolution: calc(1x))", false},
+    {"(resolution: calc(1x + 1x))", true},
+    {"(resolution: calc(1x + 0x))", false},
+    {"(resolution: calc(1x + 96dpi))", true},
+    {"(resolution: calc(0x + 37.79532dpcm))", false},
+    {"(resolution: calc(3x - 1x))", true},
+    {"(resolution: calc(3x - 2x))", false},
+    {"(resolution: calc(3x - 96dpi))", true},
+    {"(resolution: calc(2x - 37.79532dpcm))", false},
+    {"(resolution: calc(1x * 2))", true},
+    {"(resolution: calc(0.5x * 2))", false},
+    {"(resolution: calc(4x / 2))", true},
+    {"(resolution: calc(2x / 2))", false},
     {"(orientation: portrait)", true},
     {"(orientation: landscape)", false},
     {"(orientation: url(portrait))", false},
@@ -183,6 +197,7 @@
 
 MediaQueryEvaluatorTestCase g_print_test_cases[] = {
     {"print and (min-resolution: 1dppx)", true},
+    {"print and (min-resolution: calc(100dpi - 4dpi))", true},
     {"print and (min-resolution: 118dpcm)", true},
     {"print and (min-resolution: 119dpcm)", false},
     {nullptr, false}  // Do not remove the terminator line.
diff --git a/third_party/blink/renderer/core/css/media_query_exp.cc b/third_party/blink/renderer/core/css/media_query_exp.cc
index 6ac3f6a..6d55a94 100644
--- a/third_party/blink/renderer/core/css/media_query_exp.cc
+++ b/third_party/blink/renderer/core/css/media_query_exp.cc
@@ -31,7 +31,6 @@
 
 #include "third_party/blink/renderer/core/css/css_custom_property_declaration.h"
 #include "third_party/blink/renderer/core/css/css_math_expression_node.h"
-#include "third_party/blink/renderer/core/css/css_math_function_value.h"
 #include "third_party/blink/renderer/core/css/css_numeric_literal_value.h"
 #include "third_party/blink/renderer/core/css/css_primitive_value.h"
 #include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
@@ -386,7 +385,7 @@
         range, context, CSSPrimitiveValue::ValueRange::kAll);
   }
   if (!value) {
-    value = css_parsing_utils::ConsumeResolution(range);
+    value = css_parsing_utils::ConsumeResolution(range, context);
   }
 
   if (!value) {
@@ -422,8 +421,12 @@
   }
 
   if (FeatureWithValidDensity(media_feature, value)) {
-    // TODO(crbug.com/983613): Support resolution in math functions.
-    DCHECK(value->IsNumericLiteralValue());
+    DCHECK(value->IsResolution());
+
+    if (const auto* math_function = DynamicTo<CSSMathFunctionValue>(value)) {
+      return MediaQueryExpValue(*math_function);
+    }
+
     const auto* numeric_literal = To<CSSNumericLiteralValue>(value);
     return MediaQueryExpValue(numeric_literal->DoubleValue(),
                               numeric_literal->GetType());
diff --git a/third_party/blink/renderer/core/css/media_query_exp.h b/third_party/blink/renderer/core/css/media_query_exp.h
index 1d82376c..92f3281 100644
--- a/third_party/blink/renderer/core/css/media_query_exp.h
+++ b/third_party/blink/renderer/core/css/media_query_exp.h
@@ -31,6 +31,7 @@
 
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/renderer/core/core_export.h"
+#include "third_party/blink/renderer/core/css/css_math_function_value.h"
 #include "third_party/blink/renderer/core/css/css_primitive_value.h"
 #include "third_party/blink/renderer/core/css/css_value.h"
 #include "third_party/blink/renderer/core/css/media_feature_names.h"
@@ -66,6 +67,20 @@
   bool IsNumeric() const { return type_ == Type::kNumeric; }
   bool IsRatio() const { return type_ == Type::kRatio; }
   bool IsCSSValue() const { return type_ == Type::kCSSValue; }
+  bool IsResolution() const {
+    switch (type_) {
+      case Type::kNumeric:
+        return CSSPrimitiveValue::IsResolution(Unit());
+      case Type::kCSSValue:
+        if (const auto* math_function =
+                DynamicTo<CSSMathFunctionValue>(css_value_.Get())) {
+          return math_function->IsResolution();
+        }
+        return false;
+      default:
+        return false;
+    }
+  }
 
   CSSValueID Id() const {
     DCHECK(IsId());
@@ -73,11 +88,25 @@
   }
 
   double Value() const {
+    if (const auto* math_function =
+            DynamicTo<CSSMathFunctionValue>(css_value_.Get())) {
+      if (math_function->IsResolution()) {
+        return math_function->ComputeDotsPerPixel();
+      }
+    }
+
     DCHECK(IsNumeric());
     return numeric_.value;
   }
 
   CSSPrimitiveValue::UnitType Unit() const {
+    if (const auto* math_function =
+            DynamicTo<CSSMathFunctionValue>(css_value_.Get())) {
+      if (math_function->IsResolution()) {
+        return CSSPrimitiveValue::UnitType::kDotsPerPixel;
+      }
+    }
+
     DCHECK(IsNumeric());
     return numeric_.unit;
   }
diff --git a/third_party/blink/renderer/core/css/media_query_exp_test.cc b/third_party/blink/renderer/core/css/media_query_exp_test.cc
index aa275c7..72aa115 100644
--- a/third_party/blink/renderer/core/css/media_query_exp_test.cc
+++ b/third_party/blink/renderer/core/css/media_query_exp_test.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "third_party/blink/renderer/core/css/media_query_exp.h"
+#include "third_party/blink/renderer/core/css/css_numeric_literal_value.h"
 #include "third_party/blink/renderer/core/css/css_test_helpers.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/testing/null_execution_context.h"
@@ -62,6 +63,30 @@
   return MediaQueryExpValue(value);
 }
 
+MediaQueryExpValue DppxValue(double value) {
+  return MediaQueryExpValue(value, CSSPrimitiveValue::UnitType::kDotsPerPixel);
+}
+
+MediaQueryExpValue CalcValue(const String& syntax, const String& value) {
+  ScopedNullExecutionContext execution_context;
+  const auto* calc_value =
+      DynamicTo<CSSPrimitiveValue>(css_test_helpers::ParseValue(
+          *Document::CreateForTest(execution_context.GetExecutionContext()),
+          syntax, value));
+  EXPECT_NE(calc_value, nullptr);
+
+  return CssValue(*calc_value);
+}
+
+MediaQueryExpValue NumericLiteralValue(double value,
+                                       CSSPrimitiveValue::UnitType unit) {
+  auto* num_lit_val =
+      DynamicTo<CSSPrimitiveValue>(CSSNumericLiteralValue::Create(value, unit));
+  EXPECT_NE(num_lit_val, nullptr);
+
+  return CssValue(*num_lit_val);
+}
+
 MediaQueryExpValue InvalidValue() {
   return MediaQueryExpValue();
 }
@@ -431,4 +456,16 @@
   EXPECT_FALSE(MediaQueryExpNode::Or(nullptr, nullptr));
 }
 
+TEST(MediaQueryExpTest, ResolutionChecks) {
+  EXPECT_TRUE(DppxValue(3).IsResolution());
+  EXPECT_TRUE(CalcValue("<resolution>", "calc(96dpi)").IsResolution());
+
+  EXPECT_FALSE(InvalidValue().IsResolution());
+  EXPECT_FALSE(PxValue(10).IsResolution());
+  EXPECT_FALSE(RatioValue(3, 5).IsResolution());
+  EXPECT_FALSE(CalcValue("<length>", "calc(13px)").IsResolution());
+  EXPECT_FALSE(NumericLiteralValue(3, CSSPrimitiveValue::UnitType::kPixels)
+                   .IsResolution());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/media_query_set_test.cc b/third_party/blink/renderer/core/css/media_query_set_test.cc
index bcedcd8d..39403d1 100644
--- a/third_party/blink/renderer/core/css/media_query_set_test.cc
+++ b/third_party/blink/renderer/core/css/media_query_set_test.cc
@@ -107,6 +107,13 @@
       {"(resolution: 0.83333333333333333333dppx)",
        "(resolution: 0.833333333333333dppx)"},
       {"(resolution: 2.4dppx)", nullptr},
+      {"(resolution: calc(1dppx))", "(resolution: calc(1dppx))"},
+      {"(resolution: calc(1x))", "(resolution: calc(1dppx))"},
+      {"(resolution: calc(96dpi))", "(resolution: calc(1dppx))"},
+      {"(resolution: calc(1x + 2x))", "(resolution: calc(3dppx))"},
+      {"(resolution: calc(3x - 2x))", "(resolution: calc(1dppx))"},
+      {"(resolution: calc(1x * 3))", "(resolution: calc(3dppx))"},
+      {"(resolution: calc(6x / 2))", "(resolution: calc(3dppx))"},
       {"all and(color)", "not all"},
       {"all and (", "not all"},
       {"test;,all", "not all, all"},
diff --git a/third_party/blink/renderer/core/css/parser/css_parser.cc b/third_party/blink/renderer/core/css/parser/css_parser.cc
index b4662a90..1e6614f 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser.cc
@@ -366,7 +366,8 @@
 
 CSSPrimitiveValue* CSSParser::ParseLengthPercentage(
     const String& string,
-    const CSSParserContext* context) {
+    const CSSParserContext* context,
+    CSSPrimitiveValue::ValueRange value_range) {
   if (string.empty() || !context) {
     return nullptr;
   }
@@ -376,8 +377,8 @@
   // Trim whitespace from the string. It's only necessary to consume leading
   // whitespaces, since ConsumeLengthOrPercent always consumes trailing ones.
   range.ConsumeWhitespace();
-  CSSPrimitiveValue* parsed_value = css_parsing_utils::ConsumeLengthOrPercent(
-      range, *context, CSSPrimitiveValue::ValueRange::kAll);
+  CSSPrimitiveValue* parsed_value =
+      css_parsing_utils::ConsumeLengthOrPercent(range, *context, value_range);
   return range.AtEnd() ? parsed_value : nullptr;
 }
 
diff --git a/third_party/blink/renderer/core/css/parser/css_parser.h b/third_party/blink/renderer/core/css/parser/css_parser.h
index a26f097..495af1c7 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser.h
+++ b/third_party/blink/renderer/core/css/parser/css_parser.h
@@ -129,8 +129,10 @@
                                                const String&,
                                                CSSParserObserver&);
 
-  static CSSPrimitiveValue* ParseLengthPercentage(const String&,
-                                                  const CSSParserContext*);
+  static CSSPrimitiveValue* ParseLengthPercentage(
+      const String&,
+      const CSSParserContext*,
+      CSSPrimitiveValue::ValueRange);
 
   // https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-font
   // https://drafts.csswg.org/css-font-loading/#find-the-matching-font-faces
diff --git a/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc b/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc
index ca032fc..18dfa364 100644
--- a/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc
+++ b/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc
@@ -720,6 +720,101 @@
   TestImageSetParsing("image-set(url(foo) -1x)", "image-set(url(\"foo\") -1x)");
 }
 
+TEST(CSSPropertyParserTest, ImageSetCalcResolutionUnitX) {
+  TestImageSetParsing("image-set(url(foo) calc(1x))",
+                      "image-set(url(\"foo\") calc(1dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetAddCalcResolutionUnitX) {
+  TestImageSetParsing("image-set(url(foo) calc(2x + 3x))",
+                      "image-set(url(\"foo\") calc(5dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetSubCalcResolutionUnitX) {
+  TestImageSetParsing("image-set(url(foo) calc(2x - 1x))",
+                      "image-set(url(\"foo\") calc(1dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetMultCalcResolutionUnitX) {
+  TestImageSetParsing("image-set(url(foo) calc(2x * 3))",
+                      "image-set(url(\"foo\") calc(6dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetDivCalcResolutionUnitX) {
+  TestImageSetParsing("image-set(url(foo) calc(6x / 3))",
+                      "image-set(url(\"foo\") calc(2dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetAddCalcResolutionUnitDpiWithX) {
+  TestImageSetParsing("image-set(url(foo) calc(96dpi + 2x))",
+                      "image-set(url(\"foo\") calc(3dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetAddCalcResolutionUnitDpiWithDpi) {
+  TestImageSetParsing("image-set(url(foo) calc(96dpi + 96dpi))",
+                      "image-set(url(\"foo\") calc(2dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetSubCalcResolutionUnitDpiFromX) {
+  TestImageSetParsing("image-set(url(foo) calc(2x - 96dpi))",
+                      "image-set(url(\"foo\") calc(1dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetCalcResolutionUnitDppx) {
+  TestImageSetParsing("image-set(url(foo) calc(2dppx * 3))",
+                      "image-set(url(\"foo\") calc(6dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetCalcResolutionUnitDpi) {
+  TestImageSetParsing("image-set(url(foo) calc(32dpi * 3))",
+                      "image-set(url(\"foo\") calc(1dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetCalcResolutionUnitDpcm) {
+  TestImageSetParsing("image-set(url(foo) calc(1dpcm * 37.79532))",
+                      "image-set(url(\"foo\") calc(1dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetCalcMaxInf) {
+  TestImageSetParsing("image-set(url(foo) calc(1 * max(INFinity * 3x, 0dpcm)))",
+                      "image-set(url(\"foo\") calc(infinity * 1dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetCalcMinInf) {
+  TestImageSetParsing("image-set(url(foo) calc(1 * min(inFInity * 4x, 0dpi)))",
+                      "image-set(url(\"foo\") calc(0dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetCalcMinMaxNan) {
+  TestImageSetParsing("image-set(url(foo) calc(1dppx * max(0, min(10, NaN))))",
+                      "image-set(url(\"foo\") calc(NaN * 1dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetCalcClamp) {
+  TestImageSetParsing(
+      "image-set(url(foo) calc(1dppx * clamp(-Infinity, 0, infinity)))",
+      "image-set(url(\"foo\") calc(0dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetCalcClampLeft) {
+  TestImageSetParsing(
+      "image-set(url(foo) calc(1dppx * clamp(0, -Infinity, infinity)))",
+      "image-set(url(\"foo\") calc(0dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetCalcClampRight) {
+  TestImageSetParsing(
+      "image-set(url(foo) calc(1dppx * clamp(-Infinity, infinity, 0)))",
+      "image-set(url(\"foo\") calc(0dppx))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetCalcClampNan) {
+  TestImageSetParsing(
+      "image-set(url(foo) calc(1 * clamp(-INFINITY*0dppx, 0dppx, "
+      "infiniTY*0dppx)))",
+      "image-set(url(\"foo\") calc(NaN * 1dppx))");
+}
+
 TEST(CSSPropertyParserTest, ImageSetUrlFunction) {
   TestImageSetParsing("image-set(url('foo') 1x)", "image-set(url(\"foo\") 1x)");
 }
@@ -794,6 +889,30 @@
   TestImageSetParsingFailure("image-set(linear-gradient(red) 1x)");
 }
 
+TEST(CSSPropertyParserTest, ImageSetAddCalcMissingUnit1) {
+  TestImageSetParsingFailure("image-set(url(foo) calc(2 + 3x))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetAddCalcMissingUnit2) {
+  TestImageSetParsingFailure("image-set(url(foo) calc(2x + 3))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetSubCalcMissingUnit1) {
+  TestImageSetParsingFailure("image-set(url(foo) calc(2 - 1x))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetSubCalcMissingUnit2) {
+  TestImageSetParsingFailure("image-set(url(foo) calc(2x - 1))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetMultCalcDoubleX) {
+  TestImageSetParsingFailure("image-set(url(foo) calc(2x * 3x))");
+}
+
+TEST(CSSPropertyParserTest, ImageSetDivCalcDoubleX) {
+  TestImageSetParsingFailure("image-set(url(foo) calc(6x / 3x))");
+}
+
 TEST(CSSPropertyParserTest, InternalLightDarkAuthor) {
   auto* context = MakeGarbageCollected<CSSParserContext>(
       kHTMLStandardMode, SecureContextMode::kInsecureContext);
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
index 6562165..05286ee 100644
--- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
+++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -1470,21 +1470,27 @@
   return nullptr;
 }
 
-CSSNumericLiteralValue* ConsumeResolution(CSSParserTokenRange& range) {
-  const CSSParserToken& token = range.Peek();
+CSSPrimitiveValue* ConsumeResolution(CSSParserTokenRange& range,
+                                     const CSSParserContext& context) {
+  if (const CSSParserToken& token = range.Peek();
+      token.GetType() == kDimensionToken) {
+    CSSPrimitiveValue::UnitType unit = token.GetUnitType();
+    if (!CSSPrimitiveValue::IsResolution(unit)) {
+      return nullptr;
+    }
 
-  // Unlike the other types, calc() does not work with <resolution>.
-  if (token.GetType() != kDimensionToken) {
-    return nullptr;
+    return CSSNumericLiteralValue::Create(
+        range.ConsumeIncludingWhitespace().NumericValue(), unit);
   }
 
-  CSSPrimitiveValue::UnitType unit = token.GetUnitType();
-  if (!CSSPrimitiveValue::IsResolution(unit)) {
-    return nullptr;
+  MathFunctionParser math_parser(range, context,
+                                 CSSPrimitiveValue::ValueRange::kAll);
+  const CSSMathFunctionValue* math_value = math_parser.Value();
+  if (math_value && math_value->IsResolution()) {
+    return math_parser.ConsumeValue();
   }
 
-  return CSSNumericLiteralValue::Create(
-      range.ConsumeIncludingWhitespace().NumericValue(), unit);
+  return nullptr;
 }
 
 // https://drafts.csswg.org/css-values-4/#ratio-value
@@ -3534,21 +3540,14 @@
   // Type could appear before or after resolution
   CSSImageSetTypeValue* type = ConsumeImageSetType(range, context);
 
-  CSSNumericLiteralValue* resolution = nullptr;
-  if (range.Peek().GetType() == kDimensionToken ||
-      !RuntimeEnabledFeatures::CSSImageSetEnabled()) {
-    if (range.Peek().GetUnitType() != CSSPrimitiveValue::UnitType::kX &&
-        !RuntimeEnabledFeatures::CSSImageSetEnabled()) {
-      return nullptr;
-    }
-
-    resolution = ConsumeResolution(range);
-    if (!resolution || (resolution->GetDoubleValue() <= 0.0 &&
-                        !RuntimeEnabledFeatures::CSSImageSetEnabled())) {
-      return nullptr;
-    }
+  if (!RuntimeEnabledFeatures::CSSImageSetEnabled() &&
+      range.Peek().GetType() != kDimensionToken &&
+      range.Peek().GetUnitType() != CSSPrimitiveValue::UnitType::kX) {
+    return nullptr;
   }
 
+  CSSPrimitiveValue* resolution = ConsumeResolution(range, context);
+
   if (!type) {
     type = ConsumeImageSetType(range, context);
   }
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.h b/third_party/blink/renderer/core/css/properties/css_parsing_utils.h
index 4f8b074..9d47aa5c 100644
--- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.h
+++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.h
@@ -142,7 +142,8 @@
 CSSPrimitiveValue* ConsumeTime(CSSParserTokenRange&,
                                const CSSParserContext&,
                                CSSPrimitiveValue::ValueRange);
-CSSNumericLiteralValue* ConsumeResolution(CSSParserTokenRange&);
+CSSPrimitiveValue* ConsumeResolution(CSSParserTokenRange&,
+                                     const CSSParserContext&);
 CSSValue* ConsumeRatio(CSSParserTokenRange&, const CSSParserContext&);
 CSSIdentifierValue* ConsumeIdent(CSSParserTokenRange&);
 CSSIdentifierValue* ConsumeIdentRange(CSSParserTokenRange&,
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 9f6212d..f613bfd 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -719,7 +719,7 @@
       context_features_(ContextFeatures::DefaultSwitch()),
       http_refresh_scheduler_(MakeGarbageCollected<HttpRefreshScheduler>(this)),
       well_formed_(false),
-      fallback_base_url_for_srcdoc_(initializer.FallbackSrcdocBaseURL()),
+      fallback_base_url_(initializer.FallbackBaseURL()),
       cookie_url_(dom_window_ ? initializer.GetCookieUrl()
                               : KURL(g_empty_string)),
       printing_(kNotPrinting),
@@ -3291,7 +3291,7 @@
   // for this document with the entered window's url.
   if (dom_window_ && entered_window) {
     KURL new_url = entered_window->Url();
-    if (new_url.IsAboutSrcdocURL() &&
+    if ((new_url.IsAboutSrcdocURL() || new_url.IsAboutBlankURL()) &&
         blink::features::IsNewBaseUrlInheritanceBehaviorEnabled()) {
       // When updating the URL to about:srcdoc due to a document.open() call,
       // the opened document should also end up with the same base URL as the
@@ -3299,7 +3299,7 @@
       // so that SetURL() below will take it into account.
       // TODO(https://crbug.com/751329): about:blank should also be handled
       // here once it supports the new base url inheritance behavior.
-      fallback_base_url_for_srcdoc_ = entered_window->BaseURL();
+      fallback_base_url_ = entered_window->BaseURL();
       is_srcdoc_document_ = new_url.IsAboutSrcdocURL();
     }
     // Clear the hash fragment from the inherited URL to prevent a
@@ -4351,14 +4351,19 @@
   const Document* same_origin_parent =
       is_parent_cross_origin ? nullptr : ParentDocument();
 
+  // TODO(https://github.com/whatwg/html/issues/9025): Don't let a sandboxed
+  // iframe (without 'allow-same-origin') inherit a fallback base url.
+  // https://chromium-review.googlesource.com/c/chromium/src/+/4324738
+
   // [spec] 1. If document is an iframe srcdoc document, then return the
   //           document base URL of document's browsing context's container
   //           document.
   if (IsSrcdocDocument()) {
     // Return the base_url value that was sent from the initiator along with the
     // srcdoc attribute's value.
-    if (fallback_base_url_for_srcdoc_.IsValid())
-      return fallback_base_url_for_srcdoc_;
+    if (fallback_base_url_.IsValid()) {
+      return fallback_base_url_;
+    }
     // We only use the parent document's base URL in legacy behavior. There are
     // cases where fallback_base_url_for_srcdoc_ may not be set in the new base
     // URL inheritance mode (e.g., browser-initiated navigations as in
@@ -4385,7 +4390,18 @@
       return execution_context_->BaseURL();
     }
 
-    if (same_origin_parent) {
+    if (!fallback_base_url_.IsEmpty() &&
+        blink::features::IsNewBaseUrlInheritanceBehaviorEnabled()) {
+      // Note: if we get here, it's not worth worrying if
+      // same_origin_parent->BaseURL() exists and matches fallback_base_url_,
+      // since if the latter exists it's based on the initiator, which won't
+      // always be the parent.
+      return fallback_base_url_;
+    }
+
+    if (same_origin_parent &&
+        !blink::features::IsNewBaseUrlInheritanceBehaviorEnabled()) {
+      // Only allow access to the parent in legacy mode.
       return same_origin_parent->BaseURL();
     }
   }
@@ -4820,10 +4836,13 @@
 }
 
 Document* Document::CloneDocumentWithoutChildren() const {
-  DocumentInit init = DocumentInit::Create()
-                          .WithExecutionContext(execution_context_.Get())
-                          .WithAgent(GetAgent())
-                          .WithURL(Url());
+  DocumentInit init =
+      DocumentInit::Create()
+          .WithExecutionContext(execution_context_.Get())
+          .WithAgent(GetAgent())
+          .WithURL(Url())
+          .WithFallbackBaseURL(Url().IsAboutBlankURL() ? fallback_base_url_
+                                                       : KURL());
   if (IsA<XMLDocument>(this)) {
     if (IsXHTMLDocument())
       return XMLDocument::CreateXHTML(init);
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index add70f5..56404a8a 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -2243,12 +2243,12 @@
   KURL base_url_override_;  // An alternative base URL that takes precedence
                             // over base_url_ (but not base_element_url_).
 
-  // Used in FallbackBaseURL() to provide the base URL for srcdoc documents,
-  // which is the initiator's base URL at the time the navigation was initiated.
-  // Separate from the base_url_* fields because the fallback base URL should
-  // not take precedence over things like <base>.
-  // Note: this currently is only used when IsolateSandboxedIframes is enabled.
-  KURL fallback_base_url_for_srcdoc_;
+  // Used in FallbackBaseURL() to provide the base URL for  about:srcdoc  and
+  // about:blank documents, which is the initiator's base URL at the time the
+  // navigation was initiated. Separate from the base_url_* fields because the
+  // fallback base URL should not take precedence over things like <base>. Note:
+  // this currently is only used when NewBaseUrlInheritanceBehavior is enabled.
+  KURL fallback_base_url_;
 
   KURL base_element_url_;   // The URL set by the <base> element.
   KURL cookie_url_;         // The URL to use for cookie access.
diff --git a/third_party/blink/renderer/core/dom/document_init.cc b/third_party/blink/renderer/core/dom/document_init.cc
index 41018abb..965b3313 100644
--- a/third_party/blink/renderer/core/dom/document_init.cc
+++ b/third_party/blink/renderer/core/dom/document_init.cc
@@ -87,11 +87,16 @@
   return window_ && !window_->GetFrame()->IsMainFrame() && is_srcdoc_document_;
 }
 
-const KURL& DocumentInit::FallbackSrcdocBaseURL() const {
-  // The following DCHECK will need to change when we also use the fallback base
-  // url for about:blank. https://crbug.com/1356658.
-  DCHECK(IsSrcdocDocument() || fallback_srcdoc_base_url_.IsEmpty());
-  return fallback_srcdoc_base_url_;
+bool DocumentInit::IsAboutBlankDocument() const {
+  return window_ && url_.IsAboutBlankURL();
+}
+
+const KURL& DocumentInit::FallbackBaseURL() const {
+  DCHECK(IsSrcdocDocument() || IsAboutBlankDocument() ||
+         IsInitialEmptyDocument() || is_for_javascript_url_ ||
+         fallback_base_url_.IsEmpty())
+      << " url = " << url_ << ", fallback_base_url = " << fallback_base_url_;
+  return fallback_base_url_;
 }
 
 DocumentInit& DocumentInit::WithWindow(LocalDOMWindow* window,
@@ -271,9 +276,13 @@
   return *this;
 }
 
-DocumentInit& DocumentInit::WithFallbackSrcdocBaseURL(
-    const KURL& fallback_srcdoc_base_url) {
-  fallback_srcdoc_base_url_ = fallback_srcdoc_base_url;
+DocumentInit& DocumentInit::WithFallbackBaseURL(const KURL& fallback_base_url) {
+  fallback_base_url_ = fallback_base_url;
+  return *this;
+}
+
+DocumentInit& DocumentInit::WithJavascriptURL(bool is_for_javascript_url) {
+  is_for_javascript_url_ = is_for_javascript_url;
   return *this;
 }
 
diff --git a/third_party/blink/renderer/core/dom/document_init.h b/third_party/blink/renderer/core/dom/document_init.h
index 2d63f79..fb5cfbf 100644
--- a/third_party/blink/renderer/core/dom/document_init.h
+++ b/third_party/blink/renderer/core/dom/document_init.h
@@ -97,7 +97,8 @@
   Document* CreateDocument() const;
 
   bool IsSrcdocDocument() const;
-  const KURL& FallbackSrcdocBaseURL() const;
+  bool IsAboutBlankDocument() const;
+  const KURL& FallbackBaseURL() const;
   bool ShouldSetURL() const;
 
   DocumentInit& WithWindow(LocalDOMWindow*, Document* owner_document);
@@ -139,7 +140,8 @@
   const KURL& GetCookieUrl() const;
 
   DocumentInit& WithSrcdocDocument(bool is_srcdoc_document);
-  DocumentInit& WithFallbackSrcdocBaseURL(const KURL& fallback_srcdoc_base_url);
+  DocumentInit& WithFallbackBaseURL(const KURL& fallback_base_url);
+  DocumentInit& WithJavascriptURL(bool is_for_javascript_url);
 
   DocumentInit& WithUkmSourceId(ukm::SourceId ukm_source_id);
   ukm::SourceId UkmSourceId() const { return ukm_source_id_; }
@@ -166,7 +168,9 @@
   // affects security checks, since srcdoc's content comes directly from
   // the parent document, not from loading a URL.
   bool is_srcdoc_document_ = false;
-  KURL fallback_srcdoc_base_url_;
+  KURL fallback_base_url_;
+  // True when the commit reason for this DocumentInit was a javascript: url.
+  bool is_for_javascript_url_ = false;
 
   // Source id to set on the Document to be created.
   ukm::SourceId ukm_source_id_ = ukm::kInvalidSourceId;
diff --git a/third_party/blink/renderer/core/editing/serializers/serialization.cc b/third_party/blink/renderer/core/editing/serializers/serialization.cc
index d0e1ce53..ad760c78 100644
--- a/third_party/blink/renderer/core/editing/serializers/serialization.cc
+++ b/third_party/blink/renderer/core/editing/serializers/serialization.cc
@@ -897,7 +897,8 @@
   frame->SetView(frame_view);
   // TODO(https://crbug.com/1355751) Initialize `storage_key`.
   frame->Init(/*opener=*/nullptr, DocumentToken(), /*policy_container=*/nullptr,
-              StorageKey(), /*document_ukm_source_id=*/ukm::kInvalidSourceId);
+              StorageKey(), /*document_ukm_source_id=*/ukm::kInvalidSourceId,
+              /*creator_base_url=*/KURL());
 
   Document* document = frame->GetDocument();
   DCHECK(document);
diff --git a/third_party/blink/renderer/core/exported/web_navigation_params.cc b/third_party/blink/renderer/core/exported/web_navigation_params.cc
index 3d2eaec..47912c99 100644
--- a/third_party/blink/renderer/core/exported/web_navigation_params.cc
+++ b/third_party/blink/renderer/core/exported/web_navigation_params.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/public/web/web_navigation_params.h"
 
+#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h"
 #include "third_party/blink/renderer/platform/loader/static_data_navigation_body_loader.h"
 #include "third_party/blink/renderer/platform/network/encoded_form_data.h"
@@ -37,6 +38,9 @@
   result->http_content_type =
       info.url_request.HttpHeaderField(http_names::kContentType);
   result->requestor_origin = info.url_request.RequestorOrigin();
+  if (features::IsNewBaseUrlInheritanceBehaviorEnabled()) {
+    result->fallback_base_url = info.requestor_base_url;
+  }
   result->frame_load_type = info.frame_load_type;
   result->is_client_redirect = info.is_client_redirect;
   result->navigation_timings.input_start = info.input_start;
diff --git a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
index 21e0f38..529a51f 100644
--- a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
@@ -405,7 +405,8 @@
 
   // TODO(https://crbug.com/1355751) Initialize `storage_key`.
   frame->Init(/*opener=*/nullptr, DocumentToken(), /*policy_container=*/nullptr,
-              StorageKey(), /*document_ukm_source_id=*/ukm::kInvalidSourceId);
+              StorageKey(), /*document_ukm_source_id=*/ukm::kInvalidSourceId,
+              /*creator_base_url=*/KURL());
   frame->View()->SetParentVisible(true);
   frame->View()->SetSelfVisible(true);
 
diff --git a/third_party/blink/renderer/core/exported/web_view_test.cc b/third_party/blink/renderer/core/exported/web_view_test.cc
index 749ae75..d7ddb33 100644
--- a/third_party/blink/renderer/core/exported/web_view_test.cc
+++ b/third_party/blink/renderer/core/exported/web_view_test.cc
@@ -3892,7 +3892,8 @@
       const SessionStorageNamespaceId&,
       bool& consumed_user_gesture,
       const absl::optional<Impression>&,
-      const absl::optional<WebPictureInPictureWindowOptions>&) override {
+      const absl::optional<WebPictureInPictureWindowOptions>&,
+      const WebURL&) override {
     return web_view_helper_.InitializeWithOpener(Frame());
   }
   WebView* CreatedWebView() const { return web_view_helper_.GetWebView(); }
@@ -3989,7 +3990,8 @@
       const SessionStorageNamespaceId&,
       bool& consumed_user_gesture,
       const absl::optional<Impression>&,
-      const absl::optional<WebPictureInPictureWindowOptions>&) override {
+      const absl::optional<WebPictureInPictureWindowOptions>&,
+      const WebURL&) override {
     return web_view_;
   }
 
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.cc b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
index 341d3b9..ec601fe 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -838,7 +838,7 @@
 
   KURL url = info->url_request.Url();
   if (url.IsAboutSrcdocURL()) {
-    params->fallback_srcdoc_base_url = info->requestor_base_url;
+    params->fallback_base_url = info->requestor_base_url;
     TestWebFrameHelper::FillStaticResponseForSrcdocNavigation(frame_,
                                                               params.get());
   }
@@ -909,7 +909,8 @@
     const SessionStorageNamespaceId&,
     bool& consumed_user_gesture,
     const absl::optional<Impression>&,
-    const absl::optional<WebPictureInPictureWindowOptions>&) {
+    const absl::optional<WebPictureInPictureWindowOptions>&,
+    const WebURL&) {
   auto webview_helper = std::make_unique<WebViewHelper>();
   WebView* result = webview_helper->InitializeWithOpener(frame_);
   child_web_views_.push_back(std::move(webview_helper));
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.h b/third_party/blink/renderer/core/frame/frame_test_helpers.h
index daade68..2ef593e 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.h
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.h
@@ -545,7 +545,8 @@
       const SessionStorageNamespaceId&,
       bool& consumed_user_gesture,
       const absl::optional<Impression>&,
-      const absl::optional<WebPictureInPictureWindowOptions>&) override;
+      const absl::optional<WebPictureInPictureWindowOptions>&,
+      const WebURL& base_url) override;
 
   int VisuallyNonEmptyLayoutCount() const {
     return visually_non_empty_layout_count_;
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index 9cf3695..3dd5c05 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -321,7 +321,8 @@
                       const DocumentToken& document_token,
                       std::unique_ptr<PolicyContainer> policy_container,
                       const StorageKey& storage_key,
-                      ukm::SourceId document_ukm_source_id) {
+                      ukm::SourceId document_ukm_source_id,
+                      const KURL& creator_base_url) {
   if (!policy_container)
     policy_container = PolicyContainer::CreateEmpty();
 
@@ -334,7 +335,7 @@
 
   SetOpenerDoNotNotify(opener);
   loader_.Init(document_token, std::move(policy_container), storage_key,
-               document_ukm_source_id);
+               document_ukm_source_id, creator_base_url);
 }
 
 void LocalFrame::SetView(LocalFrameView* view) {
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h
index b85c9aa..3d011d6 100644
--- a/third_party/blink/renderer/core/frame/local_frame.h
+++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -214,6 +214,8 @@
   //   storage, IndexedDB, BroadcastChannel, etc...
   // - |document_ukm_source_id| is the ukm source id for the new document. If
   //   you pass ukm::kInvalidSourceId, a new ukm source id will be generated.
+  // - `creator_base_url` is the base url of the initiator that created this
+  //    frame.
   //
   // Note: Usually, the initial empty document inherits its |policy_container|
   // and |storage_key| from the parent or the opener. The inheritance operation
@@ -224,7 +226,8 @@
             const DocumentToken& document_token,
             std::unique_ptr<PolicyContainer> policy_container,
             const StorageKey& storage_key,
-            ukm::SourceId document_ukm_source_id);
+            ukm::SourceId document_ukm_source_id,
+            const KURL& creator_base_url);
   void SetView(LocalFrameView*);
   void CreateView(const gfx::Size&, const Color&);
 
diff --git a/third_party/blink/renderer/core/frame/web_frame_test.cc b/third_party/blink/renderer/core/frame/web_frame_test.cc
index bf411044..25ff4a45 100644
--- a/third_party/blink/renderer/core/frame/web_frame_test.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_test.cc
@@ -7652,7 +7652,8 @@
       const SessionStorageNamespaceId&,
       bool& consumed_user_gesture,
       const absl::optional<Impression>&,
-      const absl::optional<WebPictureInPictureWindowOptions>&) override {
+      const absl::optional<WebPictureInPictureWindowOptions>&,
+      const WebURL&) override {
     EXPECT_TRUE(false);
     return nullptr;
   }
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
index 294250e..48bb0d4 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -1984,10 +1984,12 @@
     std::unique_ptr<WebPolicyContainer> policy_container,
     WebFrame* opener,
     const WebString& name,
-    network::mojom::blink::WebSandboxFlags sandbox_flags) {
+    network::mojom::blink::WebSandboxFlags sandbox_flags,
+    const WebURL& creator_base_url) {
   return WebLocalFrameImpl::CreateMainFrame(
       web_view, client, interface_registry, frame_token, opener, name,
-      sandbox_flags, document_token, std::move(policy_container));
+      sandbox_flags, document_token, std::move(policy_container),
+      creator_base_url);
 }
 
 WebLocalFrame* WebLocalFrame::CreateProvisional(
@@ -2012,7 +2014,8 @@
     const WebString& name,
     network::mojom::blink::WebSandboxFlags sandbox_flags,
     const DocumentToken& document_token,
-    std::unique_ptr<WebPolicyContainer> policy_container) {
+    std::unique_ptr<WebPolicyContainer> policy_container,
+    const WebURL& creator_base_url) {
   auto* frame = MakeGarbageCollected<WebLocalFrameImpl>(
       base::PassKey<WebLocalFrameImpl>(),
       mojom::blink::TreeScopeType::kDocument, client, interface_registry,
@@ -2030,7 +2033,7 @@
       page, nullptr, nullptr, nullptr, FrameInsertType::kInsertInConstructor,
       name, opener ? &ToCoreFrame(*opener)->window_agent_factory() : nullptr,
       opener, document_token, std::move(policy_container), storage_key,
-      sandbox_flags);
+      creator_base_url, sandbox_flags);
   return frame;
 }
 
@@ -2084,7 +2087,8 @@
       previous_web_frame->Parent(), nullptr, FrameInsertType::kInsertLater,
       name, &ToCoreFrame(*previous_web_frame)->window_agent_factory(),
       previous_web_frame->Opener(), DocumentToken(),
-      /*policy_container=*/nullptr, StorageKey(), sandbox_flags);
+      /*policy_container=*/nullptr, StorageKey(),
+      /*creator_base_url=*/KURL(), sandbox_flags);
 
   LocalFrame* new_frame = web_frame->GetFrame();
 
@@ -2203,13 +2207,14 @@
     const DocumentToken& document_token,
     std::unique_ptr<blink::WebPolicyContainer> policy_container,
     const StorageKey& storage_key,
+    const KURL& creator_base_url,
     network::mojom::blink::WebSandboxFlags sandbox_flags) {
   InitializeCoreFrameInternal(
       page, owner, parent, previous_sibling, insert_type, name,
       window_agent_factory, opener, document_token,
       PolicyContainer::CreateFromWebPolicyContainer(
           std::move(policy_container)),
-      storage_key, ukm::kInvalidSourceId, sandbox_flags);
+      storage_key, ukm::kInvalidSourceId, creator_base_url, sandbox_flags);
 }
 
 void WebLocalFrameImpl::InitializeCoreFrameInternal(
@@ -2225,6 +2230,7 @@
     std::unique_ptr<PolicyContainer> policy_container,
     const StorageKey& storage_key,
     ukm::SourceId document_ukm_source_id,
+    const KURL& creator_base_url,
     network::mojom::blink::WebSandboxFlags sandbox_flags) {
   Frame* parent_frame = parent ? ToCoreFrame(*parent) : nullptr;
   Frame* previous_sibling_frame =
@@ -2262,7 +2268,7 @@
   // We must call init() after frame_ is assigned because it is referenced
   // during init().
   frame_->Init(opener_frame, document_token, std::move(policy_container),
-               storage_key, document_ukm_source_id);
+               storage_key, document_ukm_source_id, creator_base_url);
 
   if (!owner) {
     // This trace event is needed to detect the main frame of the
@@ -2329,13 +2335,18 @@
         std::make_unique<PolicyContainer>(std::move(policy_container_remote),
                                           std::move(policy_container_data));
 
+    KURL creator_base_url;
+    if (features::IsNewBaseUrlInheritanceBehaviorEnabled()) {
+      creator_base_url = owner_element->GetDocument().BaseURL();
+    }
     To<WebLocalFrameImpl>(new_child_frame)
         ->InitializeCoreFrameInternal(
             *GetFrame()->GetPage(), owner_element, this, LastChild(),
             FrameInsertType::kInsertInConstructor, name,
             &GetFrame()->window_agent_factory(), nullptr, document_token,
             std::move(policy_container),
-            GetFrame()->DomWindow()->GetStorageKey(), document_ukm_source_id);
+            GetFrame()->DomWindow()->GetStorageKey(), document_ukm_source_id,
+            creator_base_url);
   };
 
   // FIXME: Using subResourceAttributeName as fallback is not a perfect
@@ -2659,6 +2670,16 @@
     // the current document.
     navigation_params->origin_agent_cluster =
         GetFrame()->GetDocument()->GetAgent().IsOriginKeyedForInheritance();
+
+    KURL url = navigation_params->url;
+    if (navigation_params->is_synchronous_commit_for_bug_778318 &&
+        // Explicitly check for about:blank or about:srcdoc to prevent things
+        // like about:mumble propagating the base url.
+        (url.IsAboutBlankURL() || url.IsAboutSrcdocURL()) &&
+        features::IsNewBaseUrlInheritanceBehaviorEnabled()) {
+      navigation_params->fallback_base_url =
+          GetFrame()->GetDocument()->BaseURL();
+    }
   }
   if (GetTextFinder())
     GetTextFinder()->ClearActiveFindMatch();
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
index 93ec7337..1dca1d3 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.h
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
@@ -412,6 +412,7 @@
       const DocumentToken& document_token,
       std::unique_ptr<blink::WebPolicyContainer> policy_container,
       const StorageKey& storage_key,
+      const KURL& creator_base_url,
       network::mojom::blink::WebSandboxFlags sandbox_flags =
           network::mojom::blink::WebSandboxFlags::kNone);
   LocalFrame* GetFrame() const { return frame_.Get(); }
@@ -429,7 +430,8 @@
       const WebString& name,
       network::mojom::blink::WebSandboxFlags,
       const DocumentToken& document_token,
-      std::unique_ptr<WebPolicyContainer>);
+      std::unique_ptr<WebPolicyContainer>,
+      const WebURL& creator_base_url);
   static WebLocalFrameImpl* CreateProvisional(
       WebLocalFrameClient*,
       InterfaceRegistry*,
@@ -623,6 +625,7 @@
       std::unique_ptr<PolicyContainer> policy_container,
       const StorageKey& storage_key,
       ukm::SourceId document_ukm_source_id,
+      const KURL& creator_base_url,
       network::mojom::blink::WebSandboxFlags sandbox_flags =
           network::mojom::blink::WebSandboxFlags::kNone);
 
diff --git a/third_party/blink/renderer/core/frame/web_remote_frame_impl.cc b/third_party/blink/renderer/core/frame/web_remote_frame_impl.cc
index 24f0f87..ae65150f 100644
--- a/third_party/blink/renderer/core/frame/web_remote_frame_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_remote_frame_impl.cc
@@ -253,7 +253,8 @@
   child->InitializeCoreFrame(
       *GetFrame()->GetPage(), owner, this, previous_sibling,
       FrameInsertType::kInsertInConstructor, name, window_agent_factory, opener,
-      document_token, std::move(policy_container), storage_key);
+      document_token, std::move(policy_container), storage_key,
+      /*creator_base_url=*/KURL());
   DCHECK(child->GetFrame());
   return child;
 }
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
index 5ea32d1..be4713c7 100644
--- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
@@ -1235,7 +1235,8 @@
       nullptr);
   frame->SetView(MakeGarbageCollected<LocalFrameView>(*frame));
   frame->Init(/*opener=*/nullptr, DocumentToken(), /*policy_container=*/nullptr,
-              StorageKey(), /*document_ukm_source_id=*/ukm::kInvalidSourceId);
+              StorageKey(), /*document_ukm_source_id=*/ukm::kInvalidSourceId,
+              /*creator_base_url=*/KURL());
   frame->View()->SetCanHaveScrollbars(false);
   frame->View()->SetBaseBackgroundColor(Color::kTransparent);
 
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_data.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_data.h
index afa6a27..de9b74f 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_data.h
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_data.h
@@ -252,10 +252,10 @@
       scoped_refptr<const NGGridLayoutTree>&& layout_tree)
       : NGGridSubtree(std::move(layout_tree)) {}
 
-  NGGridLayoutSubtree(wtf_size_t parent_end_index,
-                      wtf_size_t subtree_root,
-                      const scoped_refptr<const NGGridLayoutTree>& layout_tree)
-      : NGGridSubtree(parent_end_index, subtree_root, layout_tree) {}
+  NGGridLayoutSubtree(const scoped_refptr<const NGGridLayoutTree>& layout_tree,
+                      wtf_size_t parent_end_index,
+                      wtf_size_t subtree_root)
+      : NGGridSubtree(layout_tree, parent_end_index, subtree_root) {}
 
   // This method is meant to be used for layout invalidation, so we only care
   // about comparing the layout data of both subtrees.
@@ -266,7 +266,7 @@
                : !grid_tree_ && !other.grid_tree_;
   }
 
-  const NGGridLayoutData& LayoutData() const {
+  const NGGridLayoutData& SubtreeRootData() const {
     DCHECK(grid_tree_);
     return grid_tree_->LayoutData(subtree_root_);
   }
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h
index 5ac9fd2..56666306 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h
@@ -138,13 +138,8 @@
     return resolved_position.SpanSize(track_direction);
   }
 
-  // This item is considered a subgrid if it has at least one subgridded axis.
-  // However, for the purpose of iterating over the subgrids of a grid we don't
-  // want to consider subgridded items since they should be iterated over by
-  // their parent grid, otherwise they'll appear twice in the sizing tree.
   bool IsSubgrid() const {
-    return !is_subgridded_to_parent_grid &&
-           (has_subgridded_columns || has_subgridded_rows);
+    return has_subgridded_columns || has_subgridded_rows;
   }
 
   bool IsConsideredForSizing(GridTrackSizingDirection track_direction) const {
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
index 640c8638..f27b1f5 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
@@ -238,8 +238,7 @@
                               : BuildGridSizingTree(&oof_children);
 
   LayoutUnit intrinsic_block_size;
-  auto& grid_items = grid_sizing_tree[0].grid_items;
-  auto& layout_data = grid_sizing_tree[0].layout_data;
+  auto& [grid_items, layout_data, tree_size] = grid_sizing_tree.TreeRootData();
 
   if (IsBreakInside(BreakToken())) {
     // TODO(layout-dev): When we support variable inline-size fragments we'll
@@ -263,7 +262,7 @@
     CacheGridItemsProperties(layout_data.Rows(), &grid_items,
                              &grid_data->row_range_indices);
   } else {
-    ComputeGridGeometry(&grid_sizing_tree, &intrinsic_block_size);
+    ComputeGridGeometry(grid_sizing_tree, &intrinsic_block_size);
   }
 
   // Subgridded items must be laid out by their parent.
@@ -417,13 +416,12 @@
                               ? BuildGridSizingTreeIgnoringChildren()
                               : BuildGridSizingTree();
 
-  auto& grid_items = grid_sizing_tree[0].grid_items;
-  auto& layout_data = grid_sizing_tree[0].layout_data;
+  auto& [grid_items, layout_data, tree_size] = grid_sizing_tree.TreeRootData();
 
   bool depends_on_block_constraints = false;
   auto ComputeTotalColumnSize =
       [&](SizingConstraint sizing_constraint) -> LayoutUnit {
-    InitializeTrackSizes(&grid_sizing_tree);
+    InitializeTrackSizes(grid_sizing_tree);
 
     bool needs_additional_pass = false;
     ComputeUsedTrackSizes(layout_data, sizing_constraint, &grid_items,
@@ -440,7 +438,7 @@
                               &layout_data.Rows(), &needs_additional_pass);
 
         if (needs_additional_pass) {
-          InitializeTrackSizes(&grid_sizing_tree, kForColumns);
+          InitializeTrackSizes(grid_sizing_tree, kForColumns);
           ComputeUsedTrackSizes(layout_data, sizing_constraint, &grid_items,
                                 &layout_data.Columns());
         }
@@ -627,7 +625,7 @@
 
     sizing_data.grid_items =
         node.ConstructGridItems(node.CachedPlacementData(), oof_children);
-    sizing_data.layout_data = layout_subtree->LayoutData();
+    sizing_data.layout_data = layout_subtree->SubtreeRootData();
   } else {
     BuildGridSizingSubtree(&sizing_tree, oof_children);
   }
@@ -792,9 +790,9 @@
 }  // namespace
 
 void NGGridLayoutAlgorithm::ComputeGridGeometry(
-    NGGridSizingTree* grid_sizing_tree,
+    const NGGridSizingTree& grid_sizing_tree,
     LayoutUnit* intrinsic_block_size) {
-  DCHECK(grid_sizing_tree && intrinsic_block_size);
+  DCHECK(intrinsic_block_size);
 
   const auto& node = Node();
   const auto& container_style = Style();
@@ -803,11 +801,8 @@
 
   DCHECK_NE(grid_available_size_.inline_size, kIndefiniteSize);
 
-  auto& root_sizing_data = (*grid_sizing_tree)[0];
-  auto& grid_items = root_sizing_data.grid_items;
-  auto& layout_data = root_sizing_data.layout_data;
-
   InitializeTrackSizes(grid_sizing_tree);
+  auto& [grid_items, layout_data, tree_size] = grid_sizing_tree.TreeRootData();
 
   bool needs_additional_pass = false;
   ComputeUsedTrackSizes(layout_data, SizingConstraint::kLayout, &grid_items,
@@ -925,10 +920,9 @@
     return BorderScrollbarPadding().BlockSum() + override_intrinsic_block_size;
 
   auto grid_sizing_tree = BuildGridSizingTreeIgnoringChildren();
-  auto& grid_items = grid_sizing_tree[0].grid_items;
-  auto& layout_data = grid_sizing_tree[0].layout_data;
+  auto& [grid_items, layout_data, tree_size] = grid_sizing_tree.TreeRootData();
 
-  InitializeTrackSizes(&grid_sizing_tree, kForRows);
+  InitializeTrackSizes(grid_sizing_tree, kForRows);
   ComputeUsedTrackSizes(layout_data, SizingConstraint::kLayout, &grid_items,
                         &layout_data.Rows());
 
@@ -1534,14 +1528,13 @@
 }
 
 void NGGridLayoutAlgorithm::InitializeTrackSizes(
-    wtf_size_t current_grid_index,
+    const NGGridSizingSubtree& sizing_subtree,
     const NGSubgriddedItemData& opt_subgrid_data,
-    const absl::optional<GridTrackSizingDirection>& opt_track_direction,
-    NGGridSizingTree* sizing_tree) const {
-  DCHECK(sizing_tree && current_grid_index < sizing_tree->Size());
+    const absl::optional<GridTrackSizingDirection>& opt_track_direction) const {
+  DCHECK(sizing_subtree);
 
   auto& [grid_items, layout_data, subtree_size] =
-      sizing_tree->At(current_grid_index);
+      sizing_subtree.SubtreeRootData();
 
   auto InitAndCacheTrackSizes = [&](GridTrackSizingDirection track_direction) {
     InitializeTrackCollection(opt_subgrid_data, track_direction, &layout_data);
@@ -1593,13 +1586,13 @@
     return;
   }
 
-  wtf_size_t next_subgrid_index = current_grid_index + 1;
+  auto next_subgrid_subtree = sizing_subtree.FirstChild();
   for (const auto& grid_item : grid_items) {
-    if (!grid_item.IsSubgrid()) {
+    if (grid_item.is_subgridded_to_parent_grid || !grid_item.IsSubgrid()) {
       continue;
     }
 
-    DCHECK_LT(next_subgrid_index, current_grid_index + subtree_size);
+    DCHECK(next_subgrid_subtree);
     NGSubgriddedItemData subgrid_data(grid_item, layout_data);
 
     NGConstraintSpace unused_space;
@@ -1607,20 +1600,19 @@
     auto subgrid_algorithm = CreateSubgridLayoutAlgorithm(
         subgrid_data, &unused_space, &unused_fragment_geometry);
 
-    subgrid_algorithm.InitializeTrackSizes(next_subgrid_index, subgrid_data,
-                                           opt_track_direction, sizing_tree);
+    subgrid_algorithm.InitializeTrackSizes(next_subgrid_subtree, subgrid_data,
+                                           opt_track_direction);
 
-    next_subgrid_index += sizing_tree->SubtreeSize(next_subgrid_index);
+    next_subgrid_subtree = next_subgrid_subtree.NextSibling();
   }
-  DCHECK_EQ(next_subgrid_index, current_grid_index + subtree_size);
 }
 
 void NGGridLayoutAlgorithm::InitializeTrackSizes(
-    NGGridSizingTree* sizing_tree,
+    const NGGridSizingTree& sizing_tree,
     const absl::optional<GridTrackSizingDirection>& opt_track_direction) const {
-  InitializeTrackSizes(/* current_grid_index */ 0,
+  InitializeTrackSizes(NGGridSizingSubtree(sizing_tree),
                        /* opt_subgrid_data */ kNoSubgriddedItemData,
-                       opt_track_direction, sizing_tree);
+                       opt_track_direction);
 }
 
 namespace {
@@ -3085,7 +3077,7 @@
   DCHECK(out_row_break_between);
 
   const auto& container_space = ConstraintSpace();
-  const auto& layout_data = layout_subtree.LayoutData();
+  const auto& layout_data = layout_subtree.SubtreeRootData();
 
   const auto container_writing_direction =
       container_space.GetWritingDirection();
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h
index a71f044..34e827b 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h
@@ -83,7 +83,7 @@
                       const GridItemData& grid_item,
                       GridTrackSizingDirection track_direction) const;
 
-  void ComputeGridGeometry(NGGridSizingTree* grid_sizing_tree,
+  void ComputeGridGeometry(const NGGridSizingTree& grid_sizing_tree,
                            LayoutUnit* intrinsic_block_size);
 
   LayoutUnit ComputeIntrinsicBlockSizeIgnoringChildren() const;
@@ -127,14 +127,13 @@
                                  NGGridLayoutData* layout_data) const;
 
   // Initializes the track sizes of a given grid sizing subtree.
-  void InitializeTrackSizes(
-      wtf_size_t current_grid_index,
-      const NGSubgriddedItemData& opt_subgrid_data,
-      const absl::optional<GridTrackSizingDirection>& opt_track_direction,
-      NGGridSizingTree* sizing_tree) const;
+  void InitializeTrackSizes(const NGGridSizingSubtree& sizing_subtree,
+                            const NGSubgriddedItemData& opt_subgrid_data,
+                            const absl::optional<GridTrackSizingDirection>&
+                                opt_track_direction) const;
 
   // Helper that calls the method above for the entire grid sizing tree.
-  void InitializeTrackSizes(NGGridSizingTree* sizing_tree,
+  void InitializeTrackSizes(const NGGridSizingTree& sizing_subtree,
                             const absl::optional<GridTrackSizingDirection>&
                                 opt_track_direction = absl::nullopt) const;
 
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm_test.cc
index 1e92521..23e2fd2 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm_test.cc
@@ -37,11 +37,15 @@
   void BuildGridItemsAndTrackCollections(NGGridLayoutAlgorithm& algorithm) {
     LayoutUnit unused_intrinsic_block_size;
     auto grid_sizing_tree = algorithm.BuildGridSizingTree();
-    algorithm.ComputeGridGeometry(&grid_sizing_tree,
+
+    algorithm.ComputeGridGeometry(grid_sizing_tree,
                                   &unused_intrinsic_block_size);
 
-    cached_grid_items_ = std::move(grid_sizing_tree[0].grid_items);
-    layout_data_ = std::move(grid_sizing_tree[0].layout_data);
+    auto& [grid_items, layout_data, tree_size] =
+        grid_sizing_tree.TreeRootData();
+
+    cached_grid_items_ = std::move(grid_items);
+    layout_data_ = std::move(layout_data);
   }
 
   const GridItemData& GridItem(wtf_size_t index) {
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_sizing_tree.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_sizing_tree.cc
index b06a95b5..0f3ab6a7 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_sizing_tree.cc
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_sizing_tree.cc
@@ -29,10 +29,10 @@
 }
 
 scoped_refptr<const NGGridLayoutTree> NGGridSizingTree::FinalizeTree() const {
-  auto layout_tree =
-      base::MakeRefCounted<NGGridLayoutTree>(sizing_data_.size());
-  for (const auto& sizing_data : sizing_data_) {
-    layout_tree->Append(sizing_data->layout_data, sizing_data->subtree_size);
+  auto layout_tree = base::MakeRefCounted<NGGridLayoutTree>(tree_data_.size());
+  for (const auto& grid_tree_node : tree_data_) {
+    layout_tree->Append(grid_tree_node->layout_data,
+                        grid_tree_node->subtree_size);
   }
   return layout_tree;
 }
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_sizing_tree.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_sizing_tree.h
index 075bc33..7d45b43 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_sizing_tree.h
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_sizing_tree.h
@@ -11,15 +11,6 @@
 
 namespace blink {
 
-struct NGGridSizingData {
-  USING_FAST_MALLOC(NGGridSizingData);
-
- public:
-  GridItems grid_items;
-  NGGridLayoutData layout_data;
-  wtf_size_t subtree_size{1};
-};
-
 // In subgrid, we allow "subgridded items" to be considered by the sizing
 // algorithm of an ancestor grid that may not be its parent grid.
 //
@@ -65,26 +56,35 @@
   DISALLOW_NEW();
 
  public:
+  struct GridTreeNode {
+    USING_FAST_MALLOC(GridTreeNode);
+
+   public:
+    GridItems grid_items;
+    NGGridLayoutData layout_data;
+    wtf_size_t subtree_size{1};
+  };
+
   NGGridSizingTree() = default;
   NGGridSizingTree(NGGridSizingTree&&) = default;
   NGGridSizingTree(const NGGridSizingTree&) = delete;
   NGGridSizingTree& operator=(NGGridSizingTree&&) = default;
   NGGridSizingTree& operator=(const NGGridSizingTree&) = delete;
 
-  NGGridSizingData& CreateSizingData() {
-    return *sizing_data_.emplace_back(std::make_unique<NGGridSizingData>());
+  GridTreeNode& CreateSizingData() {
+    return *tree_data_.emplace_back(std::make_unique<GridTreeNode>());
   }
 
-  NGGridSizingData& At(wtf_size_t index) {
-    DCHECK_LT(index, sizing_data_.size());
-    return *sizing_data_[index];
+  GridTreeNode& At(wtf_size_t index) const {
+    DCHECK_LT(index, tree_data_.size());
+    return *tree_data_[index];
   }
 
-  NGGridSizingData& operator[](wtf_size_t index) { return At(index); }
+  GridTreeNode& TreeRootData() const { return At(0); }
 
   wtf_size_t SubtreeSize(wtf_size_t index) const {
-    DCHECK_LT(index, sizing_data_.size());
-    return sizing_data_[index]->subtree_size;
+    DCHECK_LT(index, tree_data_.size());
+    return tree_data_[index]->subtree_size;
   }
 
   // Creates a copy of the current grid geometry for the entire tree in a new
@@ -92,14 +92,32 @@
   // stored in a `scoped_refptr` to be shared by multiple subtrees.
   scoped_refptr<const NGGridLayoutTree> FinalizeTree() const;
 
-  wtf_size_t Size() const { return sizing_data_.size(); }
+  wtf_size_t Size() const { return tree_data_.size(); }
 
  private:
-  Vector<std::unique_ptr<NGGridSizingData>, 16> sizing_data_;
+  Vector<std::unique_ptr<GridTreeNode>, 16> tree_data_;
+};
+
+class NGGridSizingSubtree
+    : public NGGridSubtree<NGGridSizingSubtree, const NGGridSizingTree*> {
+  STACK_ALLOCATED();
+
+ public:
+  NGGridSizingSubtree() = default;
+
+  explicit NGGridSizingSubtree(const NGGridSizingTree& sizing_tree)
+      : NGGridSubtree(&sizing_tree) {}
+
+  NGGridSizingSubtree(const NGGridSizingTree* sizing_tree,
+                      wtf_size_t parent_end_index,
+                      wtf_size_t subtree_root)
+      : NGGridSubtree(sizing_tree, parent_end_index, subtree_root) {}
+
+  NGGridSizingTree::GridTreeNode& SubtreeRootData() const {
+    return grid_tree_->At(subtree_root_);
+  }
 };
 
 }  // namespace blink
 
-WTF_ALLOW_CLEAR_UNUSED_SLOTS_WITH_MEM_FUNCTIONS(blink::NGGridSizingData)
-
 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_GRID_NG_GRID_SIZING_TREE_H_
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_subtree.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_subtree.h
index 85a824e5..e063d7f76 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_subtree.h
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_subtree.h
@@ -48,13 +48,13 @@
   explicit operator bool() const { return static_cast<bool>(grid_tree_); }
 
   SubtreeType FirstChild() const {
-    return SubtreeType(/* parent_end_index */ NextSiblingIndex(),
-                       /* subtree_root */ subtree_root_ + 1, grid_tree_);
+    return SubtreeType(grid_tree_, /* parent_end_index */ NextSiblingIndex(),
+                       /* subtree_root */ subtree_root_ + 1);
   }
 
   SubtreeType NextSibling() const {
-    return SubtreeType(/* parent_end_index */ parent_end_index_,
-                       /* subtree_root */ NextSiblingIndex(), grid_tree_);
+    return SubtreeType(grid_tree_, /* parent_end_index */ parent_end_index_,
+                       /* subtree_root */ NextSiblingIndex());
   }
 
  protected:
@@ -66,9 +66,9 @@
     parent_end_index_ = grid_tree_->Size();
   }
 
-  NGGridSubtree(wtf_size_t parent_end_index,
-                wtf_size_t subtree_root,
-                GridTreePtr grid_tree) {
+  NGGridSubtree(GridTreePtr grid_tree,
+                wtf_size_t parent_end_index,
+                wtf_size_t subtree_root) {
     DCHECK_LE(subtree_root, parent_end_index);
 
     // If the subtree root is beyond the parent's end index, we will keep this
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index d2f22fce..130de7c4 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -283,7 +283,7 @@
   bool was_discarded;
   bool loading_main_document_from_mhtml_archive;
   bool loading_srcdoc;
-  KURL fallback_srcdoc_base_url;
+  KURL fallback_base_url;
   bool loading_url_as_empty_document;
   bool is_static_data;
   CommitReason commit_reason;
@@ -489,7 +489,7 @@
       is_browser_initiated_(params_->is_browser_initiated),
       was_discarded_(params_->was_discarded),
       loading_srcdoc_(url_.IsAboutSrcdocURL()),
-      fallback_srcdoc_base_url_(params_->fallback_srcdoc_base_url),
+      fallback_base_url_(params_->fallback_base_url),
       loading_url_as_empty_document_(!params_->is_static_data &&
                                      WillLoadUrlAsEmpty(url_)),
       is_static_data_(params_->is_static_data),
@@ -608,7 +608,7 @@
   LocalDOMWindow* window = frame_->DomWindow();
   params->document_token = frame_->GetDocument()->Token();
   params->url = window->Url();
-  params->fallback_srcdoc_base_url = fallback_srcdoc_base_url_;
+  params->fallback_base_url = fallback_base_url_;
   params->unreachable_url = unreachable_url_;
   params->referrer = referrer_;
   // All the security properties of the document must be preserved. Note that
@@ -2506,7 +2506,8 @@
           .WithURL(Url())
           .WithTypeFrom(MimeType())
           .WithSrcdocDocument(loading_srcdoc_)
-          .WithFallbackSrcdocBaseURL(fallback_srcdoc_base_url_)
+          .WithJavascriptURL(commit_reason_ == CommitReason::kJavascriptUrl)
+          .WithFallbackBaseURL(fallback_base_url_)
           .WithUkmSourceId(ukm_source_id_));
 
   RecordUseCountersForCommit();
diff --git a/third_party/blink/renderer/core/loader/document_loader.h b/third_party/blink/renderer/core/loader/document_loader.h
index 552b61c..1384ac1 100644
--- a/third_party/blink/renderer/core/loader/document_loader.h
+++ b/third_party/blink/renderer/core/loader/document_loader.h
@@ -752,7 +752,7 @@
   // |archive_|, but won't have |loading_main_document_from_mhtml_archive_| set.
   bool loading_main_document_from_mhtml_archive_ = false;
   const bool loading_srcdoc_ = false;
-  const KURL fallback_srcdoc_base_url_;
+  const KURL fallback_base_url_;
   const bool loading_url_as_empty_document_ = false;
   const bool is_static_data_ = false;
   CommitReason commit_reason_ = CommitReason::kRegular;
diff --git a/third_party/blink/renderer/core/loader/frame_load_request.cc b/third_party/blink/renderer/core/loader/frame_load_request.cc
index 9a3b14f7..1994c062c 100644
--- a/third_party/blink/renderer/core/loader/frame_load_request.cc
+++ b/third_party/blink/renderer/core/loader/frame_load_request.cc
@@ -71,7 +71,8 @@
     // about:blank and about:srcdoc here.
     if (blink::features::IsNewBaseUrlInheritanceBehaviorEnabled() &&
         (resource_request_.Url().IsAboutBlankURL() ||
-         resource_request_.Url().IsAboutSrcdocURL())) {
+         resource_request_.Url().IsAboutSrcdocURL() ||
+         resource_request_.Url().IsEmpty())) {
       requestor_base_url_ = origin_window->BaseURL();
     }
 
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc
index 48552a8..97cadcad 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -223,13 +223,17 @@
 void FrameLoader::Init(const DocumentToken& document_token,
                        std::unique_ptr<PolicyContainer> policy_container,
                        const StorageKey& storage_key,
-                       ukm::SourceId document_ukm_source_id) {
+                       ukm::SourceId document_ukm_source_id,
+                       const KURL& creator_base_url) {
   DCHECK(policy_container);
   ScriptForbiddenScope forbid_scripts;
 
   // Load the initial empty document:
   auto navigation_params = std::make_unique<WebNavigationParams>();
   navigation_params->url = KURL(g_empty_string);
+  if (!creator_base_url.IsEmpty()) {
+    navigation_params->fallback_base_url = creator_base_url;
+  }
   navigation_params->storage_key = storage_key;
   navigation_params->document_token = document_token;
   navigation_params->frame_policy =
diff --git a/third_party/blink/renderer/core/loader/frame_loader.h b/third_party/blink/renderer/core/loader/frame_loader.h
index e868a8e..28dd5c9 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.h
+++ b/third_party/blink/renderer/core/loader/frame_loader.h
@@ -89,7 +89,8 @@
   void Init(const DocumentToken& document_token,
             std::unique_ptr<PolicyContainer> policy_container,
             const StorageKey& storage_key,
-            ukm::SourceId document_ukm_source_id);
+            ukm::SourceId document_ukm_source_id,
+            const KURL& creator_base_url);
 
   ResourceRequest ResourceRequestForReload(
       WebFrameLoadType,
diff --git a/third_party/blink/renderer/core/mathml/mathml_element.cc b/third_party/blink/renderer/core/mathml/mathml_element.cc
index d6208f52..5ae5559e 100644
--- a/third_party/blink/renderer/core/mathml/mathml_element.cc
+++ b/third_party/blink/renderer/core/mathml/mathml_element.cc
@@ -159,13 +159,15 @@
 
 const CSSPrimitiveValue* MathMLElement::ParseMathLength(
     const QualifiedName& attr_name,
-    AllowPercentages allow_percentages) {
+    AllowPercentages allow_percentages,
+    CSSPrimitiveValue::ValueRange value_range) {
   if (!FastHasAttribute(attr_name))
     return nullptr;
   auto value = FastGetAttribute(attr_name);
   const CSSPrimitiveValue* parsed_value = CSSParser::ParseLengthPercentage(
       value,
-      StrictCSSParserContext(GetExecutionContext()->GetSecureContextMode()));
+      StrictCSSParserContext(GetExecutionContext()->GetSecureContextMode()),
+      value_range);
   if (!parsed_value || parsed_value->IsCalculated() ||
       (parsed_value->IsPercentage() &&
        allow_percentages == AllowPercentages::kNo)) {
@@ -177,9 +179,10 @@
 absl::optional<Length> MathMLElement::AddMathLengthToComputedStyle(
     const CSSToLengthConversionData& conversion_data,
     const QualifiedName& attr_name,
-    AllowPercentages allow_percentages) {
+    AllowPercentages allow_percentages,
+    CSSPrimitiveValue::ValueRange value_range) {
   if (const CSSPrimitiveValue* parsed_value =
-          ParseMathLength(attr_name, allow_percentages)) {
+          ParseMathLength(attr_name, allow_percentages, value_range)) {
     return parsed_value->ConvertToLength(conversion_data);
   }
   return absl::nullopt;
diff --git a/third_party/blink/renderer/core/mathml/mathml_element.h b/third_party/blink/renderer/core/mathml/mathml_element.h
index f3440be3..5de94f4 100644
--- a/third_party/blink/renderer/core/mathml/mathml_element.h
+++ b/third_party/blink/renderer/core/mathml/mathml_element.h
@@ -48,11 +48,15 @@
   enum class AllowPercentages { kYes, kNo };
   const CSSPrimitiveValue* ParseMathLength(
       const QualifiedName& attr_name,
-      AllowPercentages allow_percentages = AllowPercentages::kYes);
+      AllowPercentages allow_percentages = AllowPercentages::kYes,
+      CSSPrimitiveValue::ValueRange value_range =
+          CSSPrimitiveValue::ValueRange::kAll);
   absl::optional<Length> AddMathLengthToComputedStyle(
       const CSSToLengthConversionData&,
       const QualifiedName&,
-      AllowPercentages allow_percentages = AllowPercentages::kYes);
+      AllowPercentages allow_percentages = AllowPercentages::kYes,
+      CSSPrimitiveValue::ValueRange value_range =
+          CSSPrimitiveValue::ValueRange::kAll);
 
   void ParseAttribute(const AttributeModificationParams&) override;
 
diff --git a/third_party/blink/renderer/core/mathml/mathml_padded_element.cc b/third_party/blink/renderer/core/mathml/mathml_padded_element.cc
index d424d1c..70ac834 100644
--- a/third_party/blink/renderer/core/mathml/mathml_padded_element.cc
+++ b/third_party/blink/renderer/core/mathml/mathml_padded_element.cc
@@ -16,23 +16,28 @@
     ComputedStyleBuilder& builder,
     const CSSToLengthConversionData& conversion_data) {
   if (auto length_or_percentage_value = AddMathLengthToComputedStyle(
-          conversion_data, mathml_names::kHeightAttr, AllowPercentages::kNo))
+          conversion_data, mathml_names::kHeightAttr, AllowPercentages::kNo,
+          CSSPrimitiveValue::ValueRange::kNonNegative)) {
     builder.SetMathBaseline(std::move(*length_or_percentage_value));
+  }
 }
 
 void MathMLPaddedElement::AddMathPaddedDepthIfNeeded(
     ComputedStyleBuilder& builder,
     const CSSToLengthConversionData& conversion_data) {
   if (auto length_or_percentage_value = AddMathLengthToComputedStyle(
-          conversion_data, mathml_names::kDepthAttr, AllowPercentages::kNo))
+          conversion_data, mathml_names::kDepthAttr, AllowPercentages::kNo,
+          CSSPrimitiveValue::ValueRange::kNonNegative)) {
     builder.SetMathPaddedDepth(std::move(*length_or_percentage_value));
+  }
 }
 
 void MathMLPaddedElement::AddMathPaddedLSpaceIfNeeded(
     ComputedStyleBuilder& builder,
     const CSSToLengthConversionData& conversion_data) {
   if (auto length_or_percentage_value = AddMathLengthToComputedStyle(
-          conversion_data, mathml_names::kLspaceAttr, AllowPercentages::kNo)) {
+          conversion_data, mathml_names::kLspaceAttr, AllowPercentages::kNo,
+          CSSPrimitiveValue::ValueRange::kNonNegative)) {
     builder.SetMathLSpace(std::move(*length_or_percentage_value));
   }
 }
@@ -70,7 +75,8 @@
     MutableCSSPropertyValueSet* style) {
   if (name == mathml_names::kWidthAttr) {
     if (const CSSPrimitiveValue* width_value =
-            ParseMathLength(name, AllowPercentages::kNo)) {
+            ParseMathLength(name, AllowPercentages::kNo,
+                            CSSPrimitiveValue::ValueRange::kNonNegative)) {
       AddPropertyToPresentationAttributeStyle(style, CSSPropertyID::kWidth,
                                               *width_value);
     }
diff --git a/third_party/blink/renderer/core/mathml/mathml_space_element.cc b/third_party/blink/renderer/core/mathml/mathml_space_element.cc
index 6e040da..f586816b 100644
--- a/third_party/blink/renderer/core/mathml/mathml_space_element.cc
+++ b/third_party/blink/renderer/core/mathml/mathml_space_element.cc
@@ -15,7 +15,8 @@
     ComputedStyleBuilder& builder,
     const CSSToLengthConversionData& conversion_data) {
   if (auto length_or_percentage_value = AddMathLengthToComputedStyle(
-          conversion_data, mathml_names::kHeightAttr, AllowPercentages::kNo)) {
+          conversion_data, mathml_names::kHeightAttr, AllowPercentages::kNo,
+          CSSPrimitiveValue::ValueRange::kNonNegative)) {
     builder.SetMathBaseline(std::move(*length_or_percentage_value));
   }
 }
@@ -34,7 +35,8 @@
     MutableCSSPropertyValueSet* style) {
   if (name == mathml_names::kWidthAttr) {
     if (const CSSPrimitiveValue* width_value =
-            ParseMathLength(name, AllowPercentages::kNo)) {
+            ParseMathLength(name, AllowPercentages::kNo,
+                            CSSPrimitiveValue::ValueRange::kNonNegative)) {
       AddPropertyToPresentationAttributeStyle(style, CSSPropertyID::kWidth,
                                               *width_value);
     }
@@ -43,9 +45,11 @@
     // TODO(rbuis): this can be simplified once attr() is supported for
     // width/height.
     const CSSPrimitiveValue* height_value =
-        ParseMathLength(mathml_names::kHeightAttr, AllowPercentages::kNo);
+        ParseMathLength(mathml_names::kHeightAttr, AllowPercentages::kNo,
+                        CSSPrimitiveValue::ValueRange::kNonNegative);
     const CSSPrimitiveValue* depth_value =
-        ParseMathLength(mathml_names::kDepthAttr, AllowPercentages::kNo);
+        ParseMathLength(mathml_names::kDepthAttr, AllowPercentages::kNo,
+                        CSSPrimitiveValue::ValueRange::kNonNegative);
     const CSSPrimitiveValue* attribute_value =
         (name == mathml_names::kHeightAttr ? height_value : depth_value);
     if (height_value && depth_value) {
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.cc b/third_party/blink/renderer/core/page/chrome_client_impl.cc
index 89a9e47e..8cb8e7c 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl.cc
+++ b/third_party/blink/renderer/core/page/chrome_client_impl.cc
@@ -300,7 +300,8 @@
           WrappedResourceRequest(r.GetResourceRequest()), features, frame_name,
           static_cast<WebNavigationPolicy>(r.GetNavigationPolicy()),
           sandbox_flags, session_storage_namespace_id, consumed_user_gesture,
-          r.Impression(), r.GetPictureInPictureWindowOptions()));
+          r.Impression(), r.GetPictureInPictureWindowOptions(),
+          r.GetRequestorBaseURL()));
   if (!new_view)
     return nullptr;
   return new_view->GetPage();
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl_test.cc b/third_party/blink/renderer/core/page/chrome_client_impl_test.cc
index c3e422b..978d740a 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl_test.cc
+++ b/third_party/blink/renderer/core/page/chrome_client_impl_test.cc
@@ -104,7 +104,8 @@
       const SessionStorageNamespaceId&,
       bool& consumed_user_gesture,
       const absl::optional<Impression>&,
-      const absl::optional<WebPictureInPictureWindowOptions>&) override {
+      const absl::optional<WebPictureInPictureWindowOptions>&,
+      const WebURL& creator_base_url) override {
     return web_view_helper_.InitializeWithOpener(Frame());
   }
 
diff --git a/third_party/blink/renderer/core/page/validation_message_overlay_delegate.cc b/third_party/blink/renderer/core/page/validation_message_overlay_delegate.cc
index ed37ba25..da35ce96 100644
--- a/third_party/blink/renderer/core/page/validation_message_overlay_delegate.cc
+++ b/third_party/blink/renderer/core/page/validation_message_overlay_delegate.cc
@@ -157,7 +157,8 @@
       nullptr, nullptr);
   frame->SetView(MakeGarbageCollected<LocalFrameView>(*frame, view_size));
   frame->Init(/*opener=*/nullptr, DocumentToken(), /*policy_container=*/nullptr,
-              StorageKey(), /*document_ukm_source_id=*/ukm::kInvalidSourceId);
+              StorageKey(), /*document_ukm_source_id=*/ukm::kInvalidSourceId,
+              /*creator_base_url=*/KURL());
   frame->View()->SetCanHaveScrollbars(false);
   frame->View()->SetBaseBackgroundColor(Color::kTransparent);
   page_->GetVisualViewport().SetSize(view_size);
diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image.cc b/third_party/blink/renderer/core/svg/graphics/svg_image.cc
index 15d63da..86ea7b6 100644
--- a/third_party/blink/renderer/core/svg/graphics/svg_image.cc
+++ b/third_party/blink/renderer/core/svg/graphics/svg_image.cc
@@ -841,7 +841,8 @@
     frame->SetView(MakeGarbageCollected<LocalFrameView>(*frame));
     frame->Init(/*opener=*/nullptr, DocumentToken(),
                 /*policy_container=*/nullptr, StorageKey(),
-                /*document_ukm_source_id=*/ukm::kInvalidSourceId);
+                /*document_ukm_source_id=*/ukm::kInvalidSourceId,
+                /*creator_base_url=*/KURL());
   }
 
   // SVG Images will always synthesize a viewBox, if it's not available, and
diff --git a/third_party/blink/renderer/core/testing/core_unit_test_helper.cc b/third_party/blink/renderer/core/testing/core_unit_test_helper.cc
index 37f666fb..72dce2a 100644
--- a/third_party/blink/renderer/core/testing/core_unit_test_helper.cc
+++ b/third_party/blink/renderer/core/testing/core_unit_test_helper.cc
@@ -58,7 +58,8 @@
 
   child->Init(/*opener=*/nullptr, DocumentToken(), std::move(policy_container),
               parent_frame->DomWindow()->GetStorageKey(),
-              /*document_ukm_source_id=*/ukm::kInvalidSourceId);
+              /*document_ukm_source_id=*/ukm::kInvalidSourceId,
+              /*creator_base_url=*/KURL());
 
   return child;
 }
diff --git a/third_party/blink/renderer/core/testing/dummy_page_holder.cc b/third_party/blink/renderer/core/testing/dummy_page_holder.cc
index 6f53ef6..7a7186f0 100644
--- a/third_party/blink/renderer/core/testing/dummy_page_holder.cc
+++ b/third_party/blink/renderer/core/testing/dummy_page_holder.cc
@@ -105,7 +105,8 @@
   frame_->View()->GetPage()->GetVisualViewport().SetSize(initial_view_size);
   frame_->Init(/*opener=*/nullptr, DocumentToken(),
                /*policy_container=*/nullptr, StorageKey(),
-               /*document_ukm_source_id=*/ukm::kInvalidSourceId);
+               /*document_ukm_source_id=*/ukm::kInvalidSourceId,
+               /*creator_base_url=*/KURL());
 
   CoreInitializer::GetInstance().ProvideModulesToPage(GetPage(),
                                                       base::EmptyString());
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_queue.cc b/third_party/blink/renderer/modules/webgpu/gpu_queue.cc
index 33956550..8f4dbe9 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_queue.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_queue.cc
@@ -154,12 +154,13 @@
     return external_source;
   }
 
-  if (canvas && !(canvas->IsWebGL() || canvas->IsRenderingContext2D() ||
-                  canvas->IsWebGPU())) {
+  if (canvas &&
+      !(canvas->IsWebGL() || canvas->IsRenderingContext2D() ||
+        canvas->IsWebGPU() || canvas->IsImageBitmapRenderingContext())) {
     exception_state.ThrowDOMException(
         DOMExceptionCode::kOperationError,
-        "CopyExternalImageToTexture doesn't support canvas without 2d, webgl,"
-        " webgl2 or webgpu context");
+        "CopyExternalImageToTexture doesn't support canvas without rendering "
+        "context");
     return external_source;
   }
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/memory_cache.cc b/third_party/blink/renderer/platform/loader/fetch/memory_cache.cc
index 28ea287..9d48914 100644
--- a/third_party/blink/renderer/platform/loader/fetch/memory_cache.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/memory_cache.cc
@@ -95,8 +95,7 @@
       size_(0),
       task_runner_(std::move(task_runner)) {
   MemoryCacheDumpProvider::Instance()->SetMemoryCache(this);
-  if (MemoryPressureListenerRegistry::IsLowEndDevice())
-    MemoryPressureListenerRegistry::Instance().RegisterClient(this);
+  MemoryPressureListenerRegistry::Instance().RegisterClient(this);
 }
 
 MemoryCache::~MemoryCache() = default;
@@ -478,7 +477,10 @@
 
 void MemoryCache::OnMemoryPressure(
     base::MemoryPressureListener::MemoryPressureLevel level) {
-  PruneAll();
+  saved_page_resources_.clear();
+  if (MemoryPressureListenerRegistry::IsLowEndDevice()) {
+    PruneAll();
+  }
 }
 
 void MemoryCache::SavePageResourceStrongReferences(
@@ -490,21 +492,22 @@
   }
   base::UmaHistogramCustomCounts(kPageSavedResourceStrongReferenceSize,
                                  resources.size(), 0, 200, 50);
-  saved_page_token_++;
+  base::UnguessableToken saved_page_token = base::UnguessableToken::Create();
   saved_page_resources_.insert(
-      saved_page_token_,
+      String(saved_page_token.ToString()),
       MakeGarbageCollected<HeapVector<Member<Resource>>>(std::move(resources)));
   task_runner_->PostDelayedTask(
       FROM_HERE,
       base::BindOnce(&MemoryCache::RemovePageResourceStrongReference,
-                     WrapWeakPersistent(this), saved_page_token_),
+                     WrapWeakPersistent(this), saved_page_token),
       kCUnloadPageResourceSaveTime);
 }
 
-void MemoryCache::RemovePageResourceStrongReference(uint32_t saved_page_token) {
+void MemoryCache::RemovePageResourceStrongReference(
+    const base::UnguessableToken& saved_page_token) {
   DCHECK(base::FeatureList::IsEnabled(features::kMemoryCacheStrongReference));
 
-  saved_page_resources_.erase(saved_page_token);
+  saved_page_resources_.erase(String(saved_page_token.ToString()));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/memory_cache.h b/third_party/blink/renderer/platform/loader/fetch/memory_cache.h
index a363cb6..1475ca49 100644
--- a/third_party/blink/renderer/platform/loader/fetch/memory_cache.h
+++ b/third_party/blink/renderer/platform/loader/fetch/memory_cache.h
@@ -191,7 +191,8 @@
   void PruneResources(PruneStrategy);
   void PruneNow(PruneStrategy);
 
-  void RemovePageResourceStrongReference(uint32_t saved_page_token);
+  void RemovePageResourceStrongReference(
+      const base::UnguessableToken& saved_page_token);
 
   bool in_prune_resources_ = false;
   bool prune_pending_ = false;
@@ -209,9 +210,8 @@
 
   // The size of strong reference to resources is not limited.
   // The strong references will be removed when memory pressure is signaled.
-  HeapHashMap<uint32_t, Member<HeapVector<Member<Resource>>>>
+  HeapHashMap<String, Member<HeapVector<Member<Resource>>>>
       saved_page_resources_;
-  uint32_t saved_page_token_ = 0;
 
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
index 09b6166..6333dfc 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -616,9 +616,7 @@
 
   if (IsMainThread()) {
     MainThreadFetchersSet().insert(this);
-    if (MemoryPressureListenerRegistry::IsLowEndDevice()) {
-      MemoryPressureListenerRegistry::Instance().RegisterClient(this);
-    }
+    MemoryPressureListenerRegistry::Instance().RegisterClient(this);
   }
 }
 
@@ -1365,7 +1363,7 @@
   return resource;
 }
 
-void ResourceFetcher::RemoveImageStrongReference(Resource* image_resource) {
+void ResourceFetcher::RemoveResourceStrongReference(Resource* image_resource) {
   document_resource_strong_refs_.erase(image_resource);
 }
 
@@ -2676,7 +2674,7 @@
       document_resource_strong_refs_.insert(resource);
       freezable_task_runner_->PostDelayedTask(
           FROM_HERE,
-          WTF::BindOnce(&ResourceFetcher::RemoveImageStrongReference,
+          WTF::BindOnce(&ResourceFetcher::RemoveResourceStrongReference,
                         WrapWeakPersistent(this), WrapWeakPersistent(resource)),
           GetResourceStrongReferenceTimeout(resource));
     }
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
index 01a88b31..a20e403 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
@@ -497,7 +497,7 @@
 
   void WarnUnusedPreloads();
 
-  void RemoveImageStrongReference(Resource* image_resource);
+  void RemoveResourceStrongReference(Resource* image_resource);
 
   // Information about a resource fetch that had started but not completed yet.
   // Would be added to the response data when the response arrives.
diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.cc b/third_party/blink/renderer/platform/media/web_media_player_impl.cc
index e5e4b31..9539161 100644
--- a/third_party/blink/renderer/platform/media/web_media_player_impl.cc
+++ b/third_party/blink/renderer/platform/media/web_media_player_impl.cc
@@ -3761,7 +3761,7 @@
 void WebMediaPlayerImpl::RecordUnderflowDuration(base::TimeDelta duration) {
   DCHECK(demuxer_manager_->HasDataSource() ||
          GetDemuxerType() == media::DemuxerType::kChunkDemuxer ||
-         GetDemuxerType() == media::DemuxerType::kHlsDemuxer);
+         GetDemuxerType() == media::DemuxerType::kManifestDemuxer);
   WriteSplitHistogram<kPlaybackType | kEncrypted>(
       &base::UmaHistogramTimes, "Media.UnderflowDuration2", duration);
 }
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 46abae6..5f7b3fc 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -315,7 +315,6 @@
     },
     {
       name: "AnimationWorklet",
-      status: "experimental",
       base_feature: "none",
     },
     {
@@ -1147,6 +1146,12 @@
       status: "experimental",
       base_feature: "none",
     },
+    // `white-space` as a shorthand. crbug.com/1417543
+    {
+      name: "CSSWhiteSpaceShorthand",
+      depends_on: ["CSSTextWrap"],
+      status: "test",
+    },
     {
       name: "Database",
       public: true,
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests
index 5c7a06d9..bf89c777 100644
--- a/third_party/blink/web_tests/NeverFixTests
+++ b/third_party/blink/web_tests/NeverFixTests
@@ -1745,6 +1745,46 @@
 crbug.com/1267606 [ Mac11 ] wpt_internal/css/css-fonts/font-glyph-synthesis-mac.html [ Skip ]
 crbug.com/1267606 [ Mac11-arm64 ] wpt_internal/css/css-fonts/font-glyph-synthesis-mac.html [ Skip ]
 
+# The AnimationWorklet feature is not enabled for tests
+animations/animationworklet/* [ Skip ]
+external/wpt/animation-worklet/* [ Skip ]
+virtual/threaded/external/wpt/animation-worklet/* [ Skip ]
+external/wpt/content-security-policy/gen/top.http-rp/script-src-self/worklet-animation.https.html [ Skip ]
+external/wpt/content-security-policy/gen/top.http-rp/script-src-wildcard/worklet-animation.https.html [ Skip ]
+external/wpt/content-security-policy/gen/top.http-rp/worker-src-none/worklet-animation-import-data.https.html [ Skip ]
+external/wpt/content-security-policy/gen/top.http-rp/worker-src-none/worklet-animation.https.html [ Skip ]
+external/wpt/content-security-policy/gen/top.http-rp/worker-src-self/worklet-animation-import-data.https.html [ Skip ]
+external/wpt/content-security-policy/gen/top.http-rp/worker-src-self/worklet-animation.https.html [ Skip ]
+external/wpt/content-security-policy/gen/top.http-rp/worker-src-wildcard/worklet-animation-import-data.https.html [ Skip ]
+external/wpt/content-security-policy/gen/top.http-rp/worker-src-wildcard/worklet-animation.https.html [ Skip ]
+external/wpt/content-security-policy/gen/top.meta/script-src-self/worklet-animation.https.html [ Skip ]
+external/wpt/content-security-policy/gen/top.meta/script-src-wildcard/worklet-animation.https.html [ Skip ]
+external/wpt/content-security-policy/gen/top.meta/worker-src-none/worklet-animation-import-data.https.html [ Skip ]
+external/wpt/content-security-policy/gen/top.meta/worker-src-none/worklet-animation.https.html [ Skip ]
+external/wpt/content-security-policy/gen/top.meta/worker-src-self/worklet-animation-import-data.https.html [ Skip ]
+external/wpt/content-security-policy/gen/top.meta/worker-src-self/worklet-animation.https.html [ Skip ]
+external/wpt/content-security-policy/gen/top.meta/worker-src-wildcard/worklet-animation-import-data.https.html [ Skip ]
+external/wpt/content-security-policy/gen/top.meta/worker-src-wildcard/worklet-animation.https.html [ Skip ]
+external/wpt/mixed-content/gen/top.http-rp/opt-in/worklet-animation-import-data.https.html [ Skip ]
+external/wpt/mixed-content/gen/top.http-rp/opt-in/worklet-animation.https.html [ Skip ]
+external/wpt/mixed-content/gen/top.meta/opt-in/worklet-animation-import-data.https.html [ Skip ]
+external/wpt/mixed-content/gen/top.meta/opt-in/worklet-animation.https.html [ Skip ]
+external/wpt/mixed-content/gen/top.meta/unset/worklet-animation-import-data.https.html [ Skip ]
+external/wpt/mixed-content/gen/top.meta/unset/worklet-animation.https.html [ Skip ]
+external/wpt/upgrade-insecure-requests/gen/iframe-blank-inherit.meta/upgrade/worklet-animation-import-data.https.html [ Skip ]
+external/wpt/upgrade-insecure-requests/gen/iframe-blank-inherit.meta/upgrade/worklet-animation.https.html [ Skip ]
+external/wpt/upgrade-insecure-requests/gen/srcdoc-inherit.meta/upgrade/worklet-animation-import-data.https.html [ Skip ]
+external/wpt/upgrade-insecure-requests/gen/srcdoc-inherit.meta/upgrade/worklet-animation.https.html [ Skip ]
+external/wpt/upgrade-insecure-requests/gen/top.http-rp/upgrade/worklet-animation-import-data.https.html [ Skip ]
+external/wpt/upgrade-insecure-requests/gen/top.http-rp/upgrade/worklet-animation.https.html [ Skip ]
+external/wpt/upgrade-insecure-requests/gen/top.meta/upgrade/worklet-animation-import-data.https.html [ Skip ]
+external/wpt/upgrade-insecure-requests/gen/top.meta/upgrade/worklet-animation.https.html [ Skip ]
+external/wpt/worklets/animation-worklet-credentials.https.html [ Skip ]
+external/wpt/worklets/animation-worklet-csp.https.html [ Skip ]
+external/wpt/worklets/animation-worklet-import.https.html [ Skip ]
+external/wpt/worklets/animation-worklet-referrer.https.html [ Skip ]
+external/wpt/worklets/animation-worklet-service-worker-interception.https.html [ Skip ]
+
 # SwiftShader for WebGL is not available for ARM Macs
 crbug.com/1378476 [ Mac13-arm64 ] compositing/backface-visibility/backface-visibility-webgl.html [ Skip ]
 crbug.com/1378476 [ Mac12-arm64 ] compositing/backface-visibility/backface-visibility-webgl.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 3e4cca8..8000f81 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -28,6 +28,7 @@
 harness-tests/timeout.html [ Timeout ]
 fast/harness/sample-fail-mismatch-reftest.html [ Failure ]
 
+
 # Expected to fail.
 external/wpt/infrastructure/reftest/legacy/reftest_and_fail_0-ref.html [ Failure ]
 external/wpt/infrastructure/reftest/legacy/reftest_cycle_fail_0-ref.html [ Failure ]
@@ -2900,6 +2901,8 @@
 crbug.com/626703 [ Win ] virtual/partitioned-cookies/http/tests/inspector-protocol/network/disabled-cache-navigation.js [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 [ Linux ] virtual/view-transition/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-new.html [ Failure ]
+crbug.com/626703 [ Mac12 ] virtual/view-transition/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-new.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-counter-styles/hebrew/counter-hebrew-nested.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-counter-styles/japanese-formal/counter-japanese-formal.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-counter-styles/japanese-informal/counter-japanese-informal.html [ Failure ]
@@ -6505,6 +6508,12 @@
 
 crbug.com/1385413 media/controls/text-track-menu-pointer-selection.html [ Failure Pass Skip Timeout ]
 
+# Base URL for about:blank & about:srcdoc
+# The following test can pass/fail depending on whether the associate feature,
+# NewBaseUrlInheritanceBehavior, is enabled or not.
+crbug.com/1356658 external/wpt/html/infrastructure/urls/terminology-0/document-base-url-initiated-grand-parent.https.window.html [ Failure Pass ]
+crbug.com/1356658 virtual/no-auto-wpt-origin-isolation/external/wpt/html/infrastructure/urls/terminology-0/document-base-url-initiated-grand-parent.https.window.html [ Failure Pass ]
+
 # Sheriff 2022-11-17
 crbug.com/1385642 [ Linux ] external/wpt/css/css-values/calc-in-media-queries-with-mixed-units.html [ Failure Pass Skip Timeout ]
 crbug.com/1372166 fast/spatial-navigation/snav-div-scrollable-but-without-focusable-content.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index 44a0949..8fce85c9 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -1473,6 +1473,13 @@
        ]
       ],
       "crashtests": {
+       "content-visibility-transition-finished-001.html": [
+        "ef7fb001ed86b19b78eed0cdb45624c60b72372d",
+        [
+         null,
+         {}
+        ]
+       ],
        "first-line-and-inline-block.html": [
         "6d6c6605ee0486cd6329e2d81372ed25ad5d3f17",
         [
@@ -105749,6 +105756,19 @@
         {}
        ]
       ],
+      "empty-string-symbol.html": [
+       "7efea106f516406342a66e0cfe7d9b48c19b555b",
+       [
+        null,
+        [
+         [
+          "/css/css-counter-styles/counter-style-at-rule/empty-string-symbol-notref.html",
+          "!="
+         ]
+        ],
+        {}
+       ]
+      ],
       "fallback-cycle.html": [
        "2e63a3f4d4445f1b57b216446f8d4474ff5808b1",
        [
@@ -135637,6 +135657,32 @@
       ]
      ],
      "image-set": {
+      "image-set-calc-x-rendering-2.html": [
+       "b7c02fce25d45b9b0be8f673bc144a8b4a698450",
+       [
+        null,
+        [
+         [
+          "/css/css-images/image-set/reference/image-set-rendering-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "image-set-calc-x-rendering.html": [
+       "a5444fd76901a402578eaf54b28a4d0563f90a64",
+       [
+        null,
+        [
+         [
+          "/css/css-images/image-set/reference/image-set-rendering-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
       "image-set-conic-gradient-rendering.html": [
        "e4f426471a7e11fc935456fac7b71e173d846d38",
        [
@@ -199443,7 +199489,7 @@
      },
      "skewY": {
       "svg-skewy-001.html": [
-       "898e62411e45f36d3f7c305d8a82c4618dcfa33e",
+       "a5678f30fb42bae41e660ae56fffdb99f708546a",
        [
         null,
         [
@@ -199452,11 +199498,27 @@
           "=="
          ]
         ],
-        {}
+        {
+         "fuzzy": [
+          [
+           null,
+           [
+            [
+             0,
+             1
+            ],
+            [
+             0,
+             2
+            ]
+           ]
+          ]
+         ]
+        }
        ]
       ],
       "svg-skewy-006.html": [
-       "a4d6bdd90b33d4a89da6ed19af65b3a7f06a66c4",
+       "51d7b768973909f81726017bf522b4317999f3de",
        [
         null,
         [
@@ -199465,11 +199527,27 @@
           "=="
          ]
         ],
-        {}
+        {
+         "fuzzy": [
+          [
+           null,
+           [
+            [
+             0,
+             1
+            ],
+            [
+             0,
+             2
+            ]
+           ]
+          ]
+         ]
+        }
        ]
       ],
       "svg-skewy-011.html": [
-       "15f6208cf131623e1306e456c71a9c259e5c3fa4",
+       "89f0aa9e62ca59d3c71adddff5d04edd943ec591",
        [
         null,
         [
@@ -199478,11 +199556,27 @@
           "=="
          ]
         ],
-        {}
+        {
+         "fuzzy": [
+          [
+           null,
+           [
+            [
+             0,
+             1
+            ],
+            [
+             0,
+             2
+            ]
+           ]
+          ]
+         ]
+        }
        ]
       ],
       "svg-skewy-016.html": [
-       "ce22ab40b0075818cf69589beb0d4d60c1706018",
+       "fee2331f96e38f5d159f10e34c76831d7189b031",
        [
         null,
         [
@@ -199491,11 +199585,27 @@
           "=="
          ]
         ],
-        {}
+        {
+         "fuzzy": [
+          [
+           null,
+           [
+            [
+             0,
+             1
+            ],
+            [
+             0,
+             2
+            ]
+           ]
+          ]
+         ]
+        }
        ]
       ],
       "svg-skewy-021.html": [
-       "207bfa4c8f893880b3ac34966970e4b157820cd8",
+       "5905e79c0d0f11faf38466b705bf229316bdb1d4",
        [
         null,
         [
@@ -199504,7 +199614,23 @@
           "=="
          ]
         ],
-        {}
+        {
+         "fuzzy": [
+          [
+           null,
+           [
+            [
+             0,
+             1
+            ],
+            [
+             0,
+             2
+            ]
+           ]
+          ]
+         ]
+        }
        ]
       ],
       "svg-skewy-with-units.html": [
@@ -222419,19 +222545,6 @@
        {}
       ]
      ],
-     "content-with-clip-max-texture-size.html": [
-      "efd2a6922fe2b64639823db6736f3902c4519774",
-      [
-       null,
-       [
-        [
-         "/css/css-view-transitions/content-with-clip-max-texture-size-ref.html",
-         "=="
-        ]
-       ],
-       {}
-      ]
-     ],
      "content-with-clip-root.html": [
       "5acd847734db222b50ec2aeef1133e929c132b2d",
       [
@@ -222757,6 +222870,32 @@
        }
       ]
      ],
+     "fragmented-at-start-ignored.html": [
+      "3b8628cef45a4bc6c8c3a8faf2c6d04b50db2b68",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/fragmented-at-start-ignored-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "fragmented-during-transition-skips.html": [
+      "e872aa6124592c6b067cf7301f017a429f9b9c88",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/fragmented-during-transition-skips-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "hit-test-unpainted-element.html": [
       "68026edfb1f99237a9e905816ef0e424b5be1500",
       [
@@ -222909,6 +223048,666 @@
        {}
       ]
      ],
+     "massive-element-below-and-on-top-of-viewport-partially-onscreen-new.html": [
+      "9a00a62b7ae7c404f93db79f55be2df3e80b711d",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-new.html",
+           "/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            2
+           ],
+           [
+            0,
+            330
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html": [
+      "ed16ac5662343afb54b36ef5b4ec10acc15afaf3",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html",
+           "/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            2
+           ],
+           [
+            0,
+            330
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-below-viewport-offscreen-new.html": [
+      "b5c0d4e9aee3ecaabf06458abc06fe3d9ca41759",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-below-viewport-offscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-below-viewport-offscreen-new.html",
+           "/css/css-view-transitions/massive-element-below-viewport-offscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            3
+           ],
+           [
+            0,
+            950
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-below-viewport-offscreen-old.html": [
+      "6eeb85af3e3d412ed782e61a9f118adb83bbf7bf",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-below-viewport-offscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-below-viewport-offscreen-old.html",
+           "/css/css-view-transitions/massive-element-below-viewport-offscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            2
+           ],
+           [
+            0,
+            445
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-below-viewport-partially-onscreen-new.html": [
+      "54232ead6fe335fa2817e30cab46eb54e1cda749",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html",
+           "/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            2
+           ],
+           [
+            0,
+            330
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-below-viewport-partially-onscreen-old.html": [
+      "772720def1116c689bd405e1ab1511de6751d5b8",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-old.html",
+           "/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            2
+           ],
+           [
+            0,
+            445
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-left-of-viewport-offscreen-new.html": [
+      "d9d03d1e91998da52996cc3da182adcb9ff4b586",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-left-of-viewport-offscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-left-of-viewport-offscreen-new.html",
+           "/css/css-view-transitions/massive-element-left-of-viewport-offscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            2
+           ],
+           [
+            0,
+            330
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-left-of-viewport-offscreen-old.html": [
+      "7861e5c3b8cc74fb1e98140891599f964641a010",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-left-of-viewport-offscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-left-of-viewport-offscreen-old.html",
+           "/css/css-view-transitions/massive-element-left-of-viewport-offscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            3
+           ],
+           [
+            0,
+            330
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-left-of-viewport-partially-onscreen-new.html": [
+      "7c14cef2d0026abaf9663d10de6683e9ef620563",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-new.html",
+           "/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            2
+           ],
+           [
+            0,
+            330
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-left-of-viewport-partially-onscreen-old.html": [
+      "b586f96de9faa912d7cea63cb4e57853398c8c00",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-old.html",
+           "/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            3
+           ],
+           [
+            0,
+            330
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-on-top-of-viewport-offscreen-new.html": [
+      "f4a9f833df43d52938a1a249d57a3fd1324d515b",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-new.html",
+           "/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            6
+           ],
+           [
+            0,
+            920
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-on-top-of-viewport-offscreen-old.html": [
+      "a2eb0447bd096950561c998a8eee7fe4053ec356",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-old.html",
+           "/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            3
+           ],
+           [
+            0,
+            330
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-on-top-of-viewport-partially-onscreen-new.html": [
+      "764a311fc9699c884bebbc864d1abce82241ef11",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-new.html",
+           "/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            2
+           ],
+           [
+            0,
+            330
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-on-top-of-viewport-partially-onscreen-old.html": [
+      "cecefd8f587030bbfcc71a900edbc404e5eb831c",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-old.html",
+           "/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            3
+           ],
+           [
+            0,
+            330
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-right-and-left-of-viewport-partially-onscreen-new.html": [
+      "b1bae1c09b67d9abb465a3d96dcd082a50578e08",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-new.html",
+           "/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            2
+           ],
+           [
+            0,
+            330
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-right-and-left-of-viewport-partially-onscreen-old.html": [
+      "c878ce881ec5ad51fee148a371c5227de2ed5d4f",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-old.html",
+           "/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            2
+           ],
+           [
+            0,
+            330
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-right-of-viewport-offscreen-new.html": [
+      "91b133f2cf30f802f90973caf919af9788cb7078",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-right-of-viewport-offscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-right-of-viewport-offscreen-new.html",
+           "/css/css-view-transitions/massive-element-right-of-viewport-offscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            2
+           ],
+           [
+            0,
+            445
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-right-of-viewport-offscreen-old.html": [
+      "164ff05f931e9e41177352ba74016e5b49e29043",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-right-of-viewport-offscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-right-of-viewport-offscreen-old.html",
+           "/css/css-view-transitions/massive-element-right-of-viewport-offscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            3
+           ],
+           [
+            0,
+            445
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-right-of-viewport-partially-onscreen-new.html": [
+      "b63ed0722525a2669da67d38d4e329d47209d153",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-new.html",
+           "/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            2
+           ],
+           [
+            0,
+            330
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
+     "massive-element-right-of-viewport-partially-onscreen-old.html": [
+      "cf090e0ab4c19e10e9c11fc2ce13c7db3836d5a4",
+      [
+       null,
+       [
+        [
+         "/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "fuzzy": [
+         [
+          [
+           "/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-old.html",
+           "/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-ref.html",
+           "=="
+          ],
+          [
+           [
+            0,
+            3
+           ],
+           [
+            0,
+            445
+           ]
+          ]
+         ]
+        ]
+       }
+      ]
+     ],
      "named-element-with-fix-pos-child-new.html": [
       "8a552b03a5ec5d4f3c8c84433023faeb5130116d",
       [
@@ -241099,6 +241898,19 @@
        {}
       ]
      ],
+     "mq-calc-resolution.html": [
+      "da649eb753f4ca0b1854147fe233c2ab966d3520",
+      [
+       null,
+       [
+        [
+         "/css/reference/ref-filled-green-100px-square.xht",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "mq-case-insensitive-001.html": [
       "c851662343dcfcff5a0d39d37d849f9e0ff8c667",
       [
@@ -241794,6 +242606,19 @@
        {}
       ]
      ],
+     "offset-path-ray-010.html": [
+      "d10afe1ab158f0f1b195742ab7b1cc9b09bcf43e",
+      [
+       null,
+       [
+        [
+         "/css/motion/offset-path-ray-001-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "offset-path-ray-contain-001.html": [
       "83e169298fa9f582e6c052c760a37a3b4cd66964",
       [
@@ -254874,6 +255699,19 @@
         {}
        ]
       ],
+      "popover-and-svg.html": [
+       "c5e8bb42a876ee57982f21fd968c261eb108f37e",
+       [
+        null,
+        [
+         [
+          "/html/semantics/popovers/popover-and-svg-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
       "popover-appearance.html": [
        "e9050bdeb9ddc2215bb91d0fc5c7cd6bf6c83365",
        [
@@ -266532,11 +267370,11 @@
   "support": {
    ".cache": {
     "gitignore2.json": [
-     "59fd380c2fe9369d66270c0b27cd7dc6d496dec5",
+     "ae51dd543eb97d7a48569fb96d6cbb36e951682f",
      []
     ],
     "mtime.json": [
-     "d3a3571dd7fd0cef7e2c9d5da342e87e724bb0b1",
+     "5ec44b1ac823445d2b36626e0e62ca841f1aaf5d",
      []
     ]
    },
@@ -266808,7 +267646,7 @@
      []
     ],
     "back-forward-cache-open-connection.window.js.ini": [
-     "e9ec6bf98544bbbf3bf03b0aca3ccbfdef063eb6",
+     "2e5b648c4e75b94fe85accbf7b71f025b55e4862",
      []
     ],
     "back-forward-cache-open-transaction.window.js.ini": [
@@ -267733,16 +268571,40 @@
      "88e7d924aa67645938190a6570f5026233779702",
      []
     ],
+    "animate-multiple-effects-on-different-targets-via-main-thread.https.html.ini": [
+     "3965f1e032aeba9ebd0a04460da0f35fb717e04d",
+     []
+    ],
+    "animate-non-accelerated-property.https.html.ini": [
+     "9eaa6924f8ad097c18bc155cd229dae7de8763c4",
+     []
+    ],
+    "animation-worklet-inside-iframe.https.html.ini": [
+     "d2fc442462400bf621b606ea13a7cfe28d585417",
+     []
+    ],
+    "animator-with-options.https.html.ini": [
+     "960b25584fbfdfed6befad8ef8ba2209ae1b0a48",
+     []
+    ],
+    "cancel-non-accelerated-property.https.html.ini": [
+     "bd9a0b08a05c5791c429436e394da9e450d279f7",
+     []
+    ],
     "common.js": [
      "ceb430b718b8438c933071b1dd24240ab13bf562",
      []
     ],
+    "current-time.https.html.ini": [
+     "24e7605278ebc9884a14ddd109fd87e15a7793d1",
+     []
+    ],
     "idlharness.any-expected.txt": [
      "ad3fd85c811ef1e37e3cab0638777f8c8156a8c9",
      []
     ],
     "idlharness.any.js.ini": [
-     "ffa2e4b43d1cf84188880b580b867e20e49bd965",
+     "00a012aa962ba962aace647592e65702a3380425",
      []
     ],
     "idlharness.any.worker-expected.txt": [
@@ -267750,11 +268612,15 @@
      []
     ],
     "inactive-timeline.https.html.ini": [
-     "106c4b522809618f35b116c63cad7bcdff2e0f9a",
+     "4b906bd2342559934cecd2265ed3a07016d40d4b",
+     []
+    ],
+    "multiple-effects-on-same-target-driven-by-individual-local-time.https.html.ini": [
+     "d2d3b4e093b5f833f3bcd47283f13eb715fccf01",
      []
     ],
     "playback-rate.https.html.ini": [
-     "95b3d38bfbbf8274b43d12052de9fff87d5482ed",
+     "25886b86f7e0cbda307f2d631977ec28128633c2",
      []
     ],
     "references": {
@@ -267778,25 +268644,109 @@
      ]
     },
     "scroll-timeline-writing-modes.https.html.ini": [
-     "72204df6de3ef6b64726246dba4437a97b156b42",
+     "0d6dd8a501192020fc32e07fd1c8f1dc928863e0",
+     []
+    ],
+    "stateful-animator.https.html.ini": [
+     "6e22ffb624994bc5d84bf1e98c5464b6606a7320",
+     []
+    ],
+    "worklet-animation-animator-name.https.html.ini": [
+     "600f5c9c96846435e106ed526b2c471e38a6b69e",
+     []
+    ],
+    "worklet-animation-cancel.https.html.ini": [
+     "8eabd72c233dd8cd7c513c9c1de8c9a8e4f0d47b",
      []
     ],
     "worklet-animation-creation.https.html.ini": [
-     "cff9ef9b43ace0330c5fdb882e118bfe7454a01f",
+     "e3a37fa10c1b2d5f4d89a7f67a1253abcc46b06c",
+     []
+    ],
+    "worklet-animation-duration.https.html.ini": [
+     "beabec8056c26b7c09747b87e0f12cdcf75eec7f",
+     []
+    ],
+    "worklet-animation-get-computed-timing-progress-on-worklet-thread.https.html.ini": [
+     "a5ede0a232a8a5250d9daee914acc9cc5938f9c5",
+     []
+    ],
+    "worklet-animation-get-timing-on-worklet-thread.https.html.ini": [
+     "694e0daad472d21ac89b534b40fe3adf3805f104",
+     []
+    ],
+    "worklet-animation-local-time-after-duration.https.html.ini": [
+     "59a7fc77ce65da47355b4c99fa7dca2060b7745c",
+     []
+    ],
+    "worklet-animation-local-time-before-start.https.html.ini": [
+     "d0f0108c678ec80a12b355561dd3573b7752c37e",
+     []
+    ],
+    "worklet-animation-local-time-null-1.https.html.ini": [
+     "9e229ba9508ebe81d3c8bf4adea85ce700692ec6",
      []
     ],
     "worklet-animation-local-time-null-2-ref.html": [
      "3b7a2b9258d0c2a210aaa389fadc3787c0da93a5",
      []
     ],
+    "worklet-animation-local-time-null-2.https.html.ini": [
+     "c5c79208424782f15542cfeeb81c92e4f76affed",
+     []
+    ],
+    "worklet-animation-pause-immediately.https.html.ini": [
+     "273789f178050837e8ab73b3b1aeb52004cba70f",
+     []
+    ],
+    "worklet-animation-pause-resume.https.html.ini": [
+     "fabe0e00bcd4541754e02d248e75930ce2e7b502",
+     []
+    ],
+    "worklet-animation-pause.https.html.ini": [
+     "7882feee373db03ceee82abf125e296ef7029307",
+     []
+    ],
+    "worklet-animation-play.https.html.ini": [
+     "52d94ab26e555672c85e1c924d14cd7c4c6cf1e9",
+     []
+    ],
+    "worklet-animation-set-keyframes.https.html.ini": [
+     "ab47701defc9dc085436ade5e894e0e9569f3fab",
+     []
+    ],
+    "worklet-animation-set-timing.https.html.ini": [
+     "8af5ed5e6b90632ca37aaddaa15afdedfa9d604a",
+     []
+    ],
     "worklet-animation-start-delay-ref.html": [
      "efef6f842bf0f9d3ce05e6335a3f48d17e625167",
      []
     ],
+    "worklet-animation-start-delay.https.html.ini": [
+     "e09e9ac0c985fe907ab4a71610793ee587506978",
+     []
+    ],
+    "worklet-animation-with-effects-from-different-frames.https.html.ini": [
+     "7286082a4a5eca1af9843e683d37a71db5087e57",
+     []
+    ],
+    "worklet-animation-with-fill-mode.https.html.ini": [
+     "a6da9e7f7f1086dde59c0a6ce5095d732f5a60aa",
+     []
+    ],
+    "worklet-animation-with-invalid-effect.https.html.ini": [
+     "1b77811cad07f06fd4903bf3931b5d44c1b35ca2",
+     []
+    ],
     "worklet-animation-with-non-ascii-name-ref.html": [
      "012f6f9d510581f577d8794f31badecb863d0698",
      []
     ],
+    "worklet-animation-with-non-ascii-name.https.html.ini": [
+     "9fb75aeadb011deeaa594381fb1d23e7fc360199",
+     []
+    ],
     "worklet-animation-with-scroll-timeline-and-display-none.https.html.ini": [
      "22f6836010cb659c3272f499864444a13e659600",
      []
@@ -267824,6 +268774,10 @@
     "worklet-animation-with-scroll-timeline.https.html.ini": [
      "f5cc24c01e5e5e1b3879dcaaaf49cb23732c0fbf",
      []
+    ],
+    "worklet-animation-without-target.https.html.ini": [
+     "84cb4f29127a941f5908df676debd36a79cd324b",
+     []
     ]
    },
    "apng": {
@@ -268578,11 +269532,11 @@
      []
     ],
     "setSinkId-with-selectAudioOutput.https-expected.txt": [
-     "ddce6a9a9c68b3ee891b3ddc18ed52a62cb43f21",
+     "d72718065a3b607c7704745b9f093e43d7aa3788",
      []
     ],
     "setSinkId-with-selectAudioOutput.https.html.ini": [
-     "5ebb9ef6b4e7c87be6381e0602c6e8ad89cb639a",
+     "f5a88c81ab9b325119094124210bb9e82b887177",
      []
     ],
     "setSinkId.https-expected.txt": [
@@ -271261,7 +272215,7 @@
         []
        ],
        "worklet-animation.https.html.ini": [
-        "acb0cff14e0d8794a4b5623378a59f340ebd7252",
+        "56956467bb0a7e471cd561fd38672be9515fa773",
         []
        ],
        "worklet-audio-import-data.https-expected.txt": [
@@ -271426,6 +272380,10 @@
         "cbc7a1b54f7ad52e9d6ae924483c040104f881af",
         []
        ],
+       "worklet-animation.https.html.ini": [
+        "b86a23f746cb3ff2f8ca33d95c23cdad2bddfa0b",
+        []
+       ],
        "worklet-audio-import-data.https-expected.txt": [
         "e758ba1ff0e4542079755b67f4ff73e75e525ec9",
         []
@@ -271552,10 +272510,18 @@
         "c75aa51ab414505f610344c00f899c6f8204827b",
         []
        ],
+       "worklet-animation-import-data.https.html.ini": [
+        "d07fb3b5f355ba6c2421cdbb47869d7b9b65fb13",
+        []
+       ],
        "worklet-animation.https.html.headers": [
         "c75aa51ab414505f610344c00f899c6f8204827b",
         []
        ],
+       "worklet-animation.https.html.ini": [
+        "b86a23f746cb3ff2f8ca33d95c23cdad2bddfa0b",
+        []
+       ],
        "worklet-audio-import-data.https.html.headers": [
         "c75aa51ab414505f610344c00f899c6f8204827b",
         []
@@ -271690,10 +272656,18 @@
         "d55f863f727274371606d214d792b9dba0c3dabc",
         []
        ],
+       "worklet-animation-import-data.https.html.ini": [
+        "d07fb3b5f355ba6c2421cdbb47869d7b9b65fb13",
+        []
+       ],
        "worklet-animation.https.html.headers": [
         "d55f863f727274371606d214d792b9dba0c3dabc",
         []
        ],
+       "worklet-animation.https.html.ini": [
+        "b86a23f746cb3ff2f8ca33d95c23cdad2bddfa0b",
+        []
+       ],
        "worklet-audio-import-data.https.html.headers": [
         "d55f863f727274371606d214d792b9dba0c3dabc",
         []
@@ -271796,10 +272770,18 @@
         "59e5c0fc4a31a4b09f371fa1a504c16127a32f73",
         []
        ],
+       "worklet-animation-import-data.https.html.ini": [
+        "d07fb3b5f355ba6c2421cdbb47869d7b9b65fb13",
+        []
+       ],
        "worklet-animation.https.html.headers": [
         "59e5c0fc4a31a4b09f371fa1a504c16127a32f73",
         []
        ],
+       "worklet-animation.https.html.ini": [
+        "b86a23f746cb3ff2f8ca33d95c23cdad2bddfa0b",
+        []
+       ],
        "worklet-audio-import-data.https.html.headers": [
         "59e5c0fc4a31a4b09f371fa1a504c16127a32f73",
         []
@@ -271873,7 +272855,7 @@
         []
        ],
        "worklet-animation.https.html.ini": [
-        "acb0cff14e0d8794a4b5623378a59f340ebd7252",
+        "56956467bb0a7e471cd561fd38672be9515fa773",
         []
        ],
        "worklet-audio-import-data.https-expected.txt": [
@@ -271934,6 +272916,10 @@
         "0047e9e5edb3ab404f73829e00127146226c9625",
         []
        ],
+       "worklet-animation.https.html.ini": [
+        "b86a23f746cb3ff2f8ca33d95c23cdad2bddfa0b",
+        []
+       ],
        "worklet-audio-import-data.https-expected.txt": [
         "e758ba1ff0e4542079755b67f4ff73e75e525ec9",
         []
@@ -271959,6 +272945,16 @@
         []
        ]
       },
+      "worker-src-none": {
+       "worklet-animation-import-data.https.html.ini": [
+        "d07fb3b5f355ba6c2421cdbb47869d7b9b65fb13",
+        []
+       ],
+       "worklet-animation.https.html.ini": [
+        "b86a23f746cb3ff2f8ca33d95c23cdad2bddfa0b",
+        []
+       ]
+      },
       "worker-src-self": {
        "sharedworker-import.http-expected.txt": [
         "fb8ef57e1a22bc4734099d0f3a9390130c7bf91f",
@@ -271991,6 +272987,24 @@
        "worker-import.https.html.ini": [
         "4d114e48ff74395c73e9eeb3301da7754225577b",
         []
+       ],
+       "worklet-animation-import-data.https.html.ini": [
+        "d07fb3b5f355ba6c2421cdbb47869d7b9b65fb13",
+        []
+       ],
+       "worklet-animation.https.html.ini": [
+        "b86a23f746cb3ff2f8ca33d95c23cdad2bddfa0b",
+        []
+       ]
+      },
+      "worker-src-wildcard": {
+       "worklet-animation-import-data.https.html.ini": [
+        "d07fb3b5f355ba6c2421cdbb47869d7b9b65fb13",
+        []
+       ],
+       "worklet-animation.https.html.ini": [
+        "b86a23f746cb3ff2f8ca33d95c23cdad2bddfa0b",
+        []
        ]
       }
      }
@@ -272891,7 +273905,7 @@
       []
      ],
      "blockeduri-inline-expected.txt": [
-      "9c3089f228f40e6668ae914dc5c56ab2042f590f",
+      "bdc8d6be948af6ce2ba1d14da4b75210637b28ac",
       []
      ],
      "blockeduri-inline.html.ini": [
@@ -282056,18 +283070,10 @@
      }
     },
     "css-anchor-position": {
-     "anchor-default-basics.html.ini": [
-      "d652ce94c54a6f158f5ae79778b70d663c7639f4",
-      []
-     ],
      "anchor-default-ref.html": [
       "4d7de12447c8297b8f0fc04338d80a028a3e9798",
       []
      ],
-     "anchor-name-basics.html.ini": [
-      "aba97000ea7f2242c2cc02dc361bdd2a3aa49538",
-      []
-     ],
      "anchor-position-top-layer-ref.html": [
       "dc7f77f2b3441ebee25f3e40a9480b668ee79ea4",
       []
@@ -282112,10 +283118,6 @@
       "4f3fe39eed570ad07ac3bbd3dace1d25d862999e",
       []
      ],
-     "position-fallback-basics.html.ini": [
-      "f4fce0703ae73e9f8154d864bdb0916f448c4d4c",
-      []
-     ],
      "reference": {
       "anchor-scroll-fixedpos-ref.html": [
        "e73354df72dac33f7a94eaef445e80ec61e3976a",
@@ -283306,6 +284308,10 @@
       "75f7985aa4a9361078c05429b7975c3bf81c77cf",
       []
      ],
+     "border-radius-clip-001.html.ini": [
+      "d7b1866b5f11ed9b40c27d7a9969ce42045ff84a",
+      []
+     ],
      "border-radius-clip-002.htm.ini": [
       "88dc9deb8aa0c0518634ec0ffcd7864a61bc8837",
       []
@@ -285755,12 +286761,28 @@
       []
      ],
      "parsing": {
+      "color-computed-color-function-expected.txt": [
+       "4e364819be3363382fe7f1b3508a53451151dff1",
+       []
+      ],
+      "color-computed-color-function.html.ini": [
+       "94394117c0c298d5f1bcd083d2b7118381da7d8a",
+       []
+      ],
+      "color-computed-color-mix-function-expected.txt": [
+       "99139ad99774438ab4d45bbd88a6beaad33e869f",
+       []
+      ],
+      "color-computed-color-mix-function.html.ini": [
+       "41595c07163a24a6c7d661b412c040e18992533c",
+       []
+      ],
       "color-computed-lab-expected.txt": [
-       "7d4cde8e3a678b16c9f7f08f7d23cea29b2b713d",
+       "fd32956f7b75264000c071f30202215f884d0467",
        []
       ],
       "color-computed-lab.html.ini": [
-       "0b52cae9bb1c8c548f7ed0e56b02878d8eac6bdf",
+       "8424efcb7a44a8cecbe36a06686a0372b8026c34",
        []
       ],
       "color-computed-relative-color-expected.txt": [
@@ -285771,6 +286793,14 @@
        "cd52a07975a7b0d3aaba0c37a1d2f8eef7b47142",
        []
       ],
+      "color-valid-color-function-expected.txt": [
+       "4291b9eb9b75e10ab464860a8f8956629d731689",
+       []
+      ],
+      "color-valid-color-function.html.ini": [
+       "33800d7c772a48244e5f89ab91872896823b1d01",
+       []
+      ],
       "color-valid-color-mix-function-expected.txt": [
        "c763f87ab3d82da77f865ef6532ec200d6ef5d22",
        []
@@ -285780,11 +286810,11 @@
        []
       ],
       "color-valid-lab-expected.txt": [
-       "d41facc992652d5766bf20bd808d050ee7102982",
+       "ef7c8e51f0e021e17081ef44c12d7fb9f482af11",
        []
       ],
       "color-valid-lab.html.ini": [
-       "a9e44253ed847993bb514449302bf6cabda21bc1",
+       "4b82e720c3649ddc0629473d799515a3b751311b",
        []
       ],
       "color-valid-relative-color-expected.txt": [
@@ -287805,6 +288835,10 @@
        "95da656cfc89158953ad33da7757c4d86168fdd3",
        []
       ],
+      "empty-string-symbol-notref.html": [
+       "7d0dbc3314d8379deb597d08e97804cfc51aa4ab",
+       []
+      ],
       "fallback-cycle-ref.html": [
        "22bcf8d9b4ef3963020b3e834c893756426df412",
        []
@@ -301791,14 +302825,6 @@
       []
      ],
      "image-set": {
-      "image-set-parsing-expected.txt": [
-       "02729359d0fb33db5e122ce19a24c652b58ecbc6",
-       []
-      ],
-      "image-set-parsing.html.ini": [
-       "7ab4fb4e4b6d43c4c3297387fd8dac590ccb4abb",
-       []
-      ],
       "image-set-resolution-001-ref.html": [
        "46c4d729ed59525b1a138f1f60aa6e6074251211",
        []
@@ -308706,14 +309732,6 @@
       "6a1d5036693e054d22fc94b47401227961a6b2f6",
       []
      ],
-     "registered-property-computation-expected.txt": [
-      "b5ca1975fbaa5fbf770b0e2b058ba67d25b35ad4",
-      []
-     ],
-     "registered-property-computation.html.ini": [
-      "ccc985a5a543202804995361f3f4b8711ec7b60f",
-      []
-     ],
      "registered-property-cssom.html.ini": [
       "d1d9acd1e5c11785ce2e48d47549947ef16b7eab",
       []
@@ -311078,6 +312096,10 @@
         "a95f6092dd032d894f68fea2bdc625ffbc9f7b8d",
         []
        ],
+       "shape-image-015.html.ini": [
+        "e406e2475bc24243cff8e192f4e9932c18c06e55",
+        []
+       ],
        "shape-image-018.html.ini": [
         "36b41ba3e33f2b9dea290e76bda87d797c793ce7",
         []
@@ -316786,7 +317808,7 @@
        []
       ],
       "text-transform-capitalize-016.html.ini": [
-       "38beba6e5cb6fa31f957f18a03e4d18288c7ed19",
+       "76a85b163aac3061e477a882d92419275450dbca",
        []
       ],
       "text-transform-capitalize-018.html.ini": [
@@ -322112,7 +323134,7 @@
        ],
        "resources": {
         "testsuite.js": [
-         "9708c5c04fc2510c730a5e1d9aca4eab0aed4ba4",
+         "cecd72ad927cfe239da62b01a2cb31c44c2ec7a0",
          []
         ]
        },
@@ -322527,6 +323549,10 @@
        "98578348b16a63fb19f718b1b4c8ee2cf87e6d7a",
        []
       ],
+      "kind-of-widget-fallback-color-input-border-inline-start-color-001.html.ini": [
+       "45c8c10b3d50fa0e7946ee1871f7d6e2d14f2b92",
+       []
+      ],
       "kind-of-widget-fallback-color-input-border-left-width-001.html.ini": [
        "790ec0a2515cffe6f8324353c2a9273a6a1ebb11",
        []
@@ -322595,6 +323621,10 @@
        "14b26723f548de962341d22594eefaf841cec560",
        []
       ],
+      "kind-of-widget-fallback-input-search-background-image-001.html.ini": [
+       "3ae7a3be48e0c50654746f65314e5f406e60672b",
+       []
+      ],
       "kind-of-widget-fallback-input-search-background-position-001.html.ini": [
        "99cd283bfdd9382c317c638a2dc731fb7e36e95e",
        []
@@ -322603,6 +323633,10 @@
        "7f0c55c56c12ea30869cc5b0b212ebfbaa31640f",
        []
       ],
+      "kind-of-widget-fallback-input-search-border-bottom-width-001.html.ini": [
+       "9e2554135851da64342ee914bb18d9a08426b423",
+       []
+      ],
       "kind-of-widget-fallback-input-search-border-inline-end-color-001.html.ini": [
        "dbf844d8a232c38cc9f7ff90a55a606891b2a91e",
        []
@@ -322639,6 +323673,10 @@
        "f57dc9971a753fc62dbe453c8256c6e759225333",
        []
       ],
+      "kind-of-widget-fallback-input-search-text-border-block-start-style-001.html.ini": [
+       "80288c76e7432b63b0a724c0bb92ff11f9f6c982",
+       []
+      ],
       "kind-of-widget-fallback-input-search-text-border-block-start-width-001.html.ini": [
        "a77c2a52473f072692f12cb1890ce62b405e519d",
        []
@@ -322711,6 +323749,10 @@
        "1f62c4d2d0edc40f5732899f3a7fc88802de575c",
        []
       ],
+      "kind-of-widget-fallback-input-submit-border-end-end-radius-001.html.ini": [
+       "1b2c05ec9c382ccf8393e5320fc0a5827c88ab81",
+       []
+      ],
       "kind-of-widget-fallback-input-submit-border-end-start-radius-001.html.ini": [
        "0a103751c35f49aefdaf0284d14ae70ecf9c3907",
        []
@@ -322847,6 +323889,10 @@
        "ee737becadbdfae290cdb1d571146cff26e9cce7",
        []
       ],
+      "kind-of-widget-fallback-input-text-border-top-color-001.html.ini": [
+       "ba05f649f0ed735eaaec24e14f887181dcc6022a",
+       []
+      ],
       "kind-of-widget-fallback-input-text-border-top-left-radius-001.html.ini": [
        "9916c48e0e4a60a7ff447d366fc874dc8d470308",
        []
@@ -324486,14 +325532,6 @@
       "bbd995d7f1c39e3bc7338ca9fd4c73a77e148da4",
       []
      ],
-     "calc-infinity-nan-serialize-angle-expected.txt": [
-      "3dfd64ddf2dda313347848c41af2b86a03b2f03f",
-      []
-     ],
-     "calc-infinity-nan-serialize-angle.html.ini": [
-      "95ef8232642319972990848365b3fc614c48d98b",
-      []
-     ],
      "calc-infinity-nan-serialize-length-expected.txt": [
       "56ac7eedc3014f41277191537c026a91971e6f88",
       []
@@ -324503,19 +325541,11 @@
       []
      ],
      "calc-infinity-nan-serialize-resolution-expected.txt": [
-      "65aeaea55f04143f50c89b3ced8b1977a7fef19a",
+      "db917e137f05618d76c99427baf65e461021e799",
       []
      ],
      "calc-infinity-nan-serialize-resolution.html.ini": [
-      "10fd5f24b0b7e03c53b9dbbaf5c95cbf995e9e64",
-      []
-     ],
-     "calc-infinity-nan-serialize-time-expected.txt": [
-      "43afde95b517c8dc93cce4ce80feb453c669f765",
-      []
-     ],
-     "calc-infinity-nan-serialize-time.html.ini": [
-      "eaa5df0674e621dd80219c70678fe9e79b30d41b",
+      "26ac406e8466e7194850b11b29e39da864fdd939",
       []
      ],
      "calc-margin-block-1-ref.html": [
@@ -325344,14 +326374,6 @@
       "49be5f6b0ebc4e1d6081814a563c3655765a8536",
       []
      ],
-     "content-with-clip-max-texture-size-ref.html": [
-      "55c95da77216774455cd6c229164e21e4f0d0aa9",
-      []
-     ],
-     "content-with-clip-max-texture-size.html.ini": [
-      "fcf9ccfb30a64c2fc26571d9e0d43cb4e8d7cafa",
-      []
-     ],
      "content-with-clip-ref.html": [
       "28d8733e27addde11904cd55485bc0a850a5f602",
       []
@@ -325488,6 +326510,22 @@
       "0060853bb7d87d4acdcfb304e736382c57701e6d",
       []
      ],
+     "fragmented-at-start-ignored-ref.html": [
+      "626e03d012f7c84b4130350b9cbe0745090174c3",
+      []
+     ],
+     "fragmented-at-start-ignored.html.ini": [
+      "fa1abd0e107cd2538f6e47a6287fccac1a91d867",
+      []
+     ],
+     "fragmented-during-transition-skips-ref.html": [
+      "269a6a2b9a8e85629048597f8c7a0148de8e9698",
+      []
+     ],
+     "fragmented-during-transition-skips.html.ini": [
+      "80532945efecf12e5f9fef6b0e1c4339ce00a9a6",
+      []
+     ],
      "hit-test-unpainted-element-from-point.html.ini": [
       "2277d0be4503e6d50622e49de4316a26791b22cf",
       []
@@ -325536,8 +326574,8 @@
       "577914ebca4ad7a024798cba01099a97a5a7f48d",
       []
      ],
-     "input-blocked-when-rendering-suppressed.html.ini": [
-      "7deeaa4a9925db0c1acbe3070a80eab78ac02cfb",
+     "input-targets-root-while-render-blocked.html.ini": [
+      "5c4987942870c5b39ae1b502f6277fda896e74e7",
       []
      ],
      "intrinsic-aspect-ratio-ref.html": [
@@ -325552,6 +326590,126 @@
       "634fd7c42806533c1ed8ec5733e57eaf89a1a3ca",
       []
      ],
+     "massive-element-below-and-on-top-of-viewport-partially-onscreen-new.html.ini": [
+      "d6a78a89b9b0958f1ac501a752ec52637164f690",
+      []
+     ],
+     "massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html.ini": [
+      "82ebd0604cbce5c296a12988e28b200bb618e5c3",
+      []
+     ],
+     "massive-element-below-and-on-top-of-viewport-partially-onscreen-ref.html": [
+      "507f9b8c0a14bc635d0f7399a08397d467f89261",
+      []
+     ],
+     "massive-element-below-viewport-offscreen-new.html.ini": [
+      "44460c43ce3b1a660a75f59f6c9c821eb00994b3",
+      []
+     ],
+     "massive-element-below-viewport-offscreen-old.html.ini": [
+      "d48fa31e5a70692b10bb45efc60c4c0baca6e083",
+      []
+     ],
+     "massive-element-below-viewport-offscreen-ref.html": [
+      "05827eb196bef8f1d35aa489e73173a319946c17",
+      []
+     ],
+     "massive-element-below-viewport-partially-onscreen-new.html.ini": [
+      "ae424b0e758a4885c7da29f3c56c782237c4f124",
+      []
+     ],
+     "massive-element-below-viewport-partially-onscreen-old.html.ini": [
+      "6c6a41c4d06a185f02aaa8c6ad0e7b7bbf2725d3",
+      []
+     ],
+     "massive-element-below-viewport-partially-onscreen-ref.html": [
+      "001c135f0a68ca6fbec1d5d90a04948d279cdd86",
+      []
+     ],
+     "massive-element-left-of-viewport-offscreen-new.html.ini": [
+      "475e93d0e067a86e8103fddff97806287a11560d",
+      []
+     ],
+     "massive-element-left-of-viewport-offscreen-old.html.ini": [
+      "14c19b84beee8306358c407756350746aab1ec5a",
+      []
+     ],
+     "massive-element-left-of-viewport-offscreen-ref.html": [
+      "32e688bbdb6047e6d6e57f2b7bef93049d5a6638",
+      []
+     ],
+     "massive-element-left-of-viewport-partially-onscreen-new.html.ini": [
+      "0bf5e9d1df0fda3504dfb54112365f15a36b8844",
+      []
+     ],
+     "massive-element-left-of-viewport-partially-onscreen-old.html.ini": [
+      "0320d6ac382e92f15a53bca89dddb1cca6522d66",
+      []
+     ],
+     "massive-element-left-of-viewport-partially-onscreen-ref.html": [
+      "8fa30505353ab092479bda263c04d54aa0e3f88e",
+      []
+     ],
+     "massive-element-on-top-of-viewport-offscreen-new.html.ini": [
+      "d2463066afb90227c532b16203968feb0eb13118",
+      []
+     ],
+     "massive-element-on-top-of-viewport-offscreen-old.html.ini": [
+      "c6dde51fda4f81820d3839c8142f87f616f8b684",
+      []
+     ],
+     "massive-element-on-top-of-viewport-offscreen-ref.html": [
+      "e8359077386bbc99bdf8cfd57b58446dd3e64838",
+      []
+     ],
+     "massive-element-on-top-of-viewport-partially-onscreen-new.html.ini": [
+      "d63a8b63838c3d81d1b7019b5e24d0a3063fdd39",
+      []
+     ],
+     "massive-element-on-top-of-viewport-partially-onscreen-old.html.ini": [
+      "db950227f73046d6f172938931ea69ddd0a4b3e2",
+      []
+     ],
+     "massive-element-on-top-of-viewport-partially-onscreen-ref.html": [
+      "9c60e8bf1de309b17f27a4e42f2694f84ae531d3",
+      []
+     ],
+     "massive-element-right-and-left-of-viewport-partially-onscreen-new.html.ini": [
+      "944b8d9d279ff529d8d834e45fde5bee1d0304b5",
+      []
+     ],
+     "massive-element-right-and-left-of-viewport-partially-onscreen-old.html.ini": [
+      "7de3347659e0cdeb45b1835bb3fd79ed8922050d",
+      []
+     ],
+     "massive-element-right-and-left-of-viewport-partially-onscreen-ref.html": [
+      "3516741da0803b7ee0e8efc9049c92225a765b21",
+      []
+     ],
+     "massive-element-right-of-viewport-offscreen-new.html.ini": [
+      "b34c5f02f8d0dd6d8a9a8f8efa434da9687d2194",
+      []
+     ],
+     "massive-element-right-of-viewport-offscreen-old.html.ini": [
+      "119e663e8a7a5cb2298d6e22800a8a69f889a31a",
+      []
+     ],
+     "massive-element-right-of-viewport-offscreen-ref.html": [
+      "f29d3ac6090c8f66740037c364d0829cfbf9a0da",
+      []
+     ],
+     "massive-element-right-of-viewport-partially-onscreen-new.html.ini": [
+      "1e8ad359ea8786be694eec91376563fea65559c0",
+      []
+     ],
+     "massive-element-right-of-viewport-partially-onscreen-old.html.ini": [
+      "23db6caeac729999212bb89771738381e53e85a3",
+      []
+     ],
+     "massive-element-right-of-viewport-partially-onscreen-ref.html": [
+      "1df26bb375248b014906c54efb426f2cf4bf9035",
+      []
+     ],
      "mix-blend-mode-only-on-transition.html.ini": [
       "003683ce86eeac5e199ab26f49a2aa75069f1938",
       []
@@ -325565,7 +326723,7 @@
       []
      ],
      "named-element-with-fix-pos-child-ref.html": [
-      "c1159f8e2cbc710a78e3ddc04d82e45cc6a9656c",
+      "a161cd8fc9a6a78b4070eae00544de2f3ff7ca44",
       []
      ],
      "new-and-old-sizes-match-ref.html": [
@@ -329936,6 +331094,10 @@
       "5100d6a646b6e8e4a31fff12d702c773a80723e3",
       []
      ],
+     "backdrop-filter-clipped.html.ini": [
+      "78f64743f8f3db2dd91d4c16256360d32dfd91a3",
+      []
+     ],
      "backdrop-filter-containing-block-ref.html": [
       "389802b5778edaadaee90da30bbbd65d7624b717",
       []
@@ -330994,42 +332156,18 @@
       "63c0a2ea883b4e026c9f336a0fff75045514cd82",
       []
      ],
-     "offset-path-ray-002.html.ini": [
-      "0dc1929e3a51fe3eadd0276be189c778d007f978",
-      []
-     ],
      "offset-path-ray-003-ref.html": [
       "7261167cd7f0d66153eb97398b9d43d8ff7d9a3f",
       []
      ],
-     "offset-path-ray-003.html.ini": [
-      "6e6b6c0023a1082efc488421c9114f93b97305d7",
-      []
-     ],
-     "offset-path-ray-004.html.ini": [
-      "c5c4730e9340f8a3e63ec115cd7d3dca24994c55",
-      []
-     ],
      "offset-path-ray-005-ref.html": [
       "525d747053c1e460c3d1e3b8aead48e823594999",
       []
      ],
-     "offset-path-ray-005.html.ini": [
-      "576f2b68686a7ef35101a52715514a3d785755c1",
-      []
-     ],
-     "offset-path-ray-006.html.ini": [
-      "8cd450287ad41fc0fabcc993207b73ea04e4c8e1",
-      []
-     ],
      "offset-path-ray-007-ref.html": [
       "a48d9f0a2a046c042aad1d484adc90a393b0ea3e",
       []
      ],
-     "offset-path-ray-007.html.ini": [
-      "4b79075d659a56e8d3384c9dd7e3e7ca3ed8377d",
-      []
-     ],
      "offset-path-ray-008-ref.html": [
       "2c3720c44ce8fe305ad384167daf1de163b3301f",
       []
@@ -331038,10 +332176,6 @@
       "95b54368759342f3cf0611d256e06f9534b5562e",
       []
      ],
-     "offset-path-ray-009.html.ini": [
-      "91127dabc38f3a44d493c310c20a270899ce46ad",
-      []
-     ],
      "offset-path-ray-contain-001-ref.html": [
       "24a823f9ca37c1edd1006fe8645c4c72791a4e11",
       []
@@ -331106,10 +332240,6 @@
       "ec22768e96a1cd1efab206781b985cec8f006686",
       []
      ],
-     "offset-supports-calc-expected.txt": [
-      "8d52f66538dafdb3b1e41d67798cc0d53eb69f13",
-      []
-     ],
      "offset-supports-calc.html.ini": [
       "f7c55c9576c1f1735f5f6132377704a0fb731894",
       []
@@ -331123,16 +332253,8 @@
        "d001224a3047b7d59854e55d58b045a9716f5707",
        []
       ],
-      "offset-path-computed-expected.txt": [
-       "a579d3c6dbdeb66c85a0aac9efe67ac70cb5ff8f",
-       []
-      ],
-      "offset-path-computed.html.ini": [
-       "0e40785e4082ae0231f2165393284d8c2fe9a292",
-       []
-      ],
       "offset-path-parsing-valid-expected.txt": [
-       "2006b721f675eab1bd510afa71e8ad8d04e9caf6",
+       "374a10d75dd829478f852f23f5eee1841b4692ae",
        []
       ],
       "offset-path-parsing-valid.html.ini": [
@@ -332035,7 +333157,7 @@
       []
      ],
      "interpolation-testcommon.js": [
-      "283a2d8aaba88802cc451978ba6396078364c47d",
+      "2ee00e457a2277174eb5df78ca22483892d7243e",
       []
      ],
      "numeric-testcommon.js": [
@@ -332726,7 +333848,7 @@
      []
     ],
     "requirements.txt": [
-     "589a98eaa2ab33b4d330b5e355eb8b0bdc43d31f",
+     "b29747cac1704b8ab158a73495160645144cbd7a",
      []
     ],
     "reviewing-tests": {
@@ -340165,6 +341287,10 @@
        "820f8cace2143bfc45c0c301e84b6c29b8630068",
        []
       ],
+      "js-unlabeled-utf16-without-bom.json": [
+       "157a8f5430862e504c1225de69b998b114f5c289",
+       []
+      ],
       "js-unlabeled.js": [
        "a880a5bc724a8571459eef0fe9dc23b86ff3a01e",
        []
@@ -340181,6 +341307,18 @@
        "820f8cace2143bfc45c0c301e84b6c29b8630068",
        []
       ],
+      "script-iso-8559-1.js": [
+       "3bccb6af93eebb48e3fece216303c2ff05eea8e5",
+       []
+      ],
+      "script-utf16-bom.js": [
+       "16b76e9d5e431fd9c363b0b1a15ba095e2a9fa11",
+       []
+      ],
+      "script-utf16-without-bom.js": [
+       "d983086b0369b07d089d4458f0b4338aea87295d",
+       []
+      ],
       "script.js": [
        "19675d25d832bf083412bf7a94647cedd4d8d27e",
        []
@@ -340228,7 +341366,7 @@
        []
       ],
       "known-mime-type.sub.any-expected.txt": [
-       "77ee580e662e1353d5387b07db674490f76d0c91",
+       "a4ab2e11de6a31b86e2d49759770e1dd181e6738",
        []
       ],
       "known-mime-type.sub.any.js.ini": [
@@ -340236,7 +341374,7 @@
        []
       ],
       "known-mime-type.sub.any.worker-expected.txt": [
-       "77ee580e662e1353d5387b07db674490f76d0c91",
+       "a4ab2e11de6a31b86e2d49759770e1dd181e6738",
        []
       ],
       "nosniff.sub.any-expected.txt": [
@@ -340491,7 +341629,7 @@
    "fledge": {
     "tentative": {
      "TODO": [
-      "839d286b38882f94bf97f0f6d749a33aa165cf46",
+      "d1d3930886b51f949ad0354278970b0c77c3c6e6",
       []
      ],
      "join-leave-ad-interest-group.https.sub.window-expected.txt": [
@@ -340503,11 +341641,11 @@
       []
      ],
      "no-winner.https.sub.window-expected.txt": [
-      "07b58b7fd822009fcc9b325d17004a82b32bc80f",
+      "f8a3f8834be4c7c72a252d6539f2f307fa4b9eb2",
       []
      ],
      "no-winner.https.sub.window.js.ini": [
-      "9ca0bf8eaf56a354b8608be269c7edb14421e00f",
+      "5a9d0bb6f6698d58e81955c46ba0c63a9b924eae",
       []
      ],
      "register-ad-beacon.https.sub.window-expected.txt": [
@@ -340528,11 +341666,11 @@
      ],
      "resources": {
       "bidding-logic.sub.py": [
-       "dfc4d86be359d22783da86c2c38aa97b3f8060b8",
+       "6b4e179cff9493202335b43ae68cf5862ff75053",
        []
       ],
       "decision-logic.sub.py": [
-       "8d5303ac5a41c3540b6b1289346b3cd2d3cc6147",
+       "9a97d45bd1247cd6c566f4f3cfb5b7e6d40876e8",
        []
       ],
       "fenced-frame.sub.py": [
@@ -340540,7 +341678,7 @@
        []
       ],
       "fledge-util.js": [
-       "6432752e075c156f715970b13a714011d2cae423",
+       "738764f651962b10ffe956bd86a9f81da40193d2",
        []
       ],
       "request_tracker.py": [
@@ -353219,6 +354357,12 @@
       }
      },
      "editing-0": {
+      "autocapitalization": {
+       "autocapitalize.html.ini": [
+        "798e0de0daf0c1f05ccd6998196db5e6f492b058",
+        []
+       ]
+      },
       "contenteditable": {
        "DIR_METADATA": [
         "a70c6e73fcc9273f0bcf1836f8c830a38e820e0c",
@@ -353868,10 +355012,6 @@
         "394af9a1f37914ea3ed60fc93f1bce46ab06a49a",
         []
        ],
-       "document-base-url-initiated-grand-parent.https.window-expected.txt": [
-        "0f00b10ed387682fb257b26d51c871a61ab16a60",
-        []
-       ],
        "document-base-url-initiated-grand-parent.https.window.js.ini": [
         "d25b70b39e2c0a2d53031c3d85cae1059fbeb506",
         []
@@ -354128,6 +355268,22 @@
         "a87141be1100197f60943799ec356584abe718ea",
         []
        ],
+       "search-styles-expected.txt": [
+        "f9926c87deae93bd2ab0cef146a5664a4c0a51c2",
+        []
+       ],
+       "search-styles-iso-8859-8-expected.txt": [
+        "373390bd7a7368a4f5e848445af2df40db06d0ca",
+        []
+       ],
+       "search-styles-iso-8859-8.html.ini": [
+        "172555a6af52d0650509072940a19a59ad09e9b7",
+        []
+       ],
+       "search-styles.html.ini": [
+        "f54f2a9527724744a9b6fb3a498c9bf6c49e1c44",
+        []
+       ],
        "support": {
         "dialog-framed.html": [
          "f9c414c246d1f89e697536f458e08ae33359e457",
@@ -356787,7 +357943,7 @@
         []
        ],
        "sandbox-top-navigation-grandchild.tentative.sub.window.js.ini": [
-        "9f75e6c22e1a25ff37b85e91c323e102d1f38a0f",
+        "680ce4e0c15432dc5e3d81957ba712f34651f2f6",
         []
        ],
        "stash.py": [
@@ -358405,6 +359561,10 @@
        "1bac806d11191823bdcf87b61693b00c7d507450",
        []
       ],
+      "popover-and-svg-ref.html": [
+       "db52e77d2be7bea7cc017476a854885dcbb3c9bf",
+       []
+      ],
       "popover-appearance-ref.html": [
        "7ceca94559b8d425c10243f61b038d6c8422a02b",
        []
@@ -360452,7 +361612,7 @@
        []
       ],
       "README": [
-       "944cddfc18e5a459418bc9b17bc054f677dee530",
+       "5c41f78d2ef6de3cd73775f11e37a864610a14ce",
        []
       ],
       "common.js": [
@@ -360507,6 +361667,14 @@
        "300648bab4ff8d3a71121139ae23125fa871f316",
        []
       ],
+      "html5lib_innerHTML_template-expected.txt": [
+       "e1dd1e81d9c01827a1d9d11ccf8d4dff7769baca",
+       []
+      ],
+      "html5lib_innerHTML_template.html.ini": [
+       "2bc179775699cf1c753d021093e875fa5976d246",
+       []
+      ],
       "html5lib_innerHTML_webkit02-expected.txt": [
        "062089f49a06dd4918b2ac00aca606777c632737",
        []
@@ -360519,6 +361687,22 @@
        "78cbeb1b1b95ee752845ec761f3f0aadc1f14b05",
        []
       ],
+      "html5lib_search-element.html.ini": [
+       "6786df7eb08f41cd1efc6654f4934dce000ce9af",
+       []
+      ],
+      "html5lib_search-element_run_type=uri-expected.txt": [
+       "67fc20118f9671fdaf810466437948ad374f85fb",
+       []
+      ],
+      "html5lib_search-element_run_type=write-expected.txt": [
+       "67fc20118f9671fdaf810466437948ad374f85fb",
+       []
+      ],
+      "html5lib_search-element_run_type=write_single-expected.txt": [
+       "67fc20118f9671fdaf810466437948ad374f85fb",
+       []
+      ],
       "html5lib_template-expected.txt": [
        "332024e03e79a98244ffe767051d100a3cde764b",
        []
@@ -360666,6 +361850,16 @@
        []
       ]
      },
+     "serializing-html-fragments": {
+      "serializing-expected.txt": [
+       "dc32f824f56428314af67688881cebbe1be282a9",
+       []
+      ],
+      "serializing.html.ini": [
+       "eaae0335ee0aa4ed797cc5e14c1207b5fbd2e863",
+       []
+      ]
+     },
      "speculative-charset": {
       "speculative-script.tentative.html.ini": [
        "7041ca8aa94a5402a584d601002a5ff00dfc286d",
@@ -361842,7 +363036,7 @@
      }
     },
     "tools": {
-     "html5lib_revision": [
+     "html5lib_python_revision": [
       "e0f5dd464a69319dba58276270cd19d8a6705f5c",
       []
      ],
@@ -361854,8 +363048,12 @@
       "794d13f1c4add0b13486f1c867c4bdfce06a314b",
       []
      ],
+     "html5lib_tests_revision": [
+      "4535af29f6b43f6c178c97b021d00c4b3350a311",
+      []
+     ],
      "update_html5lib_tests.py": [
-      "7ad9bc6f862b724f73a32e688327f7f8206146b8",
+      "2374bb0cdab8527d8391804f5970a3afd0a5111f",
       []
      ]
     },
@@ -362450,7 +363648,7 @@
        },
        "unhandled-promise-rejections": {
         "promise-rejection-event-during-parse-expected.txt": [
-         "89c041abb5d763c4a2c2468a412619eb5fac0a4f",
+         "b9aa87218420bb6d494f65d6fac6df23fdb794ae",
          []
         ],
         "promise-rejection-event-during-parse.html.ini": [
@@ -363274,6 +364472,10 @@
       "1d0b2e7630e223994a963e8220d730d77783e8a4",
       []
      ],
+     "unhandled-rejection-following-subtest-expected.txt": [
+      "baa0f8ffea0dd39dc234e8c99ee9cc15fdf96a65",
+      []
+     ],
      "unhandled-rejection-following-subtest.html.ini": [
       "c2b68fbce4b4d249740cb125f02eb19f4bc8ace7",
       []
@@ -365587,7 +366789,7 @@
       []
      ],
      "loaf-script-block.html.ini": [
-      "a4e25bf959a8a2272988c01ee20a73d71ea1fc3f",
+      "47ff04315e9b816b2fa2bd4b3bc7f304f23b711a",
       []
      ],
      "loaf-visibility.html.ini": [
@@ -368510,10 +369712,18 @@
         "46e2255e388e9e08377d625b55653a007d59c14e",
         []
        ],
+       "worklet-animation-import-data.https.html.ini": [
+        "a3b306219544c79a5464b45192c083280489c5c1",
+        []
+       ],
        "worklet-animation.https.html.headers": [
         "46e2255e388e9e08377d625b55653a007d59c14e",
         []
        ],
+       "worklet-animation.https.html.ini": [
+        "ef66d3ee75b117a6e6bebfeb4ecf82caf3882429",
+        []
+       ],
        "worklet-audio-import-data.https.html.headers": [
         "46e2255e388e9e08377d625b55653a007d59c14e",
         []
@@ -368545,6 +369755,16 @@
       }
      },
      "top.meta": {
+      "opt-in": {
+       "worklet-animation-import-data.https.html.ini": [
+        "1d270469d1f0da0e6d416c247157be194b5bf09c",
+        []
+       ],
+       "worklet-animation.https.html.ini": [
+        "ab0c9b7bd19a32365ec8efcf74f58ee90fd61bea",
+        []
+       ]
+      },
       "unset": {
        "audio-tag.https.html.ini": [
         "b799f42c4360a82349d637e671998d036910250b",
@@ -368557,6 +369777,14 @@
        "video-tag.https.html.ini": [
         "610e997a8870d59cabaf87371911d6aa2ea1a13a",
         []
+       ],
+       "worklet-animation-import-data.https.html.ini": [
+        "a3b306219544c79a5464b45192c083280489c5c1",
+        []
+       ],
+       "worklet-animation.https.html.ini": [
+        "ef66d3ee75b117a6e6bebfeb4ecf82caf3882429",
+        []
        ]
       }
      },
@@ -378743,6 +379971,22 @@
       []
      ]
     },
+    "selection-direction.tentative-expected.txt": [
+     "f79147f04163c00f917714ba96e494f4493d2b68",
+     []
+    ],
+    "selection-direction.tentative.html.ini": [
+     "3d480fc9996a1677c91e0003d8e545c1ffc6c237",
+     []
+    ],
+    "selection-getComposedRanges.tentative-expected.txt": [
+     "924a4ab1ada501a356a5af571794e72b22ef602c",
+     []
+    ],
+    "selection-getComposedRanges.tentative.html.ini": [
+     "5bc733b3a5cf97ce088511d8858a54c28850a99f",
+     []
+    ],
     "shadow-style-invalidation-vw-units-ref.html": [
      "d86fd234ca321a762fff5017b4adc68301124bcd",
      []
@@ -379343,7 +380587,7 @@
       []
      ],
      "document-rules.https.html.ini": [
-      "b7662df627150f64d7f15b2b2feafa4b6b4032e2",
+      "a926331fd74335587fa2566acf9f2b9ab57e0d2e",
       []
      ],
      "no-vary-search": {
@@ -380347,10 +381591,6 @@
      "3eed5f610bd34acf2fc1e6228a2a01f5f3cb1a2c",
      []
     ],
-    "requestStorageAccess-cross-origin-iframe.sub.https.window.js.ini": [
-     "ddc96049415f4d6dd4d71403bf51dd1e032908b9",
-     []
-    ],
     "requestStorageAccess-cross-site-iframe.sub.https.window.js.ini": [
      "aa17501c514b2960953b0eab40a9639e9529b650",
      []
@@ -380396,6 +381636,14 @@
       "b83a05c3f1bdf00107447527d5e009b06ddb0187",
       []
      ],
+     "requestStorageAccess-ABA-iframe.https.html": [
+      "7452ff89a082a1a4c5de734cef0df6fd466e1b08",
+      []
+     ],
+     "requestStorageAccess-ABA-iframe.sub.https.window.js": [
+      "8bfef8022a7251b54d9514d88c7e7ed20290f360",
+      []
+     ],
      "requestStorageAccess-iframe.html": [
       "8b47786e17d43ab6b468683dd460d1c77960f47e",
       []
@@ -382444,11 +383692,11 @@
      ]
     },
     "trust-token-parameter-validation-xhr.tentative.https.html.ini": [
-     "e00108cd5631d697dbd1883512b7882d818650d9",
+     "3b2d85b8752eea50cc1714560485a4eab1be4222",
      []
     ],
     "trust-token-parameter-validation.tentative.https.html.ini": [
-     "3f69376bfa6da216efeea0615d0b03590af5721e",
+     "82e8dd212694d1d293051215511c862794022b23",
      []
     ]
    },
@@ -383021,6 +384269,14 @@
        "worker-module.https.html.ini": [
         "444fe5c902158be0692f17a9e560ebc422461e30",
         []
+       ],
+       "worklet-animation-import-data.https.html.ini": [
+        "848048dd5032ba9b33c6ff56d4691e1f95c77da3",
+        []
+       ],
+       "worklet-animation.https.html.ini": [
+        "0712a2bfdc748d2a19fb897d706fe951eb9f1a48",
+        []
        ]
       }
      },
@@ -383099,6 +384355,14 @@
        "worker-module.https.html.ini": [
         "444fe5c902158be0692f17a9e560ebc422461e30",
         []
+       ],
+       "worklet-animation-import-data.https.html.ini": [
+        "848048dd5032ba9b33c6ff56d4691e1f95c77da3",
+        []
+       ],
+       "worklet-animation.https.html.ini": [
+        "0712a2bfdc748d2a19fb897d706fe951eb9f1a48",
+        []
        ]
       }
      },
@@ -383188,10 +384452,18 @@
         "602d9dc38d0a5975e8d40c26daae9329de69840c",
         []
        ],
+       "worklet-animation-import-data.https.html.ini": [
+        "848048dd5032ba9b33c6ff56d4691e1f95c77da3",
+        []
+       ],
        "worklet-animation.https.html.headers": [
         "602d9dc38d0a5975e8d40c26daae9329de69840c",
         []
        ],
+       "worklet-animation.https.html.ini": [
+        "0712a2bfdc748d2a19fb897d706fe951eb9f1a48",
+        []
+       ],
        "worklet-audio-import-data.https.html.headers": [
         "602d9dc38d0a5975e8d40c26daae9329de69840c",
         []
@@ -383265,6 +384537,14 @@
        "worker-module.https.html.ini": [
         "444fe5c902158be0692f17a9e560ebc422461e30",
         []
+       ],
+       "worklet-animation-import-data.https.html.ini": [
+        "848048dd5032ba9b33c6ff56d4691e1f95c77da3",
+        []
+       ],
+       "worklet-animation.https.html.ini": [
+        "0712a2bfdc748d2a19fb897d706fe951eb9f1a48",
+        []
        ]
       }
      },
@@ -384608,6 +385888,12 @@
        []
       ]
      },
+     "Animation": {
+      "finished.html.ini": [
+       "b79ed9dd3a043c8e6398fd289d5537dc2e2e0b75",
+       []
+      ]
+     },
      "KeyframeEffect": {
       "constructor-expected.txt": [
        "51e5f086363a0f40864298b93ede4a66a38a4825",
@@ -385804,7 +387090,7 @@
      },
      "the-mediaelementaudiosourcenode-interface": {
       "mediaElementAudioSourceToScriptProcessorTest.html.ini": [
-       "3bf76070f88802b4a5bfa04ec31b371916fc3c16",
+       "c2a51399def927cff1eec490a3b10f213263341a",
        []
       ]
      }
@@ -388140,7 +389426,7 @@
      []
     ],
     "RTCRtpTransceiver-headerExtensionControl.html.ini": [
-     "0b2d13f50acfdd71a61057fead139c22ce16f17f",
+     "e5e8b90e3f05551fd6015d91385510a69115ed13",
      []
     ],
     "transfer-datachannel-service-worker.https.html.ini": [
@@ -393841,6 +395127,26 @@
      "b06ea33cd926fd99d890b0dd7544213170a15e8e",
      []
     ],
+    "animation-worklet-credentials.https.html.ini": [
+     "f8b9a8b46e20c0fec2d649894bdb637f3cbb8c16",
+     []
+    ],
+    "animation-worklet-csp.https.html.ini": [
+     "9f5065677b3627e23589d0fe7578588f3f664b39",
+     []
+    ],
+    "animation-worklet-import.https.html.ini": [
+     "73f181dded96ff54481d6ae04be372bf8d121f00",
+     []
+    ],
+    "animation-worklet-referrer.https.html.ini": [
+     "eca2bb2965a31deed66cfb9a8e329d56bdd2db51",
+     []
+    ],
+    "animation-worklet-service-worker-interception.https.html.ini": [
+     "bb74ff5a79b5458491477bf6889815de09fad8a7",
+     []
+    ],
     "idlharness.https.any-expected.txt": [
      "5ae5361d00ca8b11eac4498deb5a35a86b059d52",
      []
@@ -408916,7 +410222,7 @@
      ]
     ],
     "setSinkId-with-selectAudioOutput.https.html": [
-     "6847545503bc62fcafd0866afd71afd405749b9a",
+     "dbe32e260695a24f686edb78fc3c158a3b8db31f",
      [
       null,
       {
@@ -417062,6 +418368,24 @@
       }
      ]
     ],
+    "async-unsanitized-standard-html-formats-write-read.tentative.https.html": [
+     "f6313c1b901c7ec454d58c8f8d3580a649bd55ae",
+     [
+      null,
+      {
+       "testdriver": true
+      }
+     ]
+    ],
+    "async-unsanitized-standard-html-read-fail.tentative.https.html": [
+     "e7ddbb0cdf6e29f98ff7eb86e16c1658c94b54f8",
+     [
+      null,
+      {
+       "testdriver": true
+      }
+     ]
+    ],
     "async-write-blobs-read-blobs.https.html": [
      "8bec558b2b2de8a38c0f9620942a5307c8158665",
      [
@@ -424231,7 +425555,7 @@
       ]
      ],
      "blockeduri-inline.html": [
-      "40c4865185a919135f1fa8b54167192a5773eaef",
+      "7cced9ef690360e37b4d5fd0cd784e1a612970ac",
       [
        null,
        {}
@@ -428078,6 +429402,13 @@
     },
     "css-align": {
      "animation": {
+      "align-no-interpolation.html": [
+       "037743bdd32fc8de5c60e0608a08085cd3cd6fe7",
+       [
+        null,
+        {}
+       ]
+      ],
       "column-gap-composition.html": [
        "0054206cca8b3448ad5d19e055e9f435a6e123b1",
        [
@@ -429793,6 +431124,13 @@
        {}
       ]
      ],
+     "display-interpolation.html": [
+      "791e794c70fdf8ec8823504b8f014992c97fbf7a",
+      [
+       null,
+       {}
+      ]
+     ],
      "event-dispatch.tentative.html": [
       "3e577d6ea6c67269766ed9ec38d13bd4cbda435c",
       [
@@ -430227,6 +431565,13 @@
        null,
        {}
       ]
+     ],
+     "transition-properties-not-animatable.html": [
+      "288487b48998772bc145c3a28c8fef329b4939ab",
+      [
+       null,
+       {}
+      ]
      ]
     },
     "css-backgrounds": {
@@ -432133,14 +433478,14 @@
        ]
       ],
       "color-computed-color-function.html": [
-       "58a09971faa5ed1e269fd87baf070a678b9655d0",
+       "ee20c9cd625466f95505f7f6ca114f4e59960999",
        [
         null,
         {}
        ]
       ],
       "color-computed-color-mix-function.html": [
-       "f000ed6a4541269966e22fba6f3e48661f09ab72",
+       "8f05a99967c0902ad6e1c4d621b8d7af6ef85ef6",
        [
         null,
         {}
@@ -432168,7 +433513,7 @@
        ]
       ],
       "color-computed-lab.html": [
-       "c25e12534393f11e483c387ef0850b26cd6dc658",
+       "f3ebb0d298edf39739d40e0091ffce997b004d18",
        [
         null,
         {}
@@ -432287,7 +433632,7 @@
        ]
       ],
       "color-valid-color-function.html": [
-       "1eb7c744b2aceea1234801706babdba155e35c9f",
+       "f922b5740ba3295176dd6cb755981fb052de087f",
        [
         null,
         {}
@@ -432315,7 +433660,7 @@
        ]
       ],
       "color-valid-lab.html": [
-       "601a0ffb641c14757752112d84fa35de56ba0a56",
+       "ee7212cda2d9bea9570f6f89e8a096fc8874327f",
        [
         null,
         {}
@@ -432625,7 +433970,7 @@
        ]
       ],
       "at-container-parsing.html": [
-       "d0aef94de55eca8c00cde4d3ddb7bd94105573c8",
+       "b0196b5e5a124cbc41f13e754f0963108b407d4a",
        [
         null,
         {}
@@ -440978,7 +442323,7 @@
      },
      "image-set": {
       "image-set-computed.sub.html": [
-       "a25ca17835b5dcf5a85d6216b6f3fe8d33b60042",
+       "6d54fd0d09b4ade26a254a0a9c8cb5a76097e88a",
        [
         null,
         {}
@@ -441454,7 +442799,7 @@
       ]
      },
      "css-lists-no-interpolation.html": [
-      "8250bc2b662dceac36966ce04d1f2419eb3a9fa2",
+      "a0e1005ef0bf3b1ff2690ee6a9fe2d3fd902e8ce",
       [
        null,
        {}
@@ -453329,7 +454674,7 @@
        ]
       ],
       "cssTransformValue.tentative.html": [
-       "856b9314d852b7134dae6ad52ff391a61d6a0345",
+       "c098868f143cb789deac6c456aa07da33dd37483",
        [
         null,
         {}
@@ -457324,8 +458669,8 @@
        {}
       ]
      ],
-     "input-blocked-when-rendering-suppressed.html": [
-      "45c811e65b9077aec4f56b82a64088335aa1d907",
+     "input-targets-root-while-render-blocked.html": [
+      "dbeb39da5468b56130413c2e29a134e5e67887fe",
       [
        null,
        {
@@ -457594,7 +458939,7 @@
        ]
       ],
       "text-input-block-size.optional.html": [
-       "75b679e2cc72c30eb7726db9240cc033fcdad531",
+       "680e0b6532b1a28bc94238b079fd2ab8417966d7",
        [
         null,
         {}
@@ -460626,7 +461971,7 @@
       ]
      ],
      "match-media-parsing.html": [
-      "bbb326eb1893e0fc35cad8e45629edd31a93fba5",
+      "c029f5494569f17f8fbe6d556de4e5b34a840fc6",
       [
        null,
        {}
@@ -460731,7 +462076,7 @@
       ]
      ],
      "test_media_queries.html": [
-      "fe3ba8195f981572aca7e7f08733d69a5151a7f0",
+      "20fca4affd24e5a3d1335b9d39420f653c7cd9fb",
       [
        null,
        {}
@@ -462779,7 +464124,7 @@
       ]
      ],
      "disabled-delegatesFocus.html": [
-      "f92cc5277c2834fef2c26ef5095bd1274a7eb322",
+      "3f2b765a63abc7c043077db19f0ef0b58a2318be",
       [
        null,
        {}
@@ -497616,7 +498961,7 @@
        ]
       ],
       "known-mime-type.sub.any.js": [
-       "919964f3f57ad89a87ba8cce176982c0d5a75236",
+       "66a63c8b28aacdbdcb06f2f3456c991b5749440a",
        [
         "fetch/orb/tentative/known-mime-type.sub.any.html",
         {
@@ -497679,6 +499024,13 @@
         {}
        ]
       ],
+      "script-utf16-without-bom-hint-charset.sub.html": [
+       "b15f976a6698fc89f8611ae27c1182936b29eb62",
+       [
+        null,
+        {}
+       ]
+      ],
       "status.sub.any.js": [
        "b94d8b7f6359a7d58bc1f19d3c55e40082925935",
        [
@@ -498286,7 +499638,7 @@
       ]
      ],
      "no-winner.https.sub.window.js": [
-      "4d24b5738eaaed58c9ef809a291d0a20021fc972",
+      "a944b860d0c77fad4784e9aee1dac62376de3a6b",
       [
        "fledge/tentative/no-winner.https.sub.window.html",
        {
@@ -498302,8 +499654,13 @@
          [
           "script",
           "resources/fledge-util.js"
+         ],
+         [
+          "timeout",
+          "long"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ]
      ],
@@ -534689,6 +536046,20 @@
          null,
          {}
         ]
+       ],
+       "search-styles-iso-8859-8.html": [
+        "194456622740b374ad5f35faf3de5d424714bffd",
+        [
+         null,
+         {}
+        ]
+       ],
+       "search-styles.html": [
+        "8c8badd1703fcf3f797d588090bc378735c6005f",
+        [
+         null,
+         {}
+        ]
        ]
       },
       "form-controls": {
@@ -542807,7 +544178,7 @@
         ]
        ],
        "selectmenu-value-selectedOption.tentative.html": [
-        "3ba7da6b5a2f893f0b5ec71ad25b4b8b5479c729",
+        "8998a07e03c5fdfe577c486968d1d71875d09fdb",
         [
          null,
          {}
@@ -543797,7 +545168,7 @@
        ]
       ],
       "popover-anchor-idl-property.html": [
-       "7b497ce09e6e192619b675b01b0ee21caa18a3e5",
+       "1e255339f8107161a0ff105eae9f7f1547599f22",
        [
         null,
         {}
@@ -548749,6 +550120,15 @@
         }
        ]
       ],
+      "html5lib_innerHTML_template.html": [
+       "19dc555a793283307ae8d8fabb5f2252ead2b046",
+       [
+        null,
+        {
+         "timeout": "long"
+        }
+       ]
+      ],
       "html5lib_innerHTML_tests4.html": [
        "b519246aa5d43a9dd769d1e668c3918c8a844d01",
        [
@@ -549046,6 +550426,27 @@
         }
        ]
       ],
+      "html5lib_search-element.html": [
+       "b3d9e3caacfb4d930f168f864e498809d13f0e0b",
+       [
+        "html/syntax/parsing/html5lib_search-element.html?run_type=uri",
+        {
+         "timeout": "long"
+        }
+       ],
+       [
+        "html/syntax/parsing/html5lib_search-element.html?run_type=write",
+        {
+         "timeout": "long"
+        }
+       ],
+       [
+        "html/syntax/parsing/html5lib_search-element.html?run_type=write_single",
+        {
+         "timeout": "long"
+        }
+       ]
+      ],
       "html5lib_tables01.html": [
        "a22bfe0b2b2e16fb1d9b6366ed538ad213659948",
        [
@@ -549068,7 +550469,7 @@
        ]
       ],
       "html5lib_template.html": [
-       "d12c2ca2d71bb55672652256c6bd1cf65a35dca7",
+       "5d6f4fc5dd977f795fa3a04b9057cf69d004ef31",
        [
         "html/syntax/parsing/html5lib_template.html?run_type=uri",
         {
@@ -549320,7 +550721,7 @@
        ]
       ],
       "html5lib_tests20.html": [
-       "778017d2a3c401ecf4053fd8b2bde78803483d2a",
+       "1bda41f46b7a1ab2e070d838d2625c6a433280c5",
        [
         "html/syntax/parsing/html5lib_tests20.html?run_type=uri",
         {
@@ -553097,6 +554498,13 @@
           null,
           {}
          ]
+        ],
+        "promise-resolution-order.html": [
+         "314063025f888effde42daedd4b2e24bfae45beb",
+         [
+          null,
+          {}
+         ]
         ]
        },
        "window-onerror-parse-error.html": [
@@ -564630,7 +566038,7 @@
       ]
      ],
      "forward-to-pruned-entry.html": [
-      "b8bd36ef061e8936b3dc1dbfdfb3766949cccc3d",
+      "05f70c5c2dccb659e36e77068a457d06881e4b74",
       [
        null,
        {}
@@ -568590,7 +569998,7 @@
     ],
     "not-restored-reasons": {
      "performance-navigation-timing-attributes.tentative.window.js": [
-      "047e97a7521b1bef9d3ee3ea0e64e8296301598e",
+      "95ca3dd6b4daaf177e716d74b95b27064637bc6f",
       [
        "performance-timeline/not-restored-reasons/performance-navigation-timing-attributes.tentative.window.html",
        {
@@ -568626,13 +570034,18 @@
          [
           "script",
           "/websockets/constants.sub.js"
+         ],
+         [
+          "timeout",
+          "long"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ]
      ],
      "performance-navigation-timing-bfcache-reasons-stay.tentative.window.js": [
-      "745c167e790067c1df92ecf8bff1cade48fb2f95",
+      "36c1b92dca43b1d6ebff2ea0804ea57f7f61d009",
       [
        "performance-timeline/not-restored-reasons/performance-navigation-timing-bfcache-reasons-stay.tentative.window.html",
        {
@@ -568668,13 +570081,18 @@
          [
           "script",
           "/websockets/constants.sub.js"
+         ],
+         [
+          "timeout",
+          "long"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ]
      ],
      "performance-navigation-timing-bfcache.tentative.window.js": [
-      "73197ef3ab30ae12f43f02ec6fd7e3084bc61575",
+      "bfb685451c36d6d42ee80cac2414950d4b9c6ae7",
       [
        "performance-timeline/not-restored-reasons/performance-navigation-timing-bfcache.tentative.window.html",
        {
@@ -568706,13 +570124,18 @@
          [
           "script",
           "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+         ],
+         [
+          "timeout",
+          "long"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ]
      ],
      "performance-navigation-timing-cross-origin-bfcache.tentative.window.js": [
-      "bb8284bb1a9776ad7f7e194781403b8a0849aa0c",
+      "80adec007a2e4a80daf33e2752fb2e04ea902668",
       [
        "performance-timeline/not-restored-reasons/performance-navigation-timing-cross-origin-bfcache.tentative.window.html",
        {
@@ -568748,13 +570171,18 @@
          [
           "script",
           "/websockets/constants.sub.js"
+         ],
+         [
+          "timeout",
+          "long"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ]
      ],
      "performance-navigation-timing-not-bfcached.tentative.window.js": [
-      "5e94a93089113d35470f6d038fc35833791723a3",
+      "3afce4b97557bc9ba0c2309306403556f38fed28",
       [
        "performance-timeline/not-restored-reasons/performance-navigation-timing-not-bfcached.tentative.window.html",
        {
@@ -568790,13 +570218,18 @@
          [
           "script",
           "/websockets/constants.sub.js"
+         ],
+         [
+          "timeout",
+          "long"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ]
      ],
      "performance-navigation-timing-redirect-on-history.tentative.window.js": [
-      "39e9ac9964ae6b2706cc118bfe528a027b7f51dd",
+      "acb70ebfae469d8fce37aa9acc54c335bf65cb67",
       [
        "performance-timeline/not-restored-reasons/performance-navigation-timing-redirect-on-history.tentative.window.html",
        {
@@ -568832,13 +570265,18 @@
          [
           "script",
           "/websockets/constants.sub.js"
+         ],
+         [
+          "timeout",
+          "long"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ]
      ],
      "performance-navigation-timing-same-origin-bfcache.tentative.window.js": [
-      "3d333b4485a972605d3323e5a8e334947fcf2237",
+      "26fea56bbbc00bc92c8e11f0b82000f5911240e9",
       [
        "performance-timeline/not-restored-reasons/performance-navigation-timing-same-origin-bfcache.tentative.window.html",
        {
@@ -568874,13 +570312,18 @@
          [
           "script",
           "/websockets/constants.sub.js"
+         ],
+         [
+          "timeout",
+          "long"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ]
      ],
      "performance-navigation-timing-same-origin-replace.tentative.window.js": [
-      "e8805be6c4b5e1892b3ffb548708a15887ebd88f",
+      "e1bfafd77988245bdd50effbb1ddf712034efb49",
       [
        "performance-timeline/not-restored-reasons/performance-navigation-timing-same-origin-replace.tentative.window.html",
        {
@@ -568916,8 +570359,13 @@
          [
           "script",
           "/websockets/constants.sub.js"
+         ],
+         [
+          "timeout",
+          "long"
          ]
-        ]
+        ],
+        "timeout": "long"
        }
       ]
      ]
@@ -595446,6 +596894,20 @@
       {}
      ]
     ],
+    "selection-direction.tentative.html": [
+     "3a2512dcc71711a2652f178de51d8ba379779a76",
+     [
+      null,
+      {}
+     ]
+    ],
+    "selection-getComposedRanges.tentative.html": [
+     "983328693c6c32b5b0ca8454b626017550868bc4",
+     [
+      null,
+      {}
+     ]
+    ],
     "slotchange-customelements.html": [
      "b0cf93277df950f46f6e6a7c5266798c47426651",
      [
@@ -596778,6 +598240,15 @@
       }
      ]
     ],
+    "navigation-api-view-transition.tentative.html": [
+     "38298bbe3dce69472270e83a11d516613532e180",
+     [
+      null,
+      {
+       "testdriver": true
+      }
+     ]
+    ],
     "navigation-api.tentative.html": [
      "c4f2786ccf35135b3f20b82e017a9114b6a07b01",
      [
@@ -596905,7 +598376,7 @@
       ]
      ],
      "document-rules.https.html": [
-      "a5030f6938b0dd993554aafdd5872ae3aa7aea9e",
+      "b0b07a878494da33145347e5995d76425fc775c7",
       [
        "speculation-rules/prefetch/document-rules.https.html?include=and",
        {}
@@ -596923,10 +598394,18 @@
        {}
       ],
       [
+       "speculation-rules/prefetch/document-rules.https.html?include=linkHrefChanged",
+       {}
+      ],
+      [
        "speculation-rules/prefetch/document-rules.https.html?include=linkInShadowTree",
        {}
       ],
       [
+       "speculation-rules/prefetch/document-rules.https.html?include=newRuleSetAdded",
+       {}
+      ],
+      [
        "speculation-rules/prefetch/document-rules.https.html?include=not",
        {}
       ],
@@ -598936,10 +600415,10 @@
       }
      ]
     ],
-    "requestStorageAccess-cross-origin-iframe-navigation.sub.https.window.js": [
-     "24595ed340856e0f667dbd2671614e5c23ba712c",
+    "requestStorageAccess-ABA.tentative.sub.https.window.js": [
+     "428053f3e56899ce9c66cc7eefbcfa3e462f2191",
      [
-      "storage-access-api/requestStorageAccess-cross-origin-iframe-navigation.sub.https.window.html",
+      "storage-access-api/requestStorageAccess-ABA.tentative.sub.https.window.html",
       {
        "script_metadata": [
         [
@@ -598948,10 +600427,6 @@
         ],
         [
          "script",
-         "/cookies/resources/cookie-helper.sub.js"
-        ],
-        [
-         "script",
          "/resources/testdriver.js"
         ],
         [
@@ -598962,10 +600437,10 @@
       }
      ]
     ],
-    "requestStorageAccess-cross-origin-iframe.sub.https.window.js": [
-     "9183832957a76703a57eca28c4c18c7bf730112d",
+    "requestStorageAccess-cross-origin-iframe-navigation.sub.https.window.js": [
+     "24595ed340856e0f667dbd2671614e5c23ba712c",
      [
-      "storage-access-api/requestStorageAccess-cross-origin-iframe.sub.https.window.html",
+      "storage-access-api/requestStorageAccess-cross-origin-iframe-navigation.sub.https.window.html",
       {
        "script_metadata": [
         [
@@ -598974,6 +600449,10 @@
         ],
         [
          "script",
+         "/cookies/resources/cookie-helper.sub.js"
+        ],
+        [
+         "script",
          "/resources/testdriver.js"
         ],
         [
@@ -599142,10 +600621,10 @@
       }
      ]
     ],
-    "requestStorageAccess-same-origin-iframe.sub.https.window.js": [
-     "f406ea1643d9adf4cd14f557703d08600a75c275",
+    "requestStorageAccess-same-site-iframe.sub.https.window.js": [
+     "f646444e67f4ba591f5239888c8dbea38586954c",
      [
-      "storage-access-api/requestStorageAccess-same-origin-iframe.sub.https.window.html",
+      "storage-access-api/requestStorageAccess-same-site-iframe.sub.https.window.html",
       {
        "script_metadata": [
         [
@@ -599165,7 +600644,7 @@
      ]
     ],
     "requestStorageAccess.sub.https.window.js": [
-     "6a9d5f4e57720c2309bd33db48918b77188b6627",
+     "306bf462328acb2da80dd7118f0284aeca6c3e78",
      [
       "storage-access-api/requestStorageAccess.sub.https.window.html",
       {
@@ -606843,14 +608322,14 @@
      ]
     },
     "trust-token-parameter-validation-xhr.tentative.https.html": [
-     "56ac7f0e4efb042d938aa85d760f0da0f8194474",
+     "73af4634b6d0326711275293e70e9b28ce618ec0",
      [
       null,
       {}
      ]
     ],
     "trust-token-parameter-validation.tentative.https.html": [
-     "5f01e5527b942efd592308f679e07b56831e08ad",
+     "e2ab079434bd6e6eda9274ba9e0064683056367a",
      [
       null,
       {}
@@ -664178,7 +665657,7 @@
        ]
       ],
       "collections.py": [
-       "a9d9e63feaffee0194a7e396744d38ed74db81b9",
+       "5dfbf2059470a2f17604a0a3d9bf47f905bca82e",
        [
         null,
         {}
@@ -664245,7 +665724,7 @@
        ]
       ],
       "collections.py": [
-       "3a6c2470c9784a9beaea2462865ca0c34b8fac0d",
+       "ec5d5ee1e32beb19b799b633534ec31fcfb0c7ad",
        [
         null,
         {}
@@ -664536,7 +666015,7 @@
      },
      "get_element_property": {
       "get.py": [
-       "84e4e89628146e3984ba926a2a9a88fb27fa9f4e",
+       "bb63481dfcae75ee6f80503413c552db78d3c8ac",
        [
         null,
         {}
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/back-forward-cache-open-connection.window.js.ini b/third_party/blink/web_tests/external/wpt/IndexedDB/back-forward-cache-open-connection.window.js.ini
index e9ec6bf..2e5b648c 100644
--- a/third_party/blink/web_tests/external/wpt/IndexedDB/back-forward-cache-open-connection.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/back-forward-cache-open-connection.window.js.ini
@@ -1,3 +1,5 @@
 [back-forward-cache-open-connection.window.html]
   [Testing BFCache support for page with open IndexedDB connection, and eviction behavior when receiving versionchange event.]
-    expected: PRECONDITION_FAILED
+    expected:
+      if (product == "content_shell") and (os == "mac"): [FAIL, PRECONDITION_FAILED]
+      PRECONDITION_FAILED
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/animate-multiple-effects-on-different-targets-via-main-thread.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/animate-multiple-effects-on-different-targets-via-main-thread.https.html.ini
new file mode 100644
index 0000000..3965f1e0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/animate-multiple-effects-on-different-targets-via-main-thread.https.html.ini
@@ -0,0 +1,3 @@
+[animate-multiple-effects-on-different-targets-via-main-thread.https.html]
+  [Animating multiple effects on different targets via main thread should produce new output values accordingly]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/animate-non-accelerated-property.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/animate-non-accelerated-property.https.html.ini
new file mode 100644
index 0000000..9eaa6924
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/animate-non-accelerated-property.https.html.ini
@@ -0,0 +1,3 @@
+[animate-non-accelerated-property.https.html]
+  [Individual worklet animation should output values at specified local time for corresponding targets and effects]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/animation-worklet-inside-iframe.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/animation-worklet-inside-iframe.https.html.ini
new file mode 100644
index 0000000..d2fc4424
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/animation-worklet-inside-iframe.https.html.ini
@@ -0,0 +1,4 @@
+[animation-worklet-inside-iframe.https.html]
+  expected: TIMEOUT
+  [Both main frame and iframe should update the opacity of their target]
+    expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/animator-with-options.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/animator-with-options.https.html.ini
new file mode 100644
index 0000000..960b2558
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/animator-with-options.https.html.ini
@@ -0,0 +1,3 @@
+[animator-with-options.https.html]
+  [Animator should be able to use options to update the animation]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/cancel-non-accelerated-property.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/cancel-non-accelerated-property.https.html.ini
new file mode 100644
index 0000000..bd9a0b08
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/cancel-non-accelerated-property.https.html.ini
@@ -0,0 +1,3 @@
+[cancel-non-accelerated-property.https.html]
+  [Animation should update the outputs after starting and then return to pre-animated values after being cancelled]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/current-time.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/current-time.https.html.ini
new file mode 100644
index 0000000..24e76052
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/current-time.https.html.ini
@@ -0,0 +1,2 @@
+[current-time.https.html]
+  expected: ERROR
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/idlharness.any.js.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/idlharness.any.js.ini
index ffa2e4b..00a012a 100644
--- a/third_party/blink/web_tests/external/wpt/animation-worklet/idlharness.any.js.ini
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/idlharness.any.js.ini
@@ -8,12 +8,24 @@
   [WorkletAnimation interface object length]
     expected: FAIL
 
+  [WorkletAnimation interface object name]
+    expected: FAIL
+
+  [WorkletAnimation interface: attribute animatorName]
+    expected: FAIL
+
   [WorkletAnimation interface: existence and properties of interface object]
     expected: FAIL
 
   [WorkletAnimation interface: existence and properties of interface prototype object]
     expected: FAIL
 
+  [WorkletAnimation interface: existence and properties of interface prototype object's "constructor" property]
+    expected: FAIL
+
+  [WorkletAnimation interface: existence and properties of interface prototype object's @@unscopables property]
+    expected: FAIL
+
   [WorkletAnimation interface: new WorkletAnimation("name") must inherit property "animatorName" with the proper type]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/inactive-timeline.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/inactive-timeline.https.html.ini
index 106c4b52..4b906bd2 100644
--- a/third_party/blink/web_tests/external/wpt/animation-worklet/inactive-timeline.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/inactive-timeline.https.html.ini
@@ -1,3 +1,2 @@
 [inactive-timeline.https.html]
-  [When timeline time becomes inactive previous current time must be the current time and start time unresolved]
-    expected: FAIL
+  expected: ERROR
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/multiple-effects-on-same-target-driven-by-individual-local-time.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/multiple-effects-on-same-target-driven-by-individual-local-time.https.html.ini
new file mode 100644
index 0000000..d2d3b4e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/multiple-effects-on-same-target-driven-by-individual-local-time.https.html.ini
@@ -0,0 +1,3 @@
+[multiple-effects-on-same-target-driven-by-individual-local-time.https.html]
+  [Animating multiple effects on the same target using effect specific local time should output values\n  relative to each effects unique local time]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/playback-rate.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/playback-rate.https.html.ini
index 95b3d38b..25886b86 100644
--- a/third_party/blink/web_tests/external/wpt/animation-worklet/playback-rate.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/playback-rate.https.html.ini
@@ -1,18 +1,2 @@
 [playback-rate.https.html]
-  [Initial current time is not affected by playbackRate set while scroll-linked animation is in play-pending state.]
-    expected: FAIL
-
-  [Initial current time is scaled by playbackRate set while scroll-linked animation is in idle state.]
-    expected: FAIL
-
-  [Scroll-linked animation playback rate affects the rate of progress of the current time.]
-    expected: FAIL
-
-  [The current time is not affected by playbackRate set while the scroll-linked animation is in play state.]
-    expected: FAIL
-
-  [The playback rate set before scroll-linked animation started playing affects the rate of progress of the current time]
-    expected: FAIL
-
-  [When playback rate is updated, the underlying effect is properly updated with the current time of its scroll-linked WorkletAnimation and produces correct visual result.]
-    expected: FAIL
+  expected: ERROR
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/scroll-timeline-writing-modes.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/scroll-timeline-writing-modes.https.html.ini
index 72204df..0d6dd8a 100644
--- a/third_party/blink/web_tests/external/wpt/animation-worklet/scroll-timeline-writing-modes.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/scroll-timeline-writing-modes.https.html.ini
@@ -1,15 +1,2 @@
 [scroll-timeline-writing-modes.https.html]
-  [A block ScrollTimeline should produce the correct current time for vertical-lr]
-    expected: FAIL
-
-  [A block ScrollTimeline should produce the correct current time for vertical-rl]
-    expected: FAIL
-
-  [An inline ScrollTimeline should produce the correct current time for horizontal-tb and direction: rtl]
-    expected: FAIL
-
-  [An inline ScrollTimeline should produce the correct current time for vertical writing mode]
-    expected: FAIL
-
-  [An inline ScrollTimeline should produce the correct current time for vertical writing mode and direction: rtl]
-    expected: FAIL
+  expected: ERROR
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/stateful-animator.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/stateful-animator.https.html.ini
new file mode 100644
index 0000000..6e22ffb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/stateful-animator.https.html.ini
@@ -0,0 +1,18 @@
+[stateful-animator.https.html]
+  [Stateful Animator instance gets dropped (does not get migrated) if state function is not serializable.]
+    expected: FAIL
+
+  [Stateful animator can use its state to update the animation. Pass if test does not timeout]
+    expected: FAIL
+
+  [Stateful animator gets recreated with 'undefined' state if state function returns undefined.]
+    expected: FAIL
+
+  [Stateless animator gets reecreated with 'undefined' state.]
+    expected: FAIL
+
+  [Stateless animator should not copy the effect object.]
+    expected: FAIL
+
+  [Stateless animator should preserve the local time of its effect.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-animator-name.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-animator-name.https.html.ini
new file mode 100644
index 0000000..600f5c9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-animator-name.https.html.ini
@@ -0,0 +1,3 @@
+[worklet-animation-animator-name.https.html]
+  [Verify that animatorName matches passed name]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-cancel.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-cancel.https.html.ini
new file mode 100644
index 0000000..8eabd72c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-cancel.https.html.ini
@@ -0,0 +1,2 @@
+[worklet-animation-cancel.https.html]
+  expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-creation.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-creation.https.html.ini
index cff9ef9..e3a37fa 100644
--- a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-creation.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-creation.https.html.ini
@@ -1,3 +1,24 @@
 [worklet-animation-creation.https.html]
+  [Constructing worklet animation for unregisested animator should throw]
+    expected: FAIL
+
+  [Creating animation with effects from different documents is allowed]
+    expected: FAIL
+
+  [If there are no effects specified, object construction should fail]
+    expected: FAIL
+
   [ScrollTimeline is a valid timeline for a WorkletAnimation]
     expected: FAIL
+
+  [WorkletAnimation creation should choose the correct timeline based on the current global object]
+    expected: FAIL
+
+  [WorkletAnimation creation with timeline and options should work]
+    expected: FAIL
+
+  [WorkletAnimation creation with timeline should work]
+    expected: FAIL
+
+  [WorkletAnimation creation without timeline should use default documentation timeline]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-duration.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-duration.https.html.ini
new file mode 100644
index 0000000..beabec8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-duration.https.html.ini
@@ -0,0 +1,3 @@
+[worklet-animation-duration.https.html]
+  [WorkletAnimation should continue to be in effect forever, even if its duration is passed]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-get-computed-timing-progress-on-worklet-thread.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-get-computed-timing-progress-on-worklet-thread.https.html.ini
new file mode 100644
index 0000000..a5ede0a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-get-computed-timing-progress-on-worklet-thread.https.html.ini
@@ -0,0 +1,3 @@
+[worklet-animation-get-computed-timing-progress-on-worklet-thread.https.html]
+  [WorkletAnimation effect should recompute its calculated timing if its local time changes]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-get-timing-on-worklet-thread.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-get-timing-on-worklet-thread.https.html.ini
new file mode 100644
index 0000000..694e0da
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-get-timing-on-worklet-thread.https.html.ini
@@ -0,0 +1,2 @@
+[worklet-animation-get-timing-on-worklet-thread.https.html]
+  expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-local-time-after-duration.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-local-time-after-duration.https.html.ini
new file mode 100644
index 0000000..59a7fc7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-local-time-after-duration.https.html.ini
@@ -0,0 +1,2 @@
+[worklet-animation-local-time-after-duration.https.html]
+  expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-local-time-before-start.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-local-time-before-start.https.html.ini
new file mode 100644
index 0000000..d0f0108
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-local-time-before-start.https.html.ini
@@ -0,0 +1,2 @@
+[worklet-animation-local-time-before-start.https.html]
+  expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-local-time-null-1.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-local-time-null-1.https.html.ini
new file mode 100644
index 0000000..9e229ba
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-local-time-null-1.https.html.ini
@@ -0,0 +1,12 @@
+[worklet-animation-local-time-null-1.https.html]
+  [A worklet which changes localTime to from a number to null has no effect on backgroundColor.]
+    expected: FAIL
+
+  [A worklet which changes localTime to from a number to null has no effect on transform.]
+    expected: FAIL
+
+  [A worklet which never sets localTime has no effect.]
+    expected: FAIL
+
+  [A worklet which sets localTime to null has no effect.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-local-time-null-2.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-local-time-null-2.https.html.ini
new file mode 100644
index 0000000..c5c79208
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-local-time-null-2.https.html.ini
@@ -0,0 +1,2 @@
+[worklet-animation-local-time-null-2.https.html]
+  expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-pause-immediately.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-pause-immediately.https.html.ini
new file mode 100644
index 0000000..273789f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-pause-immediately.https.html.ini
@@ -0,0 +1,2 @@
+[worklet-animation-pause-immediately.https.html]
+  expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-pause-resume.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-pause-resume.https.html.ini
new file mode 100644
index 0000000..fabe0e0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-pause-resume.https.html.ini
@@ -0,0 +1,2 @@
+[worklet-animation-pause-resume.https.html]
+  expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-pause.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-pause.https.html.ini
new file mode 100644
index 0000000..7882feee
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-pause.https.html.ini
@@ -0,0 +1,2 @@
+[worklet-animation-pause.https.html]
+  expected: ERROR
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-play.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-play.https.html.ini
new file mode 100644
index 0000000..52d94ab
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-play.https.html.ini
@@ -0,0 +1,6 @@
+[worklet-animation-play.https.html]
+  [A running worklet animation should output values at specified local time.]
+    expected: FAIL
+
+  [Playing a running animation should be a no-op.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-set-keyframes.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-set-keyframes.https.html.ini
new file mode 100644
index 0000000..ab47701
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-set-keyframes.https.html.ini
@@ -0,0 +1,2 @@
+[worklet-animation-set-keyframes.https.html]
+  expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-set-timing.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-set-timing.https.html.ini
new file mode 100644
index 0000000..8af5ed5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-set-timing.https.html.ini
@@ -0,0 +1,2 @@
+[worklet-animation-set-timing.https.html]
+  expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-start-delay.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-start-delay.https.html.ini
new file mode 100644
index 0000000..e09e9ac
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-start-delay.https.html.ini
@@ -0,0 +1,2 @@
+[worklet-animation-start-delay.https.html]
+  expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-with-effects-from-different-frames.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-with-effects-from-different-frames.https.html.ini
new file mode 100644
index 0000000..7286082
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-with-effects-from-different-frames.https.html.ini
@@ -0,0 +1,3 @@
+[worklet-animation-with-effects-from-different-frames.https.html]
+  [Effects from different documents can be animated within one worklet animation]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-with-fill-mode.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-with-fill-mode.https.html.ini
new file mode 100644
index 0000000..a6da9e7f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-with-fill-mode.https.html.ini
@@ -0,0 +1,2 @@
+[worklet-animation-with-fill-mode.https.html]
+  expected: ERROR
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-with-invalid-effect.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-with-invalid-effect.https.html.ini
new file mode 100644
index 0000000..1b77811
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-with-invalid-effect.https.html.ini
@@ -0,0 +1,3 @@
+[worklet-animation-with-invalid-effect.https.html]
+  [Trying to play invalid worklet animation should throw an exception.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-with-non-ascii-name.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-with-non-ascii-name.https.html.ini
new file mode 100644
index 0000000..9fb75ae
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-with-non-ascii-name.https.html.ini
@@ -0,0 +1,2 @@
+[worklet-animation-with-non-ascii-name.https.html]
+  expected: TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-without-target.https.html.ini b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-without-target.https.html.ini
new file mode 100644
index 0000000..84cb4f2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/animation-worklet/worklet-animation-without-target.https.html.ini
@@ -0,0 +1,2 @@
+[worklet-animation-without-target.https.html]
+  expected: ERROR
diff --git a/third_party/blink/web_tests/external/wpt/audio-output/setSinkId-with-selectAudioOutput.https-expected.txt b/third_party/blink/web_tests/external/wpt/audio-output/setSinkId-with-selectAudioOutput.https-expected.txt
index ddce6a9a..d727180 100644
--- a/third_party/blink/web_tests/external/wpt/audio-output/setSinkId-with-selectAudioOutput.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/audio-output/setSinkId-with-selectAudioOutput.https-expected.txt
@@ -1,5 +1,7 @@
 This is a testharness.js-based test.
 FAIL setSinkId() after selectAudioOutput() promise_test: Unhandled rejection with value: object "TypeError: navigator.mediaDevices.selectAudioOutput is not a function"
+FAIL setSinkId() on video after loadeddata assert_not_equals: selectAudioOutput() resolved got disallowed value undefined
+FAIL setSinkId() on video after play assert_not_equals: selectAudioOutput() resolved got disallowed value undefined
 FAIL setSinkId() with deviceID from another window assert_not_equals: selectAudioOutput() resolved got disallowed value undefined
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/audio-output/setSinkId-with-selectAudioOutput.https.html b/third_party/blink/web_tests/external/wpt/audio-output/setSinkId-with-selectAudioOutput.https.html
index 6847545..dbe32e260 100644
--- a/third_party/blink/web_tests/external/wpt/audio-output/setSinkId-with-selectAudioOutput.https.html
+++ b/third_party/blink/web_tests/external/wpt/audio-output/setSinkId-with-selectAudioOutput.https.html
@@ -29,6 +29,37 @@
   assert_equals(r, undefined, "resetting sinkid on default audio output should always work");
 }, "setSinkId() after selectAudioOutput()");
 
+const src = "/media/movie_5.ogv";
+
+promise_test(async t => {
+  assert_not_equals(deviceId, undefined, "selectAudioOutput() resolved");
+  const video = document.createElement('video');
+  try {
+    document.body.appendChild(video);
+    video.src = src;
+    await new Promise(r => video.onloadeddata = r);
+    await video.setSinkId(deviceId);
+    assert_equals(video.sinkId, deviceId, "sinkId after setSinkId()");
+  } finally {
+    video.remove();
+  }
+}, "setSinkId() on video after loadeddata");
+
+promise_test(async t => {
+  assert_not_equals(deviceId, undefined, "selectAudioOutput() resolved");
+  const video = document.createElement('video');
+  try {
+    video.src = src;
+    video.autoplay = true;
+    video.loop = true;
+    await new Promise(r => video.onplay = r);
+    await video.setSinkId(deviceId);
+    assert_equals(video.sinkId, deviceId, "sinkId after setSinkId()");
+  } finally {
+    video.pause();
+  }
+}, "setSinkId() on video after play");
+
 // Use the same sinkId in another same-origin top-level browsing context.
 // "the identifier MUST be the same in documents of the same origin in
 // top-level browsing contexts."
diff --git a/third_party/blink/web_tests/external/wpt/audio-output/setSinkId-with-selectAudioOutput.https.html.ini b/third_party/blink/web_tests/external/wpt/audio-output/setSinkId-with-selectAudioOutput.https.html.ini
index 5ebb9ef6..f5a88c8 100644
--- a/third_party/blink/web_tests/external/wpt/audio-output/setSinkId-with-selectAudioOutput.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/audio-output/setSinkId-with-selectAudioOutput.https.html.ini
@@ -2,5 +2,13 @@
   [setSinkId() after selectAudioOutput()]
     expected: FAIL
 
+  [setSinkId() on video after loadeddata]
+    expected:
+      if product == "chrome": FAIL
+
+  [setSinkId() on video after play]
+    expected:
+      if product == "chrome": FAIL
+
   [setSinkId() with deviceID from another window]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/script-src-self/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/script-src-self/worklet-animation.https.html.ini
index acb0cff..5695646 100644
--- a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/script-src-self/worklet-animation.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/script-src-self/worklet-animation.https.html.ini
@@ -1,4 +1,10 @@
 [worklet-animation.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
   [Content Security Policy: Expects blocked for worklet-animation to cross-https origin and keep-origin redirection from https context.: securitypolicyviolation]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/script-src-wildcard/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/script-src-wildcard/worklet-animation.https.html.ini
new file mode 100644
index 0000000..b86a23f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/script-src-wildcard/worklet-animation.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and swap-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and swap-origin redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-none/worklet-animation-import-data.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-none/worklet-animation-import-data.https.html.ini
new file mode 100644
index 0000000..d07fb3b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-none/worklet-animation-import-data.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation-import-data.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and swap-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and swap-origin redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-none/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-none/worklet-animation.https.html.ini
new file mode 100644
index 0000000..b86a23f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-none/worklet-animation.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and swap-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and swap-origin redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-self/worklet-animation-import-data.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-self/worklet-animation-import-data.https.html.ini
new file mode 100644
index 0000000..d07fb3b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-self/worklet-animation-import-data.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation-import-data.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and swap-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and swap-origin redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-self/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-self/worklet-animation.https.html.ini
new file mode 100644
index 0000000..b86a23f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-self/worklet-animation.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and swap-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and swap-origin redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-wildcard/worklet-animation-import-data.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-wildcard/worklet-animation-import-data.https.html.ini
new file mode 100644
index 0000000..d07fb3b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-wildcard/worklet-animation-import-data.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation-import-data.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and swap-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and swap-origin redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-wildcard/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-wildcard/worklet-animation.https.html.ini
new file mode 100644
index 0000000..b86a23f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.http-rp/worker-src-wildcard/worklet-animation.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and swap-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and swap-origin redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/script-src-self/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/script-src-self/worklet-animation.https.html.ini
index acb0cff..5695646 100644
--- a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/script-src-self/worklet-animation.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/script-src-self/worklet-animation.https.html.ini
@@ -1,4 +1,10 @@
 [worklet-animation.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
   [Content Security Policy: Expects blocked for worklet-animation to cross-https origin and keep-origin redirection from https context.: securitypolicyviolation]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/script-src-wildcard/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/script-src-wildcard/worklet-animation.https.html.ini
new file mode 100644
index 0000000..b86a23f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/script-src-wildcard/worklet-animation.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and swap-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and swap-origin redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-none/worklet-animation-import-data.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-none/worklet-animation-import-data.https.html.ini
new file mode 100644
index 0000000..d07fb3b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-none/worklet-animation-import-data.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation-import-data.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and swap-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and swap-origin redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-none/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-none/worklet-animation.https.html.ini
new file mode 100644
index 0000000..b86a23f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-none/worklet-animation.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and swap-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and swap-origin redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-self/worklet-animation-import-data.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-self/worklet-animation-import-data.https.html.ini
new file mode 100644
index 0000000..d07fb3b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-self/worklet-animation-import-data.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation-import-data.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and swap-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and swap-origin redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-self/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-self/worklet-animation.https.html.ini
new file mode 100644
index 0000000..b86a23f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-self/worklet-animation.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and swap-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and swap-origin redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-wildcard/worklet-animation-import-data.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-wildcard/worklet-animation-import-data.https.html.ini
new file mode 100644
index 0000000..d07fb3b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-wildcard/worklet-animation-import-data.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation-import-data.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to cross-https origin and swap-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation-import-data to same-https origin and swap-origin redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-wildcard/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-wildcard/worklet-animation.https.html.ini
new file mode 100644
index 0000000..b86a23f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/gen/top.meta/worker-src-wildcard/worklet-animation.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation.https.html]
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to cross-https origin and swap-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and keep-origin redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Content Security Policy: Expects allowed for worklet-animation to same-https origin and swap-origin redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/securitypolicyviolation/blockeduri-inline-expected.txt b/third_party/blink/web_tests/external/wpt/content-security-policy/securitypolicyviolation/blockeduri-inline-expected.txt
index 9c3089f2..bdc8d6b 100644
--- a/third_party/blink/web_tests/external/wpt/content-security-policy/securitypolicyviolation/blockeduri-inline-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/securitypolicyviolation/blockeduri-inline-expected.txt
@@ -1,4 +1,4 @@
 This is a testharness.js-based test.
-FAIL Inline violations have a blockedURI of 'inline' assert_equals: expected 1 but got 0
+FAIL Inline violations have a blockedURI of 'inline' assert_equals: expected 8 but got 0
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/securitypolicyviolation/blockeduri-inline.html b/third_party/blink/web_tests/external/wpt/content-security-policy/securitypolicyviolation/blockeduri-inline.html
index 40c4865..7cced9e 100644
--- a/third_party/blink/web_tests/external/wpt/content-security-policy/securitypolicyviolation/blockeduri-inline.html
+++ b/third_party/blink/web_tests/external/wpt/content-security-policy/securitypolicyviolation/blockeduri-inline.html
@@ -8,7 +8,7 @@
         watcher.wait_for('securitypolicyviolation').then(t.step_func_done(e => {
             assert_equals(e.blockedURI, "inline");
             assert_equals(e.lineNumber, 15);
-            assert_equals(e.columnNumber, 1);
+            assert_equals(e.columnNumber, 8);
         }));
     }, "Inline violations have a blockedURI of 'inline'");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-default-basics.html.ini b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-default-basics.html.ini
deleted file mode 100644
index d652ce9..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-default-basics.html.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[anchor-default-basics.html]
-  [CSS Transitions: property <anchor-default> from [--foo\] to [implicit\] at (-0.3) should be [implicit\]]
-    expected: FAIL
-
-  [CSS Transitions: property <anchor-default> from [--foo\] to [implicit\] at (0) should be [implicit\]]
-    expected: FAIL
-
-  [CSS Transitions: property <anchor-default> from [--foo\] to [implicit\] at (0.3) should be [implicit\]]
-    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-basics.html.ini b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-basics.html.ini
deleted file mode 100644
index aba97000..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-basics.html.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[anchor-name-basics.html]
-  [CSS Transitions: property <anchor-name> from [--foo\] to [none\] at (-0.3) should be [none\]]
-    expected: FAIL
-
-  [CSS Transitions: property <anchor-name> from [--foo\] to [none\] at (0) should be [none\]]
-    expected: FAIL
-
-  [CSS Transitions: property <anchor-name> from [--foo\] to [none\] at (0.3) should be [none\]]
-    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/position-fallback-basics.html.ini b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/position-fallback-basics.html.ini
deleted file mode 100644
index f4fce07..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/position-fallback-basics.html.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[position-fallback-basics.html]
-  [CSS Transitions: property <position-fallback> from [--foo\] to [none\] at (-0.3) should be [none\]]
-    expected: FAIL
-
-  [CSS Transitions: property <position-fallback> from [--foo\] to [none\] at (0) should be [none\]]
-    expected: FAIL
-
-  [CSS Transitions: property <position-fallback> from [--foo\] to [none\] at (0.3) should be [none\]]
-    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/border-radius-clip-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/border-radius-clip-001.html.ini
new file mode 100644
index 0000000..d7b1866
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/border-radius-clip-001.html.ini
@@ -0,0 +1,3 @@
+[border-radius-clip-001.html]
+  expected:
+    if (product == "content_shell") and (os == "linux"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-function-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-function-expected.txt
new file mode 100644
index 0000000..4e36481
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-function-expected.txt
@@ -0,0 +1,405 @@
+This is a testharness.js-based test.
+Found 401 tests; 383 PASS, 18 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Property color value 'color(srgb 0% 0% 0%)'
+PASS Property color value 'color(srgb 10% 10% 10%)'
+PASS Property color value 'color(srgb .2 .2 25%)'
+PASS Property color value 'color(srgb 0 0 0 / 1)'
+PASS Property color value 'color(srgb 0% 0 0 / 0.5)'
+PASS Property color value 'color(srgb 20% 0 10/0.5)'
+PASS Property color value 'color(srgb 20% 0 10/50%)'
+PASS Property color value 'color(srgb 400% 0 10/50%)'
+PASS Property color value 'color(srgb 50% -160 160)'
+PASS Property color value 'color(srgb 50% -200 200)'
+PASS Property color value 'color(srgb 0 0 0 / -10%)'
+PASS Property color value 'color(srgb 0 0 0 / 110%)'
+PASS Property color value 'color(srgb 0 0 0 / 300%)'
+PASS Property color value 'color(srgb 200 200 200)'
+PASS Property color value 'color(srgb 200 200 200 / 200)'
+PASS Property color value 'color(srgb -200 -200 -200)'
+PASS Property color value 'color(srgb -200 -200 -200 / -200)'
+PASS Property color value 'color(srgb 200% 200% 200%)'
+PASS Property color value 'color(srgb 200% 200% 200% / 200%)'
+PASS Property color value 'color(srgb -200% -200% -200% / -200%)'
+PASS Property color value 'color(srgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))'
+PASS Property color value 'color(srgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))'
+PASS Property color value 'color(srgb none none none / none)'
+PASS Property color value 'color(srgb none none none)'
+PASS Property color value 'color(srgb 10% none none / none)'
+PASS Property color value 'color(srgb none none none / 0.5)'
+PASS Property color value 'color(srgb 0 0 0 / none)'
+FAIL Property color value 'color(srgb calc(NaN) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+FAIL Property color value 'color(srgb calc(0 / 0) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+PASS Property color value 'color(srgb-linear 0% 0% 0%)'
+PASS Property color value 'color(srgb-linear 10% 10% 10%)'
+PASS Property color value 'color(srgb-linear .2 .2 25%)'
+PASS Property color value 'color(srgb-linear 0 0 0 / 1)'
+PASS Property color value 'color(srgb-linear 0% 0 0 / 0.5)'
+PASS Property color value 'color(srgb-linear 20% 0 10/0.5)'
+PASS Property color value 'color(srgb-linear 20% 0 10/50%)'
+PASS Property color value 'color(srgb-linear 400% 0 10/50%)'
+PASS Property color value 'color(srgb-linear 50% -160 160)'
+PASS Property color value 'color(srgb-linear 50% -200 200)'
+PASS Property color value 'color(srgb-linear 0 0 0 / -10%)'
+PASS Property color value 'color(srgb-linear 0 0 0 / 110%)'
+PASS Property color value 'color(srgb-linear 0 0 0 / 300%)'
+PASS Property color value 'color(srgb-linear 200 200 200)'
+PASS Property color value 'color(srgb-linear 200 200 200 / 200)'
+PASS Property color value 'color(srgb-linear -200 -200 -200)'
+PASS Property color value 'color(srgb-linear -200 -200 -200 / -200)'
+PASS Property color value 'color(srgb-linear 200% 200% 200%)'
+PASS Property color value 'color(srgb-linear 200% 200% 200% / 200%)'
+PASS Property color value 'color(srgb-linear -200% -200% -200% / -200%)'
+PASS Property color value 'color(srgb-linear calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))'
+PASS Property color value 'color(srgb-linear calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))'
+PASS Property color value 'color(srgb-linear none none none / none)'
+PASS Property color value 'color(srgb-linear none none none)'
+PASS Property color value 'color(srgb-linear 10% none none / none)'
+PASS Property color value 'color(srgb-linear none none none / 0.5)'
+PASS Property color value 'color(srgb-linear 0 0 0 / none)'
+FAIL Property color value 'color(srgb-linear calc(NaN) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+FAIL Property color value 'color(srgb-linear calc(0 / 0) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+PASS Property color value 'color(a98-rgb 0% 0% 0%)'
+PASS Property color value 'color(a98-rgb 10% 10% 10%)'
+PASS Property color value 'color(a98-rgb .2 .2 25%)'
+PASS Property color value 'color(a98-rgb 0 0 0 / 1)'
+PASS Property color value 'color(a98-rgb 0% 0 0 / 0.5)'
+PASS Property color value 'color(a98-rgb 20% 0 10/0.5)'
+PASS Property color value 'color(a98-rgb 20% 0 10/50%)'
+PASS Property color value 'color(a98-rgb 400% 0 10/50%)'
+PASS Property color value 'color(a98-rgb 50% -160 160)'
+PASS Property color value 'color(a98-rgb 50% -200 200)'
+PASS Property color value 'color(a98-rgb 0 0 0 / -10%)'
+PASS Property color value 'color(a98-rgb 0 0 0 / 110%)'
+PASS Property color value 'color(a98-rgb 0 0 0 / 300%)'
+PASS Property color value 'color(a98-rgb 200 200 200)'
+PASS Property color value 'color(a98-rgb 200 200 200 / 200)'
+PASS Property color value 'color(a98-rgb -200 -200 -200)'
+PASS Property color value 'color(a98-rgb -200 -200 -200 / -200)'
+PASS Property color value 'color(a98-rgb 200% 200% 200%)'
+PASS Property color value 'color(a98-rgb 200% 200% 200% / 200%)'
+PASS Property color value 'color(a98-rgb -200% -200% -200% / -200%)'
+PASS Property color value 'color(a98-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))'
+PASS Property color value 'color(a98-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))'
+PASS Property color value 'color(a98-rgb none none none / none)'
+PASS Property color value 'color(a98-rgb none none none)'
+PASS Property color value 'color(a98-rgb 10% none none / none)'
+PASS Property color value 'color(a98-rgb none none none / 0.5)'
+PASS Property color value 'color(a98-rgb 0 0 0 / none)'
+FAIL Property color value 'color(a98-rgb calc(NaN) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+FAIL Property color value 'color(a98-rgb calc(0 / 0) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+PASS Property color value 'color(rec2020 0% 0% 0%)'
+PASS Property color value 'color(rec2020 10% 10% 10%)'
+PASS Property color value 'color(rec2020 .2 .2 25%)'
+PASS Property color value 'color(rec2020 0 0 0 / 1)'
+PASS Property color value 'color(rec2020 0% 0 0 / 0.5)'
+PASS Property color value 'color(rec2020 20% 0 10/0.5)'
+PASS Property color value 'color(rec2020 20% 0 10/50%)'
+PASS Property color value 'color(rec2020 400% 0 10/50%)'
+PASS Property color value 'color(rec2020 50% -160 160)'
+PASS Property color value 'color(rec2020 50% -200 200)'
+PASS Property color value 'color(rec2020 0 0 0 / -10%)'
+PASS Property color value 'color(rec2020 0 0 0 / 110%)'
+PASS Property color value 'color(rec2020 0 0 0 / 300%)'
+PASS Property color value 'color(rec2020 200 200 200)'
+PASS Property color value 'color(rec2020 200 200 200 / 200)'
+PASS Property color value 'color(rec2020 -200 -200 -200)'
+PASS Property color value 'color(rec2020 -200 -200 -200 / -200)'
+PASS Property color value 'color(rec2020 200% 200% 200%)'
+PASS Property color value 'color(rec2020 200% 200% 200% / 200%)'
+PASS Property color value 'color(rec2020 -200% -200% -200% / -200%)'
+PASS Property color value 'color(rec2020 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))'
+PASS Property color value 'color(rec2020 calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))'
+PASS Property color value 'color(rec2020 none none none / none)'
+PASS Property color value 'color(rec2020 none none none)'
+PASS Property color value 'color(rec2020 10% none none / none)'
+PASS Property color value 'color(rec2020 none none none / 0.5)'
+PASS Property color value 'color(rec2020 0 0 0 / none)'
+FAIL Property color value 'color(rec2020 calc(NaN) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+FAIL Property color value 'color(rec2020 calc(0 / 0) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+PASS Property color value 'color(prophoto-rgb 0% 0% 0%)'
+PASS Property color value 'color(prophoto-rgb 10% 10% 10%)'
+PASS Property color value 'color(prophoto-rgb .2 .2 25%)'
+PASS Property color value 'color(prophoto-rgb 0 0 0 / 1)'
+PASS Property color value 'color(prophoto-rgb 0% 0 0 / 0.5)'
+PASS Property color value 'color(prophoto-rgb 20% 0 10/0.5)'
+PASS Property color value 'color(prophoto-rgb 20% 0 10/50%)'
+PASS Property color value 'color(prophoto-rgb 400% 0 10/50%)'
+PASS Property color value 'color(prophoto-rgb 50% -160 160)'
+PASS Property color value 'color(prophoto-rgb 50% -200 200)'
+PASS Property color value 'color(prophoto-rgb 0 0 0 / -10%)'
+PASS Property color value 'color(prophoto-rgb 0 0 0 / 110%)'
+PASS Property color value 'color(prophoto-rgb 0 0 0 / 300%)'
+PASS Property color value 'color(prophoto-rgb 200 200 200)'
+PASS Property color value 'color(prophoto-rgb 200 200 200 / 200)'
+PASS Property color value 'color(prophoto-rgb -200 -200 -200)'
+PASS Property color value 'color(prophoto-rgb -200 -200 -200 / -200)'
+PASS Property color value 'color(prophoto-rgb 200% 200% 200%)'
+PASS Property color value 'color(prophoto-rgb 200% 200% 200% / 200%)'
+PASS Property color value 'color(prophoto-rgb -200% -200% -200% / -200%)'
+PASS Property color value 'color(prophoto-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))'
+PASS Property color value 'color(prophoto-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))'
+PASS Property color value 'color(prophoto-rgb none none none / none)'
+PASS Property color value 'color(prophoto-rgb none none none)'
+PASS Property color value 'color(prophoto-rgb 10% none none / none)'
+PASS Property color value 'color(prophoto-rgb none none none / 0.5)'
+PASS Property color value 'color(prophoto-rgb 0 0 0 / none)'
+FAIL Property color value 'color(prophoto-rgb calc(NaN) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+FAIL Property color value 'color(prophoto-rgb calc(0 / 0) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+PASS Property color value 'color(display-p3 0% 0% 0%)'
+PASS Property color value 'color(display-p3 10% 10% 10%)'
+PASS Property color value 'color(display-p3 .2 .2 25%)'
+PASS Property color value 'color(display-p3 0 0 0 / 1)'
+PASS Property color value 'color(display-p3 0% 0 0 / 0.5)'
+PASS Property color value 'color(display-p3 20% 0 10/0.5)'
+PASS Property color value 'color(display-p3 20% 0 10/50%)'
+PASS Property color value 'color(display-p3 400% 0 10/50%)'
+PASS Property color value 'color(display-p3 50% -160 160)'
+PASS Property color value 'color(display-p3 50% -200 200)'
+PASS Property color value 'color(display-p3 0 0 0 / -10%)'
+PASS Property color value 'color(display-p3 0 0 0 / 110%)'
+PASS Property color value 'color(display-p3 0 0 0 / 300%)'
+PASS Property color value 'color(display-p3 200 200 200)'
+PASS Property color value 'color(display-p3 200 200 200 / 200)'
+PASS Property color value 'color(display-p3 -200 -200 -200)'
+PASS Property color value 'color(display-p3 -200 -200 -200 / -200)'
+PASS Property color value 'color(display-p3 200% 200% 200%)'
+PASS Property color value 'color(display-p3 200% 200% 200% / 200%)'
+PASS Property color value 'color(display-p3 -200% -200% -200% / -200%)'
+PASS Property color value 'color(display-p3 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))'
+PASS Property color value 'color(display-p3 calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))'
+PASS Property color value 'color(display-p3 none none none / none)'
+PASS Property color value 'color(display-p3 none none none)'
+PASS Property color value 'color(display-p3 10% none none / none)'
+PASS Property color value 'color(display-p3 none none none / 0.5)'
+PASS Property color value 'color(display-p3 0 0 0 / none)'
+FAIL Property color value 'color(display-p3 calc(NaN) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+FAIL Property color value 'color(display-p3 calc(0 / 0) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+PASS Property color value 'color(xyz 0 0 0)'
+PASS Property color value 'color(xyz 0 0 0 / 1)'
+PASS Property color value 'color(xyz 1 1 1)'
+PASS Property color value 'color(xyz 1 1 1 / 1)'
+PASS Property color value 'color(xyz -1 -1 -1)'
+PASS Property color value 'color(xyz 0.1 0.1 0.1)'
+PASS Property color value 'color(xyz 10 10 10)'
+PASS Property color value 'color(xyz .2 .2 .25)'
+PASS Property color value 'color(xyz 0 0 0 / 0.5)'
+PASS Property color value 'color(xyz .20 0 10/0.5)'
+PASS Property color value 'color(xyz .20 0 10/50%)'
+PASS Property color value 'color(xyz 0 0 0 / -10%)'
+PASS Property color value 'color(xyz 0 0 0 / 110%)'
+PASS Property color value 'color(xyz 0 0 0 / 300%)'
+PASS Property color value 'color(xyz calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))'
+PASS Property color value 'color(xyz none none none / none)'
+PASS Property color value 'color(xyz none none none)'
+PASS Property color value 'color(xyz 0.2 none none / none)'
+PASS Property color value 'color(xyz none none none / 0.5)'
+PASS Property color value 'color(xyz 0 0 0 / none)'
+FAIL Property color value 'color(xyz calc(NaN) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+FAIL Property color value 'color(xyz calc(0 / 0) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+PASS Property color value 'color(xyz-d50 0 0 0)'
+PASS Property color value 'color(xyz-d50 0 0 0 / 1)'
+PASS Property color value 'color(xyz-d50 1 1 1)'
+PASS Property color value 'color(xyz-d50 1 1 1 / 1)'
+PASS Property color value 'color(xyz-d50 -1 -1 -1)'
+PASS Property color value 'color(xyz-d50 0.1 0.1 0.1)'
+PASS Property color value 'color(xyz-d50 10 10 10)'
+PASS Property color value 'color(xyz-d50 .2 .2 .25)'
+PASS Property color value 'color(xyz-d50 0 0 0 / 0.5)'
+PASS Property color value 'color(xyz-d50 .20 0 10/0.5)'
+PASS Property color value 'color(xyz-d50 .20 0 10/50%)'
+PASS Property color value 'color(xyz-d50 0 0 0 / -10%)'
+PASS Property color value 'color(xyz-d50 0 0 0 / 110%)'
+PASS Property color value 'color(xyz-d50 0 0 0 / 300%)'
+PASS Property color value 'color(xyz-d50 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))'
+PASS Property color value 'color(xyz-d50 none none none / none)'
+PASS Property color value 'color(xyz-d50 none none none)'
+PASS Property color value 'color(xyz-d50 0.2 none none / none)'
+PASS Property color value 'color(xyz-d50 none none none / 0.5)'
+PASS Property color value 'color(xyz-d50 0 0 0 / none)'
+FAIL Property color value 'color(xyz-d50 calc(NaN) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+FAIL Property color value 'color(xyz-d50 calc(0 / 0) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+PASS Property color value 'color(xyz-d65 0 0 0)'
+PASS Property color value 'color(xyz-d65 0 0 0 / 1)'
+PASS Property color value 'color(xyz-d65 1 1 1)'
+PASS Property color value 'color(xyz-d65 1 1 1 / 1)'
+PASS Property color value 'color(xyz-d65 -1 -1 -1)'
+PASS Property color value 'color(xyz-d65 0.1 0.1 0.1)'
+PASS Property color value 'color(xyz-d65 10 10 10)'
+PASS Property color value 'color(xyz-d65 .2 .2 .25)'
+PASS Property color value 'color(xyz-d65 0 0 0 / 0.5)'
+PASS Property color value 'color(xyz-d65 .20 0 10/0.5)'
+PASS Property color value 'color(xyz-d65 .20 0 10/50%)'
+PASS Property color value 'color(xyz-d65 0 0 0 / -10%)'
+PASS Property color value 'color(xyz-d65 0 0 0 / 110%)'
+PASS Property color value 'color(xyz-d65 0 0 0 / 300%)'
+PASS Property color value 'color(xyz-d65 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))'
+PASS Property color value 'color(xyz-d65 none none none / none)'
+PASS Property color value 'color(xyz-d65 none none none)'
+PASS Property color value 'color(xyz-d65 0.2 none none / none)'
+PASS Property color value 'color(xyz-d65 none none none / 0.5)'
+PASS Property color value 'color(xyz-d65 0 0 0 / none)'
+FAIL Property color value 'color(xyz-d65 calc(NaN) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+FAIL Property color value 'color(xyz-d65 calc(0 / 0) 0 0 / none)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+PASS Property color value 'color(srgb 1.00 0.50 0.200)' [sRGB all numbers]
+PASS Property color value 'color(srgb 100% 50% 20%)' [sRGB all percent]
+PASS Property color value 'color(srgb 100% 0.5 20%)' [sRGB mixed number and percent]
+PASS Property color value 'color(srgb 1.00 50% 0.2)' [sRGB mixed number and percent 2]
+PASS Property color value 'color(srgb none none none)' [sRGB all none]
+PASS Property color value 'color(srgb 1.00 none 0.2)' [sRGB number and none]
+PASS Property color value 'color(srgb 100% none 20%)' [sRGB percent and none]
+PASS Property color value 'color(srgb 100% none 0.2)' [sRGB number, percent and none]
+PASS Property color value 'color(srgb 1.00 0.50 0.200 / 0.6)' [sRGB with alpha, all numbers]
+PASS Property color value 'color(srgb 100% 50% 20% / 60%)' [sRGB with alpha, all percent]
+PASS Property color value 'color(srgb 100% 0.5 20% / 0.6)' [sRGB with alpha, mixed number and percent]
+PASS Property color value 'color(srgb 1.00 50% 0.2 / 60%)' [sRGB with alpha, mixed number and percent 2]
+PASS Property color value 'color(srgb none none none / none)' [sRGB with alpha, all none]
+PASS Property color value 'color(srgb 1.00 none 0.2 / none)' [sRGB with alpha, number and none]
+PASS Property color value 'color(srgb 100% none 20% / 30%)' [sRGB with alpha, percent and none]
+PASS Property color value 'color(srgb 100% none 0.2 / 23.7%)' [sRGB with alpha, number, percent and none]
+PASS Property color value 'color(srgb-linear 1.00 0.50 0.200)' [Linear-light sRGB all numbers]
+PASS Property color value 'color(srgb-linear 100% 50% 20%)' [Linear-light sRGB all percent]
+PASS Property color value 'color(srgb-linear 100% 0.5 20%)' [Linear-light sRGB mixed number and percent]
+PASS Property color value 'color(srgb-linear 1.00 50% 0.2)' [Linear-light sRGB mixed number and percent 2]
+PASS Property color value 'color(srgb-linear none none none)' [Linear-light sRGB all none]
+PASS Property color value 'color(srgb-linear 1.00 none 0.2)' [Linear-light sRGB number and none]
+PASS Property color value 'color(srgb-linear 100% none 20%)' [Linear-light sRGB percent and none]
+PASS Property color value 'color(srgb-linear 100% none 0.2)' [Linear-light sRGB number, percent and none]
+PASS Property color value 'color(srgb-linear 1.00 0.50 0.200 / 0.6)' [Linear-light sRGB with alpha, all numbers]
+PASS Property color value 'color(srgb-linear 100% 50% 20% / 60%)' [Linear-light sRGB with alpha, all percent]
+PASS Property color value 'color(srgb-linear 100% 0.5 20% / 0.6)' [Linear-light sRGB with alpha, mixed number and percent]
+PASS Property color value 'color(srgb-linear 1.00 50% 0.2 / 60%)' [Linear-light sRGB with alpha, mixed number and percent 2]
+PASS Property color value 'color(srgb-linear none none none / none)' [Linear-light sRGB with alpha, all none]
+PASS Property color value 'color(srgb-linear 1.00 none 0.2 / none)' [Linear-light sRGB with alpha, number and none]
+PASS Property color value 'color(srgb-linear 100% none 20% / 30%)' [Linear-light sRGB with alpha, percent and none]
+PASS Property color value 'color(srgb-linear 100% none 0.2 / 23.7%)' [Linear-light sRGB with alpha, number, percent and none]
+PASS Property color value 'color(display-p3 1.00 0.50 0.200)' [Display P3 all numbers]
+PASS Property color value 'color(display-p3 100% 50% 20%)' [Display P3 all percent]
+PASS Property color value 'color(display-p3 100% 0.5 20%)' [Display P3 mixed number and percent]
+PASS Property color value 'color(display-p3 1.00 50% 0.2)' [Display P3 mixed number and percent 2]
+PASS Property color value 'color(display-p3 none none none)' [Display P3 all none]
+PASS Property color value 'color(display-p3 1.00 none 0.2)' [Display P3 number and none]
+PASS Property color value 'color(display-p3 100% none 20%)' [Display P3 percent and none]
+PASS Property color value 'color(display-p3 100% none 0.2)' [Display P3 number, percent and none]
+PASS Property color value 'color(display-p3 1.00 0.50 0.200 / 0.6)' [Display P3 with alpha, all numbers]
+PASS Property color value 'color(display-p3 100% 50% 20% / 60%)' [Display P3 with alpha, all percent]
+PASS Property color value 'color(display-p3 100% 0.5 20% / 0.6)' [Display P3 with alpha, mixed number and percent]
+PASS Property color value 'color(display-p3 1.00 50% 0.2 / 60%)' [Display P3 with alpha, mixed number and percent 2]
+PASS Property color value 'color(display-p3 none none none / none)' [Display P3 with alpha, all none]
+PASS Property color value 'color(display-p3 1.00 none 0.2 / none)' [Display P3 with alpha, number and none]
+PASS Property color value 'color(display-p3 100% none 20% / 30%)' [Display P3 with alpha, percent and none]
+PASS Property color value 'color(display-p3 100% none 0.2 / 23.7%)' [Display P3 with alpha, number, percent and none]
+PASS Property color value 'color(a98-rgb 1.00 0.50 0.200)' [A98 RGB all numbers]
+PASS Property color value 'color(a98-rgb 100% 50% 20%)' [A98 RGB all percent]
+PASS Property color value 'color(a98-rgb 100% 0.5 20%)' [A98 RGB mixed number and percent]
+PASS Property color value 'color(a98-rgb 1.00 50% 0.2)' [A98 RGB mixed number and percent 2]
+PASS Property color value 'color(a98-rgb none none none)' [A98 RGB all none]
+PASS Property color value 'color(a98-rgb 1.00 none 0.2)' [A98 RGB number and none]
+PASS Property color value 'color(a98-rgb 100% none 20%)' [A98 RGB percent and none]
+PASS Property color value 'color(a98-rgb 100% none 0.2)' [A98 RGB number, percent and none]
+PASS Property color value 'color(a98-rgb 1.00 0.50 0.200 / 0.6)' [A98 RGB with alpha, all numbers]
+PASS Property color value 'color(a98-rgb 100% 50% 20% / 60%)' [A98 RGB with alpha, all percent]
+PASS Property color value 'color(a98-rgb 100% 0.5 20% / 0.6)' [A98 RGB with alpha, mixed number and percent]
+PASS Property color value 'color(a98-rgb 1.00 50% 0.2 / 60%)' [A98 RGB with alpha, mixed number and percent 2]
+PASS Property color value 'color(a98-rgb none none none / none)' [A98 RGB with alpha, all none]
+PASS Property color value 'color(a98-rgb 1.00 none 0.2 / none)' [A98 RGB with alpha, number and none]
+PASS Property color value 'color(a98-rgb 100% none 20% / 30%)' [A98 RGB with alpha, percent and none]
+PASS Property color value 'color(a98-rgb 100% none 0.2 / 23.7%)' [A98 RGB with alpha, number, percent and none]
+PASS Property color value 'color(prophoto-rgb 1.00 0.50 0.200)' [ProPhoto RGB all numbers]
+PASS Property color value 'color(prophoto-rgb 100% 50% 20%)' [ProPhoto RGB all percent]
+PASS Property color value 'color(prophoto-rgb 100% 0.5 20%)' [ProPhoto RGB mixed number and percent]
+PASS Property color value 'color(prophoto-rgb 1.00 50% 0.2)' [ProPhoto RGB mixed number and percent 2]
+PASS Property color value 'color(prophoto-rgb none none none)' [ProPhoto RGB all none]
+PASS Property color value 'color(prophoto-rgb 1.00 none 0.2)' [ProPhoto RGB number and none]
+PASS Property color value 'color(prophoto-rgb 100% none 20%)' [ProPhoto RGB percent and none]
+PASS Property color value 'color(prophoto-rgb 100% none 0.2)' [ProPhoto RGB number, percent and none]
+PASS Property color value 'color(prophoto-rgb 1.00 0.50 0.200 / 0.6)' [ProPhoto RGB with alpha, all numbers]
+PASS Property color value 'color(prophoto-rgb 100% 50% 20% / 60%)' [ProPhoto RGB with alpha, all percent]
+PASS Property color value 'color(prophoto-rgb 100% 0.5 20% / 0.6)' [ProPhoto RGB with alpha, mixed number and percent]
+PASS Property color value 'color(prophoto-rgb 1.00 50% 0.2 / 60%)' [ProPhoto RGB with alpha, mixed number and percent 2]
+PASS Property color value 'color(prophoto-rgb none none none / none)' [ProPhoto RGB with alpha, all none]
+PASS Property color value 'color(prophoto-rgb 1.00 none 0.2 / none)' [ProPhoto RGB with alpha, number and none]
+PASS Property color value 'color(prophoto-rgb 100% none 20% / 30%)' [ProPhoto RGB with alpha, percent and none]
+PASS Property color value 'color(prophoto-rgb 100% none 0.2 / 23.7%)' [ProPhoto RGB with alpha, number, percent and none]
+PASS Property color value 'color(rec2020 1.00 0.50 0.200)' [Rec BT.2020 all numbers]
+PASS Property color value 'color(rec2020 100% 50% 20%)' [Rec BT.2020 all percent]
+PASS Property color value 'color(rec2020 100% 0.5 20%)' [Rec BT.2020 mixed number and percent]
+PASS Property color value 'color(rec2020 1.00 50% 0.2)' [Rec BT.2020 mixed number and percent 2]
+PASS Property color value 'color(rec2020 none none none)' [Rec BT.2020 all none]
+PASS Property color value 'color(rec2020 1.00 none 0.2)' [Rec BT.2020 number and none]
+PASS Property color value 'color(rec2020 100% none 20%)' [Rec BT.2020 percent and none]
+PASS Property color value 'color(rec2020 100% none 0.2)' [Rec BT.2020 number, percent and none]
+PASS Property color value 'color(rec2020 1.00 0.50 0.200 / 0.6)' [Rec BT.2020 with alpha, all numbers]
+PASS Property color value 'color(rec2020 100% 50% 20% / 60%)' [Rec BT.2020 with alpha, all percent]
+PASS Property color value 'color(rec2020 100% 0.5 20% / 0.6)' [Rec BT.2020 with alpha, mixed number and percent]
+PASS Property color value 'color(rec2020 1.00 50% 0.2 / 60%)' [Rec BT.2020 with alpha, mixed number and percent 2]
+PASS Property color value 'color(rec2020 none none none / none)' [Rec BT.2020 with alpha, all none]
+PASS Property color value 'color(rec2020 1.00 none 0.2 / none)' [Rec BT.2020 with alpha, number and none]
+PASS Property color value 'color(rec2020 100% none 20% / 30%)' [Rec BT.2020 with alpha, percent and none]
+PASS Property color value 'color(rec2020 100% none 0.2 / 23.7%)' [Rec BT.2020 with alpha, number, percent and none]
+PASS Property color value 'color(xyz-d50 1.00 0.50 0.200)' [CIE XYZ D50 all numbers]
+PASS Property color value 'color(xyz-d50 100% 50% 20%)' [CIE XYZ D50 all percent]
+PASS Property color value 'color(xyz-d50 100% 0.5 20%)' [CIE XYZ D50 mixed number and percent]
+PASS Property color value 'color(xyz-d50 1.00 50% 0.2)' [CIE XYZ D50 mixed number and percent 2]
+PASS Property color value 'color(xyz-d50 none none none)' [CIE XYZ D50 all none]
+PASS Property color value 'color(xyz-d50 1.00 none 0.2)' [CIE XYZ D50 number and none]
+PASS Property color value 'color(xyz-d50 100% none 20%)' [CIE XYZ D50 percent and none]
+PASS Property color value 'color(xyz-d50 100% none 0.2)' [CIE XYZ D50 number, percent and none]
+PASS Property color value 'color(xyz-d50 1.00 0.50 0.200 / 0.6)' [CIE XYZ D50 with alpha, all numbers]
+PASS Property color value 'color(xyz-d50 100% 50% 20% / 60%)' [CIE XYZ D50 with alpha, all percent]
+PASS Property color value 'color(xyz-d50 100% 0.5 20% / 0.6)' [CIE XYZ D50 with alpha, mixed number and percent]
+PASS Property color value 'color(xyz-d50 1.00 50% 0.2 / 60%)' [CIE XYZ D50 with alpha, mixed number and percent 2]
+PASS Property color value 'color(xyz-d50 none none none / none)' [CIE XYZ D50 with alpha, all none]
+PASS Property color value 'color(xyz-d50 1.00 none 0.2 / none)' [CIE XYZ D50 with alpha, number and none]
+PASS Property color value 'color(xyz-d50 100% none 20% / 30%)' [CIE XYZ D50 with alpha, percent and none]
+PASS Property color value 'color(xyz-d50 100% none 0.2 / 23.7%)' [CIE XYZ D50 with alpha, number, percent and none]
+PASS Property color value 'color(xyz-d65 1.00 0.50 0.200)' [CIE XYZ D65 all numbers]
+PASS Property color value 'color(xyz-d65 100% 50% 20%)' [CIE XYZ D65 all percent]
+PASS Property color value 'color(xyz-d65 100% 0.5 20%)' [CIE XYZ D65 mixed number and percent]
+PASS Property color value 'color(xyz-d65 1.00 50% 0.2)' [CIE XYZ D65 mixed number and percent 2]
+PASS Property color value 'color(xyz-d65 none none none)' [CIE XYZ D65 all none]
+PASS Property color value 'color(xyz-d65 1.00 none 0.2)' [CIE XYZ D65 number and none]
+PASS Property color value 'color(xyz-d65 100% none 20%)' [CIE XYZ D65 percent and none]
+PASS Property color value 'color(xyz-d65 100% none 0.2)' [CIE XYZ D65 number, percent and none]
+PASS Property color value 'color(xyz-d65 1.00 0.50 0.200 / 0.6)' [CIE XYZ D65 with alpha, all numbers]
+PASS Property color value 'color(xyz-d65 100% 50% 20% / 60%)' [CIE XYZ D65 with alpha, all percent]
+PASS Property color value 'color(xyz-d65 100% 0.5 20% / 0.6)' [CIE XYZ D65 with alpha, mixed number and percent]
+PASS Property color value 'color(xyz-d65 1.00 50% 0.2 / 60%)' [CIE XYZ D65 with alpha, mixed number and percent 2]
+PASS Property color value 'color(xyz-d65 none none none / none)' [CIE XYZ D65 with alpha, all none]
+PASS Property color value 'color(xyz-d65 1.00 none 0.2 / none)' [CIE XYZ D65 with alpha, number and none]
+PASS Property color value 'color(xyz-d65 100% none 20% / 30%)' [CIE XYZ D65 with alpha, percent and none]
+PASS Property color value 'color(xyz-d65 100% none 0.2 / 23.7%)' [CIE XYZ D65 with alpha, number, percent and none]
+PASS Property color value 'color(xyz 1.00 0.50 0.200)' [CIE XYZ (implicit D65) all numbers]
+PASS Property color value 'color(xyz 100% 50% 20%)' [CIE XYZ (implicit D65) all percent]
+PASS Property color value 'color(xyz 100% 0.5 20%)' [CIE XYZ (implicit D65) mixed number and percent]
+PASS Property color value 'color(xyz 1.00 50% 0.2)' [CIE XYZ (implicit D65) mixed number and percent 2]
+PASS Property color value 'color(xyz none none none)' [CIE XYZ (implicit D65) all none]
+PASS Property color value 'color(xyz 1.00 none 0.2)' [CIE XYZ (implicit D65) number and none]
+PASS Property color value 'color(xyz 100% none 20%)' [CIE XYZ (implicit D65) percent and none]
+PASS Property color value 'color(xyz 100% none 0.2)' [CIE XYZ (implicit D65) number, percent and none]
+PASS Property color value 'color(xyz 1.00 0.50 0.200 / 0.6)' [CIE XYZ (implicit D65) with alpha, all numbers]
+PASS Property color value 'color(xyz 100% 50% 20% / 60%)' [CIE XYZ (implicit D65) with alpha, all percent]
+PASS Property color value 'color(xyz 100% 0.5 20% / 0.6)' [CIE XYZ (implicit D65) with alpha, mixed number and percent]
+PASS Property color value 'color(xyz 1.00 50% 0.2 / 60%)' [CIE XYZ (implicit D65) with alpha, mixed number and percent 2]
+PASS Property color value 'color(xyz none none none / none)' [CIE XYZ (implicit D65) with alpha, all none]
+PASS Property color value 'color(xyz 1.00 none 0.2 / none)' [CIE XYZ (implicit D65) with alpha, number and none]
+PASS Property color value 'color(xyz 100% none 20% / 30%)' [CIE XYZ (implicit D65) with alpha, percent and none]
+PASS Property color value 'color(xyz 100% none 0.2 / 23.7%)' [CIE XYZ (implicit D65) with alpha, number, percent and none]
+PASS Property color value 'color(srgb 1 1 1)' [Basic sRGB white]
+PASS Property color value 'color(    srgb         1      1 1       )' [White with lots of space]
+PASS Property color value 'color(srgb 0.25 0.5 0.75)' [sRGB color]
+PASS Property color value 'color(SrGb 0.25 0.5 0.75)' [Different case for sRGB]
+PASS Property color value 'color(srgb 1.00000 0.500000 0.20)' [sRGB color with unnecessary decimals]
+PASS Property color value 'color(srgb 1 1 1 / 0.5)' [sRGB white with 0.5 alpha]
+PASS Property color value 'color(srgb 1 1 1 / 0)' [sRGB white with 0 alpha]
+PASS Property color value 'color(srgb 1 1 1 / 50%)' [sRGB white with 50% alpha]
+PASS Property color value 'color(srgb 1 1 1 / 0%)' [sRGB white with 0% alpha]
+PASS Property color value 'color(display-p3 0.6 0.7 0.8)' [Display P3 color]
+PASS Property color value 'color(dIspLaY-P3 0.6 0.7 0.8)' [Different case for Display P3]
+PASS Property color value 'color(srgb -0.25 0.5 0.75)' [sRGB color with negative component should not clamp to 0]
+PASS Property color value 'color(srgb 0.25 1.5 0.75)' [sRGB color with component > 1 should not clamp]
+PASS Property color value 'color(display-p3 0.5 -199 0.75)' [Display P3 color with negative component should not clamp to 0]
+PASS Property color value 'color(display-p3 184 1.00001 1103)' [Display P3 color with component > 1 should not clamp]
+PASS Property color value 'color(srgb 0.1 0.2 0.3 / 1.9)' [Alpha > 1 should clamp]
+PASS Property color value 'color(srgb 1 1 1 / -0.2)' [Negative alpha should clamp]
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-function.html b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-function.html
index 58a09971..ee20c9c 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-function.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-function.html
@@ -46,6 +46,9 @@
     test_computed_value("color", `color(${colorSpace} 10% none none / none)`, `color(${colorSpace} 0.1 none none / none)`);
     test_computed_value("color", `color(${colorSpace} none none none / 0.5)`, `color(${colorSpace} none none none / 0.5)`);
     test_computed_value("color", `color(${colorSpace} 0 0 0 / none)`, `color(${colorSpace} 0 0 0 / none)`);
+
+    test_computed_value("color", `color(${colorSpace} calc(NaN) 0 0 / none)`, `color(${colorSpace} 0 0 0)`);
+    test_computed_value("color", `color(${colorSpace} calc(0 / 0) 0 0 / none)`, `color(${colorSpace} 0 0 0)`);
 }
 
 for (const colorSpace of [ "xyz", "xyz-d50", "xyz-d65" ]) {
@@ -72,6 +75,9 @@
     test_computed_value("color", `color(${colorSpace} 0.2 none none / none)`, `color(${resultColorSpace} 0.2 none none / none)`);
     test_computed_value("color", `color(${colorSpace} none none none / 0.5)`, `color(${resultColorSpace} none none none / 0.5)`);
     test_computed_value("color", `color(${colorSpace} 0 0 0 / none)`, `color(${resultColorSpace} 0 0 0 / none)`);
+
+    test_computed_value("color", `color(${colorSpace} calc(NaN) 0 0 / none)`, `color(${resultColorSpace} 0 0 0)`);
+    test_computed_value("color", `color(${colorSpace} calc(0 / 0) 0 0 / none)`, `color(${resultColorSpace} 0 0 0)`);
 }
 
 // Opaque sRGB in color()
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-function.html.ini b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-function.html.ini
new file mode 100644
index 0000000..9439411
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-function.html.ini
@@ -0,0 +1,54 @@
+[color-computed-color-function.html]
+  [Property color value 'color(a98-rgb calc(0 / 0) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(a98-rgb calc(NaN) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(display-p3 calc(0 / 0) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(display-p3 calc(NaN) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(prophoto-rgb calc(0 / 0) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(prophoto-rgb calc(NaN) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(rec2020 calc(0 / 0) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(rec2020 calc(NaN) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(srgb calc(0 / 0) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(srgb calc(NaN) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(srgb-linear calc(0 / 0) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(srgb-linear calc(NaN) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(xyz calc(0 / 0) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(xyz calc(NaN) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(xyz-d50 calc(0 / 0) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(xyz-d50 calc(NaN) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(xyz-d65 calc(0 / 0) 0 0 / none)']
+    expected: FAIL
+
+  [Property color value 'color(xyz-d65 calc(NaN) 0 0 / none)']
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-mix-function-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-mix-function-expected.txt
new file mode 100644
index 0000000..99139ad9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-mix-function-expected.txt
@@ -0,0 +1,480 @@
+This is a testharness.js-based test.
+Found 476 tests; 468 PASS, 8 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hsl, 25% hsl(120deg 10% 20%), hsl(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))'
+PASS Property color value 'color-mix(in hsl, 25% hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))'
+FAIL Property color value 'color-mix(in hsl, transparent, hsl(30deg 30% 40%))' assert_array_approx_equals: Numeric parameters are approximately equal. property 1, expected 102 +/- 1, expected 102 but got 87
+FAIL Property color value 'color-mix(in hsl, transparent 10%, hsl(30deg 30% 40%))' assert_array_approx_equals: Numeric parameters are approximately equal. property 1, expected 102 +/- 1, expected 102 but got 99
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / 0), hsl(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / 0) 10%, hsl(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl, hsl(50deg 50% 50%), hsl(330deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl, hsl(330deg 50% 50%), hsl(50deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl, hsl(20deg 50% 50%), hsl(320deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl, hsl(320deg 50% 50%), hsl(20deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl shorter hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl shorter hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl shorter hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl longer hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl longer hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl increasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl increasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl decreasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl decreasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))'
+PASS Property color value 'color-mix(in hsl, hsl(none none none), hsl(none none none))'
+PASS Property color value 'color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 20% 40%), hsl(none none none))'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 20% none), hsl(30deg 40% 60%))'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 20% 40%), hsl(30deg 20% none))'
+PASS Property color value 'color-mix(in hsl, hsl(none 20% 40%), hsl(30deg none 80%))'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40%))'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / 0.5))'
+PASS Property color value 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / none))'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, 25% hwb(120deg 10% 20%), hwb(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))'
+PASS Property color value 'color-mix(in hwb, 25% hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))'
+FAIL Property color value 'color-mix(in hwb, transparent, hwb(30deg 30% 40%))' assert_array_approx_equals: Numeric parameters are approximately equal. property 1, expected 115 +/- 1, expected 115 but got 96
+FAIL Property color value 'color-mix(in hwb, transparent 10%, hwb(30deg 30% 40%))' assert_array_approx_equals: Numeric parameters are approximately equal. property 1, expected 115 +/- 1, expected 115 but got 111
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / 0), hwb(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / 0) 10%, hwb(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(50deg 30% 40%), hwb(330deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(330deg 30% 40%), hwb(50deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(20deg 30% 40%), hwb(320deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(320deg 30% 40%), hwb(20deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb shorter hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb shorter hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb shorter hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb longer hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb increasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb decreasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(none none none), hwb(none none none))'
+PASS Property color value 'color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(none none none))'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% none), hwb(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% none))'
+PASS Property color value 'color-mix(in hwb, hwb(none 10% 20%), hwb(30deg none 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40%))'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))'
+PASS Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg))'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg))'
+PASS Property color value 'color-mix(in lch, 25% lch(10 20 30deg), lch(50 60 70deg))'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg), 25% lch(50 60 70deg))'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg) 25%)'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg) 75%)'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg) 30%, lch(50 60 70deg) 90%)'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg) 12.5%, lch(50 60 70deg) 37.5%)'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg) 0%, lch(50 60 70deg))'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8))'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8))'
+PASS Property color value 'color-mix(in lch, 25% lch(10 20 30deg / .4), lch(50 60 70deg / .8))'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg / .4), 25% lch(50 60 70deg / .8))'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8) 25%)'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8) 75%)'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg / .4) 30%, lch(50 60 70deg / .8) 90%)'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg / .4) 12.5%, lch(50 60 70deg / .8) 37.5%)'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg / .4) 0%, lch(50 60 70deg / .8))'
+FAIL Property color value 'color-mix(in lch, transparent, lch(0.3 0.4 30deg))' assert_array_approx_equals: Numeric parameters are approximately equal. property 2, expected 30 +/- 0.0001, expected 30 but got 15
+FAIL Property color value 'color-mix(in lch, transparent 10%, lch(0.3 0.4 30deg))' assert_array_approx_equals: Numeric parameters are approximately equal. property 2, expected 30 +/- 0.0001, expected 30 but got 27
+PASS Property color value 'color-mix(in lch, lch(0.1 0.2 120deg / 0), lch(0.3 0.4 30deg))'
+PASS Property color value 'color-mix(in lch, lch(0.1 0.2 120deg / 0) 10%, lch(0.3 0.4 30deg))'
+PASS Property color value 'color-mix(in lch, lch(100 0 40deg), lch(100 0 60deg))'
+PASS Property color value 'color-mix(in lch, lch(100 0 60deg), lch(100 0 40deg))'
+PASS Property color value 'color-mix(in lch, lch(100 0 50deg), lch(100 0 330deg))'
+PASS Property color value 'color-mix(in lch, lch(100 0 330deg), lch(100 0 50deg))'
+PASS Property color value 'color-mix(in lch, lch(100 0 20deg), lch(100 0 320deg))'
+PASS Property color value 'color-mix(in lch, lch(100 0 320deg), lch(100 0 20deg))'
+PASS Property color value 'color-mix(in lch shorter hue, lch(100 0 40deg), lch(100 0 60deg))'
+PASS Property color value 'color-mix(in lch shorter hue, lch(100 0 60deg), lch(100 0 40deg))'
+PASS Property color value 'color-mix(in lch shorter hue, lch(100 0 50deg), lch(100 0 330deg))'
+PASS Property color value 'color-mix(in lch shorter hue, lch(100 0 330deg), lch(100 0 50deg))'
+PASS Property color value 'color-mix(in lch shorter hue, lch(100 0 20deg), lch(100 0 320deg))'
+PASS Property color value 'color-mix(in lch shorter hue, lch(100 0 320deg), lch(100 0 20deg))'
+PASS Property color value 'color-mix(in lch longer hue, lch(100 0 40deg), lch(100 0 60deg))'
+PASS Property color value 'color-mix(in lch longer hue, lch(100 0 60deg), lch(100 0 40deg))'
+PASS Property color value 'color-mix(in lch longer hue, lch(100 0 50deg), lch(100 0 330deg))'
+PASS Property color value 'color-mix(in lch longer hue, lch(100 0 330deg), lch(100 0 50deg))'
+PASS Property color value 'color-mix(in lch longer hue, lch(100 0 20deg), lch(100 0 320deg))'
+PASS Property color value 'color-mix(in lch longer hue, lch(100 0 320deg), lch(100 0 20deg))'
+PASS Property color value 'color-mix(in lch increasing hue, lch(100 0 40deg), lch(100 0 60deg))'
+PASS Property color value 'color-mix(in lch increasing hue, lch(100 0 60deg), lch(100 0 40deg))'
+PASS Property color value 'color-mix(in lch increasing hue, lch(100 0 50deg), lch(100 0 330deg))'
+PASS Property color value 'color-mix(in lch increasing hue, lch(100 0 330deg), lch(100 0 50deg))'
+PASS Property color value 'color-mix(in lch increasing hue, lch(100 0 20deg), lch(100 0 320deg))'
+PASS Property color value 'color-mix(in lch increasing hue, lch(100 0 320deg), lch(100 0 20deg))'
+PASS Property color value 'color-mix(in lch decreasing hue, lch(100 0 40deg), lch(100 0 60deg))'
+PASS Property color value 'color-mix(in lch decreasing hue, lch(100 0 60deg), lch(100 0 40deg))'
+PASS Property color value 'color-mix(in lch decreasing hue, lch(100 0 50deg), lch(100 0 330deg))'
+PASS Property color value 'color-mix(in lch decreasing hue, lch(100 0 330deg), lch(100 0 50deg))'
+PASS Property color value 'color-mix(in lch decreasing hue, lch(100 0 20deg), lch(100 0 320deg))'
+PASS Property color value 'color-mix(in lch decreasing hue, lch(100 0 320deg), lch(100 0 20deg))'
+PASS Property color value 'color-mix(in lch, lch(none none none), lch(none none none))'
+PASS Property color value 'color-mix(in lch, lch(none none none), lch(50 60 70deg))'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg), lch(none none none))'
+PASS Property color value 'color-mix(in lch, lch(10 20 none), lch(50 60 70deg))'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg), lch(50 60 none))'
+PASS Property color value 'color-mix(in lch, lch(none 20 30deg), lch(50 none 70deg))'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg))'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg / 0.5))'
+PASS Property color value 'color-mix(in lch, lch(10 20 30deg / none), lch(50 60 70deg / none))'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg), oklch(0.5 0.6 70deg))'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg) 25%, oklch(0.5 0.6 70deg))'
+PASS Property color value 'color-mix(in oklch, 25% oklch(0.1 0.2 30deg), oklch(0.5 0.6 70deg))'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg), 25% oklch(0.5 0.6 70deg))'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg), oklch(0.5 0.6 70deg) 25%)'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg) 25%, oklch(0.5 0.6 70deg) 75%)'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg) 30%, oklch(0.5 0.6 70deg) 90%)'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg) 12.5%, oklch(0.5 0.6 70deg) 37.5%)'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg) 0%, oklch(0.5 0.6 70deg))'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg / .4), oklch(0.5 0.6 70deg / .8))'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg / .4) 25%, oklch(0.5 0.6 70deg / .8))'
+PASS Property color value 'color-mix(in oklch, 25% oklch(0.1 0.2 30deg / .4), oklch(0.5 0.6 70deg / .8))'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg / .4), 25% oklch(0.5 0.6 70deg / .8))'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg / .4), oklch(0.5 0.6 70deg / .8) 25%)'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg / .4) 25%, oklch(0.5 0.6 70deg / .8) 75%)'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg / .4) 30%, oklch(0.5 0.6 70deg / .8) 90%)'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg / .4) 12.5%, oklch(0.5 0.6 70deg / .8) 37.5%)'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg / .4) 0%, oklch(0.5 0.6 70deg / .8))'
+FAIL Property color value 'color-mix(in oklch, transparent, oklch(30 40 30deg))' assert_array_approx_equals: Numeric parameters are approximately equal. property 2, expected 30 +/- 0.0001, expected 30 but got 15
+FAIL Property color value 'color-mix(in oklch, transparent 10%, oklch(30 40 30deg))' assert_array_approx_equals: Numeric parameters are approximately equal. property 2, expected 30 +/- 0.0001, expected 30 but got 27
+PASS Property color value 'color-mix(in oklch, oklch(10 20 120deg / 0), oklch(30 40 30deg))'
+PASS Property color value 'color-mix(in oklch, oklch(10 20 120deg / 0) 10%, oklch(30 40 30deg))'
+PASS Property color value 'color-mix(in oklch, oklch(1 0 40deg), oklch(1 0 60deg))'
+PASS Property color value 'color-mix(in oklch, oklch(1 0 60deg), oklch(1 0 40deg))'
+PASS Property color value 'color-mix(in oklch, oklch(1 0 50deg), oklch(1 0 330deg))'
+PASS Property color value 'color-mix(in oklch, oklch(1 0 330deg), oklch(1 0 50deg))'
+PASS Property color value 'color-mix(in oklch, oklch(1 0 20deg), oklch(1 0 320deg))'
+PASS Property color value 'color-mix(in oklch, oklch(1 0 320deg), oklch(1 0 20deg))'
+PASS Property color value 'color-mix(in oklch shorter hue, oklch(1 0 40deg), oklch(1 0 60deg))'
+PASS Property color value 'color-mix(in oklch shorter hue, oklch(1 0 60deg), oklch(1 0 40deg))'
+PASS Property color value 'color-mix(in oklch shorter hue, oklch(1 0 50deg), oklch(1 0 330deg))'
+PASS Property color value 'color-mix(in oklch shorter hue, oklch(1 0 330deg), oklch(1 0 50deg))'
+PASS Property color value 'color-mix(in oklch shorter hue, oklch(1 0 20deg), oklch(1 0 320deg))'
+PASS Property color value 'color-mix(in oklch shorter hue, oklch(1 0 320deg), oklch(1 0 20deg))'
+PASS Property color value 'color-mix(in oklch longer hue, oklch(1 0 40deg), oklch(1 0 60deg))'
+PASS Property color value 'color-mix(in oklch longer hue, oklch(1 0 60deg), oklch(1 0 40deg))'
+PASS Property color value 'color-mix(in oklch longer hue, oklch(1 0 50deg), oklch(1 0 330deg))'
+PASS Property color value 'color-mix(in oklch longer hue, oklch(1 0 330deg), oklch(1 0 50deg))'
+PASS Property color value 'color-mix(in oklch longer hue, oklch(1 0 20deg), oklch(1 0 320deg))'
+PASS Property color value 'color-mix(in oklch longer hue, oklch(1 0 320deg), oklch(1 0 20deg))'
+PASS Property color value 'color-mix(in oklch increasing hue, oklch(1 0 40deg), oklch(1 0 60deg))'
+PASS Property color value 'color-mix(in oklch increasing hue, oklch(1 0 60deg), oklch(1 0 40deg))'
+PASS Property color value 'color-mix(in oklch increasing hue, oklch(1 0 50deg), oklch(1 0 330deg))'
+PASS Property color value 'color-mix(in oklch increasing hue, oklch(1 0 330deg), oklch(1 0 50deg))'
+PASS Property color value 'color-mix(in oklch increasing hue, oklch(1 0 20deg), oklch(1 0 320deg))'
+PASS Property color value 'color-mix(in oklch increasing hue, oklch(1 0 320deg), oklch(1 0 20deg))'
+PASS Property color value 'color-mix(in oklch decreasing hue, oklch(1 0 40deg), oklch(1 0 60deg))'
+PASS Property color value 'color-mix(in oklch decreasing hue, oklch(1 0 60deg), oklch(1 0 40deg))'
+PASS Property color value 'color-mix(in oklch decreasing hue, oklch(1 0 50deg), oklch(1 0 330deg))'
+PASS Property color value 'color-mix(in oklch decreasing hue, oklch(1 0 330deg), oklch(1 0 50deg))'
+PASS Property color value 'color-mix(in oklch decreasing hue, oklch(1 0 20deg), oklch(1 0 320deg))'
+PASS Property color value 'color-mix(in oklch decreasing hue, oklch(1 0 320deg), oklch(1 0 20deg))'
+PASS Property color value 'color-mix(in oklch, oklch(none none none), oklch(none none none))'
+PASS Property color value 'color-mix(in oklch, oklch(none none none), oklch(0.5 0.6 70deg))'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg), oklch(none none none))'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 none), oklch(0.5 0.6 70deg))'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg), oklch(0.5 0.6 none))'
+PASS Property color value 'color-mix(in oklch, oklch(none 0.2 30deg), oklch(0.5 none 70deg))'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg / none), oklch(0.5 0.6 70deg))'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg / none), oklch(0.5 0.6 70deg / 0.5))'
+PASS Property color value 'color-mix(in oklch, oklch(0.1 0.2 30deg / none), oklch(0.5 0.6 70deg / none))'
+PASS Property color value 'color-mix(in lab, lab(10 20 30), lab(50 60 70))'
+PASS Property color value 'color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70))'
+PASS Property color value 'color-mix(in lab, 25% lab(10 20 30), lab(50 60 70))'
+PASS Property color value 'color-mix(in lab, lab(10 20 30), 25% lab(50 60 70))'
+PASS Property color value 'color-mix(in lab, lab(10 20 30), lab(50 60 70) 25%)'
+PASS Property color value 'color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70) 75%)'
+PASS Property color value 'color-mix(in lab, lab(10 20 30) 30%, lab(50 60 70) 90%)'
+PASS Property color value 'color-mix(in lab, lab(10 20 30) 12.5%, lab(50 60 70) 37.5%)'
+PASS Property color value 'color-mix(in lab, lab(10 20 30) 0%, lab(50 60 70))'
+PASS Property color value 'color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8))'
+PASS Property color value 'color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8))'
+PASS Property color value 'color-mix(in lab, 25% lab(10 20 30 / .4), lab(50 60 70 / .8))'
+PASS Property color value 'color-mix(in lab, lab(10 20 30 / .4), 25% lab(50 60 70 / .8))'
+PASS Property color value 'color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8) 25%)'
+PASS Property color value 'color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8) 75%)'
+PASS Property color value 'color-mix(in lab, lab(10 20 30 / .4) 30%, lab(50 60 70 / .8) 90%)'
+PASS Property color value 'color-mix(in lab, lab(10 20 30 / .4) 12.5%, lab(50 60 70 / .8) 37.5%)'
+PASS Property color value 'color-mix(in lab, lab(10 20 30 / .4) 0%, lab(50 60 70 / .8))'
+PASS Property color value 'color-mix(in lab, transparent, lab(30 40 50))'
+PASS Property color value 'color-mix(in lab, transparent 10%, lab(30 40 50))'
+PASS Property color value 'color-mix(in lab, lab(10 20 30 / 0), lab(30 40 50))'
+PASS Property color value 'color-mix(in lab, lab(10 20 30 / 0) 10%, lab(30 40 50))'
+PASS Property color value 'color-mix(in lab, lab(none none none), lab(none none none))'
+PASS Property color value 'color-mix(in lab, lab(none none none), lab(50 60 70))'
+PASS Property color value 'color-mix(in lab, lab(10 20 30), lab(none none none))'
+PASS Property color value 'color-mix(in lab, lab(10 20 none), lab(50 60 70))'
+PASS Property color value 'color-mix(in lab, lab(10 20 30), lab(50 60 none))'
+PASS Property color value 'color-mix(in lab, lab(none 20 30), lab(50 none 70))'
+PASS Property color value 'color-mix(in lab, lab(10 20 30 / none), lab(50 60 70))'
+PASS Property color value 'color-mix(in lab, lab(10 20 30 / none), lab(50 60 70 / 0.5))'
+PASS Property color value 'color-mix(in lab, lab(10 20 30 / none), lab(50 60 70 / none))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3), oklab(0.5 0.6 0.7))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3) 25%, oklab(0.5 0.6 0.7))'
+PASS Property color value 'color-mix(in oklab, 25% oklab(0.1 0.2 0.3), oklab(0.5 0.6 0.7))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3), 25% oklab(0.5 0.6 0.7))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3), oklab(0.5 0.6 0.7) 25%)'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3) 25%, oklab(0.5 0.6 0.7) 75%)'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3) 30%, oklab(0.5 0.6 0.7) 90%)'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3) 12.5%, oklab(0.5 0.6 0.7) 37.5%)'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3) 0%, oklab(0.5 0.6 0.7))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3 / .4), oklab(0.5 0.6 0.7 / .8))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3 / .4) 25%, oklab(0.5 0.6 0.7 / .8))'
+PASS Property color value 'color-mix(in oklab, 25% oklab(0.1 0.2 0.3 / .4), oklab(0.5 0.6 0.7 / .8))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3 / .4), 25% oklab(0.5 0.6 0.7 / .8))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3 / .4), oklab(0.5 0.6 0.7 / .8) 25%)'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3 / .4) 25%, oklab(0.5 0.6 0.7 / .8) 75%)'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3 / .4) 30%, oklab(0.5 0.6 0.7 / .8) 90%)'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3 / .4) 12.5%, oklab(0.5 0.6 0.7 / .8) 37.5%)'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3 / .4) 0%, oklab(0.5 0.6 0.7 / .8))'
+PASS Property color value 'color-mix(in oklab, transparent, oklab(0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in oklab, transparent 10%, oklab(0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3 / 0), oklab(0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3 / 0) 10%, oklab(0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in oklab, oklab(none none none), oklab(none none none))'
+PASS Property color value 'color-mix(in oklab, oklab(none none none), oklab(0.5 0.6 0.7))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3), oklab(none none none))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 none), oklab(0.5 0.6 0.7))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3), oklab(0.5 0.6 none))'
+PASS Property color value 'color-mix(in oklab, oklab(none 0.2 0.3), oklab(0.5 none 0.7))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3 / none), oklab(0.5 0.6 0.7))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3 / none), oklab(0.5 0.6 0.7 / 0.5))'
+PASS Property color value 'color-mix(in oklab, oklab(0.1 0.2 0.3 / none), oklab(0.5 0.6 0.7 / none))'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb, 25% color(srgb .1 .2 .3), color(srgb .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7) 25%)'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), 25% color(srgb .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7) 75%)'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 30%, color(srgb .5 .6 .7) 90%)'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 12.5%, color(srgb .5 .6 .7) 37.5%)'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3) 0%, color(srgb .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .5), color(srgb .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in srgb, 25% color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8) 25%)'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4), 25% color(srgb .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8) 75%)'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 30%, color(srgb .5 .6 .7 / .8) 90%)'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 12.5%, color(srgb .5 .6 .7 / .8) 37.5%)'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / .4) 0%, color(srgb .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in srgb, transparent, color(srgb 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in srgb, transparent 10%, color(srgb 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in srgb, color(srgb 0.1 0.2 0.3 / 0), color(srgb 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in srgb, color(srgb 0.1 0.2 0.3 / 0) 10%, color(srgb 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in srgb, color(srgb 2 3 4 / 5), color(srgb 4 6 8 / 10))'
+PASS Property color value 'color-mix(in srgb, color(srgb -2 -3 -4), color(srgb -4 -6 -8))'
+PASS Property color value 'color-mix(in srgb, color(srgb -2 -3 -4 / -5), color(srgb -4 -6 -8 / -10))'
+PASS Property color value 'color-mix(in srgb, color(srgb none none none), color(srgb none none none))'
+PASS Property color value 'color-mix(in srgb, color(srgb none none none), color(srgb .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb none none none))'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 none), color(srgb .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 none))'
+PASS Property color value 'color-mix(in srgb, color(srgb none .2 .3), color(srgb .5 none .7))'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / 0.5))'
+PASS Property color value 'color-mix(in srgb, color(srgb .1 .2 .3 / none), color(srgb .5 .6 .7 / none))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb-linear, 25% color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7) 25%)'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), 25% color(srgb-linear .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7) 75%)'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 30%, color(srgb-linear .5 .6 .7) 90%)'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 12.5%, color(srgb-linear .5 .6 .7) 37.5%)'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 0%, color(srgb-linear .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .5), color(srgb-linear .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in srgb-linear, 25% color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8) 25%)'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), 25% color(srgb-linear .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8) 75%)'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 30%, color(srgb-linear .5 .6 .7 / .8) 90%)'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 12.5%, color(srgb-linear .5 .6 .7 / .8) 37.5%)'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 0%, color(srgb-linear .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in srgb-linear, transparent, color(srgb-linear 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in srgb-linear, transparent 10%, color(srgb-linear 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear 0.1 0.2 0.3 / 0), color(srgb-linear 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear 0.1 0.2 0.3 / 0) 10%, color(srgb-linear 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear 2 3 4 / 5), color(srgb-linear 4 6 8 / 10))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear -2 -3 -4), color(srgb-linear -4 -6 -8))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear -2 -3 -4 / -5), color(srgb-linear -4 -6 -8 / -10))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear none none none))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear none none none), color(srgb-linear .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear none none none))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 none), color(srgb-linear .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 none))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear none .2 .3), color(srgb-linear .5 none .7))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / 0.5))'
+PASS Property color value 'color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / none), color(srgb-linear .5 .6 .7 / none))'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz, 25% color(xyz .1 .2 .3), color(xyz .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7) 25%)'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), 25% color(xyz .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7) 75%)'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 30%, color(xyz .5 .6 .7) 90%)'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 12.5%, color(xyz .5 .6 .7) 37.5%)'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3) 0%, color(xyz .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .5), color(xyz .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in xyz, 25% color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8) 25%)'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4), 25% color(xyz .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8) 75%)'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 30%, color(xyz .5 .6 .7 / .8) 90%)'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 12.5%, color(xyz .5 .6 .7 / .8) 37.5%)'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / .4) 0%, color(xyz .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in xyz, transparent, color(xyz 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in xyz, transparent 10%, color(xyz 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in xyz, color(xyz 0.1 0.2 0.3 / 0), color(xyz 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in xyz, color(xyz 0.1 0.2 0.3 / 0) 10%, color(xyz 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in xyz, color(xyz 2 3 4 / 5), color(xyz 4 6 8 / 10))'
+PASS Property color value 'color-mix(in xyz, color(xyz -2 -3 -4), color(xyz -4 -6 -8))'
+PASS Property color value 'color-mix(in xyz, color(xyz -2 -3 -4 / -5), color(xyz -4 -6 -8 / -10))'
+PASS Property color value 'color-mix(in xyz, color(xyz none none none), color(xyz none none none))'
+PASS Property color value 'color-mix(in xyz, color(xyz none none none), color(xyz .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz none none none))'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 none), color(xyz .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 none))'
+PASS Property color value 'color-mix(in xyz, color(xyz none .2 .3), color(xyz .5 none .7))'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / 0.5))'
+PASS Property color value 'color-mix(in xyz, color(xyz .1 .2 .3 / none), color(xyz .5 .6 .7 / none))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d50, 25% color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7) 25%)'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), 25% color(xyz-d50 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7) 75%)'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 30%, color(xyz-d50 .5 .6 .7) 90%)'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 12.5%, color(xyz-d50 .5 .6 .7) 37.5%)'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 0%, color(xyz-d50 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .5), color(xyz-d50 .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in xyz-d50, 25% color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8) 25%)'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), 25% color(xyz-d50 .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8) 75%)'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 30%, color(xyz-d50 .5 .6 .7 / .8) 90%)'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 12.5%, color(xyz-d50 .5 .6 .7 / .8) 37.5%)'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 0%, color(xyz-d50 .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in xyz-d50, transparent, color(xyz-d50 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in xyz-d50, transparent 10%, color(xyz-d50 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 0.1 0.2 0.3 / 0), color(xyz-d50 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 0.1 0.2 0.3 / 0) 10%, color(xyz-d50 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 2 3 4 / 5), color(xyz-d50 4 6 8 / 10))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4), color(xyz-d50 -4 -6 -8))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4 / -5), color(xyz-d50 -4 -6 -8 / -10))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 none none none))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 none none none), color(xyz-d50 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 none none none))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 none), color(xyz-d50 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 none))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 none .2 .3), color(xyz-d50 .5 none .7))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / 0.5))'
+PASS Property color value 'color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / none), color(xyz-d50 .5 .6 .7 / none))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d65, 25% color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7) 25%)'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), 25% color(xyz-d65 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7) 75%)'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 30%, color(xyz-d65 .5 .6 .7) 90%)'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 12.5%, color(xyz-d65 .5 .6 .7) 37.5%)'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 0%, color(xyz-d65 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .5), color(xyz-d65 .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in xyz-d65, 25% color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8) 25%)'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), 25% color(xyz-d65 .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8) 75%)'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 30%, color(xyz-d65 .5 .6 .7 / .8) 90%)'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 12.5%, color(xyz-d65 .5 .6 .7 / .8) 37.5%)'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 0%, color(xyz-d65 .5 .6 .7 / .8))'
+PASS Property color value 'color-mix(in xyz-d65, transparent, color(xyz-d65 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in xyz-d65, transparent 10%, color(xyz-d65 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0), color(xyz-d65 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 0.1 0.2 0.3 / 0) 10%, color(xyz-d65 0.3 0.4 0.5))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 2 3 4 / 5), color(xyz-d65 4 6 8 / 10))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4), color(xyz-d65 -4 -6 -8))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 -2 -3 -4 / -5), color(xyz-d65 -4 -6 -8 / -10))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 none none none))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 none none none), color(xyz-d65 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 none none none))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 none), color(xyz-d65 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 none))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 none .2 .3), color(xyz-d65 .5 none .7))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / 0.5))'
+PASS Property color value 'color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / none), color(xyz-d65 .5 .6 .7 / none))'
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-mix-function.html b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-mix-function.html
index f000ed6..8f05a99 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-mix-function.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-mix-function.html
@@ -46,6 +46,11 @@
     test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)`, `rgba(121, 114, 69, 0.35)`); // Scale up < 100% sum, causes alpha multiplication.
     test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))`, `rgba(133, 102, 71, 0.8)`);
 
+    test_computed_value(`color`, `color-mix(in hsl, transparent, hsl(30deg 30% 40%))`, canonicalize(`hsl(30deg 30% 40% / 0.5)`));
+    test_computed_value(`color`, `color-mix(in hsl, transparent 10%, hsl(30deg 30% 40%))`, canonicalize(`hsl(30deg 30% 40% / 0.9)`));
+    test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / 0), hsl(30deg 30% 40%))`, canonicalize(`hsl(75deg 30% 40% / 0.5)`));
+    test_computed_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / 0) 10%, hsl(30deg 30% 40%))`, canonicalize(`hsl(39deg 30% 40% / 0.9)`));
+
     test_computed_value(`color`, `color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))`, canonicalize(`hsl(50deg 50% 50%)`));
     test_computed_value(`color`, `color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))`, canonicalize(`hsl(50deg 50% 50%)`));
     test_computed_value(`color`, `color-mix(in hsl, hsl(50deg 50% 50%), hsl(330deg 50% 50%))`, canonicalize(`hsl(10deg 50% 50%)`));
@@ -112,6 +117,11 @@
     test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)`, `rgba(160, 149, 70, 0.35)`); // Scale up < 100% sum, causes alpha multiplication.
     test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))`, `rgba(153, 115, 77, 0.8)`);
 
+    test_computed_value(`color`, `color-mix(in hwb, transparent, hwb(30deg 30% 40%))`, canonicalize(`hwb(30deg 30% 40% / 0.5)`));
+    test_computed_value(`color`, `color-mix(in hwb, transparent 10%, hwb(30deg 30% 40%))`, canonicalize(`hwb(30deg 30% 40% / 0.9)`));
+    test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / 0), hwb(30deg 30% 40%))`, canonicalize(`hwb(75deg 30% 40% / 0.5)`));
+    test_computed_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / 0) 10%, hwb(30deg 30% 40%))`, canonicalize(`hwb(39deg 30% 40% / 0.9)`));
+
     test_computed_value(`color`, `color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))`, canonicalize(`hwb(50deg 30% 40%)`));
     test_computed_value(`color`, `color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))`, canonicalize(`hwb(50deg 30% 40%)`));
     test_computed_value(`color`, `color-mix(in hwb, hwb(50deg 30% 40%), hwb(330deg 30% 40%))`, canonicalize(`hwb(10deg 30% 40%)`));
@@ -178,6 +188,11 @@
     test_computed_value(`color`, `color-mix(in lch, lch(10 20 30deg / .4) 12.5%, lch(50 60 70deg / .8) 37.5%)`, `lch(44.285713 54.285717 60 / 0.35)`); // Scale up < 100% sum, causes alpha multiplication.
     test_computed_value(`color`, `color-mix(in lch, lch(10 20 30deg / .4) 0%, lch(50 60 70deg / .8))`, `lch(50 60 70 / 0.8)`);
 
+    test_computed_value(`color`, `color-mix(in lch, transparent, lch(0.3 0.4 30deg))`, canonicalize(`lch(0.3 0.4 30deg / 0.5)`));
+    test_computed_value(`color`, `color-mix(in lch, transparent 10%, lch(0.3 0.4 30deg))`, canonicalize(`lch(0.3 0.4 30deg / 0.9)`));
+    test_computed_value(`color`, `color-mix(in lch, lch(0.1 0.2 120deg / 0), lch(0.3 0.4 30deg))`, canonicalize(`lch(0.3 0.4 75deg / 0.5)`));
+    test_computed_value(`color`, `color-mix(in lch, lch(0.1 0.2 120deg / 0) 10%, lch(0.3 0.4 30deg))`, canonicalize(`lch(0.3 0.4 39deg / 0.9)`));
+
     test_computed_value(`color`, `color-mix(in lch, lch(100 0 40deg), lch(100 0 60deg))`, `lch(100 0 50)`);
     test_computed_value(`color`, `color-mix(in lch, lch(100 0 60deg), lch(100 0 40deg))`, `lch(100 0 50)`);
     test_computed_value(`color`, `color-mix(in lch, lch(100 0 50deg), lch(100 0 330deg))`, `lch(100 0 10)`);
@@ -244,6 +259,11 @@
     test_computed_value(`color`, `color-mix(in oklch, oklch(0.1 0.2 30deg / .4) 12.5%, oklch(0.5 0.6 70deg / .8) 37.5%)`, `oklch(0.44285713 0.54285717 60 / 0.35)`); // Scale up < 100% sum, causes alpha multiplication.
     test_computed_value(`color`, `color-mix(in oklch, oklch(0.1 0.2 30deg / .4) 0%, oklch(0.5 0.6 70deg / .8))`, `oklch(0.5 0.6 70 / 0.8)`);
 
+    test_computed_value(`color`, `color-mix(in oklch, transparent, oklch(30 40 30deg))`, canonicalize(`oklch(30 40 30deg / 0.5)`));
+    test_computed_value(`color`, `color-mix(in oklch, transparent 10%, oklch(30 40 30deg))`, canonicalize(`oklch(30 40 30deg / 0.9)`));
+    test_computed_value(`color`, `color-mix(in oklch, oklch(10 20 120deg / 0), oklch(30 40 30deg))`, canonicalize(`oklch(30 40 75deg / 0.5)`));
+    test_computed_value(`color`, `color-mix(in oklch, oklch(10 20 120deg / 0) 10%, oklch(30 40 30deg))`, canonicalize(`oklch(30 40 39deg / 0.9)`));
+
     test_computed_value(`color`, `color-mix(in oklch, oklch(1 0 40deg), oklch(1 0 60deg))`, `oklch(1 0 50)`);
     test_computed_value(`color`, `color-mix(in oklch, oklch(1 0 60deg), oklch(1 0 40deg))`, `oklch(1 0 50)`);
     test_computed_value(`color`, `color-mix(in oklch, oklch(1 0 50deg), oklch(1 0 330deg))`, `oklch(1 0 10)`);
@@ -310,6 +330,11 @@
     test_computed_value(`color`, `color-mix(in lab, lab(10 20 30 / .4) 12.5%, lab(50 60 70 / .8) 37.5%)`, `lab(44.285713 54.285717 64.28571 / 0.35)`); // Scale up < 100% sum, causes alpha multiplication.
     test_computed_value(`color`, `color-mix(in lab, lab(10 20 30 / .4) 0%, lab(50 60 70 / .8))`, `lab(50 60 70 / 0.8)`);
 
+    test_computed_value(`color`, `color-mix(in lab, transparent, lab(30 40 50))`, 'lab(30 40 50 / 0.5)');
+    test_computed_value(`color`, `color-mix(in lab, transparent 10%, lab(30 40 50))`, 'lab(30 40 50 / 0.9)');
+    test_computed_value(`color`, `color-mix(in lab, lab(10 20 30 / 0), lab(30 40 50))`, 'lab(30 40 50 / 0.5)');
+    test_computed_value(`color`, `color-mix(in lab, lab(10 20 30 / 0) 10%, lab(30 40 50))`, 'lab(30 40 50 / 0.9)');
+
     test_computed_value(`color`, `color-mix(in lab, lab(none none none), lab(none none none))`, `lab(none none none)`);
     test_computed_value(`color`, `color-mix(in lab, lab(none none none), lab(50 60 70))`, `lab(50 60 70)`);
     test_computed_value(`color`, `color-mix(in lab, lab(10 20 30), lab(none none none))`, `lab(10 20 30)`);
@@ -341,6 +366,11 @@
     test_computed_value(`color`, `color-mix(in oklab, oklab(0.1 0.2 0.3 / .4) 12.5%, oklab(0.5 0.6 0.7 / .8) 37.5%)`, `oklab(0.44285713 0.54285717 0.6428571 / 0.35)`); // Scale up < 100% sum, causes alpha multiplication.
     test_computed_value(`color`, `color-mix(in oklab, oklab(0.1 0.2 0.3 / .4) 0%, oklab(0.5 0.6 0.7 / .8))`, `oklab(0.5 0.6 0.7 / 0.8)`);
 
+    test_computed_value(`color`, `color-mix(in oklab, transparent, oklab(0.3 0.4 0.5))`, 'oklab(0.3 0.4 0.5 / 0.5)');
+    test_computed_value(`color`, `color-mix(in oklab, transparent 10%, oklab(0.3 0.4 0.5))`, 'oklab(0.3 0.4 0.5 / 0.9)');
+    test_computed_value(`color`, `color-mix(in oklab, oklab(0.1 0.2 0.3 / 0), oklab(0.3 0.4 0.5))`, 'oklab(0.3 0.4 0.5 / 0.5)');
+    test_computed_value(`color`, `color-mix(in oklab, oklab(0.1 0.2 0.3 / 0) 10%, oklab(0.3 0.4 0.5))`, 'oklab(0.3 0.4 0.5 / 0.9)');
+
     test_computed_value(`color`, `color-mix(in oklab, oklab(none none none), oklab(none none none))`, `oklab(none none none)`);
     test_computed_value(`color`, `color-mix(in oklab, oklab(none none none), oklab(0.5 0.6 0.7))`, `oklab(0.5 0.6 0.7)`);
     test_computed_value(`color`, `color-mix(in oklab, oklab(0.1 0.2 0.3), oklab(none none none))`, `oklab(0.1 0.2 0.3)`);
@@ -375,6 +405,11 @@
         test_computed_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 12.5%, color(${colorSpace} .5 .6 .7 / .8) 37.5%)`, `color(${resultColorSpace} 0.44285715 0.54285717 0.64285713 / 0.35)`); // Scale up < 100% sum, causes alpha multiplication.
         test_computed_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 0%, color(${colorSpace} .5 .6 .7 / .8))`, `color(${resultColorSpace} 0.5 0.6 0.7 / 0.8)`);
 
+        test_computed_value(`color`, `color-mix(in ${colorSpace}, transparent, color(${colorSpace} 0.3 0.4 0.5))`, `color(${resultColorSpace} 0.3 0.4 0.5 / 0.5)`);
+        test_computed_value(`color`, `color-mix(in ${colorSpace}, transparent 10%, color(${colorSpace} 0.3 0.4 0.5))`, `color(${resultColorSpace} 0.3 0.4 0.5 / 0.9)`);
+        test_computed_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} 0.1 0.2 0.3 / 0), color(${colorSpace} 0.3 0.4 0.5))`, `color(${resultColorSpace} 0.3 0.4 0.5 / 0.5)`);
+        test_computed_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} 0.1 0.2 0.3 / 0) 10%, color(${colorSpace} 0.3 0.4 0.5))`, `color(${resultColorSpace} 0.3 0.4 0.5 / 0.9)`);
+
         test_computed_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} 2 3 4 / 5), color(${colorSpace} 4 6 8 / 10))`, `color(${resultColorSpace} 3 4.5 6)`);
         test_computed_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} -2 -3 -4), color(${colorSpace} -4 -6 -8))`, `color(${resultColorSpace} -3 -4.5 -6)`);
         test_computed_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} -2 -3 -4 / -5), color(${colorSpace} -4 -6 -8 / -10))`, `color(${resultColorSpace} 0 0 0 / 0)`);
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-mix-function.html.ini b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-mix-function.html.ini
new file mode 100644
index 0000000..41595c07
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-color-mix-function.html.ini
@@ -0,0 +1,24 @@
+[color-computed-color-mix-function.html]
+  [Property color value 'color-mix(in hsl, transparent 10%, hsl(30deg 30% 40%))']
+    expected: FAIL
+
+  [Property color value 'color-mix(in hsl, transparent, hsl(30deg 30% 40%))']
+    expected: FAIL
+
+  [Property color value 'color-mix(in hwb, transparent 10%, hwb(30deg 30% 40%))']
+    expected: FAIL
+
+  [Property color value 'color-mix(in hwb, transparent, hwb(30deg 30% 40%))']
+    expected: FAIL
+
+  [Property color value 'color-mix(in lch, transparent 10%, lch(0.3 0.4 30deg))']
+    expected: FAIL
+
+  [Property color value 'color-mix(in lch, transparent, lch(0.3 0.4 30deg))']
+    expected: FAIL
+
+  [Property color value 'color-mix(in oklch, transparent 10%, oklch(30 40 30deg))']
+    expected: FAIL
+
+  [Property color value 'color-mix(in oklch, transparent, oklch(30 40 30deg))']
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-lab-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-lab-expected.txt
index 7d4cde8..fd32956f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-lab-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-lab-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 96 tests; 90 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 104 tests; 90 PASS, 14 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Property color value 'lab(0 0 0)'
 PASS Property color value 'lab(0 0 0 / 1)'
 PASS Property color value 'lab(0 0 0 / 0.5)'
@@ -21,6 +21,8 @@
 PASS Property color value 'lab(20 none none / none)'
 PASS Property color value 'lab(none none none / 0.5)'
 PASS Property color value 'lab(0 0 0 / none)'
+FAIL Property color value 'lab(calc(NaN) 0 0)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+FAIL Property color value 'lab(calc(0 / 0) 0 0)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
 PASS Property color value 'oklab(0 0 0)'
 PASS Property color value 'oklab(0 0 0 / 1)'
 PASS Property color value 'oklab(0 0 0 / 0.5)'
@@ -42,6 +44,8 @@
 PASS Property color value 'oklab(0.2 none none / none)'
 PASS Property color value 'oklab(none none none / 0.5)'
 PASS Property color value 'oklab(0 0 0 / none)'
+FAIL Property color value 'oklab(calc(NaN) 0 0)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+FAIL Property color value 'oklab(calc(0 / 0) 0 0)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
 PASS Property color value 'lab(20% 0 10/0.5)'
 PASS Property color value 'oklab(20% 0 0.1/0.5)'
 PASS Property color value 'lch(0 0 0deg)'
@@ -69,6 +73,8 @@
 PASS Property color value 'lch(20 none none / none)'
 PASS Property color value 'lch(none none none / 0.5)'
 PASS Property color value 'lch(0 0 0 / none)'
+FAIL Property color value 'lch(calc(NaN) 0 0)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+FAIL Property color value 'lch(calc(0 / 0) 0 0)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
 PASS Property color value 'oklch(0 0 0deg)'
 PASS Property color value 'oklch(0 0 0deg / 1)'
 PASS Property color value 'oklch(0 0 0deg / 0.5)'
@@ -94,6 +100,8 @@
 PASS Property color value 'oklch(0.2 none none / none)'
 PASS Property color value 'oklch(none none none / 0.5)'
 PASS Property color value 'oklch(0 0 0 / none)'
+FAIL Property color value 'oklch(calc(NaN) 0 0)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
+FAIL Property color value 'oklch(calc(0 / 0) 0 0)' assert_array_approx_equals: Numeric parameters are approximately equal. property 0, expected 0 +/- 0.0001, expected 0 but got Infinity
 PASS Property color value 'lch(20% 0 10/0.5)'
 PASS Property color value 'oklch(20% 0 10/0.5)'
 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-lab.html b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-lab.html
index c25e1253..f3ebb0d2 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-lab.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-lab.html
@@ -47,6 +47,9 @@
 test_computed_value("color", "lab(none none none / 0.5)", "lab(none none none / 0.5)");
 test_computed_value("color", "lab(0 0 0 / none)", "lab(0 0 0 / none)");
 
+test_computed_value("color", "lab(calc(NaN) 0 0)", "lab(0 0 0)");
+test_computed_value("color", "lab(calc(0 / 0) 0 0)", "lab(0 0 0)");
+
 // oklab()
 test_computed_value("color", "oklab(0 0 0)", "oklab(0 0 0)");
 test_computed_value("color", "oklab(0 0 0 / 1)", "oklab(0 0 0)");
@@ -71,6 +74,9 @@
 test_computed_value("color", "oklab(none none none / 0.5)", "oklab(none none none / 0.5)");
 test_computed_value("color", "oklab(0 0 0 / none)", "oklab(0 0 0 / none)");
 
+test_computed_value("color", "oklab(calc(NaN) 0 0)", "oklab(0 0 0)");
+test_computed_value("color", "oklab(calc(0 / 0) 0 0)", "oklab(0 0 0)");
+
 // These tests validate that lab lightness range is 0-100 and oklab lightness range is 0.0-1.0.
 test_computed_value("color", "lab(20% 0 10/0.5)", "lab(20 0 10 / 0.5)");
 test_computed_value("color", "oklab(20% 0 0.1/0.5)", "oklab(0.2 0 0.1 / 0.5)");
@@ -103,6 +109,9 @@
 test_computed_value("color", "lch(none none none / 0.5)", "lch(none none none / 0.5)");
 test_computed_value("color", "lch(0 0 0 / none)", "lch(0 0 0 / none)");
 
+test_computed_value("color", "lch(calc(NaN) 0 0)", "lch(0 0 0)");
+test_computed_value("color", "lch(calc(0 / 0) 0 0)", "lch(0 0 0)");
+
 // oklch()
 test_computed_value("color", "oklch(0 0 0deg)", "oklch(0 0 0)");
 test_computed_value("color", "oklch(0 0 0deg / 1)", "oklch(0 0 0)");
@@ -131,6 +140,9 @@
 test_computed_value("color", "oklch(none none none / 0.5)", "oklch(none none none / 0.5)");
 test_computed_value("color", "oklch(0 0 0 / none)", "oklch(0 0 0 / none)");
 
+test_computed_value("color", "oklch(calc(NaN) 0 0)", "oklch(0 0 0)");
+test_computed_value("color", "oklch(calc(0 / 0) 0 0)", "oklch(0 0 0)");
+
 // These tests validate that lch lightness range is 0-100 and oklch lightness range is 0.0-1.0.
 test_computed_value("color", "lch(20% 0 10/0.5)", "lch(20 0 10 / 0.5)");
 test_computed_value("color", "oklch(20% 0 10/0.5)", "oklch(0.2 0 10 / 0.5)");
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-lab.html.ini b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-lab.html.ini
index 0b52cae..8424efcb 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-lab.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-computed-lab.html.ini
@@ -2,17 +2,41 @@
   [Property color value 'lab(400 0 10/50%)']
     expected: FAIL
 
+  [Property color value 'lab(calc(0 / 0) 0 0)']
+    expected: FAIL
+
   [Property color value 'lab(calc(50 * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))']
     expected: FAIL
 
+  [Property color value 'lab(calc(NaN) 0 0)']
+    expected: FAIL
+
+  [Property color value 'lch(calc(0 / 0) 0 0)']
+    expected: FAIL
+
   [Property color value 'lch(calc(50 * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))']
     expected: FAIL
 
+  [Property color value 'lch(calc(NaN) 0 0)']
+    expected: FAIL
+
   [Property color value 'oklab(4 0 0.1/50%)']
     expected: FAIL
 
+  [Property color value 'oklab(calc(0 / 0) 0 0)']
+    expected: FAIL
+
   [Property color value 'oklab(calc(0.5 * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))']
     expected: FAIL
 
+  [Property color value 'oklab(calc(NaN) 0 0)']
+    expected: FAIL
+
+  [Property color value 'oklch(calc(0 / 0) 0 0)']
+    expected: FAIL
+
   [Property color value 'oklch(calc(0.5 * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))']
     expected: FAIL
+
+  [Property color value 'oklch(calc(NaN) 0 0)']
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-color-function-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-color-function-expected.txt
new file mode 100644
index 0000000..4291b9e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-color-function-expected.txt
@@ -0,0 +1,262 @@
+This is a testharness.js-based test.
+Found 258 tests; 222 PASS, 36 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS e.style['color'] = "color(srgb 0% 0% 0%)" should set the property value
+PASS e.style['color'] = "color(srgb 10% 10% 10%)" should set the property value
+PASS e.style['color'] = "color(srgb .2 .2 25%)" should set the property value
+PASS e.style['color'] = "color(srgb 0 0 0 / 1)" should set the property value
+PASS e.style['color'] = "color(srgb 0% 0 0 / 0.5)" should set the property value
+PASS e.style['color'] = "color(srgb 20% 0 10/0.5)" should set the property value
+PASS e.style['color'] = "color(srgb 20% 0 10/50%)" should set the property value
+PASS e.style['color'] = "color(srgb 400% 0 10/50%)" should set the property value
+PASS e.style['color'] = "color(srgb 50% -160 160)" should set the property value
+PASS e.style['color'] = "color(srgb 50% -200 200)" should set the property value
+PASS e.style['color'] = "color(srgb 0 0 0 / -10%)" should set the property value
+PASS e.style['color'] = "color(srgb 0 0 0 / 110%)" should set the property value
+PASS e.style['color'] = "color(srgb 0 0 0 / 300%)" should set the property value
+PASS e.style['color'] = "color(srgb 200 200 200)" should set the property value
+PASS e.style['color'] = "color(srgb 200 200 200 / 200)" should set the property value
+PASS e.style['color'] = "color(srgb -200 -200 -200)" should set the property value
+PASS e.style['color'] = "color(srgb -200 -200 -200 / -200)" should set the property value
+PASS e.style['color'] = "color(srgb 200% 200% 200%)" should set the property value
+PASS e.style['color'] = "color(srgb 200% 200% 200% / 200%)" should set the property value
+PASS e.style['color'] = "color(srgb -200% -200% -200% / -200%)" should set the property value
+PASS e.style['color'] = "color(srgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value
+PASS e.style['color'] = "color(srgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value
+PASS e.style['color'] = "color(srgb none none none / none)" should set the property value
+PASS e.style['color'] = "color(srgb none none none)" should set the property value
+PASS e.style['color'] = "color(srgb 10% none none / none)" should set the property value
+PASS e.style['color'] = "color(srgb none none none / 0.5)" should set the property value
+PASS e.style['color'] = "color(srgb 0 0 0 / none)" should set the property value
+FAIL e.style['color'] = "color(srgb 0 calc(infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0 calc(infinity) 0)" but got "color(srgb 0 Infinity 0)"
+FAIL e.style['color'] = "color(srgb 0 calc(-infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(srgb 0 calc(-infinity) 0)" but got "color(srgb 0 -Infinity 0)"
+FAIL e.style['color'] = "color(srgb calc(NaN) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(srgb calc(NaN) 0 0)" but got "color(srgb Infinity 0 0 / none)"
+FAIL e.style['color'] = "color(srgb calc(0 / 0) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(srgb calc(NaN) 0 0)" but got "color(srgb Infinity 0 0 / none)"
+PASS e.style['color'] = "color(srgb-linear 0% 0% 0%)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 10% 10% 10%)" should set the property value
+PASS e.style['color'] = "color(srgb-linear .2 .2 25%)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 0 0 0 / 1)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 0% 0 0 / 0.5)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 20% 0 10/0.5)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 20% 0 10/50%)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 400% 0 10/50%)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 50% -160 160)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 50% -200 200)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 0 0 0 / -10%)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 0 0 0 / 110%)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 0 0 0 / 300%)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 200 200 200)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 200 200 200 / 200)" should set the property value
+PASS e.style['color'] = "color(srgb-linear -200 -200 -200)" should set the property value
+PASS e.style['color'] = "color(srgb-linear -200 -200 -200 / -200)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 200% 200% 200%)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 200% 200% 200% / 200%)" should set the property value
+PASS e.style['color'] = "color(srgb-linear -200% -200% -200% / -200%)" should set the property value
+PASS e.style['color'] = "color(srgb-linear calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value
+PASS e.style['color'] = "color(srgb-linear calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value
+PASS e.style['color'] = "color(srgb-linear none none none / none)" should set the property value
+PASS e.style['color'] = "color(srgb-linear none none none)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 10% none none / none)" should set the property value
+PASS e.style['color'] = "color(srgb-linear none none none / 0.5)" should set the property value
+PASS e.style['color'] = "color(srgb-linear 0 0 0 / none)" should set the property value
+FAIL e.style['color'] = "color(srgb-linear 0 calc(infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0 calc(infinity) 0)" but got "color(srgb-linear 0 Infinity 0)"
+FAIL e.style['color'] = "color(srgb-linear 0 calc(-infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear 0 calc(-infinity) 0)" but got "color(srgb-linear 0 -Infinity 0)"
+FAIL e.style['color'] = "color(srgb-linear calc(NaN) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear calc(NaN) 0 0)" but got "color(srgb-linear Infinity 0 0 / none)"
+FAIL e.style['color'] = "color(srgb-linear calc(0 / 0) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(srgb-linear calc(NaN) 0 0)" but got "color(srgb-linear Infinity 0 0 / none)"
+PASS e.style['color'] = "color(a98-rgb 0% 0% 0%)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 10% 10% 10%)" should set the property value
+PASS e.style['color'] = "color(a98-rgb .2 .2 25%)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 0 0 0 / 1)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 0% 0 0 / 0.5)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 20% 0 10/0.5)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 20% 0 10/50%)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 400% 0 10/50%)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 50% -160 160)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 50% -200 200)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 0 0 0 / -10%)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 0 0 0 / 110%)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 0 0 0 / 300%)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 200 200 200)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 200 200 200 / 200)" should set the property value
+PASS e.style['color'] = "color(a98-rgb -200 -200 -200)" should set the property value
+PASS e.style['color'] = "color(a98-rgb -200 -200 -200 / -200)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 200% 200% 200%)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 200% 200% 200% / 200%)" should set the property value
+PASS e.style['color'] = "color(a98-rgb -200% -200% -200% / -200%)" should set the property value
+PASS e.style['color'] = "color(a98-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value
+PASS e.style['color'] = "color(a98-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value
+PASS e.style['color'] = "color(a98-rgb none none none / none)" should set the property value
+PASS e.style['color'] = "color(a98-rgb none none none)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 10% none none / none)" should set the property value
+PASS e.style['color'] = "color(a98-rgb none none none / 0.5)" should set the property value
+PASS e.style['color'] = "color(a98-rgb 0 0 0 / none)" should set the property value
+FAIL e.style['color'] = "color(a98-rgb 0 calc(infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(a98-rgb 0 calc(infinity) 0)" but got "color(a98-rgb 0 Infinity 0)"
+FAIL e.style['color'] = "color(a98-rgb 0 calc(-infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(a98-rgb 0 calc(-infinity) 0)" but got "color(a98-rgb 0 -Infinity 0)"
+FAIL e.style['color'] = "color(a98-rgb calc(NaN) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(a98-rgb calc(NaN) 0 0)" but got "color(a98-rgb Infinity 0 0 / none)"
+FAIL e.style['color'] = "color(a98-rgb calc(0 / 0) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(a98-rgb calc(NaN) 0 0)" but got "color(a98-rgb Infinity 0 0 / none)"
+PASS e.style['color'] = "color(rec2020 0% 0% 0%)" should set the property value
+PASS e.style['color'] = "color(rec2020 10% 10% 10%)" should set the property value
+PASS e.style['color'] = "color(rec2020 .2 .2 25%)" should set the property value
+PASS e.style['color'] = "color(rec2020 0 0 0 / 1)" should set the property value
+PASS e.style['color'] = "color(rec2020 0% 0 0 / 0.5)" should set the property value
+PASS e.style['color'] = "color(rec2020 20% 0 10/0.5)" should set the property value
+PASS e.style['color'] = "color(rec2020 20% 0 10/50%)" should set the property value
+PASS e.style['color'] = "color(rec2020 400% 0 10/50%)" should set the property value
+PASS e.style['color'] = "color(rec2020 50% -160 160)" should set the property value
+PASS e.style['color'] = "color(rec2020 50% -200 200)" should set the property value
+PASS e.style['color'] = "color(rec2020 0 0 0 / -10%)" should set the property value
+PASS e.style['color'] = "color(rec2020 0 0 0 / 110%)" should set the property value
+PASS e.style['color'] = "color(rec2020 0 0 0 / 300%)" should set the property value
+PASS e.style['color'] = "color(rec2020 200 200 200)" should set the property value
+PASS e.style['color'] = "color(rec2020 200 200 200 / 200)" should set the property value
+PASS e.style['color'] = "color(rec2020 -200 -200 -200)" should set the property value
+PASS e.style['color'] = "color(rec2020 -200 -200 -200 / -200)" should set the property value
+PASS e.style['color'] = "color(rec2020 200% 200% 200%)" should set the property value
+PASS e.style['color'] = "color(rec2020 200% 200% 200% / 200%)" should set the property value
+PASS e.style['color'] = "color(rec2020 -200% -200% -200% / -200%)" should set the property value
+PASS e.style['color'] = "color(rec2020 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value
+PASS e.style['color'] = "color(rec2020 calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value
+PASS e.style['color'] = "color(rec2020 none none none / none)" should set the property value
+PASS e.style['color'] = "color(rec2020 none none none)" should set the property value
+PASS e.style['color'] = "color(rec2020 10% none none / none)" should set the property value
+PASS e.style['color'] = "color(rec2020 none none none / 0.5)" should set the property value
+PASS e.style['color'] = "color(rec2020 0 0 0 / none)" should set the property value
+FAIL e.style['color'] = "color(rec2020 0 calc(infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(rec2020 0 calc(infinity) 0)" but got "color(rec2020 0 Infinity 0)"
+FAIL e.style['color'] = "color(rec2020 0 calc(-infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(rec2020 0 calc(-infinity) 0)" but got "color(rec2020 0 -Infinity 0)"
+FAIL e.style['color'] = "color(rec2020 calc(NaN) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(rec2020 calc(NaN) 0 0)" but got "color(rec2020 Infinity 0 0 / none)"
+FAIL e.style['color'] = "color(rec2020 calc(0 / 0) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(rec2020 calc(NaN) 0 0)" but got "color(rec2020 Infinity 0 0 / none)"
+PASS e.style['color'] = "color(prophoto-rgb 0% 0% 0%)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 10% 10% 10%)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb .2 .2 25%)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 0 0 0 / 1)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 0% 0 0 / 0.5)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 20% 0 10/0.5)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 20% 0 10/50%)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 400% 0 10/50%)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 50% -160 160)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 50% -200 200)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 0 0 0 / -10%)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 0 0 0 / 110%)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 0 0 0 / 300%)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 200 200 200)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 200 200 200 / 200)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb -200 -200 -200)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb -200 -200 -200 / -200)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 200% 200% 200%)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 200% 200% 200% / 200%)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb -200% -200% -200% / -200%)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb none none none / none)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb none none none)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 10% none none / none)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb none none none / 0.5)" should set the property value
+PASS e.style['color'] = "color(prophoto-rgb 0 0 0 / none)" should set the property value
+FAIL e.style['color'] = "color(prophoto-rgb 0 calc(infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(prophoto-rgb 0 calc(infinity) 0)" but got "color(prophoto-rgb 0 Infinity 0)"
+FAIL e.style['color'] = "color(prophoto-rgb 0 calc(-infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(prophoto-rgb 0 calc(-infinity) 0)" but got "color(prophoto-rgb 0 -Infinity 0)"
+FAIL e.style['color'] = "color(prophoto-rgb calc(NaN) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(prophoto-rgb calc(NaN) 0 0)" but got "color(prophoto-rgb Infinity 0 0 / none)"
+FAIL e.style['color'] = "color(prophoto-rgb calc(0 / 0) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(prophoto-rgb calc(NaN) 0 0)" but got "color(prophoto-rgb Infinity 0 0 / none)"
+PASS e.style['color'] = "color(display-p3 0% 0% 0%)" should set the property value
+PASS e.style['color'] = "color(display-p3 10% 10% 10%)" should set the property value
+PASS e.style['color'] = "color(display-p3 .2 .2 25%)" should set the property value
+PASS e.style['color'] = "color(display-p3 0 0 0 / 1)" should set the property value
+PASS e.style['color'] = "color(display-p3 0% 0 0 / 0.5)" should set the property value
+PASS e.style['color'] = "color(display-p3 20% 0 10/0.5)" should set the property value
+PASS e.style['color'] = "color(display-p3 20% 0 10/50%)" should set the property value
+PASS e.style['color'] = "color(display-p3 400% 0 10/50%)" should set the property value
+PASS e.style['color'] = "color(display-p3 50% -160 160)" should set the property value
+PASS e.style['color'] = "color(display-p3 50% -200 200)" should set the property value
+PASS e.style['color'] = "color(display-p3 0 0 0 / -10%)" should set the property value
+PASS e.style['color'] = "color(display-p3 0 0 0 / 110%)" should set the property value
+PASS e.style['color'] = "color(display-p3 0 0 0 / 300%)" should set the property value
+PASS e.style['color'] = "color(display-p3 200 200 200)" should set the property value
+PASS e.style['color'] = "color(display-p3 200 200 200 / 200)" should set the property value
+PASS e.style['color'] = "color(display-p3 -200 -200 -200)" should set the property value
+PASS e.style['color'] = "color(display-p3 -200 -200 -200 / -200)" should set the property value
+PASS e.style['color'] = "color(display-p3 200% 200% 200%)" should set the property value
+PASS e.style['color'] = "color(display-p3 200% 200% 200% / 200%)" should set the property value
+PASS e.style['color'] = "color(display-p3 -200% -200% -200% / -200%)" should set the property value
+PASS e.style['color'] = "color(display-p3 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value
+PASS e.style['color'] = "color(display-p3 calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value
+PASS e.style['color'] = "color(display-p3 none none none / none)" should set the property value
+PASS e.style['color'] = "color(display-p3 none none none)" should set the property value
+PASS e.style['color'] = "color(display-p3 10% none none / none)" should set the property value
+PASS e.style['color'] = "color(display-p3 none none none / 0.5)" should set the property value
+PASS e.style['color'] = "color(display-p3 0 0 0 / none)" should set the property value
+FAIL e.style['color'] = "color(display-p3 0 calc(infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(display-p3 0 calc(infinity) 0)" but got "color(display-p3 0 Infinity 0)"
+FAIL e.style['color'] = "color(display-p3 0 calc(-infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(display-p3 0 calc(-infinity) 0)" but got "color(display-p3 0 -Infinity 0)"
+FAIL e.style['color'] = "color(display-p3 calc(NaN) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(display-p3 calc(NaN) 0 0)" but got "color(display-p3 Infinity 0 0 / none)"
+FAIL e.style['color'] = "color(display-p3 calc(0 / 0) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(display-p3 calc(NaN) 0 0)" but got "color(display-p3 Infinity 0 0 / none)"
+PASS e.style['color'] = "color(xyz 0 0 0)" should set the property value
+PASS e.style['color'] = "color(xyz 0 0 0 / 1)" should set the property value
+PASS e.style['color'] = "color(xyz 1 1 1)" should set the property value
+PASS e.style['color'] = "color(xyz 1 1 1 / 1)" should set the property value
+PASS e.style['color'] = "color(xyz -1 -1 -1)" should set the property value
+PASS e.style['color'] = "color(xyz 0.1 0.1 0.1)" should set the property value
+PASS e.style['color'] = "color(xyz 10 10 10)" should set the property value
+PASS e.style['color'] = "color(xyz .2 .2 .25)" should set the property value
+PASS e.style['color'] = "color(xyz 0 0 0 / 0.5)" should set the property value
+PASS e.style['color'] = "color(xyz .20 0 10/0.5)" should set the property value
+PASS e.style['color'] = "color(xyz .20 0 10/50%)" should set the property value
+PASS e.style['color'] = "color(xyz 0 0 0 / -10%)" should set the property value
+PASS e.style['color'] = "color(xyz 0 0 0 / 110%)" should set the property value
+PASS e.style['color'] = "color(xyz 0 0 0 / 300%)" should set the property value
+PASS e.style['color'] = "color(xyz calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value
+PASS e.style['color'] = "color(xyz none none none / none)" should set the property value
+PASS e.style['color'] = "color(xyz none none none)" should set the property value
+PASS e.style['color'] = "color(xyz 0.2 none none / none)" should set the property value
+PASS e.style['color'] = "color(xyz none none none / 0.5)" should set the property value
+PASS e.style['color'] = "color(xyz 0 0 0 / none)" should set the property value
+FAIL e.style['color'] = "color(xyz 0 calc(infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(xyz 0 calc(infinity) 0)" but got "color(xyz-d65 0 Infinity 0)"
+FAIL e.style['color'] = "color(xyz 0 calc(-infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(xyz 0 calc(-infinity) 0)" but got "color(xyz-d65 0 -Infinity 0)"
+FAIL e.style['color'] = "color(xyz calc(NaN) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(xyz calc(NaN) 0 0)" but got "color(xyz-d65 Infinity 0 0 / none)"
+FAIL e.style['color'] = "color(xyz calc(0 / 0) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(xyz calc(NaN) 0 0)" but got "color(xyz-d65 Infinity 0 0 / none)"
+PASS e.style['color'] = "color(xyz-d50 0 0 0)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 0 0 0 / 1)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 1 1 1)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 1 1 1 / 1)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 -1 -1 -1)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 0.1 0.1 0.1)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 10 10 10)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 .2 .2 .25)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 0 0 0 / 0.5)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 .20 0 10/0.5)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 .20 0 10/50%)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 0 0 0 / -10%)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 0 0 0 / 110%)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 0 0 0 / 300%)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value
+PASS e.style['color'] = "color(xyz-d50 none none none / none)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 none none none)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 0.2 none none / none)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 none none none / 0.5)" should set the property value
+PASS e.style['color'] = "color(xyz-d50 0 0 0 / none)" should set the property value
+FAIL e.style['color'] = "color(xyz-d50 0 calc(infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0 calc(infinity) 0)" but got "color(xyz-d50 0 Infinity 0)"
+FAIL e.style['color'] = "color(xyz-d50 0 calc(-infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 0 calc(-infinity) 0)" but got "color(xyz-d50 0 -Infinity 0)"
+FAIL e.style['color'] = "color(xyz-d50 calc(NaN) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 calc(NaN) 0 0)" but got "color(xyz-d50 Infinity 0 0 / none)"
+FAIL e.style['color'] = "color(xyz-d50 calc(0 / 0) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d50 calc(NaN) 0 0)" but got "color(xyz-d50 Infinity 0 0 / none)"
+PASS e.style['color'] = "color(xyz-d65 0 0 0)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 0 0 0 / 1)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 1 1 1)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 1 1 1 / 1)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 -1 -1 -1)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 0.1 0.1 0.1)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 10 10 10)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 .2 .2 .25)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 0 0 0 / 0.5)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 .20 0 10/0.5)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 .20 0 10/50%)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 0 0 0 / -10%)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 0 0 0 / 110%)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 0 0 0 / 300%)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value
+PASS e.style['color'] = "color(xyz-d65 none none none / none)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 none none none)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 0.2 none none / none)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 none none none / 0.5)" should set the property value
+PASS e.style['color'] = "color(xyz-d65 0 0 0 / none)" should set the property value
+FAIL e.style['color'] = "color(xyz-d65 0 calc(infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0 calc(infinity) 0)" but got "color(xyz-d65 0 Infinity 0)"
+FAIL e.style['color'] = "color(xyz-d65 0 calc(-infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 0 calc(-infinity) 0)" but got "color(xyz-d65 0 -Infinity 0)"
+FAIL e.style['color'] = "color(xyz-d65 calc(NaN) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 calc(NaN) 0 0)" but got "color(xyz-d65 Infinity 0 0 / none)"
+FAIL e.style['color'] = "color(xyz-d65 calc(0 / 0) 0 0 / none)" should set the property value assert_equals: serialization should be canonical expected "color(xyz-d65 calc(NaN) 0 0)" but got "color(xyz-d65 Infinity 0 0 / none)"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-color-function.html b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-color-function.html
index 1eb7c74..f922b57 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-color-function.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-color-function.html
@@ -41,6 +41,11 @@
     test_valid_value("color", `color(${colorSpace} 10% none none / none)`, `color(${colorSpace} 0.1 none none / none)`);
     test_valid_value("color", `color(${colorSpace} none none none / 0.5)`, `color(${colorSpace} none none none / 0.5)`);
     test_valid_value("color", `color(${colorSpace} 0 0 0 / none)`, `color(${colorSpace} 0 0 0 / none)`);
+
+    test_valid_value("color", `color(${colorSpace} 0 calc(infinity) 0)`, `color(${colorSpace} 0 calc(infinity) 0)`);
+    test_valid_value("color", `color(${colorSpace} 0 calc(-infinity) 0)`, `color(${colorSpace} 0 calc(-infinity) 0)`);
+    test_valid_value("color", `color(${colorSpace} calc(NaN) 0 0 / none)`, `color(${colorSpace} calc(NaN) 0 0)`);
+    test_valid_value("color", `color(${colorSpace} calc(0 / 0) 0 0 / none)`, `color(${colorSpace} calc(NaN) 0 0)`);
 }
 
 for (const colorSpace of [ "xyz", "xyz-d50", "xyz-d65" ]) {
@@ -67,6 +72,11 @@
     test_valid_value("color", `color(${colorSpace} 0.2 none none / none)`, `color(${resultColorSpace} 0.2 none none / none)`);
     test_valid_value("color", `color(${colorSpace} none none none / 0.5)`, `color(${resultColorSpace} none none none / 0.5)`);
     test_valid_value("color", `color(${colorSpace} 0 0 0 / none)`, `color(${resultColorSpace} 0 0 0 / none)`);
+
+    test_valid_value("color", `color(${colorSpace} 0 calc(infinity) 0)`, `color(${colorSpace} 0 calc(infinity) 0)`);
+    test_valid_value("color", `color(${colorSpace} 0 calc(-infinity) 0)`, `color(${colorSpace} 0 calc(-infinity) 0)`);
+    test_valid_value("color", `color(${colorSpace} calc(NaN) 0 0 / none)`, `color(${colorSpace} calc(NaN) 0 0)`);
+    test_valid_value("color", `color(${colorSpace} calc(0 / 0) 0 0 / none)`, `color(${colorSpace} calc(NaN) 0 0)`);
 }
 </script>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-color-function.html.ini b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-color-function.html.ini
new file mode 100644
index 0000000..33800d7c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-color-function.html.ini
@@ -0,0 +1,108 @@
+[color-valid-color-function.html]
+  [e.style['color'\] = "color(a98-rgb 0 calc(-infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(a98-rgb 0 calc(infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(a98-rgb calc(0 / 0) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(a98-rgb calc(NaN) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(display-p3 0 calc(-infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(display-p3 0 calc(infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(display-p3 calc(0 / 0) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(display-p3 calc(NaN) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(prophoto-rgb 0 calc(-infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(prophoto-rgb 0 calc(infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(prophoto-rgb calc(0 / 0) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(prophoto-rgb calc(NaN) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(rec2020 0 calc(-infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(rec2020 0 calc(infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(rec2020 calc(0 / 0) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(rec2020 calc(NaN) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(srgb 0 calc(-infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(srgb 0 calc(infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(srgb calc(0 / 0) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(srgb calc(NaN) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(srgb-linear 0 calc(-infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(srgb-linear 0 calc(infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(srgb-linear calc(0 / 0) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(srgb-linear calc(NaN) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(xyz 0 calc(-infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(xyz 0 calc(infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(xyz calc(0 / 0) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(xyz calc(NaN) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(xyz-d50 0 calc(-infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(xyz-d50 0 calc(infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(xyz-d50 calc(0 / 0) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(xyz-d50 calc(NaN) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(xyz-d65 0 calc(-infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(xyz-d65 0 calc(infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(xyz-d65 calc(0 / 0) 0 0 / none)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "color(xyz-d65 calc(NaN) 0 0 / none)" should set the property value]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-lab-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-lab-expected.txt
index d41facc..ef7c8e51f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-lab-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-lab-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 92 tests; 86 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 112 tests; 88 PASS, 24 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS e.style['color'] = "lab(0 0 0)" should set the property value
 PASS e.style['color'] = "lab(0 0 0 / 1)" should set the property value
 PASS e.style['color'] = "lab(0 0 0 / 0.5)" should set the property value
@@ -21,6 +21,11 @@
 PASS e.style['color'] = "lab(20 none none / none)" should set the property value
 PASS e.style['color'] = "lab(none none none / 0.5)" should set the property value
 PASS e.style['color'] = "lab(0 0 0 / none)" should set the property value
+FAIL e.style['color'] = "lab(calc(infinity) 0 0)" should set the property value assert_equals: serialization should be canonical expected "lab(100 0 0)" but got "lab(Infinity 0 0)"
+FAIL e.style['color'] = "lab(50 calc(infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "lab(50 calc(infinity) 0)" but got "lab(50 Infinity 0)"
+FAIL e.style['color'] = "lab(50 calc(-infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "lab(50 calc(-infinity) 0)" but got "lab(50 -Infinity 0)"
+FAIL e.style['color'] = "lab(calc(NaN) 0 0)" should set the property value assert_equals: serialization should be canonical expected "lab(calc(NaN) 0 0)" but got "lab(Infinity 0 0)"
+FAIL e.style['color'] = "lab(calc(0 / 0) 0 0)" should set the property value assert_equals: serialization should be canonical expected "lab(calc(NaN) 0 0)" but got "lab(Infinity 0 0)"
 PASS e.style['color'] = "oklab(0 0 0)" should set the property value
 PASS e.style['color'] = "oklab(0 0 0 / 1)" should set the property value
 PASS e.style['color'] = "oklab(0 0 0 / 0.5)" should set the property value
@@ -42,6 +47,11 @@
 PASS e.style['color'] = "oklab(0.2 none none / none)" should set the property value
 PASS e.style['color'] = "oklab(none none none / 0.5)" should set the property value
 PASS e.style['color'] = "oklab(0 0 0 / none)" should set the property value
+FAIL e.style['color'] = "oklab(calc(infinity) 0 0)" should set the property value assert_equals: serialization should be canonical expected "oklab(1 0 0)" but got "oklab(Infinity 0 0)"
+FAIL e.style['color'] = "oklab(0.5 calc(infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "oklab(0.5 calc(infinity) 0)" but got "oklab(0.5 Infinity 0)"
+FAIL e.style['color'] = "oklab(0.5 calc(-infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "oklab(0.5 calc(-infinity) 0)" but got "oklab(0.5 -Infinity 0)"
+FAIL e.style['color'] = "oklab(calc(NaN) 0 0)" should set the property value assert_equals: serialization should be canonical expected "oklab(calc(NaN) 0 0)" but got "oklab(Infinity 0 0)"
+FAIL e.style['color'] = "oklab(calc(0 / 0) 0 0)" should set the property value assert_equals: serialization should be canonical expected "oklab(calc(NaN) 0 0)" but got "oklab(Infinity 0 0)"
 PASS e.style['color'] = "lch(0 0 0deg)" should set the property value
 PASS e.style['color'] = "lch(0 0 0deg / 1)" should set the property value
 PASS e.style['color'] = "lch(0 0 0deg / 0.5)" should set the property value
@@ -67,6 +77,11 @@
 PASS e.style['color'] = "lch(20 none none / none)" should set the property value
 PASS e.style['color'] = "lch(none none none / 0.5)" should set the property value
 PASS e.style['color'] = "lch(0 0 0 / none)" should set the property value
+FAIL e.style['color'] = "lch(calc(infinity) 0 0)" should set the property value assert_equals: serialization should be canonical expected "lch(100 0 0)" but got "lch(Infinity 0 0)"
+FAIL e.style['color'] = "lch(50 calc(infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "lch(50 calc(infinity) 0)" but got "lch(50 Infinity 0)"
+PASS e.style['color'] = "lch(50 calc(-infinity) 0)" should set the property value
+FAIL e.style['color'] = "lch(calc(NaN) 0 0)" should set the property value assert_equals: serialization should be canonical expected "lch(calc(NaN) 0 0)" but got "lch(Infinity 0 0)"
+FAIL e.style['color'] = "lch(calc(0 / 0) 0 0)" should set the property value assert_equals: serialization should be canonical expected "lch(calc(NaN) 0 0)" but got "lch(Infinity 0 0)"
 PASS e.style['color'] = "oklch(0 0 0deg)" should set the property value
 PASS e.style['color'] = "oklch(0 0 0deg / 1)" should set the property value
 PASS e.style['color'] = "oklch(0 0 0deg / 0.5)" should set the property value
@@ -92,5 +107,10 @@
 PASS e.style['color'] = "oklch(0.2 none none / none)" should set the property value
 PASS e.style['color'] = "oklch(none none none / 0.5)" should set the property value
 PASS e.style['color'] = "oklch(0 0 0 / none)" should set the property value
+FAIL e.style['color'] = "oklch(calc(infinity) 0 0)" should set the property value assert_equals: serialization should be canonical expected "oklch(1 0 0)" but got "oklch(Infinity 0 0)"
+FAIL e.style['color'] = "oklch(0.5 calc(infinity) 0)" should set the property value assert_equals: serialization should be canonical expected "oklch(0.5 calc(infinity) 0)" but got "oklch(0.5 Infinity 0)"
+PASS e.style['color'] = "oklch(0.5 calc(-infinity) 0)" should set the property value
+FAIL e.style['color'] = "oklch(calc(NaN) 0 0)" should set the property value assert_equals: serialization should be canonical expected "oklch(calc(NaN) 0 0)" but got "oklch(Infinity 0 0)"
+FAIL e.style['color'] = "oklch(calc(0 / 0) 0 0)" should set the property value assert_equals: serialization should be canonical expected "oklch(calc(NaN) 0 0)" but got "oklch(Infinity 0 0)"
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-lab.html b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-lab.html
index 601a0ffb..ee7212c 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-lab.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-lab.html
@@ -39,6 +39,12 @@
 test_valid_value("color", "lab(none none none / 0.5)", "lab(none none none / 0.5)");
 test_valid_value("color", "lab(0 0 0 / none)", "lab(0 0 0 / none)");
 
+test_valid_value("color", "lab(calc(infinity) 0 0)", "lab(100 0 0)");
+test_valid_value("color", "lab(50 calc(infinity) 0)", "lab(50 calc(infinity) 0)");
+test_valid_value("color", "lab(50 calc(-infinity) 0)", "lab(50 calc(-infinity) 0)");
+test_valid_value("color", "lab(calc(NaN) 0 0)", "lab(calc(NaN) 0 0)");
+test_valid_value("color", "lab(calc(0 / 0) 0 0)", "lab(calc(NaN) 0 0)");
+
 // oklab()
 test_valid_value("color", "oklab(0 0 0)", "oklab(0 0 0)");
 test_valid_value("color", "oklab(0 0 0 / 1)", "oklab(0 0 0)");
@@ -63,6 +69,12 @@
 test_valid_value("color", "oklab(none none none / 0.5)", "oklab(none none none / 0.5)");
 test_valid_value("color", "oklab(0 0 0 / none)", "oklab(0 0 0 / none)");
 
+test_valid_value("color", "oklab(calc(infinity) 0 0)", "oklab(1 0 0)");
+test_valid_value("color", "oklab(0.5 calc(infinity) 0)", "oklab(0.5 calc(infinity) 0)");
+test_valid_value("color", "oklab(0.5 calc(-infinity) 0)", "oklab(0.5 calc(-infinity) 0)");
+test_valid_value("color", "oklab(calc(NaN) 0 0)", "oklab(calc(NaN) 0 0)");
+test_valid_value("color", "oklab(calc(0 / 0) 0 0)", "oklab(calc(NaN) 0 0)");
+
 // lch()
 test_valid_value("color", "lch(0 0 0deg)", "lch(0 0 0)");
 test_valid_value("color", "lch(0 0 0deg / 1)", "lch(0 0 0)");
@@ -91,6 +103,12 @@
 test_valid_value("color", "lch(none none none / 0.5)", "lch(none none none / 0.5)");
 test_valid_value("color", "lch(0 0 0 / none)", "lch(0 0 0 / none)");
 
+test_valid_value("color", "lch(calc(infinity) 0 0)", "lch(100 0 0)");
+test_valid_value("color", "lch(50 calc(infinity) 0)", "lch(50 calc(infinity) 0)");
+test_valid_value("color", "lch(50 calc(-infinity) 0)", "lch(50 0 0)");
+test_valid_value("color", "lch(calc(NaN) 0 0)", "lch(calc(NaN) 0 0)");
+test_valid_value("color", "lch(calc(0 / 0) 0 0)", "lch(calc(NaN) 0 0)");
+
 // oklch()
 test_valid_value("color", "oklch(0 0 0deg)", "oklch(0 0 0)");
 test_valid_value("color", "oklch(0 0 0deg / 1)", "oklch(0 0 0)");
@@ -118,6 +136,12 @@
 test_valid_value("color", "oklch(0.2 none none / none)", "oklch(0.2 none none / none)");
 test_valid_value("color", "oklch(none none none / 0.5)", "oklch(none none none / 0.5)");
 test_valid_value("color", "oklch(0 0 0 / none)", "oklch(0 0 0 / none)");
+
+test_valid_value("color", "oklch(calc(infinity) 0 0)", "oklch(1 0 0)");
+test_valid_value("color", "oklch(0.5 calc(infinity) 0)", "oklch(0.5 calc(infinity) 0)");
+test_valid_value("color", "oklch(0.5 calc(-infinity) 0)", "oklch(0.5 0 0)");
+test_valid_value("color", "oklch(calc(NaN) 0 0)", "oklch(calc(NaN) 0 0)");
+test_valid_value("color", "oklch(calc(0 / 0) 0 0)", "oklch(calc(NaN) 0 0)");
 </script>
 </body>
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-lab.html.ini b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-lab.html.ini
index a9e4425..4b82e720 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-lab.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/parsing/color-valid-lab.html.ini
@@ -2,17 +2,71 @@
   [e.style['color'\] = "lab(400 0 10/50%)" should set the property value]
     expected: FAIL
 
+  [e.style['color'\] = "lab(50 calc(-infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "lab(50 calc(infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "lab(calc(0 / 0) 0 0)" should set the property value]
+    expected: FAIL
+
   [e.style['color'\] = "lab(calc(50 * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))" should set the property value]
     expected: FAIL
 
+  [e.style['color'\] = "lab(calc(NaN) 0 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "lab(calc(infinity) 0 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "lch(50 calc(infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "lch(calc(0 / 0) 0 0)" should set the property value]
+    expected: FAIL
+
   [e.style['color'\] = "lch(calc(50 * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))" should set the property value]
     expected: FAIL
 
+  [e.style['color'\] = "lch(calc(NaN) 0 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "lch(calc(infinity) 0 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "oklab(0.5 calc(-infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "oklab(0.5 calc(infinity) 0)" should set the property value]
+    expected: FAIL
+
   [e.style['color'\] = "oklab(4 0 0.1/50%)" should set the property value]
     expected: FAIL
 
+  [e.style['color'\] = "oklab(calc(0 / 0) 0 0)" should set the property value]
+    expected: FAIL
+
   [e.style['color'\] = "oklab(calc(0.5 * 3) calc(0.5 - 1) calc(1.5) / calc(-0.5 + 1))" should set the property value]
     expected: FAIL
 
+  [e.style['color'\] = "oklab(calc(NaN) 0 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "oklab(calc(infinity) 0 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "oklch(0.5 calc(infinity) 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "oklch(calc(0 / 0) 0 0)" should set the property value]
+    expected: FAIL
+
   [e.style['color'\] = "oklch(calc(0.5 * 3) calc(0.5 - 1) calc(20deg * 2) / calc(-0.5 + 1))" should set the property value]
     expected: FAIL
+
+  [e.style['color'\] = "oklch(calc(NaN) 0 0)" should set the property value]
+    expected: FAIL
+
+  [e.style['color'\] = "oklch(calc(infinity) 0 0)" should set the property value]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/at-container-parsing.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/at-container-parsing.html
index d0aef94..b0196b5 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/at-container-parsing.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/at-container-parsing.html
@@ -136,6 +136,7 @@
   test_condition_unknown('(asdf)');
   test_condition_unknown('(resolution > 100dpi)');
   test_condition_unknown('(resolution: 150dpi)');
+  test_condition_unknown('(resolution: calc(2x))');
   test_condition_unknown('(color)');
   test_condition_unknown('(min-color: 1)');
   test_condition_unknown('(color-index >= 1)');
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/crashtests/content-visibility-transition-finished-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/crashtests/content-visibility-transition-finished-001.html
new file mode 100644
index 0000000..ef7fb00
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/crashtests/content-visibility-transition-finished-001.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html class="test-wait">
+<meta charset="utf-8">
+<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1822907">
+<style>
+  #inner {
+    /* Extremely short so that we can just do a double-rAF and
+     * expect that this transition will have completed: */
+    transition: opacity 0.01s;
+  }
+</style>
+<script>
+  function setup() {
+    // Flush style, in case the document hasn't been styled yet:
+    let origOpacity = getComputedStyle(inner).opacity;
+
+    // Trigger the (extremely short) transition, and proceed to next step
+    // when it finishes.
+    inner.addEventListener("transitionend", handleTransitionEnd);
+    inner.style.opacity = "0.8";
+  }
+  function handleTransitionEnd(e) {
+    // Hide & unhide the subtree that contained the transition:
+    foo.style.contentVisibility = "hidden";
+    document.documentElement.offsetHeight; // flush layout
+    foo.style.contentVisibility = "";
+
+    // Double-rAF to see if we crash when animations are resampled.
+    requestAnimationFrame(() => { requestAnimationFrame(finish) });
+  }
+  function finish() {
+    // If we get here, we've succeeded; hooray!
+    document.documentElement.removeAttribute("class");
+  }
+</script>
+<body onload="setup()">
+  <div id="foo">
+    Hello
+    <div id="inner">Inner</div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/empty-string-symbol-notref.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/empty-string-symbol-notref.html
new file mode 100644
index 0000000..7d0dbc3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/empty-string-symbol-notref.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>CSS Test: counter-style empty string symbol</title>
+<ol style="list-style-type: a"><li>Decimal marker. Should have "1." as marker.</ol>
+<ol style="list-style-type: a"><li>Empty string marker, should have "" as marker.</ol>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/empty-string-symbol.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/empty-string-symbol.html
new file mode 100644
index 0000000..7efea106
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-at-rule/empty-string-symbol.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>CSS Test: counter-style empty string symbol</title>
+<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#typedef-symbol">
+<link rel="mismatch" href="empty-string-symbol-notref.html">
+<style type="text/css">
+  @counter-style a {
+    system: cyclic;
+    symbols: "";
+    prefix: "";
+    suffix: "";
+  }
+</style>
+<ol><li>Decimal marker. Should have "1." as marker.</ol>
+<ol style="list-style-type: a"><li>Empty string marker, should have "" as marker.</ol>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-calc-x-rendering-2.html b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-calc-x-rendering-2.html
new file mode 100644
index 0000000..b7c02fce
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-calc-x-rendering-2.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<title>Image set calc x rendering</title>
+<link rel="help" href="https://drafts.csswg.org/css-images-4/#image-set-notation">
+<link rel="match" href="reference/image-set-rendering-ref.html">
+<meta name="assert" content="image-set calc x rendering">
+<style>
+  #test {
+    background-image: image-set(
+      url("/images/green.png") calc(0.5x * 2),
+      url("/images/red.png") 2x
+    );
+    width: 100px;
+    height: 100px;
+  }
+</style>
+<div id="test"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-calc-x-rendering.html b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-calc-x-rendering.html
new file mode 100644
index 0000000..a5444fd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-calc-x-rendering.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<title>Image set calc x rendering</title>
+<link rel="help" href="https://drafts.csswg.org/css-images-4/#image-set-notation">
+<link rel="match" href="reference/image-set-rendering-ref.html">
+<meta name="assert" content="image-set calc x rendering">
+<style>
+  #test {
+    background-image: image-set(url("/images/green.png") calc(0.5x * 2));
+    width: 100px;
+    height: 100px;
+  }
+</style>
+<div id="test"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-computed.sub.html b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-computed.sub.html
index a25ca17..6d54fd0 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-computed.sub.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-computed.sub.html
@@ -16,6 +16,32 @@
   test_computed_value(property, "-webkit-" + specified, computed);
 }
 
+function test_calculated_resolution_units() {
+  test_computed_value_variants(
+    'background-image',
+    "image-set(url('http://{{host}}/example.png') calc(1x * 2))",
+    'image-set(url("http://{{host}}/example.png") 2dppx)'
+  );
+
+  test_computed_value_variants(
+    'background-image',
+    "image-set(url('http://{{host}}/example.png') calc(6dppx / 3))",
+    'image-set(url("http://{{host}}/example.png") 2dppx)'
+  );
+
+  test_computed_value_variants(
+    'background-image',
+    "image-set(url('http://{{host}}/example.png') calc(100dpi - 4dpi))",
+    'image-set(url("http://{{host}}/example.png") 1dppx)'
+  );
+
+  test_computed_value_variants(
+    'background-image',
+    "image-set(url('http://{{host}}/example.png') calc(37dpcm + 0.79532dpcm))",
+    'image-set(url("http://{{host}}/example.png") 1dppx)'
+  );
+}
+
 // The resolution unit is expected to be converted to the canonical unit 'dppx'
 // for computed style.
 test_computed_value_variants('background-image', "image-set(url(http://{{host}}/example.png) 1x)", 'image-set(url("http://{{host}}/example.png") 1dppx)');
@@ -33,4 +59,6 @@
 // Unsupported type should still serialize.
 test_computed_value_variants('background-image', 'image-set(url("http://{{host}}/example.png") type("image/unsupported"))', 'image-set(url("http://{{host}}/example.png") 1dppx type("image/unsupported"))');
 test_computed_value_variants('background-image', 'image-set(url("http://{{host}}/example.png") 2x type("image/unsupported"), url("http://{{host}}/example.png") 1x type("image/unsupported"))', 'image-set(url("http://{{host}}/example.png") 2dppx type("image/unsupported"), url("http://{{host}}/example.png") 1dppx type("image/unsupported"))');
+
+test_calculated_resolution_units();
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing-expected.txt
deleted file mode 100644
index 02729359d..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing-expected.txt
+++ /dev/null
@@ -1,130 +0,0 @@
-This is a testharness.js-based test.
-Found 126 tests; 116 PASS, 10 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS e.style['background-image'] = "image-set(url(example.png) 1x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(example.png) 1x)" should set the property value
-PASS e.style['background-image'] = "image-set('example.jpg' 1x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set('example.jpg' 1x)" should set the property value
-PASS e.style['background-image'] = "image-set(url(example.png) 1x, 'example.png' 2x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(example.png) 1x, 'example.png' 2x)" should set the property value
-PASS e.style['background-image'] = "image-set(url(example.png) 1dpcm, 'example.png' 2x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(example.png) 1dpcm, 'example.png' 2x)" should set the property value
-PASS e.style['background-image'] = "image-set('example.jpeg' 222dpi, url(example.png) 3.5x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set('example.jpeg' 222dpi, url(example.png) 3.5x)" should set the property value
-PASS e.style['content'] = "image-set(url(\"example.png\") 1x)" should set the property value
-PASS e.style['content'] = "-webkit-image-set(url(\"example.png\") 1x)" should set the property value
-PASS e.style['content'] = "image-set(url(\"example.png\") 1x, \"example.png\" 3x)" should set the property value
-PASS e.style['content'] = "-webkit-image-set(url(\"example.png\") 1x, \"example.png\" 3x)" should set the property value
-PASS e.style['border-image-source'] = "image-set(url(\"example.png\") 1x)" should set the property value
-PASS e.style['border-image-source'] = "-webkit-image-set(url(\"example.png\") 1x)" should set the property value
-PASS e.style['border-image-source'] = "image-set(url(\"example.png\") 1x, \"example.png\" 3x)" should set the property value
-PASS e.style['border-image-source'] = "-webkit-image-set(url(\"example.png\") 1x, \"example.png\" 3x)" should set the property value
-PASS e.style['background-image'] = "image-set(none, url(example.png) 1x)" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set(none, url(example.png) 1x)" should not set the property value
-PASS e.style['background-image'] = "image-set()" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set()" should not set the property value
-PASS e.style['background-image'] = "image-set('example.jpeg' 92pid url(example.png) 1x)" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set('example.jpeg' 92pid url(example.png) 1x)" should not set the property value
-PASS e.style['background-image'] = "image-set(url(example.png) 1x url(example.jpeg))" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(example.png) 1x url(example.jpeg))" should not set the property value
-PASS e.style['background-image'] = "image-set(url(example.png) 1x 2x)" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(example.png) 1x 2x)" should not set the property value
-PASS e.style['background-image'] = "image-set(url(foo))" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(foo))" should set the property value
-PASS e.style['background-image'] = "image-set(url(foo), url(bar) 1x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(foo), url(bar) 1x)" should set the property value
-PASS e.style['background-image'] = "image-set(url(foo) 1x, url(bar))" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(foo) 1x, url(bar))" should set the property value
-PASS e.style['background-image'] = "image-set(url(foo), url(bar))" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(foo), url(bar))" should set the property value
-PASS e.style['background-image'] = "image-set(url(foo) 1x, url(bar), url(baz) 2x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(foo) 1x, url(bar), url(baz) 2x)" should set the property value
-PASS e.style['background-image'] = "image-set(url(\"example.png\") 1x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") 1x)" should set the property value
-FAIL e.style['background-image'] = "image-set(url(\"example.png\") calc(2x * 3))" should set the property value assert_not_equals: property should be set got disallowed value ""
-FAIL e.style['background-image'] = "-webkit-image-set(url(\"example.png\") calc(2x * 3))" should set the property value assert_not_equals: property should be set got disallowed value ""
-PASS e.style['background-image'] = "image-set(url(\"example.png\") 1dppx)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") 1dppx)" should set the property value
-FAIL e.style['background-image'] = "image-set(url(\"example.png\") calc(1dppx * 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
-FAIL e.style['background-image'] = "-webkit-image-set(url(\"example.png\") calc(1dppx * 1))" should set the property value assert_not_equals: property should be set got disallowed value ""
-PASS e.style['background-image'] = "image-set(url(\"example.png\") 1dpi)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") 1dpi)" should set the property value
-FAIL e.style['background-image'] = "image-set(url(\"example.png\") calc(96dpi * 2))" should set the property value assert_not_equals: property should be set got disallowed value ""
-FAIL e.style['background-image'] = "-webkit-image-set(url(\"example.png\") calc(96dpi * 2))" should set the property value assert_not_equals: property should be set got disallowed value ""
-PASS e.style['background-image'] = "image-set(url(\"example.png\") 1dpcm)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") 1dpcm)" should set the property value
-FAIL e.style['background-image'] = "image-set(url(\"example.png\") calc(1dpcm * 96/2.54))" should set the property value assert_not_equals: property should be set got disallowed value ""
-FAIL e.style['background-image'] = "-webkit-image-set(url(\"example.png\") calc(1dpcm * 96/2.54))" should set the property value assert_not_equals: property should be set got disallowed value ""
-PASS e.style['background-image'] = "image-set(url(\"example.png\") 1x, url(\"example.png\") 2dppx, \"example.png\" 250dpi, \"example.png\" 1dpcm)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") 1x, url(\"example.png\") 2dppx, \"example.png\" 250dpi, \"example.png\" 1dpcm)" should set the property value
-PASS e.style['content'] = "image-set(url(\"example.png\") 1dpi)" should set the property value
-PASS e.style['content'] = "-webkit-image-set(url(\"example.png\") 1dpi)" should set the property value
-FAIL e.style['content'] = "image-set(url(\"example.png\") calc(1 * 96dpi))" should set the property value assert_not_equals: property should be set got disallowed value ""
-FAIL e.style['content'] = "-webkit-image-set(url(\"example.png\") calc(1 * 96dpi))" should set the property value assert_not_equals: property should be set got disallowed value ""
-PASS e.style['background-image'] = "image-set(url(\"example.png\") 1invalidResUnit)" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") 1invalidResUnit)" should not set the property value
-PASS e.style['background-image'] = "image-set(url(\"example.png\") calc(3 * 4))" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") calc(3 * 4))" should not set the property value
-PASS e.style['background-image'] = "image-set(url(\"example.png\") calc(2 - 1))" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") calc(2 - 1))" should not set the property value
-PASS e.style['background-image'] = "image-set(url(\"example.png\") calc(2x - 1))" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") calc(2x - 1))" should not set the property value
-PASS e.style['background-image'] = "image-set(url(\"example.png\") calc(1 + 4dpi))" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") calc(1 + 4dpi))" should not set the property value
-PASS e.style['background-image'] = "image-set(url(\"example.png\") 0x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") 0x)" should set the property value
-PASS e.style['background-image'] = "image-set(url(\"example.png\") 0dppx)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") 0dppx)" should set the property value
-PASS e.style['background-image'] = "image-set(url(\"example.png\") 0dpi)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") 0dpi)" should set the property value
-PASS e.style['background-image'] = "image-set(url(\"example.png\") 0dpcm)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") 0dpcm)" should set the property value
-PASS e.style['background-image'] = "image-set(url(\"example.png\") -1x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") -1x)" should set the property value
-PASS e.style['background-image'] = "image-set(url(\"example.png\") -3dppx)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") -3dppx)" should set the property value
-PASS e.style['background-image'] = "image-set(url(\"example.png\") -96dpi)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") -96dpi)" should set the property value
-PASS e.style['background-image'] = "image-set(url(\"example.png\") -113dpcm)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") -113dpcm)" should set the property value
-PASS e.style['background-image'] = "image-set(linear-gradient(black, white) 1x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(linear-gradient(black, white) 1x)" should set the property value
-PASS e.style['background-image'] = "image-set(repeating-linear-gradient(red, blue 25%) 1x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(repeating-linear-gradient(red, blue 25%) 1x)" should set the property value
-PASS e.style['background-image'] = "image-set(radial-gradient(black, white) 1x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(radial-gradient(black, white) 1x)" should set the property value
-PASS e.style['background-image'] = "image-set(repeating-radial-gradient(red, blue 25%) 1x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(repeating-radial-gradient(red, blue 25%) 1x)" should set the property value
-PASS e.style['background-image'] = "image-set(conic-gradient(black, white) 1x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(conic-gradient(black, white) 1x)" should set the property value
-PASS e.style['background-image'] = "image-set(repeating-conic-gradient(red, blue 25%) 1x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(repeating-conic-gradient(red, blue 25%) 1x)" should set the property value
-PASS e.style['content'] = "image-set(linear-gradient(black, white) 1x, url(\"example.png\") 4x)" should set the property value
-PASS e.style['content'] = "-webkit-image-set(linear-gradient(black, white) 1x, url(\"example.png\") 4x)" should set the property value
-PASS e.style['content'] = "image-set(url(\"example.png\") 192dpi, linear-gradient(black, white) 1x)" should set the property value
-PASS e.style['content'] = "-webkit-image-set(url(\"example.png\") 192dpi, linear-gradient(black, white) 1x)" should set the property value
-PASS e.style['cursor'] = "image-set(linear-gradient(black, white) 1x)" should not set the property value
-PASS e.style['cursor'] = "-webkit-image-set(linear-gradient(black, white) 1x)" should not set the property value
-PASS e.style['background-image'] = "image-set(linear-gradient(red) 1x)" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set(linear-gradient(red) 1x)" should not set the property value
-PASS e.style['background-image'] = "image-set(url(\"example.png\") 1x type(\"image/png\"))" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(\"example.png\") 1x type(\"image/png\"))" should set the property value
-PASS e.style['background-image'] = "image-set(url(example.png) type('image/png'))" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(example.png) type('image/png'))" should set the property value
-PASS e.style['background-image'] = "image-set(url(example.png) type('image/png') 1x)" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(example.png) type('image/png') 1x)" should set the property value
-PASS e.style['background-image'] = "image-set(url(example.png) 1x type('image/jpeg'))" should set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(example.png) 1x type('image/jpeg'))" should set the property value
-PASS e.style['background-image'] = "image-set(url(example.png) type(image/png))" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(example.png) type(image/png))" should not set the property value
-PASS e.style['background-image'] = "image-set(url(example.png) type('image/png') type('image/png'))" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(example.png) type('image/png') type('image/png'))" should not set the property value
-PASS e.style['background-image'] = "image-set(url(example.png) 1xtype('image/png'))" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set(url(example.png) 1xtype('image/png'))" should not set the property value
-PASS e.style['background-image'] = "image-set(type('image/png') url(example.png) 1x)" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set(type('image/png') url(example.png) 1x)" should not set the property value
-PASS e.style['background-image'] = "image-set(image-set(url(example.png)) 2x)" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set(image-set(url(example.png)) 2x)" should not set the property value
-PASS e.style['background-image'] = "image-set(image(image-set(url(example.png)) 2x) 2x)" should not set the property value
-PASS e.style['background-image'] = "-webkit-image-set(image(image-set(url(example.png)) 2x) 2x)" should not set the property value
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing.html.ini b/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing.html.ini
deleted file mode 100644
index 7ab4fb4..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-images/image-set/image-set-parsing.html.ini
+++ /dev/null
@@ -1,30 +0,0 @@
-[image-set-parsing.html]
-  [e.style['background-image'\] = "-webkit-image-set(url(\\"example.png\\") calc(1dpcm * 96/2.54))" should set the property value]
-    expected: FAIL
-
-  [e.style['background-image'\] = "-webkit-image-set(url(\\"example.png\\") calc(1dppx * 1))" should set the property value]
-    expected: FAIL
-
-  [e.style['background-image'\] = "-webkit-image-set(url(\\"example.png\\") calc(2x * 3))" should set the property value]
-    expected: FAIL
-
-  [e.style['background-image'\] = "-webkit-image-set(url(\\"example.png\\") calc(96dpi * 2))" should set the property value]
-    expected: FAIL
-
-  [e.style['background-image'\] = "image-set(url(\\"example.png\\") calc(1dpcm * 96/2.54))" should set the property value]
-    expected: FAIL
-
-  [e.style['background-image'\] = "image-set(url(\\"example.png\\") calc(1dppx * 1))" should set the property value]
-    expected: FAIL
-
-  [e.style['background-image'\] = "image-set(url(\\"example.png\\") calc(2x * 3))" should set the property value]
-    expected: FAIL
-
-  [e.style['background-image'\] = "image-set(url(\\"example.png\\") calc(96dpi * 2))" should set the property value]
-    expected: FAIL
-
-  [e.style['content'\] = "-webkit-image-set(url(\\"example.png\\") calc(1 * 96dpi))" should set the property value]
-    expected: FAIL
-
-  [e.style['content'\] = "image-set(url(\\"example.png\\") calc(1 * 96dpi))" should set the property value]
-    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-computation-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-computation-expected.txt
deleted file mode 100644
index b5ca197..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-computation-expected.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-This is a testharness.js-based test.
-Found 62 tests; 61 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS <length> values computed are correctly via var()-reference
-PASS <length> values computed are correctly via var()-reference when font-size is inherited
-PASS <length> values are computed correctly when font-size is inherited [14em]
-PASS <length> values are computed correctly when font-size is inherited [calc(14em + 10px)]
-PASS <length> values are computed correctly [12px]
-PASS <length> values are computed correctly [13vw]
-PASS <length> values are computed correctly [14em]
-PASS <length> values are computed correctly [15vmin]
-PASS <length> values are computed correctly [calc(16px - 7em + 10vh)]
-PASS <length> values are computed correctly [1in]
-PASS <length> values are computed correctly [2.54cm]
-PASS <length> values are computed correctly [25.4mm]
-PASS <length> values are computed correctly [6pc]
-PASS <length> values are computed correctly [72pt]
-PASS <length> values are computed correctly [10lh]
-PASS <length-percentage> values are computed correctly [17em]
-PASS <length-percentage> values are computed correctly [18%]
-PASS <length-percentage> values are computed correctly [calc(19em - 2%)]
-PASS <length># values are computed correctly [10px, 3em]
-PASS <length># values are computed correctly [4em ,9px]
-PASS <length># values are computed correctly [8em]
-PASS <length-percentage># values are computed correctly [3% , 10vmax  , 22px]
-PASS <length-percentage># values are computed correctly [calc(50% + 1em), 4px]
-PASS <length-percentage># values are computed correctly [calc(13% + 37px)]
-PASS <length>+ values are computed correctly [10px 3em]
-PASS <length>+ values are computed correctly [4em 9px]
-PASS <length-percentage>+ values are computed correctly [3% 10vmax 22px]
-PASS <length-percentage>+ values are computed correctly [calc(50% + 1em) 4px]
-PASS <transform-function> values are computed correctly [translateX(2px)]
-PASS <transform-function> values are computed correctly [translateX(10em)]
-PASS <transform-function> values are computed correctly [translateX(calc(11em + 10%))]
-PASS <transform-function>+ values are computed correctly [translateX(10%) scale(2)]
-PASS <integer> values are computed correctly [15]
-PASS <integer> values are computed correctly [calc(15 + 15)]
-PASS <integer> values are computed correctly [calc(2.4)]
-PASS <integer> values are computed correctly [calc(2.6)]
-PASS <integer> values are computed correctly [calc(2.6 + 3.1)]
-PASS <integer>+ values are computed correctly [15 calc(2.4) calc(2.6)]
-PASS <color> values are computed correctly [#ff0000]
-PASS <color> values are computed correctly [#000f00]
-PASS <color> values are computed correctly [#00000a]
-PASS <color> values are computed correctly [#badbee]
-PASS <color> values are computed correctly [#badbee33]
-PASS <color> values are computed correctly [tomato]
-PASS <color> values are computed correctly [plum]
-PASS <color> values are computed correctly [currentcolor]
-PASS * values are computed correctly [tomato]
-PASS tomato | plum values are computed correctly [plum]
-PASS tomato | plum | <color> values are computed correctly [plum]
-PASS * values are computed correctly [-50grad]
-PASS <angle> values are computed correctly [180deg]
-PASS <angle> values are computed correctly [400grad]
-PASS <angle> values are computed correctly [calc(360deg + 400grad)]
-PASS * values are computed correctly [50s]
-PASS <time> values are computed correctly [1s]
-PASS <time> values are computed correctly [1000ms]
-PASS <time> values are computed correctly [calc(1000ms + 1s)]
-PASS * values are computed correctly [50dpi]
-PASS <resolution> values are computed correctly [1dppx]
-PASS <resolution> values are computed correctly [96dpi]
-FAIL <resolution> values are computed correctly [calc(1dppx + 96dpi)] assert_equals: expected "2dppx" but got "0dppx"
-PASS * values are computed correctly [url(why)]
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-computation.html.ini b/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-computation.html.ini
deleted file mode 100644
index ccc985a..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-computation.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[registered-property-computation.html]
-  [<resolution> values are computed correctly [calc(1dppx + 96dpi)\]]
-    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-015.html.ini b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-015.html.ini
new file mode 100644
index 0000000..e406e24
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-015.html.ini
@@ -0,0 +1,3 @@
+[shape-image-015.html]
+  expected:
+    if (product == "content_shell") and (os == "linux"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-016.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-016.html.ini
index 38beba6..76a85b1 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-016.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-016.html.ini
@@ -1,3 +1,4 @@
 [text-transform-capitalize-016.html]
   expected:
+    if (product == "content_shell") and (os == "mac"): FAIL
     if (product == "content_shell") and (os == "linux"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-001.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-001.html
index 898e6241..a5678f3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-001.html
@@ -8,6 +8,7 @@
 		<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#funcdef-transform-skewy">
     <link rel="help" href="http://www.w3.org/TR/css-transforms-1/#svg-transform-value">
     <link rel="match" href="reference/svg-skewy-ref.html">
+    <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-2">
     <meta name="flags" content="svg">
     <meta name="assert" content="The skewY transform function must support unit less arguments for angle. The green rect in this test should be skewed vertically 45 degrees to completely cover the red path.">
     <style type="text/css">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-006.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-006.html
index a4d6bdd..51d7b76 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-006.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-006.html
@@ -8,6 +8,7 @@
 		<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#funcdef-transform-skewy">
     <link rel="help" href="http://www.w3.org/TR/css-transforms-1/#svg-transform-value">
     <link rel="match" href="reference/svg-skewy-ref.html">
+    <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-2">
     <meta name="flags" content="svg">
     <meta name="assert" content="The skewY transform function must support negative, unit less angle arguments. The green rect in this test should be skewed vertically 45 degrees to completely cover the red path.">
     <style type="text/css">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-011.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-011.html
index 15f6208..89f0aa9 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-011.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-011.html
@@ -8,6 +8,7 @@
 		<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#funcdef-transform-skewy">
     <link rel="help" href="http://www.w3.org/TR/css-transforms-1/#svg-transform-value">
     <link rel="match" href="reference/svg-skewy-ref.html">
+    <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-2">
     <meta name="flags" content="svg">
     <meta name="assert" content="The skewY transform function must support 'modulo whole circle' for unit less angle arguments. The green rect in this test should be skewed vertically 45 degrees to completely cover the red path.">
     <style type="text/css">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-016.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-016.html
index ce22ab4..fee2331 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-016.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-016.html
@@ -9,6 +9,7 @@
     <link rel="help" href="http://www.w3.org/TR/css-transforms-1/#two-d-transform-functions">
 		<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#funcdef-transform-skewy">
     <link rel="match" href="reference/svg-skewy-ref.html">
+    <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-2">
     <meta name="flags" content="svg">
     <meta name="assert" content="The skewY transform function must support scientific numbers for unit less angle arguments. The green rect in this test should be skewed vertically 45 degrees to completely cover the red path.">
     <style type="text/css">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-021.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-021.html
index 207bfa4..5905e79 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-021.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-transforms/skewY/svg-skewy-021.html
@@ -9,6 +9,7 @@
     <link rel="help" href="http://www.w3.org/TR/css-transforms-1/#two-d-transform-functions">
 		<link rel="help" href="http://www.w3.org/TR/css-transforms-1/#funcdef-transform-skewy">
     <link rel="match" href="reference/svg-skewy-ref.html">
+    <meta name="fuzzy" content="maxDifference=0-1;totalPixels=0-2">
     <meta name="flags" content="svg">
     <meta name="assert" content="The skewY transform function must support scientific numbers with negative exponents for unit less angle arguments. The green rect in this test should be skewed vertically 45 degrees to completely cover the red path.">
     <style type="text/css">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-color-input-border-inline-start-color-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-color-input-border-inline-start-color-001.html.ini
new file mode 100644
index 0000000..45c8c10b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-color-input-border-inline-start-color-001.html.ini
@@ -0,0 +1,3 @@
+[kind-of-widget-fallback-color-input-border-inline-start-color-001.html]
+  expected:
+    if (product == "content_shell") and (os == "mac"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-background-image-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-background-image-001.html.ini
new file mode 100644
index 0000000..3ae7a3b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-background-image-001.html.ini
@@ -0,0 +1,3 @@
+[kind-of-widget-fallback-input-search-background-image-001.html]
+  expected:
+    if (product == "content_shell") and (os == "linux"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-border-bottom-width-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-border-bottom-width-001.html.ini
new file mode 100644
index 0000000..9e25541
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-border-bottom-width-001.html.ini
@@ -0,0 +1,3 @@
+[kind-of-widget-fallback-input-search-border-bottom-width-001.html]
+  expected:
+    if (product == "content_shell") and (os == "win") and (port == "win11"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-text-border-block-start-style-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-text-border-block-start-style-001.html.ini
new file mode 100644
index 0000000..80288c7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-search-text-border-block-start-style-001.html.ini
@@ -0,0 +1,3 @@
+[kind-of-widget-fallback-input-search-text-border-block-start-style-001.html]
+  expected:
+    if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-submit-border-end-end-radius-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-submit-border-end-end-radius-001.html.ini
new file mode 100644
index 0000000..1b2c05e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-submit-border-end-end-radius-001.html.ini
@@ -0,0 +1,3 @@
+[kind-of-widget-fallback-input-submit-border-end-end-radius-001.html]
+  expected:
+    if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-text-border-top-color-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-text-border-top-color-001.html.ini
new file mode 100644
index 0000000..ba05f64
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-input-text-border-top-color-001.html.ini
@@ -0,0 +1,3 @@
+[kind-of-widget-fallback-input-text-border-top-color-001.html]
+  expected:
+    if (product == "content_shell") and (os == "mac"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-serialize-resolution-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-serialize-resolution-expected.txt
index 65aeaea5..db917e1 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-serialize-resolution-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-serialize-resolution-expected.txt
@@ -1,32 +1,32 @@
 This is a testharness.js-based test.
-FAIL 'image-set(url("") calc(1x * NaN))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1x * NaN))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1x * nan))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1x * nan))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * NaN))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * NaN))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * infinity / infinity))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * infinity / infinity))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * 0 * infinity))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * 0 * infinity))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * (infinity + -infinity)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * (infinity + -infinity)))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * (-infinity + infinity)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * (-infinity + infinity)))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * (infinity - infinity)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * (infinity - infinity)))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * infinity))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * infinity))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * -infinity))' as a specified value should serialize as 'image-set(url("") calc(-infinity * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * -infinity))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * iNFinIty))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * iNFinIty))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * (infinity + infinity)))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * (infinity + infinity)))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * (-infinity + -infinity)))' as a specified value should serialize as 'image-set(url("") calc(-infinity * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * (-infinity + -infinity)))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * 1/infinity))' as a specified value should serialize as 'image-set(url("") calc(0dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * 1/infinity))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * infinity * infinity))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * infinity * infinity))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * -infinity * -infinity))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * -infinity * -infinity))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1 * max(INFinity*3dppx, 0dppx)))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1 * max(INFinity*3dppx, 0dppx)))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1 * min(inFInity*4dppx, 0dppx)))' as a specified value should serialize as 'image-set(url("") calc(0dppx))'. assert_not_equals: 'image-set(url("") calc(1 * min(inFInity*4dppx, 0dppx)))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1 * max(nAn*2dppx, 0dppx)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1 * max(nAn*2dppx, 0dppx)))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1 * min(nan*3dppx, 0dppx)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1 * min(nan*3dppx, 0dppx)))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1 * clamp(-INFINITY*0dppx, 0dppx, infiniTY*0dppx)))' as a specified value should serialize as 'image-set(url("") calc(0dppx))'. assert_not_equals: 'image-set(url("") calc(1 * clamp(-INFINITY*0dppx, 0dppx, infiniTY*0dppx)))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * max(NaN, min(0,10))))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * max(NaN, min(0,10))))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * clamp(NaN, 0, 10)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * clamp(NaN, 0, 10)))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * max(0, min(10, NaN))))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * max(0, min(10, NaN))))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * clamp(0, 10, NaN)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * clamp(0, 10, NaN)))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * max(0, min(NaN, 10))))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * max(0, min(NaN, 10))))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * clamp(0, NaN, 10)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * clamp(0, NaN, 10)))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * clamp(-Infinity, 0, infinity)))' as a specified value should serialize as 'image-set(url("") calc(0dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * clamp(-Infinity, 0, infinity)))' should be valid in backgroundImage. got disallowed value ""
-FAIL 'image-set(url("") calc(1dppx * clamp(-inFinity, infinity, 10)))' as a specified value should serialize as 'image-set(url("") calc(10dppx))'. assert_not_equals: 'image-set(url("") calc(1dppx * clamp(-inFinity, infinity, 10)))' should be valid in backgroundImage. got disallowed value ""
+PASS 'image-set(url("") calc(1x * NaN))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+PASS 'image-set(url("") calc(1x * nan))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * NaN))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * infinity / infinity))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * 0 * infinity))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * (infinity + -infinity)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * (-infinity + infinity)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * (infinity - infinity)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * infinity))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * -infinity))' as a specified value should serialize as 'image-set(url("") calc(-infinity * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * iNFinIty))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * (infinity + infinity)))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * (-infinity + -infinity)))' as a specified value should serialize as 'image-set(url("") calc(-infinity * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * 1/infinity))' as a specified value should serialize as 'image-set(url("") calc(0dppx))'.
+PASS 'image-set(url("") calc(1dppx * infinity * infinity))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * -infinity * -infinity))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'.
+PASS 'image-set(url("") calc(1 * max(INFinity*3dppx, 0dppx)))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'.
+PASS 'image-set(url("") calc(1 * min(inFInity*4dppx, 0dppx)))' as a specified value should serialize as 'image-set(url("") calc(0dppx))'.
+PASS 'image-set(url("") calc(1 * max(nAn*2dppx, 0dppx)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+PASS 'image-set(url("") calc(1 * min(nan*3dppx, 0dppx)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+FAIL 'image-set(url("") calc(1 * clamp(-INFINITY*0dppx, 0dppx, infiniTY*0dppx)))' as a specified value should serialize as 'image-set(url("") calc(0dppx))'. assert_equals: 'image-set(url("") calc(1 * clamp(-INFINITY*0dppx, 0dppx, infiniTY*0dppx)))' and 'image-set(url("") calc(0dppx))' should serialize the same in specified values. expected "image-set(url(\"\") calc(0dppx))" but got "image-set(url(\"\") calc(NaN * 1dppx))"
+PASS 'image-set(url("") calc(1dppx * max(NaN, min(0,10))))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * clamp(NaN, 0, 10)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * max(0, min(10, NaN))))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * clamp(0, 10, NaN)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * max(0, min(NaN, 10))))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * clamp(0, NaN, 10)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.
+PASS 'image-set(url("") calc(1dppx * clamp(-Infinity, 0, infinity)))' as a specified value should serialize as 'image-set(url("") calc(0dppx))'.
+PASS 'image-set(url("") calc(1dppx * clamp(-inFinity, infinity, 10)))' as a specified value should serialize as 'image-set(url("") calc(10dppx))'.
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-serialize-resolution.html.ini b/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-serialize-resolution.html.ini
index 10fd5f2..26ac406 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-serialize-resolution.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/calc-infinity-nan-serialize-resolution.html.ini
@@ -1,87 +1,3 @@
 [calc-infinity-nan-serialize-resolution.html]
   ['image-set(url("") calc(1 * clamp(-INFINITY*0dppx, 0dppx, infiniTY*0dppx)))' as a specified value should serialize as 'image-set(url("") calc(0dppx))'.]
     expected: FAIL
-
-  ['image-set(url("") calc(1 * max(INFinity*3dppx, 0dppx)))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1 * max(nAn*2dppx, 0dppx)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1 * min(inFInity*4dppx, 0dppx)))' as a specified value should serialize as 'image-set(url("") calc(0dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1 * min(nan*3dppx, 0dppx)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * (-infinity + -infinity)))' as a specified value should serialize as 'image-set(url("") calc(-infinity * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * (-infinity + infinity)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * (infinity + -infinity)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * (infinity + infinity)))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * (infinity - infinity)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * -infinity * -infinity))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * -infinity))' as a specified value should serialize as 'image-set(url("") calc(-infinity * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * 0 * infinity))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * 1/infinity))' as a specified value should serialize as 'image-set(url("") calc(0dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * NaN))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * clamp(-Infinity, 0, infinity)))' as a specified value should serialize as 'image-set(url("") calc(0dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * clamp(-inFinity, infinity, 10)))' as a specified value should serialize as 'image-set(url("") calc(10dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * clamp(0, 10, NaN)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * clamp(0, NaN, 10)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * clamp(NaN, 0, 10)))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * iNFinIty))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * infinity * infinity))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * infinity / infinity))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * infinity))' as a specified value should serialize as 'image-set(url("") calc(infinity * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * max(0, min(10, NaN))))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * max(0, min(NaN, 10))))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1dppx * max(NaN, min(0,10))))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1x * NaN))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
-
-  ['image-set(url("") calc(1x * nan))' as a specified value should serialize as 'image-set(url("") calc(NaN * 1dppx))'.]
-    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/content-with-clip-max-texture-size.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/content-with-clip-max-texture-size.html.ini
deleted file mode 100644
index fcf9ccf..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/content-with-clip-max-texture-size.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[content-with-clip-max-texture-size.html]
-  expected:
-    if product == "chrome": FAIL
-    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fragmented-at-start-ignored.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fragmented-at-start-ignored.html.ini
new file mode 100644
index 0000000..fa1abd0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fragmented-at-start-ignored.html.ini
@@ -0,0 +1,4 @@
+[fragmented-at-start-ignored.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fragmented-during-transition-skips.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fragmented-during-transition-skips.html.ini
new file mode 100644
index 0000000..8053294
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/fragmented-during-transition-skips.html.ini
@@ -0,0 +1,4 @@
+[fragmented-during-transition-skips.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/input-targets-root-while-render-blocked.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/input-targets-root-while-render-blocked.html.ini
new file mode 100644
index 0000000..5c49879
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/input-targets-root-while-render-blocked.html.ini
@@ -0,0 +1,4 @@
+[input-targets-root-while-render-blocked.html]
+  [Input when rendering suppressed targets root]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-new.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-new.html.ini
new file mode 100644
index 0000000..d6a78a8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-new.html.ini
@@ -0,0 +1,4 @@
+[massive-element-below-and-on-top-of-viewport-partially-onscreen-new.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html.ini
new file mode 100644
index 0000000..82ebd06
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html.ini
@@ -0,0 +1,4 @@
+[massive-element-below-and-on-top-of-viewport-partially-onscreen-old.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-offscreen-new.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-offscreen-new.html.ini
new file mode 100644
index 0000000..44460c4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-offscreen-new.html.ini
@@ -0,0 +1,4 @@
+[massive-element-below-viewport-offscreen-new.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-offscreen-old.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-offscreen-old.html.ini
new file mode 100644
index 0000000..d48fa31
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-offscreen-old.html.ini
@@ -0,0 +1,4 @@
+[massive-element-below-viewport-offscreen-old.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html.ini
new file mode 100644
index 0000000..ae424b0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-new.html.ini
@@ -0,0 +1,4 @@
+[massive-element-below-viewport-partially-onscreen-new.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-old.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-old.html.ini
new file mode 100644
index 0000000..6c6a41c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-below-viewport-partially-onscreen-old.html.ini
@@ -0,0 +1,4 @@
+[massive-element-below-viewport-partially-onscreen-old.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-offscreen-new.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-offscreen-new.html.ini
new file mode 100644
index 0000000..475e93d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-offscreen-new.html.ini
@@ -0,0 +1,4 @@
+[massive-element-left-of-viewport-offscreen-new.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-offscreen-old.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-offscreen-old.html.ini
new file mode 100644
index 0000000..14c19b8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-offscreen-old.html.ini
@@ -0,0 +1,4 @@
+[massive-element-left-of-viewport-offscreen-old.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-new.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-new.html.ini
new file mode 100644
index 0000000..0bf5e9d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-new.html.ini
@@ -0,0 +1,4 @@
+[massive-element-left-of-viewport-partially-onscreen-new.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-old.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-old.html.ini
new file mode 100644
index 0000000..0320d6a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-left-of-viewport-partially-onscreen-old.html.ini
@@ -0,0 +1,4 @@
+[massive-element-left-of-viewport-partially-onscreen-old.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-new.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-new.html.ini
new file mode 100644
index 0000000..d2463066
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-new.html.ini
@@ -0,0 +1,4 @@
+[massive-element-on-top-of-viewport-offscreen-new.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-old.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-old.html.ini
new file mode 100644
index 0000000..c6dde51
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-offscreen-old.html.ini
@@ -0,0 +1,4 @@
+[massive-element-on-top-of-viewport-offscreen-old.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-new.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-new.html.ini
new file mode 100644
index 0000000..d63a8b63
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-new.html.ini
@@ -0,0 +1,4 @@
+[massive-element-on-top-of-viewport-partially-onscreen-new.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-old.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-old.html.ini
new file mode 100644
index 0000000..db950227
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-on-top-of-viewport-partially-onscreen-old.html.ini
@@ -0,0 +1,4 @@
+[massive-element-on-top-of-viewport-partially-onscreen-old.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-new.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-new.html.ini
new file mode 100644
index 0000000..944b8d9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-new.html.ini
@@ -0,0 +1,4 @@
+[massive-element-right-and-left-of-viewport-partially-onscreen-new.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-old.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-old.html.ini
new file mode 100644
index 0000000..7de3347
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-and-left-of-viewport-partially-onscreen-old.html.ini
@@ -0,0 +1,4 @@
+[massive-element-right-and-left-of-viewport-partially-onscreen-old.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-offscreen-new.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-offscreen-new.html.ini
new file mode 100644
index 0000000..b34c5f02
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-offscreen-new.html.ini
@@ -0,0 +1,4 @@
+[massive-element-right-of-viewport-offscreen-new.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-offscreen-old.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-offscreen-old.html.ini
new file mode 100644
index 0000000..119e663
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-offscreen-old.html.ini
@@ -0,0 +1,4 @@
+[massive-element-right-of-viewport-offscreen-old.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-new.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-new.html.ini
new file mode 100644
index 0000000..1e8ad35
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-new.html.ini
@@ -0,0 +1,4 @@
+[massive-element-right-of-viewport-partially-onscreen-new.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-old.html.ini b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-old.html.ini
new file mode 100644
index 0000000..23db6cae
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/massive-element-right-of-viewport-partially-onscreen-old.html.ini
@@ -0,0 +1,4 @@
+[massive-element-right-of-viewport-partially-onscreen-old.html]
+  expected:
+    if product == "chrome": PASS
+    TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/text-input-block-size.optional.html b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/text-input-block-size.optional.html
index 75b679e..680e0b6 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/text-input-block-size.optional.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/text-input-block-size.optional.html
@@ -1,13 +1,19 @@
 <!doctype html>
+<meta charset="utf-8">
+<meta name="flags" content="ahem">
 <link rel="author" title="Tim Nguyen" href="https://github.com/nt1m">
 <link rel="help" href="https://html.spec.whatwg.org/#the-input-element">
 <link rel="help" href="https://drafts.csswg.org/css-writing-modes-4/#block-flow">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css">
 <title>Test block-size of text-based inputs is consistent across writing-modes</title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 
 <style>
-    input { appearance: none }
+    input {
+        appearance: none;
+        font: 30px/1 Ahem;
+    }
 </style>
 
 <input id="horizontalInput">
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-clipped.html.ini b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-clipped.html.ini
new file mode 100644
index 0000000..78f6474
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-clipped.html.ini
@@ -0,0 +1,3 @@
+[backdrop-filter-clipped.html]
+  expected:
+    if (product == "content_shell") and (os == "mac"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/match-media-parsing.html b/third_party/blink/web_tests/external/wpt/css/mediaqueries/match-media-parsing.html
index bbb326eb..c029f54 100644
--- a/third_party/blink/web_tests/external/wpt/css/mediaqueries/match-media-parsing.html
+++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/match-media-parsing.html
@@ -16,12 +16,20 @@
 
 function test_resolution_parsing() {
     test_parsing("(min-resolution: 1x)");
+    test_parsing("(min-resolution: calc(1x))", "(min-resolution: calc(1dppx))");
     test_parsing("(resolution: 2x)");
+    test_parsing("(resolution: calc(2x))", "(resolution: calc(2dppx))");
     test_parsing("(max-resolution: 7x)");
+    test_parsing("(max-resolution: calc(7x))", "(max-resolution: calc(7dppx))");
 
     test_parsing("(resolution: 2dppx)");
     test_parsing("(resolution: 600dpi)");
     test_parsing("(resolution: 77dpcm)");
+
+    test_parsing("(resolution: calc(1x + 2x))", "(resolution: calc(3dppx))");
+    test_parsing("(resolution: calc(5x - 2x))", "(resolution: calc(3dppx))");
+    test_parsing("(resolution: calc(1x * 3))", "(resolution: calc(3dppx))");
+    test_parsing("(resolution: calc(6x / 2))", "(resolution: calc(3dppx))");
 }
 
 test_parsing("", "");
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/mq-calc-resolution.html b/third_party/blink/web_tests/external/wpt/css/mediaqueries/mq-calc-resolution.html
new file mode 100644
index 0000000..da649eb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/mq-calc-resolution.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<title>Test: support for calc resolution in Media Queries</title>
+<link rel="help" href="http://www.w3.org/TR/css3-values/#calc-notation">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="calc resolution can be used in Media Queries">
+<style>
+  #test {
+    width: 100px;
+    height: 100px;
+    background-color: red;
+  }
+
+  @media (resolution >= calc(2x - 96dpi)){
+    #test {
+      background-color: green;
+    }
+  }
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div id="test"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/test_media_queries.html b/third_party/blink/web_tests/external/wpt/css/mediaqueries/test_media_queries.html
index fe3ba81..20fca4a 100644
--- a/third_party/blink/web_tests/external/wpt/css/mediaqueries/test_media_queries.html
+++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/test_media_queries.html
@@ -466,6 +466,7 @@
       expression_should_be_known(feature + ": -3dpi");
       expression_should_be_known(feature + ": 0dppx");
       expression_should_be_known(feature + ": 0x");
+      expression_should_be_known(feature + ": calc(6x / 2)");
     }
 
     // Find the resolution using max-resolution
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/disabled-delegatesFocus.html b/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/disabled-delegatesFocus.html
index f92cc52..3f2b765 100644
--- a/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/disabled-delegatesFocus.html
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/form-associated/disabled-delegatesFocus.html
@@ -36,10 +36,21 @@
 </form>
 
 <script>
+  let focusinPropagated = false;
+  let focusoutPropagated = false;
+
+  const form = document.querySelector("form");
+  form.addEventListener("focusin", () => focusinPropagated = true);
+  form.addEventListener("focusout", () => focusoutPropagated = true);
+
   test(() => {
     const element = document.querySelector("custom-control");
     element.focus();
 
     assert_true(element.eventFired, "Focus event fired on custom control");
+    assert_true(focusinPropagated, "FocusIn event propagated through control");
+
+    element.blur();
+    assert_true(focusoutPropagated, "FocusOut event propagated through control");
   }, "Focus events fire on disabled form-associated custom elements with delegatesFocus");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/docs/requirements.txt b/third_party/blink/web_tests/external/wpt/docs/requirements.txt
index 589a98ea..b29747ca 100644
--- a/third_party/blink/web_tests/external/wpt/docs/requirements.txt
+++ b/third_party/blink/web_tests/external/wpt/docs/requirements.txt
@@ -1,5 +1,5 @@
 recommonmark==0.7.1
-sphinx-argparse==0.3.2
+sphinx-argparse==0.4.0
 sphinx-autobuild==2021.3.14
 sphinx-js==3.2.1
 sphinx==4.4.0
diff --git a/third_party/blink/web_tests/external/wpt/fetch/orb/resources/js-unlabeled-utf16-without-bom.json b/third_party/blink/web_tests/external/wpt/fetch/orb/resources/js-unlabeled-utf16-without-bom.json
new file mode 100644
index 0000000..157a8f54
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/orb/resources/js-unlabeled-utf16-without-bom.json
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/fetch/orb/resources/script-iso-8559-1.js b/third_party/blink/web_tests/external/wpt/fetch/orb/resources/script-iso-8559-1.js
new file mode 100644
index 0000000..3bccb6a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/orb/resources/script-iso-8559-1.js
@@ -0,0 +1,4 @@
+"use strict";
+function fn() {
+  return "§A¦n";
+}
diff --git a/third_party/blink/web_tests/external/wpt/fetch/orb/resources/script-utf16-bom.js b/third_party/blink/web_tests/external/wpt/fetch/orb/resources/script-utf16-bom.js
new file mode 100644
index 0000000..16b76e9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/orb/resources/script-utf16-bom.js
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/fetch/orb/resources/script-utf16-without-bom.js b/third_party/blink/web_tests/external/wpt/fetch/orb/resources/script-utf16-without-bom.js
new file mode 100644
index 0000000..d983086
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/orb/resources/script-utf16-without-bom.js
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/fetch/orb/tentative/known-mime-type.sub.any-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/orb/tentative/known-mime-type.sub.any-expected.txt
index 77ee580e..a4ab2e1 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/orb/tentative/known-mime-type.sub.any-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/fetch/orb/tentative/known-mime-type.sub.any-expected.txt
@@ -6,5 +6,8 @@
 FAIL ORB should block opaque application/json which contains non ascii characters assert_unreached: Should have rejected: undefined Reached unreachable code
 PASS ORB shouldn't block opaque image/png
 PASS ORB shouldn't block opaque text/javascript
+PASS ORB shouldn't block opaque text/javascript (utf16 encoded with BOM)
+PASS ORB shouldn't block opaque text/javascript (utf16 encoded without BOM but charset is provided in content-type)
+PASS ORB shouldn't block opaque text/javascript (iso-8559-1 encoded)
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/fetch/orb/tentative/known-mime-type.sub.any.js b/third_party/blink/web_tests/external/wpt/fetch/orb/tentative/known-mime-type.sub.any.js
index 919964f3..66a63c8 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/orb/tentative/known-mime-type.sub.any.js
+++ b/third_party/blink/web_tests/external/wpt/fetch/orb/tentative/known-mime-type.sub.any.js
@@ -59,3 +59,18 @@
 promise_test(async () => {
   await fetchORB(`${path}/script.js`, null, contentType("text/javascript"));
 }, "ORB shouldn't block opaque text/javascript");
+
+// Test javascript validation can correctly decode the content with BOM.
+promise_test(async () => {
+  await fetchORB(`${path}/script-utf16-bom.js`, null, contentType("application/json"));
+}, "ORB shouldn't block opaque text/javascript (utf16 encoded with BOM)");
+
+// Test javascript validation can correctly decode the content with the http charset hint.
+promise_test(async () => {
+  await fetchORB(`${path}/script-utf16-without-bom.js`, null, contentType("application/json; charset=utf-16"));
+}, "ORB shouldn't block opaque text/javascript (utf16 encoded without BOM but charset is provided in content-type)");
+
+// Test javascript validation can correctly decode the content for iso-8559-1 (fallback decoder in Firefox).
+promise_test(async () => {
+  await fetchORB(`${path}/script-iso-8559-1.js`, null, contentType("application/json"));
+}, "ORB shouldn't block opaque text/javascript (iso-8559-1 encoded)");
diff --git a/third_party/blink/web_tests/external/wpt/fetch/orb/tentative/known-mime-type.sub.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/orb/tentative/known-mime-type.sub.any.worker-expected.txt
index 77ee580e..a4ab2e1 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/orb/tentative/known-mime-type.sub.any.worker-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/fetch/orb/tentative/known-mime-type.sub.any.worker-expected.txt
@@ -6,5 +6,8 @@
 FAIL ORB should block opaque application/json which contains non ascii characters assert_unreached: Should have rejected: undefined Reached unreachable code
 PASS ORB shouldn't block opaque image/png
 PASS ORB shouldn't block opaque text/javascript
+PASS ORB shouldn't block opaque text/javascript (utf16 encoded with BOM)
+PASS ORB shouldn't block opaque text/javascript (utf16 encoded without BOM but charset is provided in content-type)
+PASS ORB shouldn't block opaque text/javascript (iso-8559-1 encoded)
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/fetch/orb/tentative/script-utf16-without-bom-hint-charset.sub.html b/third_party/blink/web_tests/external/wpt/fetch/orb/tentative/script-utf16-without-bom-hint-charset.sub.html
new file mode 100644
index 0000000..b15f976
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/orb/tentative/script-utf16-without-bom-hint-charset.sub.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<!-- Test verifies that utf-16 encoded script (without BOM) which parses as Javascript (not JSON) will execute with ORB. -->
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id=log></div>
+
+<script>
+setup({ single_test: true });
+window.has_executed_script = false;
+</script>
+
+<!-- www1 is cross-origin, so the HTTP response is CORB-eligible -->
+<script charset="utf-16" src="http://{{domains[www1]}}:{{ports[http][0]}}/fetch/orb/resources/js-unlabeled-utf16-without-bom.json">
+</script>
+
+<script>
+// Verify what observable effects the <script> tag above had.
+// Assertion should hold with and without ORB:
+assert_true(window.has_executed_script,
+            'The cross-origin script should execute');
+done();
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/no-winner.https.sub.window.js.ini b/third_party/blink/web_tests/external/wpt/fledge/tentative/no-winner.https.sub.window.js.ini
index 9ca0bf8..5a9d0bb6 100644
--- a/third_party/blink/web_tests/external/wpt/fledge/tentative/no-winner.https.sub.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/no-winner.https.sub.window.js.ini
@@ -2,6 +2,9 @@
   [Bidding logic script: error=bad-allow-fledge]
     expected: FAIL
 
+  [Bidding logic script: error=close-connection]
+    expected: FAIL
+
   [Bidding logic script: error=fledge-not-allowed]
     expected: FAIL
 
@@ -59,6 +62,9 @@
   [Decision logic script: error=bad-allow-fledge]
     expected: FAIL
 
+  [Decision logic script: error=close-connection]
+    expected: FAIL
+
   [Decision logic script: error=fledge-not-allowed]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/editing/editing-0/autocapitalization/autocapitalize.html.ini b/third_party/blink/web_tests/external/wpt/html/editing/editing-0/autocapitalization/autocapitalize.html.ini
new file mode 100644
index 0000000..798e0de0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/editing/editing-0/autocapitalization/autocapitalize.html.ini
@@ -0,0 +1,3 @@
+[autocapitalize.html]
+  expected:
+    if (product == "content_shell") and (os == "mac"): [TIMEOUT, OK]
diff --git a/third_party/blink/web_tests/external/wpt/html/infrastructure/urls/terminology-0/document-base-url-initiated-grand-parent.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/html/infrastructure/urls/terminology-0/document-base-url-initiated-grand-parent.https.window-expected.txt
deleted file mode 100644
index 0f00b10e..0000000
--- a/third_party/blink/web_tests/external/wpt/html/infrastructure/urls/terminology-0/document-base-url-initiated-grand-parent.https.window-expected.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-This is a testharness.js-based test.
-FAIL Check the baseURL of an about:blank document same-origin with its parent assert_equals: expected "https://web-platform.test:8444/html/infrastructure/urls/terminology-0/document-base-url-initiated-grand-parent.https.window.html" but got "https://web-platform.test:8444/common/dispatcher/executor.html?uuid=child_token#interesting-fragment"
-FAIL Check the baseURL of an about:blank document cross-origin with its parent assert_equals: expected "https://web-platform.test:8444/html/infrastructure/urls/terminology-0/document-base-url-initiated-grand-parent.https.window.html" but got "about:blank"
-FAIL Check the baseURL of an about:blank document cross-site with its parent assert_equals: expected "https://web-platform.test:8444/html/infrastructure/urls/terminology-0/document-base-url-initiated-grand-parent.https.window.html" but got "about:blank"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles-expected.txt b/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles-expected.txt
new file mode 100644
index 0000000..f9926c8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+FAIL <search> - display assert_equals: expected "block" but got "inline"
+PASS <search> - margin-top
+PASS <search> - margin-right
+PASS <search> - margin-bottom
+PASS <search> - margin-left
+PASS <search> - padding-top
+PASS <search> - padding-right
+PASS <search> - padding-bottom
+PASS <search> - padding-left
+FAIL <search> - unicode-bidi assert_equals: expected "isolate" but got "normal"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles-iso-8859-8-expected.txt b/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles-iso-8859-8-expected.txt
new file mode 100644
index 0000000..373390b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles-iso-8859-8-expected.txt
@@ -0,0 +1,14 @@
+This is a testharness.js-based test.
+PASS Verify document.characterSet is ISO-8859-8
+FAIL <search> - display assert_equals: expected "block" but got "inline"
+PASS <search> - margin-top
+PASS <search> - margin-right
+PASS <search> - margin-bottom
+PASS <search> - margin-left
+PASS <search> - padding-top
+PASS <search> - padding-right
+PASS <search> - padding-bottom
+PASS <search> - padding-left
+FAIL <search> - unicode-bidi assert_equals: expected "bidi-override" but got "normal"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles-iso-8859-8.html b/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles-iso-8859-8.html
new file mode 100644
index 0000000..19445662
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles-iso-8859-8.html
@@ -0,0 +1,54 @@
+<!doctype html>
+<meta charset="ISO-8859-8">
+<title>default styles for the search element, ISO-8859-8</title>
+<meta name="viewport" content="width=device-width">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/rendering/support/test-ua-stylesheet.js"></script>
+<style>
+/* Specify this bogus namespace, so the rules in this stylesheet only apply to the `fakeClone`d elements in #refs, not the HTML elements in #tests. */
+@namespace url(urn:not-html);
+
+address, blockquote, center, dialog, div, figure, figcaption, footer, form,
+header, hr, legend, listing, main, p, plaintext, pre, search, xmp {
+  display: block;
+}
+
+address, blockquote, center, div, figure, figcaption, footer, form, header, hr,
+legend, listing, main, p, plaintext, pre, summary, xmp, article, aside, h1, h2,
+h3, h4, h5, h6, hgroup, nav, section, search, table, caption, colgroup, col,
+thead, tbody, tfoot, tr, td, th, dir, dd, dl, dt, menu, ol, ul, li, bdi, output,
+[dir=ltr i], [dir=rtl i], [dir=auto i], * /* only apply to the bogus namespace */ {
+  unicode-bidi: bidi-override;
+}
+
+</style>
+
+<div id="log"></div>
+
+<div id="tests">
+  <search></search>
+</div>
+
+<div id="refs"></div>
+
+<script>
+  test(() => {
+    assert_equals(document.characterSet, "ISO-8859-8")
+  }, "Verify document.characterSet is ISO-8859-8");
+
+  const props = [
+    'display',
+    'margin-top',
+    'margin-right',
+    'margin-bottom',
+    'margin-left',
+    'padding-top',
+    'padding-right',
+    'padding-bottom',
+    'padding-left',
+    'unicode-bidi',
+  ];
+  runUAStyleTests(props);
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles-iso-8859-8.html.ini b/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles-iso-8859-8.html.ini
new file mode 100644
index 0000000..172555a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles-iso-8859-8.html.ini
@@ -0,0 +1,6 @@
+[search-styles-iso-8859-8.html]
+  [<search> - display]
+    expected: FAIL
+
+  [<search> - unicode-bidi]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles.html b/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles.html
new file mode 100644
index 0000000..8c8badd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<title>default styles for the search element</title>
+<meta name="viewport" content="width=device-width">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/rendering/support/test-ua-stylesheet.js"></script>
+<style>
+/* Specify this bogus namespace, so the rules in this stylesheet only apply to the `fakeClone`d elements in #refs, not the HTML elements in #tests. */
+@namespace url(urn:not-html);
+
+address, blockquote, center, dialog, div, figure, figcaption, footer, form,
+header, hr, legend, listing, main, p, plaintext, pre, search, xmp {
+  display: block;
+}
+
+address, blockquote, center, div, figure, figcaption, footer, form, header, hr,
+legend, listing, main, p, plaintext, pre, summary, xmp, article, aside, h1, h2,
+h3, h4, h5, h6, hgroup, nav, section, search, table, caption, colgroup, col,
+thead, tbody, tfoot, tr, td, th, dir, dd, dl, dt, menu, ol, ul, li, bdi, output,
+[dir=ltr i], [dir=rtl i], [dir=auto i] {
+  unicode-bidi: isolate;
+}
+
+</style>
+
+<div id="log"></div>
+
+<div id="tests">
+  <search></search>
+</div>
+
+<div id="refs"></div>
+
+<script>
+  const props = [
+    'display',
+    'margin-top',
+    'margin-right',
+    'margin-bottom',
+    'margin-left',
+    'padding-top',
+    'padding-right',
+    'padding-bottom',
+    'padding-left',
+    'unicode-bidi',
+  ];
+  runUAStyleTests(props);
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles.html.ini b/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles.html.ini
new file mode 100644
index 0000000..f54f2a95
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/rendering/non-replaced-elements/flow-content-0/search-styles.html.ini
@@ -0,0 +1,6 @@
+[search-styles.html]
+  [<search> - display]
+    expected: FAIL
+
+  [<search> - unicode-bidi]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-grandchild.tentative.sub.window.js.ini b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-grandchild.tentative.sub.window.js.ini
index 9f75e6c..680ce4e 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-grandchild.tentative.sub.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/sandbox-top-navigation-grandchild.tentative.sub.window.js.ini
@@ -1,2 +1,4 @@
 [sandbox-top-navigation-grandchild.tentative.sub.window.html]
-  expected: ERROR
+  expected:
+    if (product == "content_shell") and (os == "mac"): [TIMEOUT, OK]
+    ERROR
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-and-svg-ref.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-and-svg-ref.html
new file mode 100644
index 0000000..db52e77d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-and-svg-ref.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>Popover is only effective on HTMLElement, not on svg element</title>
+<style>
+svg {
+  width: 100px;
+  height: 100px;
+  background-color:green;
+}
+</style>
+<svg ></svg>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-and-svg.html b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-and-svg.html
new file mode 100644
index 0000000..c5e8bb4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/popovers/popover-and-svg.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>Popover is only effective on HTMLElement, not on svg element</title>
+<link rel="author" href="mailto:cathiechen@igalia.com">
+<link rel=help href="https://html.spec.whatwg.org/#the-popover-attribute">
+<link rel="match" href="popover-and-svg-ref.html">
+<style>
+svg {
+  width: 100px;
+  height: 100px;
+  background-color:green;
+}
+[popover] {
+  top: 100px;
+  bottom: auto;
+}
+</style>
+<svg popover></svg>
diff --git a/third_party/blink/web_tests/external/wpt/html/syntax/parsing/README b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/README
index 944cddfc..5c41f78 100644
--- a/third_party/blink/web_tests/external/wpt/html/syntax/parsing/README
+++ b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/README
@@ -4,5 +4,5 @@
 To update the generated tests, run
 `wpt update-built --include html5lib speculative-parsing`.
 
-The revision of html5lib used to generate the tests is stored in
-html/tools/html5lib_revision
+The revision of html5lib-tests used to generate the tests is stored in
+html/tools/html5lib_tests_revision
diff --git a/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_innerHTML_template-expected.txt b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_innerHTML_template-expected.txt
new file mode 100644
index 0000000..e1dd1e8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_innerHTML_template-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL html5lib_innerHTML_template.html 64d3e0e4395745b6ea928e5f5cf888bf675a598b assert_equals: expected "#document\n| <template>\n|   content\n|     <form>\n|       <input>\n|         name=\"q\"\n|     <div>\n|       \"second\"" but got "#document\n| content\n|   <template>\n|     content\n|       <form>\n|         <input>\n|           name=\"q\"\n|       <div>\n|         \"second\""
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_innerHTML_template.html b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_innerHTML_template.html
new file mode 100644
index 0000000..19dc555
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_innerHTML_template.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf8">
+    <title>HTML 5 Parser tests html5lib_innerHTML_template.html</title>
+    <meta name="timeout" content="long">
+  </head>
+  <body>
+    <h1>html5lib Parser Test</h1>
+    <div id="log"></div>
+    <script src="common.js"></script>
+    <script src="test.js"></script>
+    <script src="template.js"></script>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script>
+      var num_iframes = 8;
+      var order = ['64d3e0e4395745b6ea928e5f5cf888bf675a598b',];
+      var tests = {
+          "64d3e0e4395745b6ea928e5f5cf888bf675a598b":[async_test('html5lib_innerHTML_template.html 64d3e0e4395745b6ea928e5f5cf888bf675a598b'), "%3Ctemplate%3E%3Cform%3E%3Cinput%20name%3D%22q%22%3E%3C/form%3E%3Cdiv%3Esecond%3C/div%3E%3C/template%3E", "%23document%0A%7C%20%3Ctemplate%3E%0A%7C%20%20%20content%0A%7C%20%20%20%20%20%3Cform%3E%0A%7C%20%20%20%20%20%20%20%3Cinput%3E%0A%7C%20%20%20%20%20%20%20%20%20name%3D%22q%22%0A%7C%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%22second%22", 'template'],
+      }
+      init_tests("innerHTML");
+    </script>
+  </body>
+</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_innerHTML_template.html.ini b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_innerHTML_template.html.ini
new file mode 100644
index 0000000..2bc1797
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_innerHTML_template.html.ini
@@ -0,0 +1,3 @@
+[html5lib_innerHTML_template.html]
+  [html5lib_innerHTML_template.html 64d3e0e4395745b6ea928e5f5cf888bf675a598b]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_search-element.html b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_search-element.html
new file mode 100644
index 0000000..b3d9e3ca
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_search-element.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf8">
+    <title>HTML 5 Parser tests html5lib_search-element.html</title>
+    <meta name="timeout" content="long">
+    <meta name="variant" content="?run_type=uri">
+    <meta name="variant" content="?run_type=write">
+    <meta name="variant" content="?run_type=write_single">
+  </head>
+  <body>
+    <h1>html5lib Parser Test</h1>
+    <div id="log"></div>
+    <script src="common.js"></script>
+    <script src="test.js"></script>
+    <script src="template.js"></script>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script>
+      var num_iframes = 8;
+      var order = ['114b9f3c8147c0ed8ef3ed1811a9da3f10d74402','2204afb9037ec886f428ab5dcead5ee9f87c65cb','5153f797fbb63a23a40d19e298aca06d53d22f7f',];
+      var tests = {
+          "114b9f3c8147c0ed8ef3ed1811a9da3f10d74402":[async_test('html5lib_search-element.html 114b9f3c8147c0ed8ef3ed1811a9da3f10d74402'), "%3C%21doctype%20html%3E%3Cp%3Efoo%3Csearch%3Ebar%3Cp%3Ebaz", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%22foo%22%0A%7C%20%20%20%20%20%3Csearch%3E%0A%7C%20%20%20%20%20%20%20%22bar%22%0A%7C%20%20%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%20%20%22baz%22"],"2204afb9037ec886f428ab5dcead5ee9f87c65cb":[async_test('html5lib_search-element.html 2204afb9037ec886f428ab5dcead5ee9f87c65cb'), "%3C%21doctype%20html%3E%3Csearch%3E%3Cp%3Efoo%3C/search%3Ebar", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Csearch%3E%0A%7C%20%20%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%20%20%22foo%22%0A%7C%20%20%20%20%20%22bar%22"],"5153f797fbb63a23a40d19e298aca06d53d22f7f":[async_test('html5lib_search-element.html 5153f797fbb63a23a40d19e298aca06d53d22f7f'), "%3C%21DOCTYPE%20html%3Exxx%3Csvg%3E%3Cx%3E%3Cg%3E%3Ca%3E%3Csearch%3E%3Cb%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%22xxx%22%0A%7C%20%20%20%20%20%3Csvg%20svg%3E%0A%7C%20%20%20%20%20%20%20%3Csvg%20x%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Csvg%20g%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Csvg%20a%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Csvg%20search%3E%0A%7C%20%20%20%20%20%3Cb%3E"],
+      }
+      init_tests(get_type());
+    </script>
+  </body>
+</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_search-element.html.ini b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_search-element.html.ini
new file mode 100644
index 0000000..6786df7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_search-element.html.ini
@@ -0,0 +1,22 @@
+[html5lib_search-element.html?run_type=uri]
+  [html5lib_search-element.html 114b9f3c8147c0ed8ef3ed1811a9da3f10d74402]
+    expected: FAIL
+
+  [html5lib_search-element.html 2204afb9037ec886f428ab5dcead5ee9f87c65cb]
+    expected: FAIL
+
+
+[html5lib_search-element.html?run_type=write]
+  [html5lib_search-element.html 114b9f3c8147c0ed8ef3ed1811a9da3f10d74402]
+    expected: FAIL
+
+  [html5lib_search-element.html 2204afb9037ec886f428ab5dcead5ee9f87c65cb]
+    expected: FAIL
+
+
+[html5lib_search-element.html?run_type=write_single]
+  [html5lib_search-element.html 114b9f3c8147c0ed8ef3ed1811a9da3f10d74402]
+    expected: FAIL
+
+  [html5lib_search-element.html 2204afb9037ec886f428ab5dcead5ee9f87c65cb]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_search-element_run_type=uri-expected.txt b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_search-element_run_type=uri-expected.txt
new file mode 100644
index 0000000..67fc2011
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_search-element_run_type=uri-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+FAIL html5lib_search-element.html 114b9f3c8147c0ed8ef3ed1811a9da3f10d74402 assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <p>\n|       \"foo\"\n|     <search>\n|       \"bar\"\n|       <p>\n|         \"baz\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <p>\n|       \"foo\"\n|       <search>\n|         \"bar\"\n|     <p>\n|       \"baz\""
+FAIL html5lib_search-element.html 2204afb9037ec886f428ab5dcead5ee9f87c65cb assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <search>\n|       <p>\n|         \"foo\"\n|     \"bar\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <search>\n|       <p>\n|         \"foobar\""
+PASS html5lib_search-element.html 5153f797fbb63a23a40d19e298aca06d53d22f7f
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_search-element_run_type=write-expected.txt b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_search-element_run_type=write-expected.txt
new file mode 100644
index 0000000..67fc2011
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_search-element_run_type=write-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+FAIL html5lib_search-element.html 114b9f3c8147c0ed8ef3ed1811a9da3f10d74402 assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <p>\n|       \"foo\"\n|     <search>\n|       \"bar\"\n|       <p>\n|         \"baz\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <p>\n|       \"foo\"\n|       <search>\n|         \"bar\"\n|     <p>\n|       \"baz\""
+FAIL html5lib_search-element.html 2204afb9037ec886f428ab5dcead5ee9f87c65cb assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <search>\n|       <p>\n|         \"foo\"\n|     \"bar\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <search>\n|       <p>\n|         \"foobar\""
+PASS html5lib_search-element.html 5153f797fbb63a23a40d19e298aca06d53d22f7f
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_search-element_run_type=write_single-expected.txt b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_search-element_run_type=write_single-expected.txt
new file mode 100644
index 0000000..67fc2011
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_search-element_run_type=write_single-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+FAIL html5lib_search-element.html 114b9f3c8147c0ed8ef3ed1811a9da3f10d74402 assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <p>\n|       \"foo\"\n|     <search>\n|       \"bar\"\n|       <p>\n|         \"baz\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <p>\n|       \"foo\"\n|       <search>\n|         \"bar\"\n|     <p>\n|       \"baz\""
+FAIL html5lib_search-element.html 2204afb9037ec886f428ab5dcead5ee9f87c65cb assert_equals: expected "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <search>\n|       <p>\n|         \"foo\"\n|     \"bar\"" but got "#document\n| <!DOCTYPE html>\n| <html>\n|   <head>\n|   <body>\n|     <search>\n|       <p>\n|         \"foobar\""
+PASS html5lib_search-element.html 5153f797fbb63a23a40d19e298aca06d53d22f7f
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_template.html b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_template.html
index d12c2ca..5d6f4fc 100644
--- a/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_template.html
+++ b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_template.html
@@ -18,9 +18,9 @@
     <script src="/resources/testharnessreport.js"></script>
     <script>
       var num_iframes = 8;
-      var order = ['010950d55f4eccf16e9c4af1d263bb747294c646','a838bd54410cef059a42eea9606356488e16535b','27fb9111f6675a7e033b867480c0afddcda161a6','aee883a65775489399a003b2371d58248a6aff6f','89b17b54ab343191bf74ef5434f4d2cfac40ea97','c4433556c7414cfd71f27b420f1ffc4348774f5e','3dcce7d97108b3e9ea7fa96f240ac62bf280e74b','a1f587f7ea85ccfe294bd45bfb501e850cb979e0','cd26a7832f13bdc135697321ca6c2fecdca6ef5d','e30571d90b0e56864499961eb7be955994cf72e2','01cbe9f6a25f286b08d8dc4f7b65421e8eb3500c','96cbbcdffe02c86a8b929604c2fd5f3571a18dbe','d51676f55550e960dd0f5fa7fd0bdfa20bdde046','f9dfd9acfd494489c899604649a01d864741f50f','ea00361c265d3ffb47ce636d919c94ca10d58911','d8ebfcf7694c9d04457e796ac73049210313602e','b4d5e6fe9b92e2c8f54199d7cab3da383c42add0','07724ef8f7a4fa61c77ffcd5180d3101c4781502','e90f8aae8fc690540b42b3ffa3e741e7c1dfbf43','687bdf4adda88a316ec69fe20e84720acc5d1fe6','5b232642f472c2b4c0c7511fed464eebe686b427','dc1ac1830a881d1532a1e6fd6d0cfa56d6571da2','c58747a85e8b4f44d7ae63c04cdad783a903c25e','ca59bfdaec7451f704973176fab46e582bd691b2','cf807d6391a58c172b6c15c3b01d2a99ec0e6cf8','350b7ac850e46de79615308fc923649264406104','a31ff44edf7f377543dabdda8141cda9bb6de134','533c5c1b5f0d0cbb1ede2cc5ae927095c5b21f0b','61f79e083005007853c4f8e431559ac8d3845cfd','e802e85f36792b176b73c102c0e8761d9478621d','51d0797ff7653cd7be34458d689146e08a666c7f','d60e4079a18bd6266740cc61d1ca736e9d5098ce','308709292677b4d74c108a811ad7b7acd0bdfc9c','8965cdf9c4e9936262e25c90c7a7f8673840a445','7dccda789764beb489e09be10188af9347335d05','e15be51c77e1a6de35568a099ed339440ce9426d','503d3782e45940c19f096f360a092282b46ab1ea','b4ab56fd9e9cebf479d14adfa523c06d16483a5e','cd8bc9521f9683086a9e8529dd97314a6869daeb','f915e7b3407c24b28c3aad318e5693cc774020f4','3c5eb261787b3d15aff86fa61de773fd7e439b0e','2b57775750c198d4b98b23aed74ff80a866a01f5','dc3d016610f3ab532525a6c2871f03d6b62b0168','6a184d71d00580a26a8b6bd97aafe5503339f3f6','ce570a6c4bcee8b72a03e25508c6dd72e3cc6c35','e0c3d922f7b1f1654f02f716c3d9b31198ce3385','87e67242bf6debcf3b7dca852d10aa0f7b625b28','35ac4d4c972a01d368ed0cacb41370efef0a644d','5226c39dfc2d624ad4191b4eacb7e40c7ae528eb','aa90cd4db6b12e0a47341914a90cc536eec32d64','48af1faf5fcf48a0854af5a5c33656d9ccf6736b','ed3a029ba5e7f59969d65a4fc490a8f13b098cb9','6c8880d54475ad9574e203dcf2e55820b123cc64','275060925a844cb51b29bae660301de9780d68c8','9f82f6ec4c0a48c1d4dfbe6803b94abd553aea88','f094bf7e94a88b86c80a0643e70c8e5ff3354698','35a07ec3b4bf26ea407dc1ddf52f14195a714059','24faa53b271f994a4ff31d5796c8ff47d6f2c3e6','0f1c491b58c2dd3c402a62e37f833bc1f1db8d21','868d918a7b5d8b5c065c15229492bc2022bfbcba','0538efa44e857596c556033a3821d424378aea3f','e7d7bf3973c70d3cf9b0adad2ebed9f25be48d66','c69d0ac542d477b7312bb24981127b8aa8fdb1df','b496a8c13a7bd75b778bb0de489726aee952ae0c','5d6ee61de40274c9626ca78ee208d51276d5662d','9bd9687a65f258adc24450fc5cbd781fff6c038a','db1baeb846d718c773324746524fbd68f2e9436e','4b0ce46c611dbcc016db272ef007f302bee0c897','1a735e1c7f28f8701f3c7fd5e9404b8911916086','0686eedec06b2db1dc283fac92c1ef1a33114c71','d4dfb87ce626f12923056a6cd77448eaf4660ac2','1f295920f2937b2c8023b3761c43a0d4d9e5353c','3b91fa08fad923d387d924cff37fbf6b4c3a5712','45a1c1ad5d99ad67c573096a79253996a664e01b','0fe3a66773c6048c8f6f2c92f2611f65be972ec1','be40897ca411e1507197c31ab2a9f9752a05f769','dcfb1048ed5c40e406b4fbf0cde24c826713907f','78263aeea68ac97903598682013bae9c0c21d547','5aa177ef1a35bf4502dcb867d8e666288982ba99','5d303375907dc4d4380b477e0317c17b660613e9','d822f726927c34b92fe102b13e63920850878f6a','07acdcaeb4fa639296d46673cf28823ddf2a6ca7','58bd846ce1be0caf7560fba2ef19e2c2070ab123','8eeee377e5ab324731cc592f1fa8abe1045ad610','b30690019090149132fc228a7261c5cf2fd149fc','67a209d928804f90fdb66d070201b23f3d0c8a42','12104886b8f87daa937eac30b5ff0e1e074eaa6f','483cc9957a7225fe435112642be59abb4c459a1e','72d8ac431a154c40ab75d53a258d9d80d47689eb','1125967cbbcd404f4cb14d48270b8ec778970d77','32c963e164b9ec82c60e490bb141c1ccc70b992f','574a95fc9c9f2de3aeaa0c9ee1e6967fc3d4770d','332863a7f9e61bff32bd3427ede7a088b790d453','2121db07146781773df9e53b94fa921a805175ce','8675de267cd7e34f2febdee3feb665614d1562fe','c5d26ad923a2b1e988ddd378ca4fb26eb48353e1','eec1542e2fa0e9eafb7f8d4a51eae56b5a31b3c8','b79387a54c3b136db0f28ed96555ff683b3947fe','c477a29a4deb32d072a415fa809a84a4f2beee0c','26e4480c08e1f5f7b6ac8b8c1832ab0312e3b7c5','24b3b50fdd0bf8d5cf2ebaa6bf502d7bcfde1da4','d3704c68528357189eb5826ab66eea071d6137a5','d958f7d44faf772d1fb60f1a8f186f837ca735d9','3fc4d97fa68fc2658356bdbd4e051c867de8de53','94820107bbf3fab3f82de1f717e8413aead7d3a6','657c00ebdda37ae060cc69633ed98482ccc29e18','649fc955a4b60ab2a5b881d94c9493eb4a545002',];
+      var order = ['010950d55f4eccf16e9c4af1d263bb747294c646','a838bd54410cef059a42eea9606356488e16535b','27fb9111f6675a7e033b867480c0afddcda161a6','aee883a65775489399a003b2371d58248a6aff6f','89b17b54ab343191bf74ef5434f4d2cfac40ea97','c4433556c7414cfd71f27b420f1ffc4348774f5e','3dcce7d97108b3e9ea7fa96f240ac62bf280e74b','a1f587f7ea85ccfe294bd45bfb501e850cb979e0','cd26a7832f13bdc135697321ca6c2fecdca6ef5d','e30571d90b0e56864499961eb7be955994cf72e2','01cbe9f6a25f286b08d8dc4f7b65421e8eb3500c','96cbbcdffe02c86a8b929604c2fd5f3571a18dbe','d51676f55550e960dd0f5fa7fd0bdfa20bdde046','f9dfd9acfd494489c899604649a01d864741f50f','ea00361c265d3ffb47ce636d919c94ca10d58911','d8ebfcf7694c9d04457e796ac73049210313602e','b4d5e6fe9b92e2c8f54199d7cab3da383c42add0','07724ef8f7a4fa61c77ffcd5180d3101c4781502','e90f8aae8fc690540b42b3ffa3e741e7c1dfbf43','687bdf4adda88a316ec69fe20e84720acc5d1fe6','5b232642f472c2b4c0c7511fed464eebe686b427','dc1ac1830a881d1532a1e6fd6d0cfa56d6571da2','c58747a85e8b4f44d7ae63c04cdad783a903c25e','ca59bfdaec7451f704973176fab46e582bd691b2','cf807d6391a58c172b6c15c3b01d2a99ec0e6cf8','350b7ac850e46de79615308fc923649264406104','a31ff44edf7f377543dabdda8141cda9bb6de134','533c5c1b5f0d0cbb1ede2cc5ae927095c5b21f0b','61f79e083005007853c4f8e431559ac8d3845cfd','e802e85f36792b176b73c102c0e8761d9478621d','51d0797ff7653cd7be34458d689146e08a666c7f','d60e4079a18bd6266740cc61d1ca736e9d5098ce','308709292677b4d74c108a811ad7b7acd0bdfc9c','8965cdf9c4e9936262e25c90c7a7f8673840a445','7dccda789764beb489e09be10188af9347335d05','e15be51c77e1a6de35568a099ed339440ce9426d','503d3782e45940c19f096f360a092282b46ab1ea','b4ab56fd9e9cebf479d14adfa523c06d16483a5e','cd8bc9521f9683086a9e8529dd97314a6869daeb','f915e7b3407c24b28c3aad318e5693cc774020f4','3c5eb261787b3d15aff86fa61de773fd7e439b0e','2b57775750c198d4b98b23aed74ff80a866a01f5','dc3d016610f3ab532525a6c2871f03d6b62b0168','6a184d71d00580a26a8b6bd97aafe5503339f3f6','ce570a6c4bcee8b72a03e25508c6dd72e3cc6c35','e0c3d922f7b1f1654f02f716c3d9b31198ce3385','87e67242bf6debcf3b7dca852d10aa0f7b625b28','35ac4d4c972a01d368ed0cacb41370efef0a644d','5226c39dfc2d624ad4191b4eacb7e40c7ae528eb','aa90cd4db6b12e0a47341914a90cc536eec32d64','48af1faf5fcf48a0854af5a5c33656d9ccf6736b','ed3a029ba5e7f59969d65a4fc490a8f13b098cb9','6c8880d54475ad9574e203dcf2e55820b123cc64','275060925a844cb51b29bae660301de9780d68c8','9f82f6ec4c0a48c1d4dfbe6803b94abd553aea88','f094bf7e94a88b86c80a0643e70c8e5ff3354698','35a07ec3b4bf26ea407dc1ddf52f14195a714059','24faa53b271f994a4ff31d5796c8ff47d6f2c3e6','0f1c491b58c2dd3c402a62e37f833bc1f1db8d21','868d918a7b5d8b5c065c15229492bc2022bfbcba','0538efa44e857596c556033a3821d424378aea3f','e7d7bf3973c70d3cf9b0adad2ebed9f25be48d66','c69d0ac542d477b7312bb24981127b8aa8fdb1df','b496a8c13a7bd75b778bb0de489726aee952ae0c','5d6ee61de40274c9626ca78ee208d51276d5662d','9bd9687a65f258adc24450fc5cbd781fff6c038a','db1baeb846d718c773324746524fbd68f2e9436e','4b0ce46c611dbcc016db272ef007f302bee0c897','1a735e1c7f28f8701f3c7fd5e9404b8911916086','0686eedec06b2db1dc283fac92c1ef1a33114c71','d4dfb87ce626f12923056a6cd77448eaf4660ac2','1f295920f2937b2c8023b3761c43a0d4d9e5353c','3b91fa08fad923d387d924cff37fbf6b4c3a5712','45a1c1ad5d99ad67c573096a79253996a664e01b','0fe3a66773c6048c8f6f2c92f2611f65be972ec1','be40897ca411e1507197c31ab2a9f9752a05f769','dcfb1048ed5c40e406b4fbf0cde24c826713907f','78263aeea68ac97903598682013bae9c0c21d547','5aa177ef1a35bf4502dcb867d8e666288982ba99','5d303375907dc4d4380b477e0317c17b660613e9','d822f726927c34b92fe102b13e63920850878f6a','07acdcaeb4fa639296d46673cf28823ddf2a6ca7','58bd846ce1be0caf7560fba2ef19e2c2070ab123','8eeee377e5ab324731cc592f1fa8abe1045ad610','b30690019090149132fc228a7261c5cf2fd149fc','67a209d928804f90fdb66d070201b23f3d0c8a42','12104886b8f87daa937eac30b5ff0e1e074eaa6f','483cc9957a7225fe435112642be59abb4c459a1e','72d8ac431a154c40ab75d53a258d9d80d47689eb','1125967cbbcd404f4cb14d48270b8ec778970d77','32c963e164b9ec82c60e490bb141c1ccc70b992f','574a95fc9c9f2de3aeaa0c9ee1e6967fc3d4770d','332863a7f9e61bff32bd3427ede7a088b790d453','2121db07146781773df9e53b94fa921a805175ce','8675de267cd7e34f2febdee3feb665614d1562fe','c5d26ad923a2b1e988ddd378ca4fb26eb48353e1','eec1542e2fa0e9eafb7f8d4a51eae56b5a31b3c8','b79387a54c3b136db0f28ed96555ff683b3947fe','c477a29a4deb32d072a415fa809a84a4f2beee0c','26e4480c08e1f5f7b6ac8b8c1832ab0312e3b7c5','24b3b50fdd0bf8d5cf2ebaa6bf502d7bcfde1da4','d3704c68528357189eb5826ab66eea071d6137a5','d958f7d44faf772d1fb60f1a8f186f837ca735d9','3fc4d97fa68fc2658356bdbd4e051c867de8de53','94820107bbf3fab3f82de1f717e8413aead7d3a6','657c00ebdda37ae060cc69633ed98482ccc29e18','649fc955a4b60ab2a5b881d94c9493eb4a545002','977041956eb9c7b9db73935168aba92f77c079f6','fafee395fea124791df59bafeb1136342b64d3c6','d5a8beecf5d3c53e947772ad887808d132334aa1',];
       var tests = {
-          "010950d55f4eccf16e9c4af1d263bb747294c646":[async_test('html5lib_template.html 010950d55f4eccf16e9c4af1d263bb747294c646'), "%3Cbody%3E%3Ctemplate%3EHello%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%22Hello%22"],"a838bd54410cef059a42eea9606356488e16535b":[async_test('html5lib_template.html a838bd54410cef059a42eea9606356488e16535b'), "%3Ctemplate%3EHello%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%22Hello%22%0A%7C%20%20%20%3Cbody%3E"],"27fb9111f6675a7e033b867480c0afddcda161a6":[async_test('html5lib_template.html 27fb9111f6675a7e033b867480c0afddcda161a6'), "%3Ctemplate%3E%3C/template%3E%3Cdiv%3E%3C/div%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E"],"aee883a65775489399a003b2371d58248a6aff6f":[async_test('html5lib_template.html aee883a65775489399a003b2371d58248a6aff6f'), "%3Chtml%3E%3Ctemplate%3EHello%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%22Hello%22%0A%7C%20%20%20%3Cbody%3E"],"89b17b54ab343191bf74ef5434f4d2cfac40ea97":[async_test('html5lib_template.html 89b17b54ab343191bf74ef5434f4d2cfac40ea97'), "%3Chead%3E%3Ctemplate%3E%3Cdiv%3E%3C/div%3E%3C/template%3E%3C/head%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%3Cbody%3E"],"c4433556c7414cfd71f27b420f1ffc4348774f5e":[async_test('html5lib_template.html c4433556c7414cfd71f27b420f1ffc4348774f5e'), "%3Cdiv%3E%3Ctemplate%3E%3Cdiv%3E%3Cspan%3E%3C/template%3E%3Cb%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%20%20%20%20%3Cb%3E"],"3dcce7d97108b3e9ea7fa96f240ac62bf280e74b":[async_test('html5lib_template.html 3dcce7d97108b3e9ea7fa96f240ac62bf280e74b'), "%3Cdiv%3E%3Ctemplate%3E%3C/div%3EHello", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%22Hello%22"],"a1f587f7ea85ccfe294bd45bfb501e850cb979e0":[async_test('html5lib_template.html a1f587f7ea85ccfe294bd45bfb501e850cb979e0'), "%3Cdiv%3E%3C/template%3E%3C/div%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E"],"cd26a7832f13bdc135697321ca6c2fecdca6ef5d":[async_test('html5lib_template.html cd26a7832f13bdc135697321ca6c2fecdca6ef5d'), "%3Ctable%3E%3Ctemplate%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content"],"e30571d90b0e56864499961eb7be955994cf72e2":[async_test('html5lib_template.html e30571d90b0e56864499961eb7be955994cf72e2'), "%3Ctable%3E%3Ctemplate%3E%3C/template%3E%3C/div%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content"],"01cbe9f6a25f286b08d8dc4f7b65421e8eb3500c":[async_test('html5lib_template.html 01cbe9f6a25f286b08d8dc4f7b65421e8eb3500c'), "%3Ctable%3E%3Cdiv%3E%3Ctemplate%3E%3C/template%3E%3C/div%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%3Ctable%3E"],"96cbbcdffe02c86a8b929604c2fd5f3571a18dbe":[async_test('html5lib_template.html 96cbbcdffe02c86a8b929604c2fd5f3571a18dbe'), "%3Ctable%3E%3Ctemplate%3E%3C/template%3E%3Cdiv%3E%3C/div%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content"],"d51676f55550e960dd0f5fa7fd0bdfa20bdde046":[async_test('html5lib_template.html d51676f55550e960dd0f5fa7fd0bdfa20bdde046'), "%3Ctable%3E%20%20%20%3Ctemplate%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%22%20%20%20%22%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content"],"f9dfd9acfd494489c899604649a01d864741f50f":[async_test('html5lib_template.html f9dfd9acfd494489c899604649a01d864741f50f'), "%3Ctable%3E%3Ctbody%3E%3Ctemplate%3E%3C/template%3E%3C/tbody%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content"],"ea00361c265d3ffb47ce636d919c94ca10d58911":[async_test('html5lib_template.html ea00361c265d3ffb47ce636d919c94ca10d58911'), "%3Ctable%3E%3Ctbody%3E%3Ctemplate%3E%3C/tbody%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content"],"d8ebfcf7694c9d04457e796ac73049210313602e":[async_test('html5lib_template.html d8ebfcf7694c9d04457e796ac73049210313602e'), "%3Ctable%3E%3Ctbody%3E%3Ctemplate%3E%3C/template%3E%3C/tbody%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content"],"b4d5e6fe9b92e2c8f54199d7cab3da383c42add0":[async_test('html5lib_template.html b4d5e6fe9b92e2c8f54199d7cab3da383c42add0'), "%3Ctable%3E%3Cthead%3E%3Ctemplate%3E%3C/template%3E%3C/thead%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Cthead%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content"],"07724ef8f7a4fa61c77ffcd5180d3101c4781502":[async_test('html5lib_template.html 07724ef8f7a4fa61c77ffcd5180d3101c4781502'), "%3Ctable%3E%3Ctfoot%3E%3Ctemplate%3E%3C/template%3E%3C/tfoot%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctfoot%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content"],"e90f8aae8fc690540b42b3ffa3e741e7c1dfbf43":[async_test('html5lib_template.html e90f8aae8fc690540b42b3ffa3e741e7c1dfbf43'), "%3Cselect%3E%3Ctemplate%3E%3C/template%3E%3C/select%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content"],"687bdf4adda88a316ec69fe20e84720acc5d1fe6":[async_test('html5lib_template.html 687bdf4adda88a316ec69fe20e84720acc5d1fe6'), "%3Cselect%3E%3Ctemplate%3E%3Coption%3E%3C/option%3E%3C/template%3E%3C/select%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Coption%3E"],"5b232642f472c2b4c0c7511fed464eebe686b427":[async_test('html5lib_template.html 5b232642f472c2b4c0c7511fed464eebe686b427'), "%3Ctemplate%3E%3Coption%3E%3C/option%3E%3C/select%3E%3Coption%3E%3C/option%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Coption%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Coption%3E%0A%7C%20%20%20%3Cbody%3E"],"dc1ac1830a881d1532a1e6fd6d0cfa56d6571da2":[async_test('html5lib_template.html dc1ac1830a881d1532a1e6fd6d0cfa56d6571da2'), "%3Cselect%3E%3Ctemplate%3E%3C/template%3E%3Coption%3E%3C/select%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%3Coption%3E"],"c58747a85e8b4f44d7ae63c04cdad783a903c25e":[async_test('html5lib_template.html c58747a85e8b4f44d7ae63c04cdad783a903c25e'), "%3Cselect%3E%3Coption%3E%3Ctemplate%3E%3C/template%3E%3C/select%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%3Coption%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content"],"ca59bfdaec7451f704973176fab46e582bd691b2":[async_test('html5lib_template.html ca59bfdaec7451f704973176fab46e582bd691b2'), "%3Cselect%3E%3Ctemplate%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content"],"cf807d6391a58c172b6c15c3b01d2a99ec0e6cf8":[async_test('html5lib_template.html cf807d6391a58c172b6c15c3b01d2a99ec0e6cf8'), "%3Cselect%3E%3Coption%3E%3C/option%3E%3Ctemplate%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%3Coption%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content"],"350b7ac850e46de79615308fc923649264406104":[async_test('html5lib_template.html 350b7ac850e46de79615308fc923649264406104'), "%3Cselect%3E%3Coption%3E%3C/option%3E%3Ctemplate%3E%3Coption%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%3Coption%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Coption%3E"],"a31ff44edf7f377543dabdda8141cda9bb6de134":[async_test('html5lib_template.html a31ff44edf7f377543dabdda8141cda9bb6de134'), "%3Ctable%3E%3Cthead%3E%3Ctemplate%3E%3Ctd%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Cthead%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"533c5c1b5f0d0cbb1ede2cc5ae927095c5b21f0b":[async_test('html5lib_template.html 533c5c1b5f0d0cbb1ede2cc5ae927095c5b21f0b'), "%3Ctable%3E%3Ctemplate%3E%3Cthead%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Cthead%3E"],"61f79e083005007853c4f8e431559ac8d3845cfd":[async_test('html5lib_template.html 61f79e083005007853c4f8e431559ac8d3845cfd'), "%3Cbody%3E%3Ctable%3E%3Ctemplate%3E%3Ctd%3E%3C/tr%3E%3Cdiv%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"e802e85f36792b176b73c102c0e8761d9478621d":[async_test('html5lib_template.html e802e85f36792b176b73c102c0e8761d9478621d'), "%3Ctable%3E%3Ctemplate%3E%3Cthead%3E%3C/template%3E%3C/thead%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Cthead%3E"],"51d0797ff7653cd7be34458d689146e08a666c7f":[async_test('html5lib_template.html 51d0797ff7653cd7be34458d689146e08a666c7f'), "%3Ctable%3E%3Cthead%3E%3Ctemplate%3E%3Ctr%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Cthead%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E"],"d60e4079a18bd6266740cc61d1ca736e9d5098ce":[async_test('html5lib_template.html d60e4079a18bd6266740cc61d1ca736e9d5098ce'), "%3Ctable%3E%3Ctemplate%3E%3Ctr%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E"],"308709292677b4d74c108a811ad7b7acd0bdfc9c":[async_test('html5lib_template.html 308709292677b4d74c108a811ad7b7acd0bdfc9c'), "%3Ctable%3E%3Ctr%3E%3Ctemplate%3E%3Ctd%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"8965cdf9c4e9936262e25c90c7a7f8673840a445":[async_test('html5lib_template.html 8965cdf9c4e9936262e25c90c7a7f8673840a445'), "%3Ctable%3E%3Ctemplate%3E%3Ctr%3E%3Ctemplate%3E%3Ctd%3E%3C/template%3E%3C/tr%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"7dccda789764beb489e09be10188af9347335d05":[async_test('html5lib_template.html 7dccda789764beb489e09be10188af9347335d05'), "%3Ctable%3E%3Ctemplate%3E%3Ctr%3E%3Ctemplate%3E%3Ctd%3E%3C/td%3E%3C/template%3E%3C/tr%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"e15be51c77e1a6de35568a099ed339440ce9426d":[async_test('html5lib_template.html e15be51c77e1a6de35568a099ed339440ce9426d'), "%3Ctable%3E%3Ctemplate%3E%3Ctd%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"503d3782e45940c19f096f360a092282b46ab1ea":[async_test('html5lib_template.html 503d3782e45940c19f096f360a092282b46ab1ea'), "%3Cbody%3E%3Ctemplate%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"b4ab56fd9e9cebf479d14adfa523c06d16483a5e":[async_test('html5lib_template.html b4ab56fd9e9cebf479d14adfa523c06d16483a5e'), "%3Cbody%3E%3Ctemplate%3E%3Ctemplate%3E%3Ctr%3E%3C/tr%3E%3C/template%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"cd8bc9521f9683086a9e8529dd97314a6869daeb":[async_test('html5lib_template.html cd8bc9521f9683086a9e8529dd97314a6869daeb'), "%3Ctable%3E%3Ccolgroup%3E%3Ctemplate%3E%3Ccol%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ccolgroup%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"f915e7b3407c24b28c3aad318e5693cc774020f4":[async_test('html5lib_template.html f915e7b3407c24b28c3aad318e5693cc774020f4'), "%3Cframeset%3E%3Ctemplate%3E%3Cframe%3E%3C/frame%3E%3C/template%3E%3C/frameset%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cframeset%3E%0A%7C%20%20%20%20%20%3Cframe%3E"],"3c5eb261787b3d15aff86fa61de773fd7e439b0e":[async_test('html5lib_template.html 3c5eb261787b3d15aff86fa61de773fd7e439b0e'), "%3Ctemplate%3E%3Cframe%3E%3C/frame%3E%3C/frameset%3E%3Cframe%3E%3C/frame%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%3Cbody%3E"],"2b57775750c198d4b98b23aed74ff80a866a01f5":[async_test('html5lib_template.html 2b57775750c198d4b98b23aed74ff80a866a01f5'), "%3Ctemplate%3E%3Cdiv%3E%3Cframeset%3E%3Cspan%3E%3C/span%3E%3C/div%3E%3Cspan%3E%3C/span%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%3Cbody%3E"],"dc3d016610f3ab532525a6c2871f03d6b62b0168":[async_test('html5lib_template.html dc3d016610f3ab532525a6c2871f03d6b62b0168'), "%3Cbody%3E%3Ctemplate%3E%3Cdiv%3E%3Cframeset%3E%3Cspan%3E%3C/span%3E%3C/div%3E%3Cspan%3E%3C/span%3E%3C/template%3E%3C/body%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cspan%3E"],"6a184d71d00580a26a8b6bd97aafe5503339f3f6":[async_test('html5lib_template.html 6a184d71d00580a26a8b6bd97aafe5503339f3f6'), "%3Cbody%3E%3Ctemplate%3E%3Cscript%3Evar%20i%20%3D%201%3B%3C/script%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cscript%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%22var%20i%20%3D%201%3B%22%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"ce570a6c4bcee8b72a03e25508c6dd72e3cc6c35":[async_test('html5lib_template.html ce570a6c4bcee8b72a03e25508c6dd72e3cc6c35'), "%3Cbody%3E%3Ctemplate%3E%3Ctr%3E%3Cdiv%3E%3C/div%3E%3C/tr%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"e0c3d922f7b1f1654f02f716c3d9b31198ce3385":[async_test('html5lib_template.html e0c3d922f7b1f1654f02f716c3d9b31198ce3385'), "%3Cbody%3E%3Ctemplate%3E%3Ctr%3E%3C/tr%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"87e67242bf6debcf3b7dca852d10aa0f7b625b28":[async_test('html5lib_template.html 87e67242bf6debcf3b7dca852d10aa0f7b625b28'), "%3Cbody%3E%3Ctemplate%3E%3Ctd%3E%3C/td%3E%3C/tr%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"35ac4d4c972a01d368ed0cacb41370efef0a644d":[async_test('html5lib_template.html 35ac4d4c972a01d368ed0cacb41370efef0a644d'), "%3Cbody%3E%3Ctemplate%3E%3Ctd%3E%3C/td%3E%3Ctbody%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"5226c39dfc2d624ad4191b4eacb7e40c7ae528eb":[async_test('html5lib_template.html 5226c39dfc2d624ad4191b4eacb7e40c7ae528eb'), "%3Cbody%3E%3Ctemplate%3E%3Ctd%3E%3C/td%3E%3Ccaption%3E%3C/caption%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"aa90cd4db6b12e0a47341914a90cc536eec32d64":[async_test('html5lib_template.html aa90cd4db6b12e0a47341914a90cc536eec32d64'), "%3Cbody%3E%3Ctemplate%3E%3Ctd%3E%3C/td%3E%3Ccolgroup%3E%3C/caption%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"48af1faf5fcf48a0854af5a5c33656d9ccf6736b":[async_test('html5lib_template.html 48af1faf5fcf48a0854af5a5c33656d9ccf6736b'), "%3Cbody%3E%3Ctemplate%3E%3Ctd%3E%3C/td%3E%3C/table%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"ed3a029ba5e7f59969d65a4fc490a8f13b098cb9":[async_test('html5lib_template.html ed3a029ba5e7f59969d65a4fc490a8f13b098cb9'), "%3Cbody%3E%3Ctemplate%3E%3Ctr%3E%3C/tr%3E%3Ctbody%3E%3Ctr%3E%3C/tr%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E"],"6c8880d54475ad9574e203dcf2e55820b123cc64":[async_test('html5lib_template.html 6c8880d54475ad9574e203dcf2e55820b123cc64'), "%3Cbody%3E%3Ctemplate%3E%3Ctr%3E%3C/tr%3E%3Ccaption%3E%3Ctr%3E%3C/tr%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E"],"275060925a844cb51b29bae660301de9780d68c8":[async_test('html5lib_template.html 275060925a844cb51b29bae660301de9780d68c8'), "%3Cbody%3E%3Ctemplate%3E%3Ctr%3E%3C/tr%3E%3C/table%3E%3Ctr%3E%3C/tr%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E"],"9f82f6ec4c0a48c1d4dfbe6803b94abd553aea88":[async_test('html5lib_template.html 9f82f6ec4c0a48c1d4dfbe6803b94abd553aea88'), "%3Cbody%3E%3Ctemplate%3E%3Cthead%3E%3C/thead%3E%3Ccaption%3E%3C/caption%3E%3Ctbody%3E%3C/tbody%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cthead%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ccaption%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctbody%3E"],"f094bf7e94a88b86c80a0643e70c8e5ff3354698":[async_test('html5lib_template.html f094bf7e94a88b86c80a0643e70c8e5ff3354698'), "%3Cbody%3E%3Ctemplate%3E%3Cthead%3E%3C/thead%3E%3C/table%3E%3Ctbody%3E%3C/tbody%3E%3C/template%3E%3C/body%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cthead%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctbody%3E"],"35a07ec3b4bf26ea407dc1ddf52f14195a714059":[async_test('html5lib_template.html 35a07ec3b4bf26ea407dc1ddf52f14195a714059'), "%3Cbody%3E%3Ctemplate%3E%3Cdiv%3E%3Ctr%3E%3C/tr%3E%3C/div%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"24faa53b271f994a4ff31d5796c8ff47d6f2c3e6":[async_test('html5lib_template.html 24faa53b271f994a4ff31d5796c8ff47d6f2c3e6'), "%3Cbody%3E%3Ctemplate%3E%3Cem%3EHello%3C/em%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cem%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%22Hello%22"],"0f1c491b58c2dd3c402a62e37f833bc1f1db8d21":[async_test('html5lib_template.html 0f1c491b58c2dd3c402a62e37f833bc1f1db8d21'), "%3Cbody%3E%3Ctemplate%3E%3C%21--comment--%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3C%21--%20comment%20--%3E"],"868d918a7b5d8b5c065c15229492bc2022bfbcba":[async_test('html5lib_template.html 868d918a7b5d8b5c065c15229492bc2022bfbcba'), "%3Cbody%3E%3Ctemplate%3E%3Cstyle%3E%3C/style%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cstyle%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"0538efa44e857596c556033a3821d424378aea3f":[async_test('html5lib_template.html 0538efa44e857596c556033a3821d424378aea3f'), "%3Cbody%3E%3Ctemplate%3E%3Cmeta%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cmeta%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"e7d7bf3973c70d3cf9b0adad2ebed9f25be48d66":[async_test('html5lib_template.html e7d7bf3973c70d3cf9b0adad2ebed9f25be48d66'), "%3Cbody%3E%3Ctemplate%3E%3Clink%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Clink%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"c69d0ac542d477b7312bb24981127b8aa8fdb1df":[async_test('html5lib_template.html c69d0ac542d477b7312bb24981127b8aa8fdb1df'), "%3Cbody%3E%3Ctable%3E%3Ccolgroup%3E%3Ctemplate%3E%3Ccol%3E%3C/col%3E%3C/template%3E%3C/colgroup%3E%3C/table%3E%3C/body%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ccolgroup%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"b496a8c13a7bd75b778bb0de489726aee952ae0c":[async_test('html5lib_template.html b496a8c13a7bd75b778bb0de489726aee952ae0c'), "%3Cbody%20a%3Db%3E%3Ctemplate%3E%3Cdiv%3E%3C/div%3E%3Cbody%20c%3Dd%3E%3Cdiv%3E%3C/div%3E%3C/body%3E%3C/template%3E%3C/body%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20a%3D%22b%22%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"5d6ee61de40274c9626ca78ee208d51276d5662d":[async_test('html5lib_template.html 5d6ee61de40274c9626ca78ee208d51276d5662d'), "%3Chtml%20a%3Db%3E%3Ctemplate%3E%3Cdiv%3E%3Chtml%20b%3Dc%3E%3Cspan%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20a%3D%22b%22%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%3Cbody%3E"],"9bd9687a65f258adc24450fc5cbd781fff6c038a":[async_test('html5lib_template.html 9bd9687a65f258adc24450fc5cbd781fff6c038a'), "%3Chtml%20a%3Db%3E%3Ctemplate%3E%3Ccol%3E%3C/col%3E%3Chtml%20b%3Dc%3E%3Ccol%3E%3C/col%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20a%3D%22b%22%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E%0A%7C%20%20%20%3Cbody%3E"],"db1baeb846d718c773324746524fbd68f2e9436e":[async_test('html5lib_template.html db1baeb846d718c773324746524fbd68f2e9436e'), "%3Chtml%20a%3Db%3E%3Ctemplate%3E%3Cframe%3E%3C/frame%3E%3Chtml%20b%3Dc%3E%3Cframe%3E%3C/frame%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20a%3D%22b%22%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%3Cbody%3E"],"4b0ce46c611dbcc016db272ef007f302bee0c897":[async_test('html5lib_template.html 4b0ce46c611dbcc016db272ef007f302bee0c897'), "%3Cbody%3E%3Ctemplate%3E%3Ctr%3E%3C/tr%3E%3Ctemplate%3E%3C/template%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"1a735e1c7f28f8701f3c7fd5e9404b8911916086":[async_test('html5lib_template.html 1a735e1c7f28f8701f3c7fd5e9404b8911916086'), "%3Cbody%3E%3Ctemplate%3E%3Cthead%3E%3C/thead%3E%3Ctemplate%3E%3Ctr%3E%3C/tr%3E%3C/template%3E%3Ctr%3E%3C/tr%3E%3Ctfoot%3E%3C/tfoot%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cthead%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctfoot%3E"],"0686eedec06b2db1dc283fac92c1ef1a33114c71":[async_test('html5lib_template.html 0686eedec06b2db1dc283fac92c1ef1a33114c71'), "%3Cbody%3E%3Ctemplate%3E%3Ctemplate%3E%3Cb%3E%3Ctemplate%3E%3C/template%3E%3C/template%3Etext%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cb%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%22text%22"],"d4dfb87ce626f12923056a6cd77448eaf4660ac2":[async_test('html5lib_template.html d4dfb87ce626f12923056a6cd77448eaf4660ac2'), "%3Cbody%3E%3Ctemplate%3E%3Ccol%3E%3Ccolgroup%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"1f295920f2937b2c8023b3761c43a0d4d9e5353c":[async_test('html5lib_template.html 1f295920f2937b2c8023b3761c43a0d4d9e5353c'), "%3Cbody%3E%3Ctemplate%3E%3Ccol%3E%3C/colgroup%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"3b91fa08fad923d387d924cff37fbf6b4c3a5712":[async_test('html5lib_template.html 3b91fa08fad923d387d924cff37fbf6b4c3a5712'), "%3Cbody%3E%3Ctemplate%3E%3Ccol%3E%3Ccolgroup%3E%3C/template%3E%3C/body%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"45a1c1ad5d99ad67c573096a79253996a664e01b":[async_test('html5lib_template.html 45a1c1ad5d99ad67c573096a79253996a664e01b'), "%3Cbody%3E%3Ctemplate%3E%3Ccol%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"0fe3a66773c6048c8f6f2c92f2611f65be972ec1":[async_test('html5lib_template.html 0fe3a66773c6048c8f6f2c92f2611f65be972ec1'), "%3Cbody%3E%3Ctemplate%3E%3Ccol%3E%3C/div%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"be40897ca411e1507197c31ab2a9f9752a05f769":[async_test('html5lib_template.html be40897ca411e1507197c31ab2a9f9752a05f769'), "%3Cbody%3E%3Ctemplate%3E%3Ccol%3EHello", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"dcfb1048ed5c40e406b4fbf0cde24c826713907f":[async_test('html5lib_template.html dcfb1048ed5c40e406b4fbf0cde24c826713907f'), "%3Cbody%3E%3Ctemplate%3E%3Ci%3E%3Cmenu%3EFoo%3C/i%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ci%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cmenu%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ci%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%22Foo%22"],"78263aeea68ac97903598682013bae9c0c21d547":[async_test('html5lib_template.html 78263aeea68ac97903598682013bae9c0c21d547'), "%3Cbody%3E%3Ctemplate%3E%3C/div%3E%3Cdiv%3EFoo%3C/div%3E%3Ctemplate%3E%3C/template%3E%3Ctr%3E%3C/tr%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%22Foo%22%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content"],"5aa177ef1a35bf4502dcb867d8e666288982ba99":[async_test('html5lib_template.html 5aa177ef1a35bf4502dcb867d8e666288982ba99'), "%3Cbody%3E%3Cdiv%3E%3Ctemplate%3E%3C/div%3E%3Ctr%3E%3Ctd%3EFoo%3C/td%3E%3C/tr%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Foo%22"],"5d303375907dc4d4380b477e0317c17b660613e9":[async_test('html5lib_template.html 5d303375907dc4d4380b477e0317c17b660613e9'), "%3Ctemplate%3E%3C/figcaption%3E%3Csub%3E%3Ctable%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Csub%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%3Cbody%3E"],"d822f726927c34b92fe102b13e63920850878f6a":[async_test('html5lib_template.html d822f726927c34b92fe102b13e63920850878f6a'), "%3Ctemplate%3E%3Ctemplate%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%3Cbody%3E"],"07acdcaeb4fa639296d46673cf28823ddf2a6ca7":[async_test('html5lib_template.html 07acdcaeb4fa639296d46673cf28823ddf2a6ca7'), "%3Ctemplate%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%3Cbody%3E"],"58bd846ce1be0caf7560fba2ef19e2c2070ab123":[async_test('html5lib_template.html 58bd846ce1be0caf7560fba2ef19e2c2070ab123'), "%3Ctemplate%3E%3Ctemplate%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%3Cbody%3E"],"8eeee377e5ab324731cc592f1fa8abe1045ad610":[async_test('html5lib_template.html 8eeee377e5ab324731cc592f1fa8abe1045ad610'), "%3Ctemplate%3E%3Ctemplate%3E%3Ctable%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%3Cbody%3E"],"b30690019090149132fc228a7261c5cf2fd149fc":[async_test('html5lib_template.html b30690019090149132fc228a7261c5cf2fd149fc'), "%3Ctemplate%3E%3Ctemplate%3E%3Ctbody%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%3Cbody%3E"],"67a209d928804f90fdb66d070201b23f3d0c8a42":[async_test('html5lib_template.html 67a209d928804f90fdb66d070201b23f3d0c8a42'), "%3Ctemplate%3E%3Ctemplate%3E%3Ctr%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%3Cbody%3E"],"12104886b8f87daa937eac30b5ff0e1e074eaa6f":[async_test('html5lib_template.html 12104886b8f87daa937eac30b5ff0e1e074eaa6f'), "%3Ctemplate%3E%3Ctemplate%3E%3Ctd%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%3Cbody%3E"],"483cc9957a7225fe435112642be59abb4c459a1e":[async_test('html5lib_template.html 483cc9957a7225fe435112642be59abb4c459a1e'), "%3Ctemplate%3E%3Ctemplate%3E%3Ccaption%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ccaption%3E%0A%7C%20%20%20%3Cbody%3E"],"72d8ac431a154c40ab75d53a258d9d80d47689eb":[async_test('html5lib_template.html 72d8ac431a154c40ab75d53a258d9d80d47689eb'), "%3Ctemplate%3E%3Ctemplate%3E%3Ccolgroup%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ccolgroup%3E%0A%7C%20%20%20%3Cbody%3E"],"1125967cbbcd404f4cb14d48270b8ec778970d77":[async_test('html5lib_template.html 1125967cbbcd404f4cb14d48270b8ec778970d77'), "%3Ctemplate%3E%3Ctemplate%3E%3Ccol%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ccol%3E%0A%7C%20%20%20%3Cbody%3E"],"32c963e164b9ec82c60e490bb141c1ccc70b992f":[async_test('html5lib_template.html 32c963e164b9ec82c60e490bb141c1ccc70b992f'), "%3Ctemplate%3E%3Ctemplate%3E%3Ctbody%3E%3Cselect%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%3Cbody%3E"],"574a95fc9c9f2de3aeaa0c9ee1e6967fc3d4770d":[async_test('html5lib_template.html 574a95fc9c9f2de3aeaa0c9ee1e6967fc3d4770d'), "%3Ctemplate%3E%3Ctemplate%3E%3Ctable%3EFoo", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%22Foo%22%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%3Cbody%3E"],"332863a7f9e61bff32bd3427ede7a088b790d453":[async_test('html5lib_template.html 332863a7f9e61bff32bd3427ede7a088b790d453'), "%3Ctemplate%3E%3Ctemplate%3E%3Cframe%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%3Cbody%3E"],"2121db07146781773df9e53b94fa921a805175ce":[async_test('html5lib_template.html 2121db07146781773df9e53b94fa921a805175ce'), "%3Ctemplate%3E%3Ctemplate%3E%3Cscript%3Evar%20i", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cscript%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22var%20i%22%0A%7C%20%20%20%3Cbody%3E"],"8675de267cd7e34f2febdee3feb665614d1562fe":[async_test('html5lib_template.html 8675de267cd7e34f2febdee3feb665614d1562fe'), "%3Ctemplate%3E%3Ctemplate%3E%3Cstyle%3Evar%20i", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cstyle%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22var%20i%22%0A%7C%20%20%20%3Cbody%3E"],"c5d26ad923a2b1e988ddd378ca4fb26eb48353e1":[async_test('html5lib_template.html c5d26ad923a2b1e988ddd378ca4fb26eb48353e1'), "%3Ctemplate%3E%3Ctable%3E%3C/template%3E%3Cbody%3E%3Cspan%3EFoo", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%20%20%20%20%22Foo%22"],"eec1542e2fa0e9eafb7f8d4a51eae56b5a31b3c8":[async_test('html5lib_template.html eec1542e2fa0e9eafb7f8d4a51eae56b5a31b3c8'), "%3Ctemplate%3E%3Ctd%3E%3C/template%3E%3Cbody%3E%3Cspan%3EFoo", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%20%20%20%20%22Foo%22"],"b79387a54c3b136db0f28ed96555ff683b3947fe":[async_test('html5lib_template.html b79387a54c3b136db0f28ed96555ff683b3947fe'), "%3Ctemplate%3E%3Cobject%3E%3C/template%3E%3Cbody%3E%3Cspan%3EFoo", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cobject%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%20%20%20%20%22Foo%22"],"c477a29a4deb32d072a415fa809a84a4f2beee0c":[async_test('html5lib_template.html c477a29a4deb32d072a415fa809a84a4f2beee0c'), "%3Ctemplate%3E%3Csvg%3E%3Ctemplate%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Csvg%20svg%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Csvg%20template%3E%0A%7C%20%20%20%3Cbody%3E"],"26e4480c08e1f5f7b6ac8b8c1832ab0312e3b7c5":[async_test('html5lib_template.html 26e4480c08e1f5f7b6ac8b8c1832ab0312e3b7c5'), "%3Ctemplate%3E%3Csvg%3E%3Cfoo%3E%3Ctemplate%3E%3CforeignObject%3E%3Cdiv%3E%3C/template%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Csvg%20svg%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Csvg%20foo%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Csvg%20template%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Csvg%20foreignObject%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E"],"24b3b50fdd0bf8d5cf2ebaa6bf502d7bcfde1da4":[async_test('html5lib_template.html 24b3b50fdd0bf8d5cf2ebaa6bf502d7bcfde1da4'), "%3Cdummy%3E%3Ctemplate%3E%3Cspan%3E%3C/dummy%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdummy%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Cspan%3E"],"d3704c68528357189eb5826ab66eea071d6137a5":[async_test('html5lib_template.html d3704c68528357189eb5826ab66eea071d6137a5'), "%3Cbody%3E%3Ctable%3E%3Ctr%3E%3Ctd%3E%3Cselect%3E%3Ctemplate%3EFoo%3C/template%3E%3Ccaption%3EA%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Foo%22%0A%7C%20%20%20%20%20%20%20%3Ccaption%3E%0A%7C%20%20%20%20%20%20%20%20%20%22A%22"],"d958f7d44faf772d1fb60f1a8f186f837ca735d9":[async_test('html5lib_template.html d958f7d44faf772d1fb60f1a8f186f837ca735d9'), "%3Cbody%3E%3C/body%3E%3Ctemplate%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content"],"3fc4d97fa68fc2658356bdbd4e051c867de8de53":[async_test('html5lib_template.html 3fc4d97fa68fc2658356bdbd4e051c867de8de53'), "%3Chead%3E%3C/head%3E%3Ctemplate%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%3Cbody%3E"],"94820107bbf3fab3f82de1f717e8413aead7d3a6":[async_test('html5lib_template.html 94820107bbf3fab3f82de1f717e8413aead7d3a6'), "%3Chead%3E%3C/head%3E%3Ctemplate%3EFoo%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%22Foo%22%0A%7C%20%20%20%3Cbody%3E"],"657c00ebdda37ae060cc69633ed98482ccc29e18":[async_test('html5lib_template.html 657c00ebdda37ae060cc69633ed98482ccc29e18'), "%3C%21DOCTYPE%20HTML%3E%3Cdummy%3E%3Ctable%3E%3Ctemplate%3E%3Ctable%3E%3Ctemplate%3E%3Ctable%3E%3Cscript%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdummy%3E%0A%7C%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cscript%3E"],"649fc955a4b60ab2a5b881d94c9493eb4a545002":[async_test('html5lib_template.html 649fc955a4b60ab2a5b881d94c9493eb4a545002'), "%3Ctemplate%3E%3Ca%3E%3Ctable%3E%3Ca%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ca%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ca%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%3Cbody%3E"],
+          "010950d55f4eccf16e9c4af1d263bb747294c646":[async_test('html5lib_template.html 010950d55f4eccf16e9c4af1d263bb747294c646'), "%3Cbody%3E%3Ctemplate%3EHello%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%22Hello%22"],"a838bd54410cef059a42eea9606356488e16535b":[async_test('html5lib_template.html a838bd54410cef059a42eea9606356488e16535b'), "%3Ctemplate%3EHello%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%22Hello%22%0A%7C%20%20%20%3Cbody%3E"],"27fb9111f6675a7e033b867480c0afddcda161a6":[async_test('html5lib_template.html 27fb9111f6675a7e033b867480c0afddcda161a6'), "%3Ctemplate%3E%3C/template%3E%3Cdiv%3E%3C/div%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E"],"aee883a65775489399a003b2371d58248a6aff6f":[async_test('html5lib_template.html aee883a65775489399a003b2371d58248a6aff6f'), "%3Chtml%3E%3Ctemplate%3EHello%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%22Hello%22%0A%7C%20%20%20%3Cbody%3E"],"89b17b54ab343191bf74ef5434f4d2cfac40ea97":[async_test('html5lib_template.html 89b17b54ab343191bf74ef5434f4d2cfac40ea97'), "%3Chead%3E%3Ctemplate%3E%3Cdiv%3E%3C/div%3E%3C/template%3E%3C/head%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%3Cbody%3E"],"c4433556c7414cfd71f27b420f1ffc4348774f5e":[async_test('html5lib_template.html c4433556c7414cfd71f27b420f1ffc4348774f5e'), "%3Cdiv%3E%3Ctemplate%3E%3Cdiv%3E%3Cspan%3E%3C/template%3E%3Cb%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%20%20%20%20%3Cb%3E"],"3dcce7d97108b3e9ea7fa96f240ac62bf280e74b":[async_test('html5lib_template.html 3dcce7d97108b3e9ea7fa96f240ac62bf280e74b'), "%3Cdiv%3E%3Ctemplate%3E%3C/div%3EHello", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%22Hello%22"],"a1f587f7ea85ccfe294bd45bfb501e850cb979e0":[async_test('html5lib_template.html a1f587f7ea85ccfe294bd45bfb501e850cb979e0'), "%3Cdiv%3E%3C/template%3E%3C/div%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E"],"cd26a7832f13bdc135697321ca6c2fecdca6ef5d":[async_test('html5lib_template.html cd26a7832f13bdc135697321ca6c2fecdca6ef5d'), "%3Ctable%3E%3Ctemplate%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content"],"e30571d90b0e56864499961eb7be955994cf72e2":[async_test('html5lib_template.html e30571d90b0e56864499961eb7be955994cf72e2'), "%3Ctable%3E%3Ctemplate%3E%3C/template%3E%3C/div%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content"],"01cbe9f6a25f286b08d8dc4f7b65421e8eb3500c":[async_test('html5lib_template.html 01cbe9f6a25f286b08d8dc4f7b65421e8eb3500c'), "%3Ctable%3E%3Cdiv%3E%3Ctemplate%3E%3C/template%3E%3C/div%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%3Ctable%3E"],"96cbbcdffe02c86a8b929604c2fd5f3571a18dbe":[async_test('html5lib_template.html 96cbbcdffe02c86a8b929604c2fd5f3571a18dbe'), "%3Ctable%3E%3Ctemplate%3E%3C/template%3E%3Cdiv%3E%3C/div%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content"],"d51676f55550e960dd0f5fa7fd0bdfa20bdde046":[async_test('html5lib_template.html d51676f55550e960dd0f5fa7fd0bdfa20bdde046'), "%3Ctable%3E%20%20%20%3Ctemplate%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%22%20%20%20%22%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content"],"f9dfd9acfd494489c899604649a01d864741f50f":[async_test('html5lib_template.html f9dfd9acfd494489c899604649a01d864741f50f'), "%3Ctable%3E%3Ctbody%3E%3Ctemplate%3E%3C/template%3E%3C/tbody%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content"],"ea00361c265d3ffb47ce636d919c94ca10d58911":[async_test('html5lib_template.html ea00361c265d3ffb47ce636d919c94ca10d58911'), "%3Ctable%3E%3Ctbody%3E%3Ctemplate%3E%3C/tbody%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content"],"d8ebfcf7694c9d04457e796ac73049210313602e":[async_test('html5lib_template.html d8ebfcf7694c9d04457e796ac73049210313602e'), "%3Ctable%3E%3Ctbody%3E%3Ctemplate%3E%3C/template%3E%3C/tbody%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content"],"b4d5e6fe9b92e2c8f54199d7cab3da383c42add0":[async_test('html5lib_template.html b4d5e6fe9b92e2c8f54199d7cab3da383c42add0'), "%3Ctable%3E%3Cthead%3E%3Ctemplate%3E%3C/template%3E%3C/thead%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Cthead%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content"],"07724ef8f7a4fa61c77ffcd5180d3101c4781502":[async_test('html5lib_template.html 07724ef8f7a4fa61c77ffcd5180d3101c4781502'), "%3Ctable%3E%3Ctfoot%3E%3Ctemplate%3E%3C/template%3E%3C/tfoot%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctfoot%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content"],"e90f8aae8fc690540b42b3ffa3e741e7c1dfbf43":[async_test('html5lib_template.html e90f8aae8fc690540b42b3ffa3e741e7c1dfbf43'), "%3Cselect%3E%3Ctemplate%3E%3C/template%3E%3C/select%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content"],"687bdf4adda88a316ec69fe20e84720acc5d1fe6":[async_test('html5lib_template.html 687bdf4adda88a316ec69fe20e84720acc5d1fe6'), "%3Cselect%3E%3Ctemplate%3E%3Coption%3E%3C/option%3E%3C/template%3E%3C/select%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Coption%3E"],"5b232642f472c2b4c0c7511fed464eebe686b427":[async_test('html5lib_template.html 5b232642f472c2b4c0c7511fed464eebe686b427'), "%3Ctemplate%3E%3Coption%3E%3C/option%3E%3C/select%3E%3Coption%3E%3C/option%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Coption%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Coption%3E%0A%7C%20%20%20%3Cbody%3E"],"dc1ac1830a881d1532a1e6fd6d0cfa56d6571da2":[async_test('html5lib_template.html dc1ac1830a881d1532a1e6fd6d0cfa56d6571da2'), "%3Cselect%3E%3Ctemplate%3E%3C/template%3E%3Coption%3E%3C/select%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%3Coption%3E"],"c58747a85e8b4f44d7ae63c04cdad783a903c25e":[async_test('html5lib_template.html c58747a85e8b4f44d7ae63c04cdad783a903c25e'), "%3Cselect%3E%3Coption%3E%3Ctemplate%3E%3C/template%3E%3C/select%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%3Coption%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content"],"ca59bfdaec7451f704973176fab46e582bd691b2":[async_test('html5lib_template.html ca59bfdaec7451f704973176fab46e582bd691b2'), "%3Cselect%3E%3Ctemplate%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content"],"cf807d6391a58c172b6c15c3b01d2a99ec0e6cf8":[async_test('html5lib_template.html cf807d6391a58c172b6c15c3b01d2a99ec0e6cf8'), "%3Cselect%3E%3Coption%3E%3C/option%3E%3Ctemplate%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%3Coption%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content"],"350b7ac850e46de79615308fc923649264406104":[async_test('html5lib_template.html 350b7ac850e46de79615308fc923649264406104'), "%3Cselect%3E%3Coption%3E%3C/option%3E%3Ctemplate%3E%3Coption%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%3Coption%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Coption%3E"],"a31ff44edf7f377543dabdda8141cda9bb6de134":[async_test('html5lib_template.html a31ff44edf7f377543dabdda8141cda9bb6de134'), "%3Ctable%3E%3Cthead%3E%3Ctemplate%3E%3Ctd%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Cthead%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"533c5c1b5f0d0cbb1ede2cc5ae927095c5b21f0b":[async_test('html5lib_template.html 533c5c1b5f0d0cbb1ede2cc5ae927095c5b21f0b'), "%3Ctable%3E%3Ctemplate%3E%3Cthead%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Cthead%3E"],"61f79e083005007853c4f8e431559ac8d3845cfd":[async_test('html5lib_template.html 61f79e083005007853c4f8e431559ac8d3845cfd'), "%3Cbody%3E%3Ctable%3E%3Ctemplate%3E%3Ctd%3E%3C/tr%3E%3Cdiv%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"e802e85f36792b176b73c102c0e8761d9478621d":[async_test('html5lib_template.html e802e85f36792b176b73c102c0e8761d9478621d'), "%3Ctable%3E%3Ctemplate%3E%3Cthead%3E%3C/template%3E%3C/thead%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Cthead%3E"],"51d0797ff7653cd7be34458d689146e08a666c7f":[async_test('html5lib_template.html 51d0797ff7653cd7be34458d689146e08a666c7f'), "%3Ctable%3E%3Cthead%3E%3Ctemplate%3E%3Ctr%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Cthead%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E"],"d60e4079a18bd6266740cc61d1ca736e9d5098ce":[async_test('html5lib_template.html d60e4079a18bd6266740cc61d1ca736e9d5098ce'), "%3Ctable%3E%3Ctemplate%3E%3Ctr%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E"],"308709292677b4d74c108a811ad7b7acd0bdfc9c":[async_test('html5lib_template.html 308709292677b4d74c108a811ad7b7acd0bdfc9c'), "%3Ctable%3E%3Ctr%3E%3Ctemplate%3E%3Ctd%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"8965cdf9c4e9936262e25c90c7a7f8673840a445":[async_test('html5lib_template.html 8965cdf9c4e9936262e25c90c7a7f8673840a445'), "%3Ctable%3E%3Ctemplate%3E%3Ctr%3E%3Ctemplate%3E%3Ctd%3E%3C/template%3E%3C/tr%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"7dccda789764beb489e09be10188af9347335d05":[async_test('html5lib_template.html 7dccda789764beb489e09be10188af9347335d05'), "%3Ctable%3E%3Ctemplate%3E%3Ctr%3E%3Ctemplate%3E%3Ctd%3E%3C/td%3E%3C/template%3E%3C/tr%3E%3C/template%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"e15be51c77e1a6de35568a099ed339440ce9426d":[async_test('html5lib_template.html e15be51c77e1a6de35568a099ed339440ce9426d'), "%3Ctable%3E%3Ctemplate%3E%3Ctd%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"503d3782e45940c19f096f360a092282b46ab1ea":[async_test('html5lib_template.html 503d3782e45940c19f096f360a092282b46ab1ea'), "%3Cbody%3E%3Ctemplate%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"b4ab56fd9e9cebf479d14adfa523c06d16483a5e":[async_test('html5lib_template.html b4ab56fd9e9cebf479d14adfa523c06d16483a5e'), "%3Cbody%3E%3Ctemplate%3E%3Ctemplate%3E%3Ctr%3E%3C/tr%3E%3C/template%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"cd8bc9521f9683086a9e8529dd97314a6869daeb":[async_test('html5lib_template.html cd8bc9521f9683086a9e8529dd97314a6869daeb'), "%3Ctable%3E%3Ccolgroup%3E%3Ctemplate%3E%3Ccol%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ccolgroup%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"f915e7b3407c24b28c3aad318e5693cc774020f4":[async_test('html5lib_template.html f915e7b3407c24b28c3aad318e5693cc774020f4'), "%3Cframeset%3E%3Ctemplate%3E%3Cframe%3E%3C/frame%3E%3C/template%3E%3C/frameset%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cframeset%3E%0A%7C%20%20%20%20%20%3Cframe%3E"],"3c5eb261787b3d15aff86fa61de773fd7e439b0e":[async_test('html5lib_template.html 3c5eb261787b3d15aff86fa61de773fd7e439b0e'), "%3Ctemplate%3E%3Cframe%3E%3C/frame%3E%3C/frameset%3E%3Cframe%3E%3C/frame%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%3Cbody%3E"],"2b57775750c198d4b98b23aed74ff80a866a01f5":[async_test('html5lib_template.html 2b57775750c198d4b98b23aed74ff80a866a01f5'), "%3Ctemplate%3E%3Cdiv%3E%3Cframeset%3E%3Cspan%3E%3C/span%3E%3C/div%3E%3Cspan%3E%3C/span%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%3Cbody%3E"],"dc3d016610f3ab532525a6c2871f03d6b62b0168":[async_test('html5lib_template.html dc3d016610f3ab532525a6c2871f03d6b62b0168'), "%3Cbody%3E%3Ctemplate%3E%3Cdiv%3E%3Cframeset%3E%3Cspan%3E%3C/span%3E%3C/div%3E%3Cspan%3E%3C/span%3E%3C/template%3E%3C/body%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cspan%3E"],"6a184d71d00580a26a8b6bd97aafe5503339f3f6":[async_test('html5lib_template.html 6a184d71d00580a26a8b6bd97aafe5503339f3f6'), "%3Cbody%3E%3Ctemplate%3E%3Cscript%3Evar%20i%20%3D%201%3B%3C/script%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cscript%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%22var%20i%20%3D%201%3B%22%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"ce570a6c4bcee8b72a03e25508c6dd72e3cc6c35":[async_test('html5lib_template.html ce570a6c4bcee8b72a03e25508c6dd72e3cc6c35'), "%3Cbody%3E%3Ctemplate%3E%3Ctr%3E%3Cdiv%3E%3C/div%3E%3C/tr%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"e0c3d922f7b1f1654f02f716c3d9b31198ce3385":[async_test('html5lib_template.html e0c3d922f7b1f1654f02f716c3d9b31198ce3385'), "%3Cbody%3E%3Ctemplate%3E%3Ctr%3E%3C/tr%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"87e67242bf6debcf3b7dca852d10aa0f7b625b28":[async_test('html5lib_template.html 87e67242bf6debcf3b7dca852d10aa0f7b625b28'), "%3Cbody%3E%3Ctemplate%3E%3Ctd%3E%3C/td%3E%3C/tr%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"35ac4d4c972a01d368ed0cacb41370efef0a644d":[async_test('html5lib_template.html 35ac4d4c972a01d368ed0cacb41370efef0a644d'), "%3Cbody%3E%3Ctemplate%3E%3Ctd%3E%3C/td%3E%3Ctbody%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"5226c39dfc2d624ad4191b4eacb7e40c7ae528eb":[async_test('html5lib_template.html 5226c39dfc2d624ad4191b4eacb7e40c7ae528eb'), "%3Cbody%3E%3Ctemplate%3E%3Ctd%3E%3C/td%3E%3Ccaption%3E%3C/caption%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"aa90cd4db6b12e0a47341914a90cc536eec32d64":[async_test('html5lib_template.html aa90cd4db6b12e0a47341914a90cc536eec32d64'), "%3Cbody%3E%3Ctemplate%3E%3Ctd%3E%3C/td%3E%3Ccolgroup%3E%3C/caption%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"48af1faf5fcf48a0854af5a5c33656d9ccf6736b":[async_test('html5lib_template.html 48af1faf5fcf48a0854af5a5c33656d9ccf6736b'), "%3Cbody%3E%3Ctemplate%3E%3Ctd%3E%3C/td%3E%3C/table%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"ed3a029ba5e7f59969d65a4fc490a8f13b098cb9":[async_test('html5lib_template.html ed3a029ba5e7f59969d65a4fc490a8f13b098cb9'), "%3Cbody%3E%3Ctemplate%3E%3Ctr%3E%3C/tr%3E%3Ctbody%3E%3Ctr%3E%3C/tr%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E"],"6c8880d54475ad9574e203dcf2e55820b123cc64":[async_test('html5lib_template.html 6c8880d54475ad9574e203dcf2e55820b123cc64'), "%3Cbody%3E%3Ctemplate%3E%3Ctr%3E%3C/tr%3E%3Ccaption%3E%3Ctr%3E%3C/tr%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E"],"275060925a844cb51b29bae660301de9780d68c8":[async_test('html5lib_template.html 275060925a844cb51b29bae660301de9780d68c8'), "%3Cbody%3E%3Ctemplate%3E%3Ctr%3E%3C/tr%3E%3C/table%3E%3Ctr%3E%3C/tr%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E"],"9f82f6ec4c0a48c1d4dfbe6803b94abd553aea88":[async_test('html5lib_template.html 9f82f6ec4c0a48c1d4dfbe6803b94abd553aea88'), "%3Cbody%3E%3Ctemplate%3E%3Cthead%3E%3C/thead%3E%3Ccaption%3E%3C/caption%3E%3Ctbody%3E%3C/tbody%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cthead%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ccaption%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctbody%3E"],"f094bf7e94a88b86c80a0643e70c8e5ff3354698":[async_test('html5lib_template.html f094bf7e94a88b86c80a0643e70c8e5ff3354698'), "%3Cbody%3E%3Ctemplate%3E%3Cthead%3E%3C/thead%3E%3C/table%3E%3Ctbody%3E%3C/tbody%3E%3C/template%3E%3C/body%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cthead%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctbody%3E"],"35a07ec3b4bf26ea407dc1ddf52f14195a714059":[async_test('html5lib_template.html 35a07ec3b4bf26ea407dc1ddf52f14195a714059'), "%3Cbody%3E%3Ctemplate%3E%3Cdiv%3E%3Ctr%3E%3C/tr%3E%3C/div%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"24faa53b271f994a4ff31d5796c8ff47d6f2c3e6":[async_test('html5lib_template.html 24faa53b271f994a4ff31d5796c8ff47d6f2c3e6'), "%3Cbody%3E%3Ctemplate%3E%3Cem%3EHello%3C/em%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cem%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%22Hello%22"],"0f1c491b58c2dd3c402a62e37f833bc1f1db8d21":[async_test('html5lib_template.html 0f1c491b58c2dd3c402a62e37f833bc1f1db8d21'), "%3Cbody%3E%3Ctemplate%3E%3C%21--comment--%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3C%21--%20comment%20--%3E"],"868d918a7b5d8b5c065c15229492bc2022bfbcba":[async_test('html5lib_template.html 868d918a7b5d8b5c065c15229492bc2022bfbcba'), "%3Cbody%3E%3Ctemplate%3E%3Cstyle%3E%3C/style%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cstyle%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"0538efa44e857596c556033a3821d424378aea3f":[async_test('html5lib_template.html 0538efa44e857596c556033a3821d424378aea3f'), "%3Cbody%3E%3Ctemplate%3E%3Cmeta%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cmeta%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"e7d7bf3973c70d3cf9b0adad2ebed9f25be48d66":[async_test('html5lib_template.html e7d7bf3973c70d3cf9b0adad2ebed9f25be48d66'), "%3Cbody%3E%3Ctemplate%3E%3Clink%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Clink%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"c69d0ac542d477b7312bb24981127b8aa8fdb1df":[async_test('html5lib_template.html c69d0ac542d477b7312bb24981127b8aa8fdb1df'), "%3Cbody%3E%3Ctable%3E%3Ccolgroup%3E%3Ctemplate%3E%3Ccol%3E%3C/col%3E%3C/template%3E%3C/colgroup%3E%3C/table%3E%3C/body%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ccolgroup%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"b496a8c13a7bd75b778bb0de489726aee952ae0c":[async_test('html5lib_template.html b496a8c13a7bd75b778bb0de489726aee952ae0c'), "%3Cbody%20a%3Db%3E%3Ctemplate%3E%3Cdiv%3E%3C/div%3E%3Cbody%20c%3Dd%3E%3Cdiv%3E%3C/div%3E%3C/body%3E%3C/template%3E%3C/body%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20a%3D%22b%22%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"5d6ee61de40274c9626ca78ee208d51276d5662d":[async_test('html5lib_template.html 5d6ee61de40274c9626ca78ee208d51276d5662d'), "%3Chtml%20a%3Db%3E%3Ctemplate%3E%3Cdiv%3E%3Chtml%20b%3Dc%3E%3Cspan%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20a%3D%22b%22%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%3Cbody%3E"],"9bd9687a65f258adc24450fc5cbd781fff6c038a":[async_test('html5lib_template.html 9bd9687a65f258adc24450fc5cbd781fff6c038a'), "%3Chtml%20a%3Db%3E%3Ctemplate%3E%3Ccol%3E%3C/col%3E%3Chtml%20b%3Dc%3E%3Ccol%3E%3C/col%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20a%3D%22b%22%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E%0A%7C%20%20%20%3Cbody%3E"],"db1baeb846d718c773324746524fbd68f2e9436e":[async_test('html5lib_template.html db1baeb846d718c773324746524fbd68f2e9436e'), "%3Chtml%20a%3Db%3E%3Ctemplate%3E%3Cframe%3E%3C/frame%3E%3Chtml%20b%3Dc%3E%3Cframe%3E%3C/frame%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20a%3D%22b%22%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%3Cbody%3E"],"4b0ce46c611dbcc016db272ef007f302bee0c897":[async_test('html5lib_template.html 4b0ce46c611dbcc016db272ef007f302bee0c897'), "%3Cbody%3E%3Ctemplate%3E%3Ctr%3E%3C/tr%3E%3Ctemplate%3E%3C/template%3E%3Ctd%3E%3C/td%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E"],"1a735e1c7f28f8701f3c7fd5e9404b8911916086":[async_test('html5lib_template.html 1a735e1c7f28f8701f3c7fd5e9404b8911916086'), "%3Cbody%3E%3Ctemplate%3E%3Cthead%3E%3C/thead%3E%3Ctemplate%3E%3Ctr%3E%3C/tr%3E%3C/template%3E%3Ctr%3E%3C/tr%3E%3Ctfoot%3E%3C/tfoot%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cthead%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctfoot%3E"],"0686eedec06b2db1dc283fac92c1ef1a33114c71":[async_test('html5lib_template.html 0686eedec06b2db1dc283fac92c1ef1a33114c71'), "%3Cbody%3E%3Ctemplate%3E%3Ctemplate%3E%3Cb%3E%3Ctemplate%3E%3C/template%3E%3C/template%3Etext%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cb%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%22text%22"],"d4dfb87ce626f12923056a6cd77448eaf4660ac2":[async_test('html5lib_template.html d4dfb87ce626f12923056a6cd77448eaf4660ac2'), "%3Cbody%3E%3Ctemplate%3E%3Ccol%3E%3Ccolgroup%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"1f295920f2937b2c8023b3761c43a0d4d9e5353c":[async_test('html5lib_template.html 1f295920f2937b2c8023b3761c43a0d4d9e5353c'), "%3Cbody%3E%3Ctemplate%3E%3Ccol%3E%3C/colgroup%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"3b91fa08fad923d387d924cff37fbf6b4c3a5712":[async_test('html5lib_template.html 3b91fa08fad923d387d924cff37fbf6b4c3a5712'), "%3Cbody%3E%3Ctemplate%3E%3Ccol%3E%3Ccolgroup%3E%3C/template%3E%3C/body%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"45a1c1ad5d99ad67c573096a79253996a664e01b":[async_test('html5lib_template.html 45a1c1ad5d99ad67c573096a79253996a664e01b'), "%3Cbody%3E%3Ctemplate%3E%3Ccol%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"0fe3a66773c6048c8f6f2c92f2611f65be972ec1":[async_test('html5lib_template.html 0fe3a66773c6048c8f6f2c92f2611f65be972ec1'), "%3Cbody%3E%3Ctemplate%3E%3Ccol%3E%3C/div%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"be40897ca411e1507197c31ab2a9f9752a05f769":[async_test('html5lib_template.html be40897ca411e1507197c31ab2a9f9752a05f769'), "%3Cbody%3E%3Ctemplate%3E%3Ccol%3EHello", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ccol%3E"],"dcfb1048ed5c40e406b4fbf0cde24c826713907f":[async_test('html5lib_template.html dcfb1048ed5c40e406b4fbf0cde24c826713907f'), "%3Cbody%3E%3Ctemplate%3E%3Ci%3E%3Cmenu%3EFoo%3C/i%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ci%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cmenu%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ci%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%22Foo%22"],"78263aeea68ac97903598682013bae9c0c21d547":[async_test('html5lib_template.html 78263aeea68ac97903598682013bae9c0c21d547'), "%3Cbody%3E%3Ctemplate%3E%3C/div%3E%3Cdiv%3EFoo%3C/div%3E%3Ctemplate%3E%3C/template%3E%3Ctr%3E%3C/tr%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%22Foo%22%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content"],"5aa177ef1a35bf4502dcb867d8e666288982ba99":[async_test('html5lib_template.html 5aa177ef1a35bf4502dcb867d8e666288982ba99'), "%3Cbody%3E%3Cdiv%3E%3Ctemplate%3E%3C/div%3E%3Ctr%3E%3Ctd%3EFoo%3C/td%3E%3C/tr%3E%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Foo%22"],"5d303375907dc4d4380b477e0317c17b660613e9":[async_test('html5lib_template.html 5d303375907dc4d4380b477e0317c17b660613e9'), "%3Ctemplate%3E%3C/figcaption%3E%3Csub%3E%3Ctable%3E%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Csub%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%3Cbody%3E"],"d822f726927c34b92fe102b13e63920850878f6a":[async_test('html5lib_template.html d822f726927c34b92fe102b13e63920850878f6a'), "%3Ctemplate%3E%3Ctemplate%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%3Cbody%3E"],"07acdcaeb4fa639296d46673cf28823ddf2a6ca7":[async_test('html5lib_template.html 07acdcaeb4fa639296d46673cf28823ddf2a6ca7'), "%3Ctemplate%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%3Cbody%3E"],"58bd846ce1be0caf7560fba2ef19e2c2070ab123":[async_test('html5lib_template.html 58bd846ce1be0caf7560fba2ef19e2c2070ab123'), "%3Ctemplate%3E%3Ctemplate%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%3Cbody%3E"],"8eeee377e5ab324731cc592f1fa8abe1045ad610":[async_test('html5lib_template.html 8eeee377e5ab324731cc592f1fa8abe1045ad610'), "%3Ctemplate%3E%3Ctemplate%3E%3Ctable%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%3Cbody%3E"],"b30690019090149132fc228a7261c5cf2fd149fc":[async_test('html5lib_template.html b30690019090149132fc228a7261c5cf2fd149fc'), "%3Ctemplate%3E%3Ctemplate%3E%3Ctbody%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%3Cbody%3E"],"67a209d928804f90fdb66d070201b23f3d0c8a42":[async_test('html5lib_template.html 67a209d928804f90fdb66d070201b23f3d0c8a42'), "%3Ctemplate%3E%3Ctemplate%3E%3Ctr%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%3Cbody%3E"],"12104886b8f87daa937eac30b5ff0e1e074eaa6f":[async_test('html5lib_template.html 12104886b8f87daa937eac30b5ff0e1e074eaa6f'), "%3Ctemplate%3E%3Ctemplate%3E%3Ctd%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%3Cbody%3E"],"483cc9957a7225fe435112642be59abb4c459a1e":[async_test('html5lib_template.html 483cc9957a7225fe435112642be59abb4c459a1e'), "%3Ctemplate%3E%3Ctemplate%3E%3Ccaption%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ccaption%3E%0A%7C%20%20%20%3Cbody%3E"],"72d8ac431a154c40ab75d53a258d9d80d47689eb":[async_test('html5lib_template.html 72d8ac431a154c40ab75d53a258d9d80d47689eb'), "%3Ctemplate%3E%3Ctemplate%3E%3Ccolgroup%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ccolgroup%3E%0A%7C%20%20%20%3Cbody%3E"],"1125967cbbcd404f4cb14d48270b8ec778970d77":[async_test('html5lib_template.html 1125967cbbcd404f4cb14d48270b8ec778970d77'), "%3Ctemplate%3E%3Ctemplate%3E%3Ccol%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ccol%3E%0A%7C%20%20%20%3Cbody%3E"],"32c963e164b9ec82c60e490bb141c1ccc70b992f":[async_test('html5lib_template.html 32c963e164b9ec82c60e490bb141c1ccc70b992f'), "%3Ctemplate%3E%3Ctemplate%3E%3Ctbody%3E%3Cselect%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%3Cbody%3E"],"574a95fc9c9f2de3aeaa0c9ee1e6967fc3d4770d":[async_test('html5lib_template.html 574a95fc9c9f2de3aeaa0c9ee1e6967fc3d4770d'), "%3Ctemplate%3E%3Ctemplate%3E%3Ctable%3EFoo", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%22Foo%22%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%3Cbody%3E"],"332863a7f9e61bff32bd3427ede7a088b790d453":[async_test('html5lib_template.html 332863a7f9e61bff32bd3427ede7a088b790d453'), "%3Ctemplate%3E%3Ctemplate%3E%3Cframe%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%3Cbody%3E"],"2121db07146781773df9e53b94fa921a805175ce":[async_test('html5lib_template.html 2121db07146781773df9e53b94fa921a805175ce'), "%3Ctemplate%3E%3Ctemplate%3E%3Cscript%3Evar%20i", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cscript%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22var%20i%22%0A%7C%20%20%20%3Cbody%3E"],"8675de267cd7e34f2febdee3feb665614d1562fe":[async_test('html5lib_template.html 8675de267cd7e34f2febdee3feb665614d1562fe'), "%3Ctemplate%3E%3Ctemplate%3E%3Cstyle%3Evar%20i", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cstyle%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22var%20i%22%0A%7C%20%20%20%3Cbody%3E"],"c5d26ad923a2b1e988ddd378ca4fb26eb48353e1":[async_test('html5lib_template.html c5d26ad923a2b1e988ddd378ca4fb26eb48353e1'), "%3Ctemplate%3E%3Ctable%3E%3C/template%3E%3Cbody%3E%3Cspan%3EFoo", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%20%20%20%20%22Foo%22"],"eec1542e2fa0e9eafb7f8d4a51eae56b5a31b3c8":[async_test('html5lib_template.html eec1542e2fa0e9eafb7f8d4a51eae56b5a31b3c8'), "%3Ctemplate%3E%3Ctd%3E%3C/template%3E%3Cbody%3E%3Cspan%3EFoo", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%20%20%20%20%22Foo%22"],"b79387a54c3b136db0f28ed96555ff683b3947fe":[async_test('html5lib_template.html b79387a54c3b136db0f28ed96555ff683b3947fe'), "%3Ctemplate%3E%3Cobject%3E%3C/template%3E%3Cbody%3E%3Cspan%3EFoo", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Cobject%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%20%20%20%20%22Foo%22"],"c477a29a4deb32d072a415fa809a84a4f2beee0c":[async_test('html5lib_template.html c477a29a4deb32d072a415fa809a84a4f2beee0c'), "%3Ctemplate%3E%3Csvg%3E%3Ctemplate%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Csvg%20svg%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Csvg%20template%3E%0A%7C%20%20%20%3Cbody%3E"],"26e4480c08e1f5f7b6ac8b8c1832ab0312e3b7c5":[async_test('html5lib_template.html 26e4480c08e1f5f7b6ac8b8c1832ab0312e3b7c5'), "%3Ctemplate%3E%3Csvg%3E%3Cfoo%3E%3Ctemplate%3E%3CforeignObject%3E%3Cdiv%3E%3C/template%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Csvg%20svg%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Csvg%20foo%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Csvg%20template%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Csvg%20foreignObject%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cdiv%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdiv%3E"],"24b3b50fdd0bf8d5cf2ebaa6bf502d7bcfde1da4":[async_test('html5lib_template.html 24b3b50fdd0bf8d5cf2ebaa6bf502d7bcfde1da4'), "%3Cdummy%3E%3Ctemplate%3E%3Cspan%3E%3C/dummy%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdummy%3E%0A%7C%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Cspan%3E"],"d3704c68528357189eb5826ab66eea071d6137a5":[async_test('html5lib_template.html d3704c68528357189eb5826ab66eea071d6137a5'), "%3Cbody%3E%3Ctable%3E%3Ctr%3E%3Ctd%3E%3Cselect%3E%3Ctemplate%3EFoo%3C/template%3E%3Ccaption%3EA%3C/table%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Ctbody%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cselect%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Foo%22%0A%7C%20%20%20%20%20%20%20%3Ccaption%3E%0A%7C%20%20%20%20%20%20%20%20%20%22A%22"],"d958f7d44faf772d1fb60f1a8f186f837ca735d9":[async_test('html5lib_template.html d958f7d44faf772d1fb60f1a8f186f837ca735d9'), "%3Cbody%3E%3C/body%3E%3Ctemplate%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content"],"3fc4d97fa68fc2658356bdbd4e051c867de8de53":[async_test('html5lib_template.html 3fc4d97fa68fc2658356bdbd4e051c867de8de53'), "%3Chead%3E%3C/head%3E%3Ctemplate%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%3Cbody%3E"],"94820107bbf3fab3f82de1f717e8413aead7d3a6":[async_test('html5lib_template.html 94820107bbf3fab3f82de1f717e8413aead7d3a6'), "%3Chead%3E%3C/head%3E%3Ctemplate%3EFoo%3C/template%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%22Foo%22%0A%7C%20%20%20%3Cbody%3E"],"657c00ebdda37ae060cc69633ed98482ccc29e18":[async_test('html5lib_template.html 657c00ebdda37ae060cc69633ed98482ccc29e18'), "%3C%21DOCTYPE%20HTML%3E%3Cdummy%3E%3Ctable%3E%3Ctemplate%3E%3Ctable%3E%3Ctemplate%3E%3Ctable%3E%3Cscript%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cdummy%3E%0A%7C%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cscript%3E"],"649fc955a4b60ab2a5b881d94c9493eb4a545002":[async_test('html5lib_template.html 649fc955a4b60ab2a5b881d94c9493eb4a545002'), "%3Ctemplate%3E%3Ca%3E%3Ctable%3E%3Ca%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ca%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ca%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%3Cbody%3E"],"977041956eb9c7b9db73935168aba92f77c079f6":[async_test('html5lib_template.html 977041956eb9c7b9db73935168aba92f77c079f6'), "%3C%21DOCTYPE%20HTML%3E%3Ctemplate%3E%3Ctr%3E%3Ctd%3Ecell%3C/td%3E%3C/tr%3E%3C/template%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%22cell%22%0A%7C%20%20%20%3Cbody%3E"],"fafee395fea124791df59bafeb1136342b64d3c6":[async_test('html5lib_template.html fafee395fea124791df59bafeb1136342b64d3c6'), "%3C%21DOCTYPE%20HTML%3E%3Ctemplate%3E%20%3Ctr%3E%20%3Ctd%3Ecell%3C/td%3E%20%3C/tr%3E%20%3C/template%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%22%20%22%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%22%20%22%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%22cell%22%0A%7C%20%20%20%20%20%20%20%20%20%20%20%22%20%22%0A%7C%20%20%20%20%20%20%20%20%20%22%20%22%0A%7C%20%20%20%3Cbody%3E"],"d5a8beecf5d3c53e947772ad887808d132334aa1":[async_test('html5lib_template.html d5a8beecf5d3c53e947772ad887808d132334aa1'), "%3C%21DOCTYPE%20HTML%3E%3Ctemplate%3E%3Ctr%3E%3Ctd%3Ecell%3C/td%3E%3C/tr%3Ea%3C/template%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%20%20%3Ctemplate%3E%0A%7C%20%20%20%20%20%20%20content%0A%7C%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%20%20%22cell%22%0A%7C%20%20%20%20%20%20%20%20%20%22a%22%0A%7C%20%20%20%3Cbody%3E"],
       }
       init_tests(get_type());
     </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_tests20.html b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_tests20.html
index 778017d..1bda41f 100644
--- a/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_tests20.html
+++ b/third_party/blink/web_tests/external/wpt/html/syntax/parsing/html5lib_tests20.html
@@ -18,9 +18,9 @@
     <script src="/resources/testharnessreport.js"></script>
     <script>
       var num_iframes = 8;
-      var order = ['cbb5f28bedf4361156ef3c9c37e314c6479be137','e108a4952601b4664098344189c875934ea2f7ab','8ecd0d9e2580f78ff920821bd334bd8d04d165e5','ff10749b8b1aca1fba5d07ba86f49612be43caf9','323a6d9f8d2f74e7e5b88599a87dc5673fb7a0b4','bb36fb89d118b55c66f17b24ffff0ca09ccc939b','3fed75e1a7f46a6e2a74a078bfd955e7de05de4f','8cb9d8f92ba130618646d6fd1f307ca73f4e4add','2b9e6cb75876b4a33b77ae4b1bd3ef5e73c4a40e','f95c6bf3f935fad9fc354f4cf6e0161d6ebfb08a','0b07b135bf8399742cc9e6f3d14b2ea32e3354d3','076d3588e85ce9566d9575d1564e72e8480fadc8','dfad8fc515d74c19bad1ab72e7a03d59a11c7778','7ff774f225899091d6d64e5512ada13ce32dd72a','2fd8cab5e3cc4635be76e2d430ad6fe6e79b8167','c7399a2e531694b47b436bd153823f60bba9071e','bc4092e0e1aaa4b97464005963345b4b38e1f2a1','d85e49fc5be07a699f3930464996d7ddb6a8e8bd','09cf43bae3a4d875da56c67a46cf79102b20b456','aa2a707a627408758a0ee845896ef088d6136013','bb0737ce6cdbbcc055771e2400afda545d58778f','454bb6d0471536f7b91793ddbc786761b5733902','3c8ff013bf2e80392671760c8d444730b1923c0a','9a4f0cd0bdc672beb1c1c821599a11fc8a3d139d','f5ca3a789b7451da3e6030443aee6fae734fc7a1','ca8826661175c3a1ff7c6f1ebbfe646b238deb75','9e30ae7bbd1193deb0d3599c071960d395ca01f7','4417ddedee8e753fd6e911192458168d3b77d1e8','2de333e449ca13c462832e799e13795e2cf6e3e4','23d4d0aee62db4adc7381010d80776270a6db47b','5463426618ff46188d19595aa1c7fdd86c6909b3','2649b566bd2bccc59813286d647269ad251e2fdf','5df7907b99976e4051d1dd433e2bdbeb4ce200e3','a7e70930137ff8338778253ac93dc66f11eef966','b92100bddc318e13996fbe96c087c35152cbb4e3','f55b68de8cf9ec17e0512a6caae94e0fbf151260','7fb0d4342e3ed3fabee650b83ce66ffb2f66c173','72a6100cd60dd49f780168137ed09e27a8090b34','09ee3f414d08c8a3923e7c72380868617d1a4554','3b854aa3549b6f5cac96176766fccd25c965b5fe','bbc36dce52efacdede3cf4d94582ace2a3fca9fc','d4b924764bf49ceb39aa4f63dc81b7c05bbda84d','19a6c1a25813323193c67a54904a41e389918f48',];
+      var order = ['cbb5f28bedf4361156ef3c9c37e314c6479be137','e108a4952601b4664098344189c875934ea2f7ab','1ba644a7934a55e4303effe43cae1517ee723e13','8999351d1342a9bcf670dc27eb52aa786d916916','8ecd0d9e2580f78ff920821bd334bd8d04d165e5','e6bf9f94617ae9cb7b663b2c9123a37730600e7f','c5c9728bb5634f47780efefa09f79419db4257c0','5bb84e30031c925aed6eabca8c477d547d522dbb','f1b6f41fa8856b408c3c398b420cbdc40cda555e','d5ea955e51df6ee9c7801d28dfcd85402b8fa710','27f2f34d4101ac4877edf0be8c4065e240aef15c','dcb10e242981a00dc3f6f874ec33318d6f532fff','49781179c56e3e0d4891dfff219a0beda3b86d24','86ac23e2828bb147966ee06690f6051345ce312c','b4eda259a29352b6f8f9cd989e1a0e881793814e','af0e7b907c6791a73f00b4421fa7fe7df6fe07ee','29c71813f1cd5f1ee092548211c8ffaf2d04b4a9','92547b083c29d3ea0ba5304953d254c357bcf11a','ff10749b8b1aca1fba5d07ba86f49612be43caf9','67bcf2e6d67c89c4d5d9c605faa6e5b03e77693f','1e284d72f2de23e31280a0df936043340597d3d0','323a6d9f8d2f74e7e5b88599a87dc5673fb7a0b4','2dd72ef48808b29f998fdd3df6ce7ce18b8753e4','c9e061e2d34063857d7332c66ff0d26beb2aced7','bae8a941fceb91845187cb545c8e02b03af5570d','bb36fb89d118b55c66f17b24ffff0ca09ccc939b','3fed75e1a7f46a6e2a74a078bfd955e7de05de4f','8cb9d8f92ba130618646d6fd1f307ca73f4e4add','2b9e6cb75876b4a33b77ae4b1bd3ef5e73c4a40e','f95c6bf3f935fad9fc354f4cf6e0161d6ebfb08a','0b07b135bf8399742cc9e6f3d14b2ea32e3354d3','076d3588e85ce9566d9575d1564e72e8480fadc8','dfad8fc515d74c19bad1ab72e7a03d59a11c7778','7ff774f225899091d6d64e5512ada13ce32dd72a','2fd8cab5e3cc4635be76e2d430ad6fe6e79b8167','c7399a2e531694b47b436bd153823f60bba9071e','bc4092e0e1aaa4b97464005963345b4b38e1f2a1','d85e49fc5be07a699f3930464996d7ddb6a8e8bd','09cf43bae3a4d875da56c67a46cf79102b20b456','f10ab9901d14c36846c9e6848abce19877f83094','aa2a707a627408758a0ee845896ef088d6136013','bb0737ce6cdbbcc055771e2400afda545d58778f','454bb6d0471536f7b91793ddbc786761b5733902','3c8ff013bf2e80392671760c8d444730b1923c0a','9a4f0cd0bdc672beb1c1c821599a11fc8a3d139d','f5ca3a789b7451da3e6030443aee6fae734fc7a1','ca8826661175c3a1ff7c6f1ebbfe646b238deb75','9e30ae7bbd1193deb0d3599c071960d395ca01f7','4417ddedee8e753fd6e911192458168d3b77d1e8','2de333e449ca13c462832e799e13795e2cf6e3e4','23d4d0aee62db4adc7381010d80776270a6db47b','5463426618ff46188d19595aa1c7fdd86c6909b3','2649b566bd2bccc59813286d647269ad251e2fdf','5df7907b99976e4051d1dd433e2bdbeb4ce200e3','a7e70930137ff8338778253ac93dc66f11eef966','b92100bddc318e13996fbe96c087c35152cbb4e3','f55b68de8cf9ec17e0512a6caae94e0fbf151260','7fb0d4342e3ed3fabee650b83ce66ffb2f66c173','72a6100cd60dd49f780168137ed09e27a8090b34','09ee3f414d08c8a3923e7c72380868617d1a4554','3b854aa3549b6f5cac96176766fccd25c965b5fe','bbc36dce52efacdede3cf4d94582ace2a3fca9fc','d4b924764bf49ceb39aa4f63dc81b7c05bbda84d','19a6c1a25813323193c67a54904a41e389918f48',];
       var tests = {
-          "cbb5f28bedf4361156ef3c9c37e314c6479be137":[async_test('html5lib_tests20.html cbb5f28bedf4361156ef3c9c37e314c6479be137'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cbutton%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E"],"e108a4952601b4664098344189c875934ea2f7ab":[async_test('html5lib_tests20.html e108a4952601b4664098344189c875934ea2f7ab'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Caddress%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Caddress%3E"],"8ecd0d9e2580f78ff920821bd334bd8d04d165e5":[async_test('html5lib_tests20.html 8ecd0d9e2580f78ff920821bd334bd8d04d165e5'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cblockquote%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cblockquote%3E"],"ff10749b8b1aca1fba5d07ba86f49612be43caf9":[async_test('html5lib_tests20.html ff10749b8b1aca1fba5d07ba86f49612be43caf9'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cmenu%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cmenu%3E"],"323a6d9f8d2f74e7e5b88599a87dc5673fb7a0b4":[async_test('html5lib_tests20.html 323a6d9f8d2f74e7e5b88599a87dc5673fb7a0b4'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cp%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cp%3E"],"bb36fb89d118b55c66f17b24ffff0ca09ccc939b":[async_test('html5lib_tests20.html bb36fb89d118b55c66f17b24ffff0ca09ccc939b'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cul%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cul%3E"],"3fed75e1a7f46a6e2a74a078bfd955e7de05de4f":[async_test('html5lib_tests20.html 3fed75e1a7f46a6e2a74a078bfd955e7de05de4f'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Ch1%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ch1%3E"],"8cb9d8f92ba130618646d6fd1f307ca73f4e4add":[async_test('html5lib_tests20.html 8cb9d8f92ba130618646d6fd1f307ca73f4e4add'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Ch6%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ch6%3E"],"2b9e6cb75876b4a33b77ae4b1bd3ef5e73c4a40e":[async_test('html5lib_tests20.html 2b9e6cb75876b4a33b77ae4b1bd3ef5e73c4a40e'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Clisting%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Clisting%3E"],"f95c6bf3f935fad9fc354f4cf6e0161d6ebfb08a":[async_test('html5lib_tests20.html f95c6bf3f935fad9fc354f4cf6e0161d6ebfb08a'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cpre%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cpre%3E"],"0b07b135bf8399742cc9e6f3d14b2ea32e3354d3":[async_test('html5lib_tests20.html 0b07b135bf8399742cc9e6f3d14b2ea32e3354d3'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cform%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cform%3E"],"076d3588e85ce9566d9575d1564e72e8480fadc8":[async_test('html5lib_tests20.html 076d3588e85ce9566d9575d1564e72e8480fadc8'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cli%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cli%3E"],"dfad8fc515d74c19bad1ab72e7a03d59a11c7778":[async_test('html5lib_tests20.html dfad8fc515d74c19bad1ab72e7a03d59a11c7778'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cdd%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cdd%3E"],"7ff774f225899091d6d64e5512ada13ce32dd72a":[async_test('html5lib_tests20.html 7ff774f225899091d6d64e5512ada13ce32dd72a'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cdt%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cdt%3E"],"2fd8cab5e3cc4635be76e2d430ad6fe6e79b8167":[async_test('html5lib_tests20.html 2fd8cab5e3cc4635be76e2d430ad6fe6e79b8167'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cplaintext%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cplaintext%3E"],"c7399a2e531694b47b436bd153823f60bba9071e":[async_test('html5lib_tests20.html c7399a2e531694b47b436bd153823f60bba9071e'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Ctable%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctable%3E"],"bc4092e0e1aaa4b97464005963345b4b38e1f2a1":[async_test('html5lib_tests20.html bc4092e0e1aaa4b97464005963345b4b38e1f2a1'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Chr%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Chr%3E"],"d85e49fc5be07a699f3930464996d7ddb6a8e8bd":[async_test('html5lib_tests20.html d85e49fc5be07a699f3930464996d7ddb6a8e8bd'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cxmp%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cxmp%3E"],"09cf43bae3a4d875da56c67a46cf79102b20b456":[async_test('html5lib_tests20.html 09cf43bae3a4d875da56c67a46cf79102b20b456'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3C/p%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cp%3E"],"aa2a707a627408758a0ee845896ef088d6136013":[async_test('html5lib_tests20.html aa2a707a627408758a0ee845896ef088d6136013'), "%3C%21doctype%20html%3E%3Caddress%3E%3Cbutton%3E%3C/address%3Ea", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Caddress%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%22a%22"],"bb0737ce6cdbbcc055771e2400afda545d58778f":[async_test('html5lib_tests20.html bb0737ce6cdbbcc055771e2400afda545d58778f'), "%3Cp%3E%3Ctable%3E%3C/p%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Ctable%3E"],"454bb6d0471536f7b91793ddbc786761b5733902":[async_test('html5lib_tests20.html 454bb6d0471536f7b91793ddbc786761b5733902'), "%3C%21doctype%20html%3E%3Csvg%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Csvg%20svg%3E"],"3c8ff013bf2e80392671760c8d444730b1923c0a":[async_test('html5lib_tests20.html 3c8ff013bf2e80392671760c8d444730b1923c0a'), "%3C%21doctype%20html%3E%3Cp%3E%3Cfigcaption%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%3Cfigcaption%3E"],"9a4f0cd0bdc672beb1c1c821599a11fc8a3d139d":[async_test('html5lib_tests20.html 9a4f0cd0bdc672beb1c1c821599a11fc8a3d139d'), "%3C%21doctype%20html%3E%3Cp%3E%3Csummary%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%3Csummary%3E"],"f5ca3a789b7451da3e6030443aee6fae734fc7a1":[async_test('html5lib_tests20.html f5ca3a789b7451da3e6030443aee6fae734fc7a1'), "%3C%21doctype%20html%3E%3Cform%3E%3Ctable%3E%3Cform%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cform%3E%0A%7C%20%20%20%20%20%20%20%3Ctable%3E"],"ca8826661175c3a1ff7c6f1ebbfe646b238deb75":[async_test('html5lib_tests20.html ca8826661175c3a1ff7c6f1ebbfe646b238deb75'), "%3C%21doctype%20html%3E%3Ctable%3E%3Cform%3E%3Cform%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Cform%3E"],"9e30ae7bbd1193deb0d3599c071960d395ca01f7":[async_test('html5lib_tests20.html 9e30ae7bbd1193deb0d3599c071960d395ca01f7'), "%3C%21doctype%20html%3E%3Ctable%3E%3Cform%3E%3C/table%3E%3Cform%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Cform%3E"],"4417ddedee8e753fd6e911192458168d3b77d1e8":[async_test('html5lib_tests20.html 4417ddedee8e753fd6e911192458168d3b77d1e8'), "%3C%21doctype%20html%3E%3Csvg%3E%3CforeignObject%3E%3Cp%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Csvg%20svg%3E%0A%7C%20%20%20%20%20%20%20%3Csvg%20foreignObject%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cp%3E"],"2de333e449ca13c462832e799e13795e2cf6e3e4":[async_test('html5lib_tests20.html 2de333e449ca13c462832e799e13795e2cf6e3e4'), "%3C%21doctype%20html%3E%3Csvg%3E%3Ctitle%3Eabc", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Csvg%20svg%3E%0A%7C%20%20%20%20%20%20%20%3Csvg%20title%3E%0A%7C%20%20%20%20%20%20%20%20%20%22abc%22"],"23d4d0aee62db4adc7381010d80776270a6db47b":[async_test('html5lib_tests20.html 23d4d0aee62db4adc7381010d80776270a6db47b'), "%3Coption%3E%3Cspan%3E%3Coption%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Coption%3E%0A%7C%20%20%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Coption%3E"],"5463426618ff46188d19595aa1c7fdd86c6909b3":[async_test('html5lib_tests20.html 5463426618ff46188d19595aa1c7fdd86c6909b3'), "%3Coption%3E%3Coption%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Coption%3E%0A%7C%20%20%20%20%20%3Coption%3E"],"2649b566bd2bccc59813286d647269ad251e2fdf":[async_test('html5lib_tests20.html 2649b566bd2bccc59813286d647269ad251e2fdf'), "%3Cmath%3E%3Cannotation-xml%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%3Cdiv%3E"],"5df7907b99976e4051d1dd433e2bdbeb4ce200e3":[async_test('html5lib_tests20.html 5df7907b99976e4051d1dd433e2bdbeb4ce200e3'), "%3Cmath%3E%3Cannotation-xml%20encoding%3D%22application/svg%2Bxml%22%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20encoding%3D%22application/svg%2Bxml%22%0A%7C%20%20%20%20%20%3Cdiv%3E"],"a7e70930137ff8338778253ac93dc66f11eef966":[async_test('html5lib_tests20.html a7e70930137ff8338778253ac93dc66f11eef966'), "%3Cmath%3E%3Cannotation-xml%20encoding%3D%22application/xhtml%2Bxml%22%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20encoding%3D%22application/xhtml%2Bxml%22%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"b92100bddc318e13996fbe96c087c35152cbb4e3":[async_test('html5lib_tests20.html b92100bddc318e13996fbe96c087c35152cbb4e3'), "%3Cmath%3E%3Cannotation-xml%20encoding%3D%22aPPlication/xhtmL%2BxMl%22%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20encoding%3D%22aPPlication/xhtmL%2BxMl%22%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"f55b68de8cf9ec17e0512a6caae94e0fbf151260":[async_test('html5lib_tests20.html f55b68de8cf9ec17e0512a6caae94e0fbf151260'), "%3Cmath%3E%3Cannotation-xml%20encoding%3D%22text/html%22%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20encoding%3D%22text/html%22%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"7fb0d4342e3ed3fabee650b83ce66ffb2f66c173":[async_test('html5lib_tests20.html 7fb0d4342e3ed3fabee650b83ce66ffb2f66c173'), "%3Cmath%3E%3Cannotation-xml%20encoding%3D%22Text/htmL%22%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20encoding%3D%22Text/htmL%22%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"72a6100cd60dd49f780168137ed09e27a8090b34":[async_test('html5lib_tests20.html 72a6100cd60dd49f780168137ed09e27a8090b34'), "%3Cmath%3E%3Cannotation-xml%20encoding%3D%22%20text/html%20%22%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20encoding%3D%22%20text/html%20%22%0A%7C%20%20%20%20%20%3Cdiv%3E"],"09ee3f414d08c8a3923e7c72380868617d1a4554":[async_test('html5lib_tests20.html 09ee3f414d08c8a3923e7c72380868617d1a4554'), "%3Cmath%3E%3Cannotation-xml%3E%20%3C/annotation-xml%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20%22%20%22"],"3b854aa3549b6f5cac96176766fccd25c965b5fe":[async_test('html5lib_tests20.html 3b854aa3549b6f5cac96176766fccd25c965b5fe'), "%3Cmath%3E%3Cannotation-xml%3Ec%3C/annotation-xml%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20%22c%22"],"bbc36dce52efacdede3cf4d94582ace2a3fca9fc":[async_test('html5lib_tests20.html bbc36dce52efacdede3cf4d94582ace2a3fca9fc'), "%3Cmath%3E%3Cannotation-xml%3E%3C%21--foo--%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20%3C%21--%20foo%20--%3E"],"d4b924764bf49ceb39aa4f63dc81b7c05bbda84d":[async_test('html5lib_tests20.html d4b924764bf49ceb39aa4f63dc81b7c05bbda84d'), "%3Cmath%3E%3Cannotation-xml%3E%3C/svg%3Ex", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20%22x%22"],"19a6c1a25813323193c67a54904a41e389918f48":[async_test('html5lib_tests20.html 19a6c1a25813323193c67a54904a41e389918f48'), "%3Cmath%3E%3Cannotation-xml%3E%3Csvg%3Ex", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Csvg%20svg%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%22x%22"],
+          "cbb5f28bedf4361156ef3c9c37e314c6479be137":[async_test('html5lib_tests20.html cbb5f28bedf4361156ef3c9c37e314c6479be137'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cbutton%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E"],"e108a4952601b4664098344189c875934ea2f7ab":[async_test('html5lib_tests20.html e108a4952601b4664098344189c875934ea2f7ab'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Caddress%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Caddress%3E"],"1ba644a7934a55e4303effe43cae1517ee723e13":[async_test('html5lib_tests20.html 1ba644a7934a55e4303effe43cae1517ee723e13'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Carticle%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Carticle%3E"],"8999351d1342a9bcf670dc27eb52aa786d916916":[async_test('html5lib_tests20.html 8999351d1342a9bcf670dc27eb52aa786d916916'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Caside%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Caside%3E"],"8ecd0d9e2580f78ff920821bd334bd8d04d165e5":[async_test('html5lib_tests20.html 8ecd0d9e2580f78ff920821bd334bd8d04d165e5'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cblockquote%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cblockquote%3E"],"e6bf9f94617ae9cb7b663b2c9123a37730600e7f":[async_test('html5lib_tests20.html e6bf9f94617ae9cb7b663b2c9123a37730600e7f'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Ccenter%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ccenter%3E"],"c5c9728bb5634f47780efefa09f79419db4257c0":[async_test('html5lib_tests20.html c5c9728bb5634f47780efefa09f79419db4257c0'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cdetails%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cdetails%3E"],"5bb84e30031c925aed6eabca8c477d547d522dbb":[async_test('html5lib_tests20.html 5bb84e30031c925aed6eabca8c477d547d522dbb'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cdialog%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cdialog%3E"],"f1b6f41fa8856b408c3c398b420cbdc40cda555e":[async_test('html5lib_tests20.html f1b6f41fa8856b408c3c398b420cbdc40cda555e'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cdir%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cdir%3E"],"d5ea955e51df6ee9c7801d28dfcd85402b8fa710":[async_test('html5lib_tests20.html d5ea955e51df6ee9c7801d28dfcd85402b8fa710'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cdiv%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"27f2f34d4101ac4877edf0be8c4065e240aef15c":[async_test('html5lib_tests20.html 27f2f34d4101ac4877edf0be8c4065e240aef15c'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cdl%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cdl%3E"],"dcb10e242981a00dc3f6f874ec33318d6f532fff":[async_test('html5lib_tests20.html dcb10e242981a00dc3f6f874ec33318d6f532fff'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cfieldset%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cfieldset%3E"],"49781179c56e3e0d4891dfff219a0beda3b86d24":[async_test('html5lib_tests20.html 49781179c56e3e0d4891dfff219a0beda3b86d24'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cfigcaption%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cfigcaption%3E"],"86ac23e2828bb147966ee06690f6051345ce312c":[async_test('html5lib_tests20.html 86ac23e2828bb147966ee06690f6051345ce312c'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cfigure%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cfigure%3E"],"b4eda259a29352b6f8f9cd989e1a0e881793814e":[async_test('html5lib_tests20.html b4eda259a29352b6f8f9cd989e1a0e881793814e'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cfooter%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cfooter%3E"],"af0e7b907c6791a73f00b4421fa7fe7df6fe07ee":[async_test('html5lib_tests20.html af0e7b907c6791a73f00b4421fa7fe7df6fe07ee'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cheader%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cheader%3E"],"29c71813f1cd5f1ee092548211c8ffaf2d04b4a9":[async_test('html5lib_tests20.html 29c71813f1cd5f1ee092548211c8ffaf2d04b4a9'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Chgroup%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Chgroup%3E"],"92547b083c29d3ea0ba5304953d254c357bcf11a":[async_test('html5lib_tests20.html 92547b083c29d3ea0ba5304953d254c357bcf11a'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cmain%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cmain%3E"],"ff10749b8b1aca1fba5d07ba86f49612be43caf9":[async_test('html5lib_tests20.html ff10749b8b1aca1fba5d07ba86f49612be43caf9'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cmenu%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cmenu%3E"],"67bcf2e6d67c89c4d5d9c605faa6e5b03e77693f":[async_test('html5lib_tests20.html 67bcf2e6d67c89c4d5d9c605faa6e5b03e77693f'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cnav%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cnav%3E"],"1e284d72f2de23e31280a0df936043340597d3d0":[async_test('html5lib_tests20.html 1e284d72f2de23e31280a0df936043340597d3d0'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Col%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Col%3E"],"323a6d9f8d2f74e7e5b88599a87dc5673fb7a0b4":[async_test('html5lib_tests20.html 323a6d9f8d2f74e7e5b88599a87dc5673fb7a0b4'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cp%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cp%3E"],"2dd72ef48808b29f998fdd3df6ce7ce18b8753e4":[async_test('html5lib_tests20.html 2dd72ef48808b29f998fdd3df6ce7ce18b8753e4'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Csearch%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Csearch%3E"],"c9e061e2d34063857d7332c66ff0d26beb2aced7":[async_test('html5lib_tests20.html c9e061e2d34063857d7332c66ff0d26beb2aced7'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Csection%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Csection%3E"],"bae8a941fceb91845187cb545c8e02b03af5570d":[async_test('html5lib_tests20.html bae8a941fceb91845187cb545c8e02b03af5570d'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Csummary%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Csummary%3E"],"bb36fb89d118b55c66f17b24ffff0ca09ccc939b":[async_test('html5lib_tests20.html bb36fb89d118b55c66f17b24ffff0ca09ccc939b'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cul%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cul%3E"],"3fed75e1a7f46a6e2a74a078bfd955e7de05de4f":[async_test('html5lib_tests20.html 3fed75e1a7f46a6e2a74a078bfd955e7de05de4f'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Ch1%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ch1%3E"],"8cb9d8f92ba130618646d6fd1f307ca73f4e4add":[async_test('html5lib_tests20.html 8cb9d8f92ba130618646d6fd1f307ca73f4e4add'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Ch6%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ch6%3E"],"2b9e6cb75876b4a33b77ae4b1bd3ef5e73c4a40e":[async_test('html5lib_tests20.html 2b9e6cb75876b4a33b77ae4b1bd3ef5e73c4a40e'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Clisting%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Clisting%3E"],"f95c6bf3f935fad9fc354f4cf6e0161d6ebfb08a":[async_test('html5lib_tests20.html f95c6bf3f935fad9fc354f4cf6e0161d6ebfb08a'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cpre%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cpre%3E"],"0b07b135bf8399742cc9e6f3d14b2ea32e3354d3":[async_test('html5lib_tests20.html 0b07b135bf8399742cc9e6f3d14b2ea32e3354d3'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cform%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cform%3E"],"076d3588e85ce9566d9575d1564e72e8480fadc8":[async_test('html5lib_tests20.html 076d3588e85ce9566d9575d1564e72e8480fadc8'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cli%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cli%3E"],"dfad8fc515d74c19bad1ab72e7a03d59a11c7778":[async_test('html5lib_tests20.html dfad8fc515d74c19bad1ab72e7a03d59a11c7778'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cdd%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cdd%3E"],"7ff774f225899091d6d64e5512ada13ce32dd72a":[async_test('html5lib_tests20.html 7ff774f225899091d6d64e5512ada13ce32dd72a'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cdt%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cdt%3E"],"2fd8cab5e3cc4635be76e2d430ad6fe6e79b8167":[async_test('html5lib_tests20.html 2fd8cab5e3cc4635be76e2d430ad6fe6e79b8167'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cplaintext%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cplaintext%3E"],"c7399a2e531694b47b436bd153823f60bba9071e":[async_test('html5lib_tests20.html c7399a2e531694b47b436bd153823f60bba9071e'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Ctable%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Ctable%3E"],"bc4092e0e1aaa4b97464005963345b4b38e1f2a1":[async_test('html5lib_tests20.html bc4092e0e1aaa4b97464005963345b4b38e1f2a1'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Chr%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Chr%3E"],"d85e49fc5be07a699f3930464996d7ddb6a8e8bd":[async_test('html5lib_tests20.html d85e49fc5be07a699f3930464996d7ddb6a8e8bd'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3Cxmp%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cxmp%3E"],"09cf43bae3a4d875da56c67a46cf79102b20b456":[async_test('html5lib_tests20.html 09cf43bae3a4d875da56c67a46cf79102b20b456'), "%3C%21doctype%20html%3E%3Cp%3E%3Cbutton%3E%3C/p%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cp%3E"],"f10ab9901d14c36846c9e6848abce19877f83094":[async_test('html5lib_tests20.html f10ab9901d14c36846c9e6848abce19877f83094'), "%3C%21doctype%20html%3E%3Cbutton%3E%3Cp%3E%3C/button%3Ex", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%22x%22"],"aa2a707a627408758a0ee845896ef088d6136013":[async_test('html5lib_tests20.html aa2a707a627408758a0ee845896ef088d6136013'), "%3C%21doctype%20html%3E%3Caddress%3E%3Cbutton%3E%3C/address%3Ea", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Caddress%3E%0A%7C%20%20%20%20%20%20%20%3Cbutton%3E%0A%7C%20%20%20%20%20%22a%22"],"bb0737ce6cdbbcc055771e2400afda545d58778f":[async_test('html5lib_tests20.html bb0737ce6cdbbcc055771e2400afda545d58778f'), "%3Cp%3E%3Ctable%3E%3C/p%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%20%20%3Ctable%3E"],"454bb6d0471536f7b91793ddbc786761b5733902":[async_test('html5lib_tests20.html 454bb6d0471536f7b91793ddbc786761b5733902'), "%3C%21doctype%20html%3E%3Csvg%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Csvg%20svg%3E"],"3c8ff013bf2e80392671760c8d444730b1923c0a":[async_test('html5lib_tests20.html 3c8ff013bf2e80392671760c8d444730b1923c0a'), "%3C%21doctype%20html%3E%3Cp%3E%3Cfigcaption%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%3Cfigcaption%3E"],"9a4f0cd0bdc672beb1c1c821599a11fc8a3d139d":[async_test('html5lib_tests20.html 9a4f0cd0bdc672beb1c1c821599a11fc8a3d139d'), "%3C%21doctype%20html%3E%3Cp%3E%3Csummary%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cp%3E%0A%7C%20%20%20%20%20%3Csummary%3E"],"f5ca3a789b7451da3e6030443aee6fae734fc7a1":[async_test('html5lib_tests20.html f5ca3a789b7451da3e6030443aee6fae734fc7a1'), "%3C%21doctype%20html%3E%3Cform%3E%3Ctable%3E%3Cform%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cform%3E%0A%7C%20%20%20%20%20%20%20%3Ctable%3E"],"ca8826661175c3a1ff7c6f1ebbfe646b238deb75":[async_test('html5lib_tests20.html ca8826661175c3a1ff7c6f1ebbfe646b238deb75'), "%3C%21doctype%20html%3E%3Ctable%3E%3Cform%3E%3Cform%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Cform%3E"],"9e30ae7bbd1193deb0d3599c071960d395ca01f7":[async_test('html5lib_tests20.html 9e30ae7bbd1193deb0d3599c071960d395ca01f7'), "%3C%21doctype%20html%3E%3Ctable%3E%3Cform%3E%3C/table%3E%3Cform%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Ctable%3E%0A%7C%20%20%20%20%20%20%20%3Cform%3E"],"4417ddedee8e753fd6e911192458168d3b77d1e8":[async_test('html5lib_tests20.html 4417ddedee8e753fd6e911192458168d3b77d1e8'), "%3C%21doctype%20html%3E%3Csvg%3E%3CforeignObject%3E%3Cp%3E", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Csvg%20svg%3E%0A%7C%20%20%20%20%20%20%20%3Csvg%20foreignObject%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Cp%3E"],"2de333e449ca13c462832e799e13795e2cf6e3e4":[async_test('html5lib_tests20.html 2de333e449ca13c462832e799e13795e2cf6e3e4'), "%3C%21doctype%20html%3E%3Csvg%3E%3Ctitle%3Eabc", "%23document%0A%7C%20%3C%21DOCTYPE%20html%3E%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Csvg%20svg%3E%0A%7C%20%20%20%20%20%20%20%3Csvg%20title%3E%0A%7C%20%20%20%20%20%20%20%20%20%22abc%22"],"23d4d0aee62db4adc7381010d80776270a6db47b":[async_test('html5lib_tests20.html 23d4d0aee62db4adc7381010d80776270a6db47b'), "%3Coption%3E%3Cspan%3E%3Coption%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Coption%3E%0A%7C%20%20%20%20%20%20%20%3Cspan%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Coption%3E"],"5463426618ff46188d19595aa1c7fdd86c6909b3":[async_test('html5lib_tests20.html 5463426618ff46188d19595aa1c7fdd86c6909b3'), "%3Coption%3E%3Coption%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Coption%3E%0A%7C%20%20%20%20%20%3Coption%3E"],"2649b566bd2bccc59813286d647269ad251e2fdf":[async_test('html5lib_tests20.html 2649b566bd2bccc59813286d647269ad251e2fdf'), "%3Cmath%3E%3Cannotation-xml%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%3Cdiv%3E"],"5df7907b99976e4051d1dd433e2bdbeb4ce200e3":[async_test('html5lib_tests20.html 5df7907b99976e4051d1dd433e2bdbeb4ce200e3'), "%3Cmath%3E%3Cannotation-xml%20encoding%3D%22application/svg%2Bxml%22%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20encoding%3D%22application/svg%2Bxml%22%0A%7C%20%20%20%20%20%3Cdiv%3E"],"a7e70930137ff8338778253ac93dc66f11eef966":[async_test('html5lib_tests20.html a7e70930137ff8338778253ac93dc66f11eef966'), "%3Cmath%3E%3Cannotation-xml%20encoding%3D%22application/xhtml%2Bxml%22%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20encoding%3D%22application/xhtml%2Bxml%22%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"b92100bddc318e13996fbe96c087c35152cbb4e3":[async_test('html5lib_tests20.html b92100bddc318e13996fbe96c087c35152cbb4e3'), "%3Cmath%3E%3Cannotation-xml%20encoding%3D%22aPPlication/xhtmL%2BxMl%22%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20encoding%3D%22aPPlication/xhtmL%2BxMl%22%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"f55b68de8cf9ec17e0512a6caae94e0fbf151260":[async_test('html5lib_tests20.html f55b68de8cf9ec17e0512a6caae94e0fbf151260'), "%3Cmath%3E%3Cannotation-xml%20encoding%3D%22text/html%22%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20encoding%3D%22text/html%22%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"7fb0d4342e3ed3fabee650b83ce66ffb2f66c173":[async_test('html5lib_tests20.html 7fb0d4342e3ed3fabee650b83ce66ffb2f66c173'), "%3Cmath%3E%3Cannotation-xml%20encoding%3D%22Text/htmL%22%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20encoding%3D%22Text/htmL%22%0A%7C%20%20%20%20%20%20%20%20%20%3Cdiv%3E"],"72a6100cd60dd49f780168137ed09e27a8090b34":[async_test('html5lib_tests20.html 72a6100cd60dd49f780168137ed09e27a8090b34'), "%3Cmath%3E%3Cannotation-xml%20encoding%3D%22%20text/html%20%22%3E%3Cdiv%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20encoding%3D%22%20text/html%20%22%0A%7C%20%20%20%20%20%3Cdiv%3E"],"09ee3f414d08c8a3923e7c72380868617d1a4554":[async_test('html5lib_tests20.html 09ee3f414d08c8a3923e7c72380868617d1a4554'), "%3Cmath%3E%3Cannotation-xml%3E%20%3C/annotation-xml%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20%22%20%22"],"3b854aa3549b6f5cac96176766fccd25c965b5fe":[async_test('html5lib_tests20.html 3b854aa3549b6f5cac96176766fccd25c965b5fe'), "%3Cmath%3E%3Cannotation-xml%3Ec%3C/annotation-xml%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20%22c%22"],"bbc36dce52efacdede3cf4d94582ace2a3fca9fc":[async_test('html5lib_tests20.html bbc36dce52efacdede3cf4d94582ace2a3fca9fc'), "%3Cmath%3E%3Cannotation-xml%3E%3C%21--foo--%3E", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20%3C%21--%20foo%20--%3E"],"d4b924764bf49ceb39aa4f63dc81b7c05bbda84d":[async_test('html5lib_tests20.html d4b924764bf49ceb39aa4f63dc81b7c05bbda84d'), "%3Cmath%3E%3Cannotation-xml%3E%3C/svg%3Ex", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20%22x%22"],"19a6c1a25813323193c67a54904a41e389918f48":[async_test('html5lib_tests20.html 19a6c1a25813323193c67a54904a41e389918f48'), "%3Cmath%3E%3Cannotation-xml%3E%3Csvg%3Ex", "%23document%0A%7C%20%3Chtml%3E%0A%7C%20%20%20%3Chead%3E%0A%7C%20%20%20%3Cbody%3E%0A%7C%20%20%20%20%20%3Cmath%20math%3E%0A%7C%20%20%20%20%20%20%20%3Cmath%20annotation-xml%3E%0A%7C%20%20%20%20%20%20%20%20%20%3Csvg%20svg%3E%0A%7C%20%20%20%20%20%20%20%20%20%20%20%22x%22"],
       }
       init_tests(get_type());
     </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/syntax/serializing-html-fragments/serializing.html.ini b/third_party/blink/web_tests/external/wpt/html/syntax/serializing-html-fragments/serializing.html.ini
new file mode 100644
index 0000000..eaae033
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/syntax/serializing-html-fragments/serializing.html.ini
@@ -0,0 +1,18 @@
+[serializing.html]
+  [innerHTML 7 <a b="<"></a>]
+    expected: FAIL
+
+  [innerHTML 8 <a b=">"></a>]
+    expected: FAIL
+
+  [innerHTML 9 <a href="javascript:&quot;<>&quot;"></a>]
+    expected: FAIL
+
+  [outerHTML 7 <span><a b="<"></a></span>]
+    expected: FAIL
+
+  [outerHTML 8 <span><a b=">"></a></span>]
+    expected: FAIL
+
+  [outerHTML 9 <span><a href="javascript:&quot;<>&quot;"></a></span>]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/tools/html5lib_revision b/third_party/blink/web_tests/external/wpt/html/tools/html5lib_python_revision
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/html/tools/html5lib_revision
rename to third_party/blink/web_tests/external/wpt/html/tools/html5lib_python_revision
diff --git a/third_party/blink/web_tests/external/wpt/html/tools/html5lib_tests_revision b/third_party/blink/web_tests/external/wpt/html/tools/html5lib_tests_revision
new file mode 100644
index 0000000..4535af2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/tools/html5lib_tests_revision
@@ -0,0 +1 @@
+95417e63a22e6624013558fd5a7d44d0265491b9
diff --git a/third_party/blink/web_tests/external/wpt/html/tools/update_html5lib_tests.py b/third_party/blink/web_tests/external/wpt/html/tools/update_html5lib_tests.py
index 7ad9bc6..2374bb0 100644
--- a/third_party/blink/web_tests/external/wpt/html/tools/update_html5lib_tests.py
+++ b/third_party/blink/web_tests/external/wpt/html/tools/update_html5lib_tests.py
@@ -47,21 +47,52 @@
 
 
 class Html5libInstall:
-    def __init__(self, rev=None):
+    def __init__(self, rev=None, tests_rev=None):
         self.html5lib_dir = None
         self.rev = rev
+        self.tests_rev = tests_rev
 
     def __enter__(self):
         self.html5lib_dir = tempfile.TemporaryDirectory()
         html5lib_path = self.html5lib_dir.__enter__()
-        subprocess.check_call(["git", "clone", "--no-checkout", "https://github.com/html5lib/html5lib-python.git", "html5lib"],
-                              cwd=html5lib_path)
+        html5lib_python_path = os.path.join(html5lib_path, "html5lib")
+        html5lib_tests_path = os.path.join(
+            html5lib_python_path, "html5lib", "tests", "testdata"
+        )
+
+        subprocess.check_call(
+            [
+                "git",
+                "clone",
+                "--no-checkout",
+                "https://github.com/html5lib/html5lib-python.git",
+                "html5lib",
+            ],
+            cwd=html5lib_path,
+        )
+
         rev = self.rev if self.rev is not None else "origin/master"
-        subprocess.check_call(["git", "checkout", rev],
-                              cwd=os.path.join(html5lib_path, "html5lib"))
+        subprocess.check_call(
+            ["git", "checkout", rev], cwd=html5lib_python_path
+        )
+
+        subprocess.check_call(
+            [
+                "git",
+                "submodule",
+                "update",
+                "--init",
+                "--recursive",
+            ],
+            cwd=html5lib_python_path,
+        )
+
         subprocess.check_call(["pip", "install", "-e", "html5lib"], cwd=html5lib_path)
         reload(site)
 
+        tests_rev = self.tests_rev if self.tests_rev is not None else "origin/master"
+        subprocess.check_call(["git", "checkout", tests_rev], cwd=html5lib_tests_path)
+
     def __exit__(self, *args, **kwargs):
         subprocess.call(["pip", "uninstall", "-y", "html5lib"], cwd=self.html5lib_dir.name)
         self.html5lib_dir.__exit__(*args, **kwargs)
@@ -132,10 +163,13 @@
 
     test_files = []
     inner_html_files = []
-    with open(os.path.join(script_dir, "html5lib_revision"), "r") as f:
+    with open(os.path.join(script_dir, "html5lib_python_revision"), "r") as f:
         html5lib_rev = f.read().strip()
 
-    with Html5libInstall(html5lib_rev):
+    with open(os.path.join(script_dir, "html5lib_tests_revision"), "r") as f:
+        html5lib_tests_rev = f.read().strip()
+
+    with Html5libInstall(html5lib_rev, html5lib_tests_rev):
         from html5lib.tests import support
 
         if len(sys.argv) > 2:
diff --git a/third_party/blink/web_tests/external/wpt/long-animation-frame/tentative/loaf-script-block.html.ini b/third_party/blink/web_tests/external/wpt/long-animation-frame/tentative/loaf-script-block.html.ini
index a4e25bf..47ff043 100644
--- a/third_party/blink/web_tests/external/wpt/long-animation-frame/tentative/loaf-script-block.html.ini
+++ b/third_party/blink/web_tests/external/wpt/long-animation-frame/tentative/loaf-script-block.html.ini
@@ -1,8 +1,4 @@
 [loaf-script-block.html]
-  [LoAF script: http://web-platform.test:8001/long-animation-frame/tentative/resources/busy.js module-script,]
-    expected:
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, FAIL]
-
   [LoAF script: http://web-platform.test:8001/long-animation-frame/tentative/resources/busy.js?import execute-script,]
     expected:
-      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, FAIL]
+      if (product == "content_shell") and (os == "linux") and (flag_specific == ""): [FAIL, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/mathml/crashtests/mspace-mpadded-negative-dimensions.html b/third_party/blink/web_tests/external/wpt/mathml/crashtests/mspace-mpadded-negative-dimensions.html
new file mode 100644
index 0000000..97ae5b8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/crashtests/mspace-mpadded-negative-dimensions.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1421195">
+<math><mspace width="-1px"/></math>
+<math><mspace height="-1px"/></math>
+<math><mspace depth="-1px"/></math>
+<math><mspace height="-2px" depth="1px"/></math>
+<math><mspace height="1px" depth="-2px"/></math>
+<math><mpadded width="-1px"/></math>
+<math><mpadded height="-1px"/></math>
+<math><mpadded depth="-1px"/></math>
+<math><mpadded height="-2px" depth="1px"></mpadded></math>
+<math><mpadded height="1px" depth="-2px"></mpadded></math>
+<math><mpadded lspace="-1px"/></math>
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.http-rp/opt-in/worklet-animation-import-data.https.html.ini b/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.http-rp/opt-in/worklet-animation-import-data.https.html.ini
new file mode 100644
index 0000000..a3b30621
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.http-rp/opt-in/worklet-animation-import-data.https.html.ini
@@ -0,0 +1,6 @@
+[worklet-animation-import-data.https.html]
+  [Mixed-Content: Expects allowed for worklet-animation-import-data to same-https origin and keep-scheme redirection from https context.]
+    expected: FAIL
+
+  [Mixed-Content: Expects allowed for worklet-animation-import-data to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.http-rp/opt-in/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.http-rp/opt-in/worklet-animation.https.html.ini
new file mode 100644
index 0000000..ef66d3e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.http-rp/opt-in/worklet-animation.https.html.ini
@@ -0,0 +1,6 @@
+[worklet-animation.https.html]
+  [Mixed-Content: Expects allowed for worklet-animation to same-https origin and keep-scheme redirection from https context.]
+    expected: FAIL
+
+  [Mixed-Content: Expects allowed for worklet-animation to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.meta/opt-in/worklet-animation-import-data.https.html.ini b/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.meta/opt-in/worklet-animation-import-data.https.html.ini
new file mode 100644
index 0000000..1d27046
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.meta/opt-in/worklet-animation-import-data.https.html.ini
@@ -0,0 +1,3 @@
+[worklet-animation-import-data.https.html]
+  [Mixed-Content: Expects allowed for worklet-animation-import-data to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.meta/opt-in/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.meta/opt-in/worklet-animation.https.html.ini
new file mode 100644
index 0000000..ab0c9b7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.meta/opt-in/worklet-animation.https.html.ini
@@ -0,0 +1,3 @@
+[worklet-animation.https.html]
+  [Mixed-Content: Expects allowed for worklet-animation to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.meta/unset/worklet-animation-import-data.https.html.ini b/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.meta/unset/worklet-animation-import-data.https.html.ini
new file mode 100644
index 0000000..a3b30621
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.meta/unset/worklet-animation-import-data.https.html.ini
@@ -0,0 +1,6 @@
+[worklet-animation-import-data.https.html]
+  [Mixed-Content: Expects allowed for worklet-animation-import-data to same-https origin and keep-scheme redirection from https context.]
+    expected: FAIL
+
+  [Mixed-Content: Expects allowed for worklet-animation-import-data to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.meta/unset/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.meta/unset/worklet-animation.https.html.ini
new file mode 100644
index 0000000..ef66d3e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mixed-content/gen/top.meta/unset/worklet-animation.https.html.ini
@@ -0,0 +1,6 @@
+[worklet-animation.https.html]
+  [Mixed-Content: Expects allowed for worklet-animation to same-https origin and keep-scheme redirection from https context.]
+    expected: FAIL
+
+  [Mixed-Content: Expects allowed for worklet-animation to same-https origin and no-redirect redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/selection-direction.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/shadow-dom/selection-direction.tentative-expected.txt
new file mode 100644
index 0000000..f79147f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/shadow-dom/selection-direction.tentative-expected.txt
@@ -0,0 +1,10 @@
+This is a testharness.js-based test.
+FAIL direction returns "none" when there is no selection assert_equals: expected (string) "none" but got (undefined) undefined
+FAIL direction returns "forward" when there is a forward-direction selection in the document tree assert_equals: expected (string) "forward" but got (undefined) undefined
+FAIL direction returns "backward" when there is a backward-direction selection in the document tree assert_equals: expected (string) "backward" but got (undefined) undefined
+FAIL direction returns "forward" when there is a forward selection in the shadow tree assert_equals: expected (string) "forward" but got (undefined) undefined
+FAIL direction returns "backward" when there is a backward selection in the shadow tree assert_equals: expected (string) "backward" but got (undefined) undefined
+FAIL direction returns "forward" when there is a forward selection that crosses shadow boundaries assert_equals: expected (string) "forward" but got (undefined) undefined
+FAIL direction returns "backward" when there is a forward selection that crosses shadow boundaries assert_equals: expected (string) "backward" but got (undefined) undefined
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/selection-direction.tentative.html b/third_party/blink/web_tests/external/wpt/shadow-dom/selection-direction.tentative.html
new file mode 100644
index 0000000..3a2512d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/shadow-dom/selection-direction.tentative.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+<body>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="Selection's direction should return none, forwad, or backward">
+<link rel="help" href="https://w3c.github.io/selection-api/#dom-selection-getcomposedrange">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="container"></div>
+<script>
+
+test(() => {
+    getSelection().removeAllRanges();
+    assert_equals(getSelection().direction, 'none');
+}, 'direction returns "none" when there is no selection');
+
+test(() => {
+    container.innerHTML = 'hello, world';
+    getSelection().setBaseAndExtent(container.firstChild, 0, container.firstChild, 5);
+    assert_equals(getSelection().direction, 'forward');
+}, 'direction returns "forward" when there is a forward-direction selection in the document tree');
+
+test(() => {
+    container.innerHTML = 'hello, world';
+    getSelection().setBaseAndExtent(container.firstChild, 4, container.firstChild, 3);
+    assert_equals(getSelection().direction, 'backward');
+}, 'direction returns "backward" when there is a backward-direction selection in the document tree');
+
+test(() => {
+    container.innerHTML = 'a<div id="host"></div>b';
+    const shadowRoot = host.attachShadow({mode: 'closed'});
+    shadowRoot.innerHTML = 'hello, world';
+    getSelection().setBaseAndExtent(shadowRoot.firstChild, 0, shadowRoot.firstChild, 5);
+    assert_equals(getSelection().direction, 'forward');
+}, 'direction returns "forward" when there is a forward selection in the shadow tree');
+
+test(() => {
+    container.innerHTML = 'a<div id="host"></div>b';
+    const shadowRoot = host.attachShadow({mode: 'closed'});
+    shadowRoot.innerHTML = 'hello, world';
+    getSelection().setBaseAndExtent(shadowRoot.firstChild, 5, shadowRoot.firstChild, 3);
+    assert_equals(getSelection().direction, 'backward');
+}, 'direction returns "backward" when there is a backward selection in the shadow tree');
+
+test(() => {
+    container.innerHTML = 'a<div id="host"></div>b';
+    const shadowRoot = host.attachShadow({mode: 'closed'});
+    shadowRoot.innerHTML = 'hello, world';
+    getSelection().setBaseAndExtent(shadowRoot.firstChild, 7, container, 2);
+    assert_equals(getSelection().direction, 'forward');
+}, 'direction returns "forward" when there is a forward selection that crosses shadow boundaries');
+
+test(() => {
+    container.innerHTML = 'a<div id="host"></div>b';
+    const shadowRoot = host.attachShadow({mode: 'closed'});
+    shadowRoot.innerHTML = 'hello, world';
+    getSelection().setBaseAndExtent(shadowRoot.firstChild, 7, container, 1);
+    assert_equals(getSelection().direction, 'backward');
+}, 'direction returns "backward" when there is a forward selection that crosses shadow boundaries');
+
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/selection-direction.tentative.html.ini b/third_party/blink/web_tests/external/wpt/shadow-dom/selection-direction.tentative.html.ini
new file mode 100644
index 0000000..3d480fc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/shadow-dom/selection-direction.tentative.html.ini
@@ -0,0 +1,21 @@
+[selection-direction.tentative.html]
+  [direction returns "backward" when there is a backward selection in the shadow tree]
+    expected: FAIL
+
+  [direction returns "backward" when there is a backward-direction selection in the document tree]
+    expected: FAIL
+
+  [direction returns "backward" when there is a forward selection that crosses shadow boundaries]
+    expected: FAIL
+
+  [direction returns "forward" when there is a forward selection in the shadow tree]
+    expected: FAIL
+
+  [direction returns "forward" when there is a forward selection that crosses shadow boundaries]
+    expected: FAIL
+
+  [direction returns "forward" when there is a forward-direction selection in the document tree]
+    expected: FAIL
+
+  [direction returns "none" when there is no selection]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/selection-getComposedRanges.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/shadow-dom/selection-getComposedRanges.tentative-expected.txt
new file mode 100644
index 0000000..924a4ab
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/shadow-dom/selection-getComposedRanges.tentative-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+FAIL getComposedRanges returns an empty sequence when there is no selection getSelection(...).getComposedRanges is not a function
+FAIL getComposedRanges returns a sequence with a static range when there is a forward-direction selection in the document tree getSelection(...).getComposedRanges is not a function
+FAIL getComposedRanges returns a sequence with a static range when there is a backward-direction selection in the document tree getSelection(...).getComposedRanges is not a function
+FAIL getComposedRanges returns a sequence with a static range pointing to a shadaw tree when there is a selection in the shadow tree and the shadow tree is specified as an argument getSelection(...).getComposedRanges is not a function
+FAIL getComposedRanges returns a sequence with a static range pointing to the shadow host when there is a selection in a shadow tree and the shadow tree is not specified as an argument getSelection(...).getComposedRanges is not a function
+FAIL getComposedRanges a sequence with a static range pointing to the shadow host when there is a forward selection that crosses shadow boundaries and the shadow tree is not specified as an argument getSelection(...).getComposedRanges is not a function
+FAIL getComposedRanges a sequence with a static range that crosses shadow boundaries when there is a forward selection that crosses shadow boundaries and the shadow tree is specified as an argument getSelection(...).getComposedRanges is not a function
+FAIL getComposedRanges returns a sequence with a static range pointing to the outer shadow host when there is a selection in an inner shadow tree and no shadow tree is specified as an argument getSelection(...).getComposedRanges is not a function
+FAIL getComposedRanges returns a sequence with a static range pointing to the inner shadow tree when there is a selection in an inner shadow tree and the inner shadow tree is specified as an argument getSelection(...).getComposedRanges is not a function
+FAIL getComposedRanges returns a sequence with a static range pointing to the outer shadow tree when there is a selection in an inner shadow tree and the outer shadow tree is specified as an argument getSelection(...).getComposedRanges is not a function
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/selection-getComposedRanges.tentative.html b/third_party/blink/web_tests/external/wpt/shadow-dom/selection-getComposedRanges.tentative.html
new file mode 100644
index 0000000..9833286
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/shadow-dom/selection-getComposedRanges.tentative.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<html>
+<body>
+<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
+<meta name="assert" content="Selection's getComposedRanges should return a sequence of static ranges">
+<link rel="help" href="https://w3c.github.io/selection-api/#dom-selection-getcomposedrange">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="container"></div>
+<script>
+
+test(() => {
+    getSelection().removeAllRanges();
+    assert_array_equals(getSelection().getComposedRanges(), []);
+}, 'getComposedRanges returns an empty sequence when there is no selection');
+
+test(() => {
+    container.innerHTML = 'hello, world';
+    getSelection().setBaseAndExtent(container.firstChild, 0, container.firstChild, 5);
+    const ranges = getSelection().getComposedRanges();
+    assert_equals(ranges.length, 1);
+    assert_equals(ranges[0].startContainer, container.firstChild);
+    assert_equals(ranges[0].startOffset, 0);
+    assert_equals(ranges[0].endContainer, container.firstChild);
+    assert_equals(ranges[0].endOffset, 5);
+}, 'getComposedRanges returns a sequence with a static range when there is a forward-direction selection in the document tree');
+
+test(() => {
+    container.innerHTML = 'hello, world';
+    getSelection().setBaseAndExtent(container.firstChild, 4, container.firstChild, 3);
+    const ranges = getSelection().getComposedRanges();
+    assert_equals(ranges.length, 1);
+    assert_equals(ranges[0].startContainer, container.firstChild);
+    assert_equals(ranges[0].startOffset, 3);
+    assert_equals(ranges[0].endContainer, container.firstChild);
+    assert_equals(ranges[0].endOffset, 4);
+}, 'getComposedRanges returns a sequence with a static range when there is a backward-direction selection in the document tree');
+
+test(() => {
+    container.innerHTML = 'a<div id="host"></div>b';
+    const shadowRoot = host.attachShadow({mode: 'closed'});
+    shadowRoot.innerHTML = 'hello, world';
+    getSelection().setBaseAndExtent(shadowRoot.firstChild, 0, shadowRoot.firstChild, 5);
+    const ranges = getSelection().getComposedRanges(shadowRoot);
+    assert_equals(ranges.length, 1);
+    assert_equals(ranges[0].startContainer, shadowRoot.firstChild);
+    assert_equals(ranges[0].startOffset, 0);
+    assert_equals(ranges[0].endContainer, shadowRoot.firstChild);
+    assert_equals(ranges[0].endOffset, 5);
+}, 'getComposedRanges returns a sequence with a static range pointing to a shadaw tree when there is a selection in the shadow tree and the shadow tree is specified as an argument');
+
+test(() => {
+    container.innerHTML = 'a<div id="host"></div>b';
+    const shadowRoot = host.attachShadow({mode: 'closed'});
+    shadowRoot.innerHTML = 'hello, world';
+    getSelection().setBaseAndExtent(shadowRoot.firstChild, 0, shadowRoot.firstChild, 5);
+    const ranges = getSelection().getComposedRanges();
+    assert_equals(ranges.length, 1);
+    assert_equals(ranges[0].startContainer, container);
+    assert_equals(ranges[0].startOffset, 1);
+    assert_equals(ranges[0].endContainer, container);
+    assert_equals(ranges[0].endOffset, 2);
+}, 'getComposedRanges returns a sequence with a static range pointing to the shadow host when there is a selection in a shadow tree and the shadow tree is not specified as an argument');
+
+test(() => {
+    container.innerHTML = 'a<div id="host"></div>b';
+    const shadowRoot = host.attachShadow({mode: 'closed'});
+    shadowRoot.innerHTML = 'hello, world';
+    getSelection().setBaseAndExtent(shadowRoot.firstChild, 7, container, 2);
+    const ranges = getSelection().getComposedRanges();
+    assert_equals(ranges.length, 1);
+    assert_equals(ranges[0].startContainer, container);
+    assert_equals(ranges[0].startOffset, 1);
+    assert_equals(ranges[0].endContainer, container);
+    assert_equals(ranges[0].endOffset, 2);
+}, 'getComposedRanges a sequence with a static range pointing to the shadow host when there is a forward selection that crosses shadow boundaries and the shadow tree is not specified as an argument');
+
+test(() => {
+    container.innerHTML = 'a<div id="host"></div>b';
+    const shadowRoot = host.attachShadow({mode: 'closed'});
+    shadowRoot.innerHTML = 'hello, world';
+    getSelection().setBaseAndExtent(shadowRoot.firstChild, 7, container, 2);
+    const ranges = getSelection().getComposedRanges(shadowRoot);
+    assert_equals(ranges.length, 1);
+    assert_equals(ranges[0].startContainer, shadowRoot.firstChild);
+    assert_equals(ranges[0].startOffset, 7);
+    assert_equals(ranges[0].endContainer, container);
+    assert_equals(ranges[0].endOffset, 2);
+}, 'getComposedRanges a sequence with a static range that crosses shadow boundaries when there is a forward selection that crosses shadow boundaries and the shadow tree is specified as an argument');
+
+test(() => {
+    container.innerHTML = 'a<div id="outerHost"></div>b';
+    const outerShadowRoot = outerHost.attachShadow({mode: 'closed'});
+    outerShadowRoot.innerHTML = '<div id="innerHost">hello</div><div>world</div>';
+    const innerHost = outerShadowRoot.getElementById('innerHost');
+    const innerShadowRoot = innerHost.attachShadow({mode: 'closed'});
+    innerShadowRoot.innerHTML = 'some text';
+    getSelection().setBaseAndExtent(innerShadowRoot.firstChild, 5, innerShadowRoot.firstChild, 9);
+    const ranges = getSelection().getComposedRanges();
+    assert_equals(ranges.length, 1);
+    assert_equals(ranges[0].startContainer, container);
+    assert_equals(ranges[0].startOffset, 1);
+    assert_equals(ranges[0].endContainer, container);
+    assert_equals(ranges[0].endOffset, 2);
+}, 'getComposedRanges returns a sequence with a static range pointing to the outer shadow host when there is a selection in an inner shadow tree and no shadow tree is specified as an argument');
+
+test(() => {
+    container.innerHTML = 'a<div id="outerHost"></div>b';
+    const outerShadowRoot = outerHost.attachShadow({mode: 'closed'});
+    outerShadowRoot.innerHTML = '<div id="innerHost">hello</div><div>world</div>';
+    const innerHost = outerShadowRoot.getElementById('innerHost');
+    const innerShadowRoot = innerHost.attachShadow({mode: 'closed'});
+    innerShadowRoot.innerHTML = 'some text';
+    getSelection().setBaseAndExtent(innerShadowRoot.firstChild, 5, innerShadowRoot.firstChild, 9);
+    const ranges = getSelection().getComposedRanges(innerShadowRoot);
+    assert_equals(ranges.length, 1);
+    assert_equals(ranges[0].startContainer, innerShadowRoot.firstChild);
+    assert_equals(ranges[0].startOffset, 5);
+    assert_equals(ranges[0].endContainer, innerShadowRoot.firstChild);
+    assert_equals(ranges[0].endOffset, 9);
+}, 'getComposedRanges returns a sequence with a static range pointing to the inner shadow tree when there is a selection in an inner shadow tree and the inner shadow tree is specified as an argument');
+
+test(() => {
+    container.innerHTML = 'a<div id="outerHost"></div>b';
+    const outerShadowRoot = outerHost.attachShadow({mode: 'closed'});
+    outerShadowRoot.innerHTML = '<div id="innerHost">hello</div><div>world</div>';
+    const innerHost = outerShadowRoot.getElementById('innerHost');
+    const innerShadowRoot = innerHost.attachShadow({mode: 'closed'});
+    innerShadowRoot.innerHTML = 'some text';
+    getSelection().setBaseAndExtent(innerShadowRoot.firstChild, 5, innerShadowRoot.firstChild, 9);
+    const ranges = getSelection().getComposedRanges(outerShadowRoot);
+    assert_equals(ranges.length, 1);
+    assert_equals(ranges[0].startContainer, outerShadowRoot);
+    assert_equals(ranges[0].startOffset, 0);
+    assert_equals(ranges[0].endContainer, outerShadowRoot);
+    assert_equals(ranges[0].endOffset, 1);
+}, 'getComposedRanges returns a sequence with a static range pointing to the outer shadow tree when there is a selection in an inner shadow tree and the outer shadow tree is specified as an argument');
+
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/selection-getComposedRanges.tentative.html.ini b/third_party/blink/web_tests/external/wpt/shadow-dom/selection-getComposedRanges.tentative.html.ini
new file mode 100644
index 0000000..5bc733b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/shadow-dom/selection-getComposedRanges.tentative.html.ini
@@ -0,0 +1,30 @@
+[selection-getComposedRanges.tentative.html]
+  [getComposedRanges a sequence with a static range pointing to the shadow host when there is a forward selection that crosses shadow boundaries and the shadow tree is not specified as an argument]
+    expected: FAIL
+
+  [getComposedRanges a sequence with a static range that crosses shadow boundaries when there is a forward selection that crosses shadow boundaries and the shadow tree is specified as an argument]
+    expected: FAIL
+
+  [getComposedRanges returns a sequence with a static range pointing to a shadaw tree when there is a selection in the shadow tree and the shadow tree is specified as an argument]
+    expected: FAIL
+
+  [getComposedRanges returns a sequence with a static range pointing to the inner shadow tree when there is a selection in an inner shadow tree and the inner shadow tree is specified as an argument]
+    expected: FAIL
+
+  [getComposedRanges returns a sequence with a static range pointing to the outer shadow host when there is a selection in an inner shadow tree and no shadow tree is specified as an argument]
+    expected: FAIL
+
+  [getComposedRanges returns a sequence with a static range pointing to the outer shadow tree when there is a selection in an inner shadow tree and the outer shadow tree is specified as an argument]
+    expected: FAIL
+
+  [getComposedRanges returns a sequence with a static range pointing to the shadow host when there is a selection in a shadow tree and the shadow tree is not specified as an argument]
+    expected: FAIL
+
+  [getComposedRanges returns a sequence with a static range when there is a backward-direction selection in the document tree]
+    expected: FAIL
+
+  [getComposedRanges returns a sequence with a static range when there is a forward-direction selection in the document tree]
+    expected: FAIL
+
+  [getComposedRanges returns an empty sequence when there is no selection]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/document-rules.https.html.ini b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/document-rules.https.html.ini
index b7662df..a926331 100644
--- a/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/document-rules.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/speculation-rules/prefetch/document-rules.https.html.ini
@@ -13,11 +13,21 @@
     expected: FAIL
 
 
+[document-rules.https.html?include=linkHrefChanged]
+  [test that changing the href of an invalid link to a matching value triggers a prefetch]
+    expected: FAIL
+
+
 [document-rules.https.html?include=linkInShadowTree]
   [test that matching link in a shadow tree is prefetched]
     expected: FAIL
 
 
+[document-rules.https.html?include=newRuleSetAdded]
+  [test that adding a second rule set triggers prefetch]
+    expected: FAIL
+
+
 [document-rules.https.html?include=not]
   [test document rule with negation predicate]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-origin-iframe.sub.https.window.js.ini b/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-origin-iframe.sub.https.window.js.ini
deleted file mode 100644
index ddc9604..0000000
--- a/third_party/blink/web_tests/external/wpt/storage-access-api/requestStorageAccess-cross-origin-iframe.sub.https.window.js.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-[requestStorageAccess-cross-origin-iframe.sub.https.window.html]
-  [[cross-origin-frame\] document.requestStorageAccess() should be rejected with a NotAllowedError with denied permission]
-    expected: FAIL
-
-  [[cross-origin-frame\] document.requestStorageAccess() should be rejected with a NotAllowedError without permission grant]
-    expected: FAIL
-
-  [[cross-origin-frame\] document.requestStorageAccess() should resolve in top-level frame or same-origin iframe, otherwise reject with a NotAllowedError with no user gesture.]
-    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html.ini b/third_party/blink/web_tests/external/wpt/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html.ini
index e00108c..3b2d85b 100644
--- a/third_party/blink/web_tests/external/wpt/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/trust-tokens/trust-token-parameter-validation-xhr.tentative.https.html.ini
@@ -1,8 +1,8 @@
 [trust-token-parameter-validation-xhr.tentative.https.html]
-  [Setting XHR Trust Tokens parameters requires that the XHR request be open.]
+  [Setting XHR Private Token parameters requires that the XHR request be open.]
     expected: FAIL
 
-  [Setting XHR Trust Tokens parameters requires that the XHR request not have been sent.]
+  [Setting XHR Private Token parameters requires that the XHR request not have been sent.]
     expected: FAIL
 
   [Since localhost URLs are potentially trustworthy, setting an issuer to localhost should succeed.]
diff --git a/third_party/blink/web_tests/external/wpt/trust-tokens/trust-token-parameter-validation.tentative.https.html.ini b/third_party/blink/web_tests/external/wpt/trust-tokens/trust-token-parameter-validation.tentative.https.html.ini
index 3f69376b..82e8dd2 100644
--- a/third_party/blink/web_tests/external/wpt/trust-tokens/trust-token-parameter-validation.tentative.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/trust-tokens/trust-token-parameter-validation.tentative.https.html.ini
@@ -1,21 +1,21 @@
 [trust-token-parameter-validation.tentative.https.html]
-  [Trust Tokens fetches require present `type` values.]
+  [Private Token fetches require present `type` values.]
     expected: FAIL
 
-  [Trust Tokens fetches require secure issuer URLs, if provided.]
+  [Private Token fetches require secure issuer URLs, if provided.]
     expected: FAIL
 
-  [Trust Tokens fetches require valid `refreshPolicy:` values, if provided.]
+  [Private Token fetches require valid `refreshPolicy:` values, if provided.]
     expected: FAIL
 
-  [Trust Tokens fetches require valid `type` values.]
+  [Private Token fetches require valid `type` values.]
     expected: FAIL
 
-  [Trust Tokens signing operations require at least one issuer URL]
+  [Private Token signing operations require at least one issuer URL]
     expected: FAIL
 
-  [Trust Tokens signing operations require string issuer URLs, if provided.]
+  [Private Token signing operations require string issuer URLs, if provided.]
     expected: FAIL
 
-  [Trust Tokens signing operations require valid issuer URLs, if provided.]
+  [Private Token signing operations require valid issuer URLs, if provided.]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/iframe-blank-inherit.meta/upgrade/worklet-animation-import-data.https.html.ini b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/iframe-blank-inherit.meta/upgrade/worklet-animation-import-data.https.html.ini
new file mode 100644
index 0000000..848048d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/iframe-blank-inherit.meta/upgrade/worklet-animation-import-data.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation-import-data.https.html]
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to cross-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to cross-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to cross-https origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to same-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to same-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to same-https origin and downgrade redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/iframe-blank-inherit.meta/upgrade/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/iframe-blank-inherit.meta/upgrade/worklet-animation.https.html.ini
new file mode 100644
index 0000000..0712a2bf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/iframe-blank-inherit.meta/upgrade/worklet-animation.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation.https.html]
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to cross-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to cross-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to cross-https origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to same-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to same-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to same-https origin and downgrade redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/srcdoc-inherit.meta/upgrade/worklet-animation-import-data.https.html.ini b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/srcdoc-inherit.meta/upgrade/worklet-animation-import-data.https.html.ini
new file mode 100644
index 0000000..848048d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/srcdoc-inherit.meta/upgrade/worklet-animation-import-data.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation-import-data.https.html]
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to cross-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to cross-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to cross-https origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to same-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to same-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to same-https origin and downgrade redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/srcdoc-inherit.meta/upgrade/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/srcdoc-inherit.meta/upgrade/worklet-animation.https.html.ini
new file mode 100644
index 0000000..0712a2bf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/srcdoc-inherit.meta/upgrade/worklet-animation.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation.https.html]
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to cross-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to cross-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to cross-https origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to same-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to same-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to same-https origin and downgrade redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/top.http-rp/upgrade/worklet-animation-import-data.https.html.ini b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/top.http-rp/upgrade/worklet-animation-import-data.https.html.ini
new file mode 100644
index 0000000..848048d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/top.http-rp/upgrade/worklet-animation-import-data.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation-import-data.https.html]
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to cross-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to cross-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to cross-https origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to same-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to same-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to same-https origin and downgrade redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/top.http-rp/upgrade/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/top.http-rp/upgrade/worklet-animation.https.html.ini
new file mode 100644
index 0000000..0712a2bf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/top.http-rp/upgrade/worklet-animation.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation.https.html]
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to cross-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to cross-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to cross-https origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to same-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to same-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to same-https origin and downgrade redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/top.meta/upgrade/worklet-animation-import-data.https.html.ini b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/top.meta/upgrade/worklet-animation-import-data.https.html.ini
new file mode 100644
index 0000000..848048d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/top.meta/upgrade/worklet-animation-import-data.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation-import-data.https.html]
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to cross-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to cross-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to cross-https origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to same-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to same-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation-import-data to same-https origin and downgrade redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/top.meta/upgrade/worklet-animation.https.html.ini b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/top.meta/upgrade/worklet-animation.https.html.ini
new file mode 100644
index 0000000..0712a2bf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/upgrade-insecure-requests/gen/top.meta/upgrade/worklet-animation.https.html.ini
@@ -0,0 +1,18 @@
+[worklet-animation.https.html]
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to cross-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to cross-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to cross-https origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to same-http-downgrade origin and downgrade redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to same-http-downgrade origin and no-redirect redirection from https context.]
+    expected: FAIL
+
+  [Upgrade-Insecure-Requests: Expects allowed for worklet-animation to same-https origin and downgrade redirection from https context.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/finished.html.ini b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/finished.html.ini
new file mode 100644
index 0000000..b79ed9d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/finished.html.ini
@@ -0,0 +1,4 @@
+[finished.html]
+  [Test finished promise changes for animation duration changes]
+    expected:
+      if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [FAIL, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html.ini b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html.ini
index 3bf7607..c2a51399 100644
--- a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/mediaElementAudioSourceToScriptProcessorTest.html.ini
@@ -1,5 +1,6 @@
 [mediaElementAudioSourceToScriptProcessorTest.html]
   [All data processed correctly]
     expected:
-      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [FAIL, PASS]
       if (product == "content_shell") and (os == "linux") and (flag_specific == ""): FAIL
+      if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): FAIL
+      if product == "chrome": [FAIL, PASS]
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/execute_async_script/collections.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/execute_async_script/collections.py
index a9d9e63..5dfbf205 100644
--- a/third_party/blink/web_tests/external/wpt/webdriver/tests/execute_async_script/collections.py
+++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/execute_async_script/collections.py
@@ -23,6 +23,17 @@
     assert_success(response, [1, 2])
 
 
+def test_dom_token_list(session, inline):
+    session.url = inline("""<div class="no cheese">foo</div>""")
+    element = session.find.css("div", all=False)
+
+    response = execute_async_script(
+        session, "arguments[1](arguments[0].classList)", args=[element])
+    value = assert_success(response)
+
+    assert value == ["no", "cheese"]
+
+
 def test_file_list(session, tmpdir, inline):
     files = [tmpdir.join("foo.txt"), tmpdir.join("bar.txt")]
 
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/execute_script/collections.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/execute_script/collections.py
index 3a6c247..ec5d5ee1 100644
--- a/third_party/blink/web_tests/external/wpt/webdriver/tests/execute_script/collections.py
+++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/execute_script/collections.py
@@ -19,6 +19,16 @@
     assert_success(response, [1, 2])
 
 
+def test_dom_token_list(session, inline):
+    session.url = inline("""<div class="no cheese">foo</div>""")
+    element = session.find.css("div", all=False)
+
+    response = execute_script(session, "return arguments[0].classList", args=[element])
+    value = assert_success(response)
+
+    assert value == ["no", "cheese"]
+
+
 def test_file_list(session, tmpdir, inline):
     files = [tmpdir.join("foo.txt"), tmpdir.join("bar.txt")]
 
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/get_element_property/get.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/get_element_property/get.py
index 84e4e89..bb63481 100644
--- a/third_party/blink/web_tests/external/wpt/webdriver/tests/get_element_property/get.py
+++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/get_element_property/get.py
@@ -137,6 +137,16 @@
     assert_success(response, py_primitive)
 
 
+def test_collection_dom_token_list(session, inline):
+    session.url = inline("""<div class="no cheese">""")
+    element = session.find.css("div", all=False)
+
+    response = get_element_property(session, element.id, "classList")
+    value = assert_success(response)
+
+    assert value == ["no", "cheese"]
+
+
 @pytest.mark.parametrize("js_primitive,py_primitive", [
     ("\"foobar\"", "foobar"),
     (42, 42),
diff --git a/third_party/blink/web_tests/external/wpt/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html.ini b/third_party/blink/web_tests/external/wpt/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html.ini
index 0b2d13f..e5e8b90 100644
--- a/third_party/blink/web_tests/external/wpt/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html.ini
@@ -1,3 +1,6 @@
 [RTCRtpTransceiver-headerExtensionControl.html]
+  [Extensions can be deactivated on a per-mline basis]
+    expected: FAIL
+
   [the set of negotiated extensions is the set of unstopped extensions]
     expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/worklets/animation-worklet-credentials.https.html.ini b/third_party/blink/web_tests/external/wpt/worklets/animation-worklet-credentials.https.html.ini
new file mode 100644
index 0000000..f8b9a8b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/worklets/animation-worklet-credentials.https.html.ini
@@ -0,0 +1,24 @@
+[animation-worklet-credentials.https.html]
+  [Importing a remote-origin script with credentials=include should send the credentials]
+    expected: FAIL
+
+  [Importing a remote-origin script with credentials=omit should not send the credentials]
+    expected: FAIL
+
+  [Importing a remote-origin script with credentials=same-origin should not send the credentials]
+    expected: FAIL
+
+  [Importing a remote-origin script with the default WorkletOptions should not send the credentials]
+    expected: FAIL
+
+  [Importing a same-origin script with credentials=include should send the credentials]
+    expected: FAIL
+
+  [Importing a same-origin script with credentials=omit should not send the credentials]
+    expected: FAIL
+
+  [Importing a same-origin script with credentials=same-origin should send the credentials]
+    expected: FAIL
+
+  [Importing a same-origin script with the default WorkletOptions should send the credentials]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/worklets/animation-worklet-csp.https.html.ini b/third_party/blink/web_tests/external/wpt/worklets/animation-worklet-csp.https.html.ini
new file mode 100644
index 0000000..9f506567
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/worklets/animation-worklet-csp.https.html.ini
@@ -0,0 +1,75 @@
+[animation-worklet-csp.https.html]
+  expected:
+    if product == "chrome": OK
+    ERROR
+  [A remote-origin worklet importing a remote-origin script should be blocked by the script-src 'self' directive.]
+    expected: FAIL
+
+  [A remote-origin worklet importing a remote-origin script should not be blocked because the script-src * directive allows it.]
+    expected: FAIL
+
+  [A remote-origin worklet importing a remote-origin script should not be blocked because the script-src directive specifying the origin allows it.]
+    expected: FAIL
+
+  [A remote-origin worklet importing a remote-origin script should not be blocked by the worker-src directive because worklets obey the script-src directive.]
+    expected: FAIL
+
+  [A remote-origin worklet should be blocked by the script-src 'self' directive.]
+    expected: FAIL
+
+  [A remote-origin worklet should not be blocked because the script-src * directive allows it.]
+    expected: FAIL
+
+  [A remote-origin worklet should not be blocked because the script-src directive specifying the origin allows it.]
+    expected: FAIL
+
+  [A remote-origin worklet should not be blocked by the worker-src directive because worklets obey the script-src directive.]
+    expected: FAIL
+
+  [A remote-origin-redirected worklet should be blocked by the script-src 'self' directive.]
+    expected: FAIL
+
+  [A remote-origin-redirected worklet should not be blocked because the script-src * directive allows it.]
+    expected: FAIL
+
+  [A remote-origin-redirected worklet should not be blocked because the script-src directive specifying the origin allows it.]
+    expected: FAIL
+
+  [A remote-origin-redirected worklet should not be blocked by the worker-src directive because worklets obey the script-src directive.]
+    expected: FAIL
+
+  [A same-origin worklet importing a remote-origin script should be blocked by the script-src 'self' directive.]
+    expected: FAIL
+
+  [A same-origin worklet importing a remote-origin script should not be blocked because the script-src * directive allows it.]
+    expected: FAIL
+
+  [A same-origin worklet importing a remote-origin script should not be blocked because the script-src directive specifying the origin allows it.]
+    expected: FAIL
+
+  [A same-origin worklet importing a remote-origin script should not be blocked by the worker-src directive because worklets obey the script-src directive.]
+    expected: FAIL
+
+  [A same-origin worklet importing a remote-origin-redirected script should be blocked by the script-src 'self' directive.]
+    expected: FAIL
+
+  [A same-origin worklet importing a remote-origin-redirected script should not be blocked because the script-src * directive allows it.]
+    expected: FAIL
+
+  [A same-origin worklet importing a remote-origin-redirected script should not be blocked because the script-src directive specifying the origin allows it.]
+    expected: FAIL
+
+  [A same-origin worklet importing a remote-origin-redirected script should not be blocked by the worker-src directive because worklets obey the script-src directive.]
+    expected: FAIL
+
+  [A same-origin worklet importing an insecure-origin script should be blocked because of mixed contents.]
+    expected: FAIL
+
+  [A same-origin worklet importing an insecure-origin-redirected script should be blocked because of mixed contents.]
+    expected: FAIL
+
+  [An insecure-origin worklet should be blocked because of mixed contents.]
+    expected: FAIL
+
+  [An insecure-origin-redirected worklet should be blocked because of mixed contents.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/worklets/animation-worklet-import.https.html.ini b/third_party/blink/web_tests/external/wpt/worklets/animation-worklet-import.https.html.ini
new file mode 100644
index 0000000..73f181d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/worklets/animation-worklet-import.https.html.ini
@@ -0,0 +1,54 @@
+[animation-worklet-import.https.html]
+  [Importing a blob URL should resolve the given promise.]
+    expected: FAIL
+
+  [Importing a cross origin resource with the Access-Control-Allow-Origin header should resolve the given promise]
+    expected: FAIL
+
+  [Importing a cross origin resource without the Access-Control-Allow-Origin header should reject the given promise]
+    expected: FAIL
+
+  [Importing a cross-origin-redirected resource with the Access-Control-Allow-Origin header should resolve the given promise]
+    expected: FAIL
+
+  [Importing a cross-origin-redirected resource without the Access-Control-Allow-Origin header should reject the given promise]
+    expected: FAIL
+
+  [Importing a data URL should resolve the given promise.]
+    expected: FAIL
+
+  [Importing a file:// URL should reject the given promise.]
+    expected: FAIL
+
+  [Importing a nested script that has a syntax error should reject the given promise.]
+    expected: FAIL
+
+  [Importing a non-existent script rejects the given promise with an AbortError.]
+    expected: FAIL
+
+  [Importing a script resolves the given promise.]
+    expected: FAIL
+
+  [Importing a script that has a syntax error should reject the given promise.]
+    expected: FAIL
+
+  [Importing a script that imports an invalid identifier should reject the given promise.]
+    expected: FAIL
+
+  [Importing a script which throws should still resolve the given promise.]
+    expected: FAIL
+
+  [Importing about:blank should reject the given promise.]
+    expected: FAIL
+
+  [Importing an invalid URL should reject the given promise with a SyntaxError.]
+    expected: FAIL
+
+  [Importing cyclic scripts resolves the given promise]
+    expected: FAIL
+
+  [Importing nested scripts resolves the given promise]
+    expected: FAIL
+
+  [Importing scripts resolves all the given promises.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/worklets/animation-worklet-referrer.https.html.ini b/third_party/blink/web_tests/external/wpt/worklets/animation-worklet-referrer.https.html.ini
new file mode 100644
index 0000000..eca2bb2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/worklets/animation-worklet-referrer.https.html.ini
@@ -0,0 +1,57 @@
+[animation-worklet-referrer.https.html]
+  expected:
+    if product == "chrome": OK
+    ERROR
+  [Importing a remote-origin script from a page that has "no-referrer" referrer policy should not send referrer.]
+    expected: FAIL
+
+  [Importing a remote-origin script from a page that has "origin" referrer policy should send only an origin as referrer.]
+    expected: FAIL
+
+  [Importing a remote-origin script from a page that has "same-origin" referrer policy should not send referrer.]
+    expected: FAIL
+
+  [Importing a remote-origin script from a remote-origin worklet script that has "no-referrer" referrer policy should not send referrer.]
+    expected: FAIL
+
+  [Importing a remote-origin script from a remote-origin worklet script that has "origin" referrer policy should send referrer.]
+    expected: FAIL
+
+  [Importing a remote-origin script from a remote-origin worklet script that has "same-origin" referrer policy should send referrer.]
+    expected: FAIL
+
+  [Importing a remote-origin script from a same-origin worklet script that has "no-referrer" referrer policy should not send referrer.]
+    expected: FAIL
+
+  [Importing a remote-origin script from a same-origin worklet script that has "origin" referrer policy should send referrer.]
+    expected: FAIL
+
+  [Importing a remote-origin script from a same-origin worklet script that has "same-origin" referrer policy should not send referrer.]
+    expected: FAIL
+
+  [Importing a same-origin script from a page that has "no-referrer" referrer policy should not send referrer.]
+    expected: FAIL
+
+  [Importing a same-origin script from a page that has "origin" referrer policy should send only an origin as referrer.]
+    expected: FAIL
+
+  [Importing a same-origin script from a page that has "same-origin" referrer policy should send referrer.]
+    expected: FAIL
+
+  [Importing a same-origin script from a remote-origin worklet script that has "no-referrer" referrer policy should not send referrer.]
+    expected: FAIL
+
+  [Importing a same-origin script from a remote-origin worklet script that has "origin" referrer policy should send referrer.]
+    expected: FAIL
+
+  [Importing a same-origin script from a remote-origin worklet script that has "same-origin" referrer policy should not send referrer.]
+    expected: FAIL
+
+  [Importing a same-origin script from a same-origin worklet script that has "no-referrer" referrer policy should not send referrer.]
+    expected: FAIL
+
+  [Importing a same-origin script from a same-origin worklet script that has "origin" referrer policy should send referrer.]
+    expected: FAIL
+
+  [Importing a same-origin script from a same-origin worklet script that has "same-origin" referrer policy should send referrer.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/worklets/animation-worklet-service-worker-interception.https.html.ini b/third_party/blink/web_tests/external/wpt/worklets/animation-worklet-service-worker-interception.https.html.ini
new file mode 100644
index 0000000..bb74ff5a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/worklets/animation-worklet-service-worker-interception.https.html.ini
@@ -0,0 +1,12 @@
+[animation-worklet-service-worker-interception.https.html]
+  expected:
+    if product == "chrome": OK
+    ERROR
+  [Static import should be intercepted by a service worker.]
+    expected: FAIL
+
+  [addModule() on a controlled document should be intercepted by a service worker.]
+    expected: FAIL
+
+  [addModule() on a non-controlled document should not be intercepted by a service worker even if the script is under the service worker scope.]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/html/document_metadata/base.html b/third_party/blink/web_tests/html/document_metadata/base.html
index 06bcd049..bdf7983f 100644
--- a/third_party/blink/web_tests/html/document_metadata/base.html
+++ b/third_party/blink/web_tests/html/document_metadata/base.html
@@ -43,6 +43,11 @@
 var newWindow = window.open('about:blank');
 base = newWindow.document.head.appendChild(newWindow.document.createElement('base'));
 base.setAttribute('href', 'foo/bar/');
+// TODO(1356658, 751329): This expectation will need to be changed when
+// the feature NewBaseUrlInheritanceBehavior is enabled by default. At present,
+// base.href is empty because attempting to append a relative url to the baseURI
+// about:blank will fail, but when NewBaseUrlInheritanceBehavior is enabled the
+// baseURI will end in '/' and so appending the relative URL will succeed.
 shouldBeEqualToString("newWindow.document.querySelector('base').href", '');
 newWindow.close();
 
diff --git a/third_party/blink/web_tests/http/tests/security/aboutBlank/security-context-window-open.https.html b/third_party/blink/web_tests/http/tests/security/aboutBlank/security-context-window-open.https.html
index bc73b18..e5b00656 100644
--- a/third_party/blink/web_tests/http/tests/security/aboutBlank/security-context-window-open.https.html
+++ b/third_party/blink/web_tests/http/tests/security/aboutBlank/security-context-window-open.https.html
@@ -19,6 +19,11 @@
   var wnd0 = window.open('about:blank');
   var wnd1 = window.open('');
 
+  // TODO(1356658, 751329): This expectation will need to be changed when
+  // the feature NewBaseUrlInheritanceBehavior is enabled by default. At present
+  // the baseURI of about:blank is expected to be about:blank, but when
+  // NewBaseUrlInheritanceBehavior is enabled both the baseURI in the initial
+  // "Test begins" section will be the url of the test instead.
   log('--- Test begins ---\n');
   log('* "about:blank"\n');
   log('document.URL = ' + wnd0.document.URL + '\n');
diff --git a/third_party/blink/web_tests/http/tests/worklet/animation-worklet-csp-eval-expected.txt b/third_party/blink/web_tests/http/tests/worklet/animation-worklet-csp-eval-expected.txt
index 596dc16f9..f65712ba 100644
--- a/third_party/blink/web_tests/http/tests/worklet/animation-worklet-csp-eval-expected.txt
+++ b/third_party/blink/web_tests/http/tests/worklet/animation-worklet-csp-eval-expected.txt
@@ -1,9 +1,2 @@
-CONSOLE ERROR: Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self' 'unsafe-inline'".
-
-CONSOLE ERROR: Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self' 'unsafe-inline'".
-
-This is a testharness.js-based test.
-PASS eval() call on the worklet should be blocked because the script-src unsafe-eval directive is not specified.
-PASS eval() call on the worklet should not be blocked because the script-src unsafe-eval directive allows it.
-Harness: the test ran to completion.
+CONSOLE ERROR: Uncaught TypeError: Cannot read properties of undefined (reading 'addModule')
 
diff --git a/third_party/blink/web_tests/http/tests/worklet/webexposed/global-interface-listing-animation-worklet-expected.txt b/third_party/blink/web_tests/http/tests/worklet/webexposed/global-interface-listing-animation-worklet-expected.txt
index c57a9e2..453712c6 100644
--- a/third_party/blink/web_tests/http/tests/worklet/webexposed/global-interface-listing-animation-worklet-expected.txt
+++ b/third_party/blink/web_tests/http/tests/worklet/webexposed/global-interface-listing-animation-worklet-expected.txt
@@ -1,276 +1,3 @@
 CONSOLE MESSAGE: This test logs exposed APIs from AnimationWorkletGlobalScope
-CONSOLE MESSAGE: [INTERFACES]
-CONSOLE MESSAGE: interface AnimationWorkletGlobalScope : WorkletGlobalScope
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE: interface ByteLengthQueuingStrategy
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter highWaterMark
-CONSOLE MESSAGE:     getter size
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE: interface CountQueuingStrategy
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter highWaterMark
-CONSOLE MESSAGE:     getter size
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE: interface ReadableByteStreamController
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter byobRequest
-CONSOLE MESSAGE:     getter desiredSize
-CONSOLE MESSAGE:     method close
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method enqueue
-CONSOLE MESSAGE:     method error
-CONSOLE MESSAGE: interface ReadableStream
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter locked
-CONSOLE MESSAGE:     method cancel
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method getReader
-CONSOLE MESSAGE:     method pipeThrough
-CONSOLE MESSAGE:     method pipeTo
-CONSOLE MESSAGE:     method tee
-CONSOLE MESSAGE: interface ReadableStreamBYOBReader
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter closed
-CONSOLE MESSAGE:     method cancel
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method read
-CONSOLE MESSAGE:     method releaseLock
-CONSOLE MESSAGE: interface ReadableStreamBYOBRequest
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter view
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method respond
-CONSOLE MESSAGE:     method respondWithNewView
-CONSOLE MESSAGE: interface ReadableStreamDefaultController
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter desiredSize
-CONSOLE MESSAGE:     method close
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method enqueue
-CONSOLE MESSAGE:     method error
-CONSOLE MESSAGE: interface ReadableStreamDefaultReader
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter closed
-CONSOLE MESSAGE:     method cancel
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method read
-CONSOLE MESSAGE:     method releaseLock
-CONSOLE MESSAGE: interface TransformStream
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter readable
-CONSOLE MESSAGE:     getter writable
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE: interface TransformStreamDefaultController
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter desiredSize
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method enqueue
-CONSOLE MESSAGE:     method error
-CONSOLE MESSAGE:     method terminate
-CONSOLE MESSAGE: interface WorkletAnimationEffect
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter localTime
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method getComputedTiming
-CONSOLE MESSAGE:     method getTiming
-CONSOLE MESSAGE:     setter localTime
-CONSOLE MESSAGE: interface WorkletGlobalScope
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE: interface WorkletGroupEffect
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method getChildren
-CONSOLE MESSAGE: interface WritableStream
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter locked
-CONSOLE MESSAGE:     method abort
-CONSOLE MESSAGE:     method close
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method getWriter
-CONSOLE MESSAGE: interface WritableStreamDefaultController
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter signal
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method error
-CONSOLE MESSAGE: interface WritableStreamDefaultWriter
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter closed
-CONSOLE MESSAGE:     getter desiredSize
-CONSOLE MESSAGE:     getter ready
-CONSOLE MESSAGE:     method abort
-CONSOLE MESSAGE:     method close
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method releaseLock
-CONSOLE MESSAGE:     method write
-CONSOLE MESSAGE: [NAMESPACES]
-CONSOLE MESSAGE: namespace console
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     method assert
-CONSOLE MESSAGE:     method clear
-CONSOLE MESSAGE:     method context
-CONSOLE MESSAGE:     method count
-CONSOLE MESSAGE:     method countReset
-CONSOLE MESSAGE:     method createTask
-CONSOLE MESSAGE:     method debug
-CONSOLE MESSAGE:     method dir
-CONSOLE MESSAGE:     method dirxml
-CONSOLE MESSAGE:     method error
-CONSOLE MESSAGE:     method group
-CONSOLE MESSAGE:     method groupCollapsed
-CONSOLE MESSAGE:     method groupEnd
-CONSOLE MESSAGE:     method info
-CONSOLE MESSAGE:     method log
-CONSOLE MESSAGE:     method profile
-CONSOLE MESSAGE:     method profileEnd
-CONSOLE MESSAGE:     method table
-CONSOLE MESSAGE:     method time
-CONSOLE MESSAGE:     method timeEnd
-CONSOLE MESSAGE:     method timeLog
-CONSOLE MESSAGE:     method timeStamp
-CONSOLE MESSAGE:     method trace
-CONSOLE MESSAGE:     method warn
-CONSOLE MESSAGE: [GLOBAL OBJECT]
-CONSOLE MESSAGE:     attribute globalThis
-CONSOLE MESSAGE:     method gc
-CONSOLE MESSAGE:     method registerAnimator
-CONSOLE MESSAGE: [INTERFACES]
-CONSOLE MESSAGE: interface AnimationWorkletGlobalScope : WorkletGlobalScope
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE: interface ByteLengthQueuingStrategy
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter highWaterMark
-CONSOLE MESSAGE:     getter size
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE: interface CountQueuingStrategy
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter highWaterMark
-CONSOLE MESSAGE:     getter size
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE: interface ReadableByteStreamController
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter byobRequest
-CONSOLE MESSAGE:     getter desiredSize
-CONSOLE MESSAGE:     method close
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method enqueue
-CONSOLE MESSAGE:     method error
-CONSOLE MESSAGE: interface ReadableStream
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter locked
-CONSOLE MESSAGE:     method cancel
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method getReader
-CONSOLE MESSAGE:     method pipeThrough
-CONSOLE MESSAGE:     method pipeTo
-CONSOLE MESSAGE:     method tee
-CONSOLE MESSAGE: interface ReadableStreamBYOBReader
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter closed
-CONSOLE MESSAGE:     method cancel
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method read
-CONSOLE MESSAGE:     method releaseLock
-CONSOLE MESSAGE: interface ReadableStreamBYOBRequest
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter view
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method respond
-CONSOLE MESSAGE:     method respondWithNewView
-CONSOLE MESSAGE: interface ReadableStreamDefaultController
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter desiredSize
-CONSOLE MESSAGE:     method close
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method enqueue
-CONSOLE MESSAGE:     method error
-CONSOLE MESSAGE: interface ReadableStreamDefaultReader
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter closed
-CONSOLE MESSAGE:     method cancel
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method read
-CONSOLE MESSAGE:     method releaseLock
-CONSOLE MESSAGE: interface TransformStream
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter readable
-CONSOLE MESSAGE:     getter writable
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE: interface TransformStreamDefaultController
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter desiredSize
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method enqueue
-CONSOLE MESSAGE:     method error
-CONSOLE MESSAGE:     method terminate
-CONSOLE MESSAGE: interface WorkletAnimationEffect
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter localTime
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method getComputedTiming
-CONSOLE MESSAGE:     method getTiming
-CONSOLE MESSAGE:     setter localTime
-CONSOLE MESSAGE: interface WorkletGlobalScope
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE: interface WorkletGroupEffect
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method getChildren
-CONSOLE MESSAGE: interface WritableStream
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter locked
-CONSOLE MESSAGE:     method abort
-CONSOLE MESSAGE:     method close
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method getWriter
-CONSOLE MESSAGE: interface WritableStreamDefaultController
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter signal
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method error
-CONSOLE MESSAGE: interface WritableStreamDefaultWriter
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     getter closed
-CONSOLE MESSAGE:     getter desiredSize
-CONSOLE MESSAGE:     getter ready
-CONSOLE MESSAGE:     method abort
-CONSOLE MESSAGE:     method close
-CONSOLE MESSAGE:     method constructor
-CONSOLE MESSAGE:     method releaseLock
-CONSOLE MESSAGE:     method write
-CONSOLE MESSAGE: [NAMESPACES]
-CONSOLE MESSAGE: namespace console
-CONSOLE MESSAGE:     attribute @@toStringTag
-CONSOLE MESSAGE:     method assert
-CONSOLE MESSAGE:     method clear
-CONSOLE MESSAGE:     method context
-CONSOLE MESSAGE:     method count
-CONSOLE MESSAGE:     method countReset
-CONSOLE MESSAGE:     method createTask
-CONSOLE MESSAGE:     method debug
-CONSOLE MESSAGE:     method dir
-CONSOLE MESSAGE:     method dirxml
-CONSOLE MESSAGE:     method error
-CONSOLE MESSAGE:     method group
-CONSOLE MESSAGE:     method groupCollapsed
-CONSOLE MESSAGE:     method groupEnd
-CONSOLE MESSAGE:     method info
-CONSOLE MESSAGE:     method log
-CONSOLE MESSAGE:     method profile
-CONSOLE MESSAGE:     method profileEnd
-CONSOLE MESSAGE:     method table
-CONSOLE MESSAGE:     method time
-CONSOLE MESSAGE:     method timeEnd
-CONSOLE MESSAGE:     method timeLog
-CONSOLE MESSAGE:     method timeStamp
-CONSOLE MESSAGE:     method trace
-CONSOLE MESSAGE:     method warn
-CONSOLE MESSAGE: [GLOBAL OBJECT]
-CONSOLE MESSAGE:     attribute globalThis
-CONSOLE MESSAGE:     method gc
-CONSOLE MESSAGE:     method registerAnimator
+CONSOLE MESSAGE: CSS.animationWorklet not exposed
 
diff --git a/third_party/blink/web_tests/http/tests/worklet/webexposed/global-interface-listing-worklets-expected.txt b/third_party/blink/web_tests/http/tests/worklet/webexposed/global-interface-listing-worklets-expected.txt
index ba4a664..9415843dd 100644
--- a/third_party/blink/web_tests/http/tests/worklet/webexposed/global-interface-listing-worklets-expected.txt
+++ b/third_party/blink/web_tests/http/tests/worklet/webexposed/global-interface-listing-worklets-expected.txt
@@ -1,6 +1,5 @@
 CONSOLE MESSAGE: This test logs all exposed Worklets
 CONSOLE MESSAGE: layoutWorklet
-CONSOLE MESSAGE: animationWorklet
 CONSOLE MESSAGE: paintWorklet
 CONSOLE MESSAGE: AudioWorklet
 CONSOLE MESSAGE: IMPORTANT:
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index 7cd086c..9aaf5832 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -11408,20 +11408,6 @@
     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
@@ -12064,7 +12050,6 @@
 [NAMESPACES]
 namespace CSS
     attribute @@toStringTag
-    getter animationWorklet
     getter highlights
     getter layoutWorklet
     getter paintWorklet
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/get-nested-configs.https.html.ini b/third_party/blink/web_tests/wpt_internal/fenced_frame/get-nested-configs.https.html.ini
index d4e9e5d..f689090 100644
--- a/third_party/blink/web_tests/wpt_internal/fenced_frame/get-nested-configs.https.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/get-nested-configs.https.html.ini
@@ -2,7 +2,10 @@
   [Navigating an invalid config should be handled gracefully]
     expected: FAIL
 
-  [Nested configs created by FLEDGE should be navigable]
+  [Nested configs created by FLEDGE should be navigable by URN iframe]
+    expected: FAIL
+
+  [Nested configs created by FLEDGE should be navigable by fenced frame]
     expected: FAIL
 
   [getNestedConfigs() created by FLEDGE should return configurations]
@@ -17,8 +20,5 @@
   [getNestedConfigs() from a fenced frame with the urn:uuid from sharedStroage.selectURL() should be empty]
     expected: FAIL
 
-  [getNestedConfigs() in a nested iframe should be empty]
-    expected: FAIL
-
   [getNestedConfigs() should work in a same-origin nested iframe]
     expected: FAIL
diff --git a/third_party/libxml/README.chromium b/third_party/libxml/README.chromium
index 6f510db..8d0700c 100644
--- a/third_party/libxml/README.chromium
+++ b/third_party/libxml/README.chromium
@@ -1,6 +1,6 @@
 Name: libxml
 URL: http://xmlsoft.org
-Version: f931178e5f46da72843c675b217db94cf9df70ee
+Version: 44ecefc8cc299a66ac21ffec141eb261e92638da
 CPEPrefix: cpe:/a:xmlsoft:libxml2:2.11.0
 License: MIT
 License File: src/Copyright
diff --git a/third_party/libxml/linux/include/private/Makefile b/third_party/libxml/linux/include/private/Makefile
index c70ffa7d..3fab76d4 100644
--- a/third_party/libxml/linux/include/private/Makefile
+++ b/third_party/libxml/linux/include/private/Makefile
@@ -216,7 +216,7 @@
 RANLIB = ranlib
 RDL_CFLAGS = 
 RDL_LIBS = 
-RELDATE = Fri Feb 24 2023
+RELDATE = Tue Mar 21 2023
 SED = /usr/bin/sed
 SET_MAKE = 
 SHELL = /bin/sh
diff --git a/third_party/libxml/linux/xstc/Makefile b/third_party/libxml/linux/xstc/Makefile
index 6ea2861..8a3f20a 100644
--- a/third_party/libxml/linux/xstc/Makefile
+++ b/third_party/libxml/linux/xstc/Makefile
@@ -216,7 +216,7 @@
 RANLIB = ranlib
 RDL_CFLAGS = 
 RDL_LIBS = 
-RELDATE = Fri Feb 24 2023
+RELDATE = Tue Mar 21 2023
 SED = /usr/bin/sed
 SET_MAKE = 
 SHELL = /bin/sh
diff --git a/third_party/libxml/src/HTMLparser.c b/third_party/libxml/src/HTMLparser.c
index 7e91384b..81bd11f 100644
--- a/third_party/libxml/src/HTMLparser.c
+++ b/third_party/libxml/src/HTMLparser.c
@@ -295,11 +295,11 @@
 
 #define SHRINK if ((ctxt->input->cur - ctxt->input->base > 2 * INPUT_CHUNK) && \
 		   (ctxt->input->end - ctxt->input->cur < 2 * INPUT_CHUNK)) \
-	xmlParserInputShrink(ctxt->input)
+	xmlParserShrink(ctxt)
 
 #define GROW if ((ctxt->progressive == 0) &&				\
 		 (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK))	\
-	xmlParserInputGrow(ctxt->input, INPUT_CHUNK)
+	xmlParserGrow(ctxt)
 
 #define SKIP_BLANKS htmlSkipBlankChars(ctxt)
 
@@ -410,6 +410,11 @@
 	*len = 0;
 	return(ctxt->token);
     }
+
+    if ((ctxt->input->end - ctxt->input->cur < 4) &&
+        (xmlParserGrow(ctxt) < 0))
+        return(0);
+
     if (ctxt->charset != XML_CHAR_ENCODING_UTF8) {
         xmlChar * guess;
         xmlCharEncodingHandlerPtr handler;
@@ -470,29 +475,21 @@
     cur = ctxt->input->cur;
     c = *cur;
     if (c & 0x80) {
+        size_t avail;
+
         if ((c & 0x40) == 0)
             goto encoding_error;
-        if (cur[1] == 0) {
-            xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
-            cur = ctxt->input->cur;
-        }
-        if ((cur[1] & 0xc0) != 0x80)
+
+        avail = ctxt->input->end - ctxt->input->cur;
+
+        if ((avail < 2) || ((cur[1] & 0xc0) != 0x80))
             goto encoding_error;
         if ((c & 0xe0) == 0xe0) {
-
-            if (cur[2] == 0) {
-                xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
-                cur = ctxt->input->cur;
-            }
-            if ((cur[2] & 0xc0) != 0x80)
+            if ((avail < 3) || ((cur[2] & 0xc0) != 0x80))
                 goto encoding_error;
             if ((c & 0xf0) == 0xf0) {
-                if (cur[3] == 0) {
-                    xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
-                    cur = ctxt->input->cur;
-                }
                 if (((c & 0xf8) != 0xf0) ||
-                    ((cur[3] & 0xc0) != 0x80))
+                    (avail < 4) || ((cur[3] & 0xc0) != 0x80))
                     goto encoding_error;
                 /* 4-byte code */
                 *len = 4;
@@ -588,17 +585,12 @@
     int res = 0;
 
     while (IS_BLANK_CH(*(ctxt->input->cur))) {
-	if ((*ctxt->input->cur == 0) &&
-	    (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) {
-		xmlPopInput(ctxt);
-	} else {
-	    if (*(ctxt->input->cur) == '\n') {
-		ctxt->input->line++; ctxt->input->col = 1;
-	    } else ctxt->input->col++;
-	    ctxt->input->cur++;
-	    if (*ctxt->input->cur == 0)
-		xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
-	}
+        if (*(ctxt->input->cur) == '\n') {
+            ctxt->input->line++; ctxt->input->col = 1;
+        } else ctxt->input->col++;
+        ctxt->input->cur++;
+        if (*ctxt->input->cur == 0)
+            xmlParserGrow(ctxt);
 	if (res < INT_MAX)
 	    res++;
     }
@@ -2675,13 +2667,14 @@
 htmlParseNameComplex(xmlParserCtxtPtr ctxt) {
     int len = 0, l;
     int c;
-    int count = 0;
+    int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
+                    XML_MAX_TEXT_LENGTH :
+                    XML_MAX_NAME_LENGTH;
     const xmlChar *base = ctxt->input->base;
 
     /*
      * Handler for more complex cases
      */
-    GROW;
     c = CUR_CHAR(l);
     if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */
 	(!IS_LETTER(c) && (c != '_') &&
@@ -2695,11 +2688,11 @@
 	    (c == '_') || (c == ':') ||
 	    (IS_COMBINING(c)) ||
 	    (IS_EXTENDER(c)))) {
-	if (count++ > 100) {
-	    count = 0;
-	    GROW;
-	}
 	len += l;
+        if (len > maxLength) {
+            htmlParseErr(ctxt, XML_ERR_NAME_TOO_LONG, "name too long", NULL, NULL);
+            return(NULL);
+        }
 	NEXTL(l);
 	c = CUR_CHAR(l);
 	if (ctxt->input->base != base) {
@@ -2710,6 +2703,8 @@
 	    return(htmlParseNameComplex(ctxt));
 	}
     }
+    if (ctxt->instate == XML_PARSER_EOF)
+        return(NULL);
 
     if (ctxt->input->cur - ctxt->input->base < len) {
         /* Sanity check */
@@ -2737,6 +2732,9 @@
 htmlParseHTMLAttribute(htmlParserCtxtPtr ctxt, const xmlChar stop) {
     xmlChar *buffer = NULL;
     int buffer_size = 0;
+    int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
+                    XML_MAX_HUGE_LENGTH :
+                    XML_MAX_TEXT_LENGTH;
     xmlChar *out = NULL;
     const xmlChar *name = NULL;
     const xmlChar *cur = NULL;
@@ -2842,6 +2840,10 @@
 		out = &buffer[indx];
 	    }
 	    c = CUR_CHAR(l);
+            if (ctxt->instate == XML_PARSER_EOF) {
+                xmlFree(buffer);
+                return(NULL);
+            }
 	    if      (c <    0x80)
 		    { *out++  = c;                bits= -6; }
 	    else if (c <   0x800)
@@ -2854,8 +2856,14 @@
 	    for ( ; bits >= 0; bits-= 6) {
 		*out++  = ((c >> bits) & 0x3F) | 0x80;
 	    }
-	    NEXT;
+	    NEXTL(l);
 	}
+        if (out - buffer > maxLength) {
+            htmlParseErr(ctxt, XML_ERR_ATTRIBUTE_NOT_FINISHED,
+                         "attribute value too long\n", NULL, NULL);
+            xmlFree(buffer);
+            return(NULL);
+        }
     }
     *out = 0;
     return(buffer);
@@ -3131,6 +3139,7 @@
             htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR,
                             "Invalid char in CDATA 0x%X\n", cur);
         }
+	NEXTL(l);
 	if (nbchar >= HTML_PARSER_BIG_BUFFER_SIZE) {
             buf[nbchar] = 0;
 	    if (ctxt->sax->cdataBlock!= NULL) {
@@ -3142,12 +3151,14 @@
 		ctxt->sax->characters(ctxt->userData, buf, nbchar);
 	    }
 	    nbchar = 0;
+            SHRINK;
 	}
-	GROW;
-	NEXTL(l);
 	cur = CUR_CHAR(l);
     }
 
+    if (ctxt->instate == XML_PARSER_EOF)
+        return;
+
     if ((nbchar != 0) && (ctxt->sax != NULL) && (!ctxt->disableSAX)) {
         buf[nbchar] = 0;
 	if (ctxt->sax->cdataBlock!= NULL) {
@@ -3178,12 +3189,10 @@
     xmlChar buf[HTML_PARSER_BIG_BUFFER_SIZE + 6];
     int nbchar = 0;
     int cur, l;
-    int chunk = 0;
 
     if (readahead)
         buf[nbchar++] = readahead;
 
-    SHRINK;
     cur = CUR_CHAR(l);
     while (((cur != '<') || (ctxt->token == '<')) &&
            ((cur != '&') || (ctxt->token == '&')) &&
@@ -3194,6 +3203,7 @@
 	} else {
 	    COPY_BUF(l,buf,nbchar,cur);
 	}
+	NEXTL(l);
 	if (nbchar >= HTML_PARSER_BIG_BUFFER_SIZE) {
             buf[nbchar] = 0;
 
@@ -3217,21 +3227,12 @@
 		}
 	    }
 	    nbchar = 0;
-	}
-	NEXTL(l);
-        chunk++;
-        if (chunk > HTML_PARSER_BUFFER_SIZE) {
-            chunk = 0;
             SHRINK;
-            GROW;
-        }
-	cur = CUR_CHAR(l);
-	if (cur == 0) {
-	    SHRINK;
-	    GROW;
-	    cur = CUR_CHAR(l);
 	}
+	cur = CUR_CHAR(l);
     }
+    if (ctxt->instate == XML_PARSER_EOF)
+        return;
     if (nbchar != 0) {
         buf[nbchar] = 0;
 
@@ -3254,12 +3255,6 @@
 		    ctxt->sax->characters(ctxt->userData, buf, nbchar);
 	    }
 	}
-    } else {
-	/*
-	 * Loop detection
-	 */
-	if (cur == 0)
-	    ctxt->instate = XML_PARSER_EOF;
     }
 }
 
@@ -3350,9 +3345,11 @@
     int len = 0;
     int size = HTML_PARSER_BUFFER_SIZE;
     int cur, l;
+    int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
+                    XML_MAX_HUGE_LENGTH :
+                    XML_MAX_TEXT_LENGTH;
     const xmlChar *target;
     xmlParserInputState state;
-    int count = 0;
 
     if ((RAW == '<') && (NXT(1) == '?')) {
 	state = ctxt->instate;
@@ -3409,11 +3406,6 @@
 		    }
 		    buf = tmp;
 		}
-		count++;
-		if (count > 50) {
-		    GROW;
-		    count = 0;
-		}
                 if (IS_CHAR(cur)) {
 		    COPY_BUF(l,buf,len,cur);
                 } else {
@@ -3421,15 +3413,21 @@
                                     "Invalid char in processing instruction "
                                     "0x%X\n", cur);
                 }
+                if (len > maxLength) {
+                    htmlParseErr(ctxt, XML_ERR_PI_NOT_FINISHED,
+                                 "PI %s too long", target, NULL);
+                    xmlFree(buf);
+                    ctxt->instate = state;
+                    return;
+                }
 		NEXTL(l);
 		cur = CUR_CHAR(l);
-		if (cur == 0) {
-		    SHRINK;
-		    GROW;
-		    cur = CUR_CHAR(l);
-		}
 	    }
 	    buf[len] = 0;
+            if (ctxt->instate == XML_PARSER_EOF) {
+                xmlFree(buf);
+                return;
+            }
 	    if (cur != '>') {
 		htmlParseErr(ctxt, XML_ERR_PI_NOT_FINISHED,
 		      "ParsePI: PI %s never end ...\n", target, NULL);
@@ -3470,6 +3468,9 @@
     int r, rl;
     int cur, l;
     int next, nl;
+    int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
+                    XML_MAX_HUGE_LENGTH :
+                    XML_MAX_TEXT_LENGTH;
     xmlParserInputState state;
 
     /*
@@ -3514,11 +3515,6 @@
 	    (r != '-') || (q != '-'))) {
 	NEXTL(l);
 	next = CUR_CHAR(nl);
-	if (next == 0) {
-	    SHRINK;
-	    GROW;
-	    next = CUR_CHAR(nl);
-	}
 
 	if ((q == '-') && (r == '-') && (cur == '!') && (next == '>')) {
 	  htmlParseErr(ctxt, XML_ERR_COMMENT_NOT_FINISHED,
@@ -3546,6 +3542,13 @@
             htmlParseErrInt(ctxt, XML_ERR_INVALID_CHAR,
                             "Invalid char in comment 0x%X\n", q);
         }
+        if (len > maxLength) {
+            htmlParseErr(ctxt, XML_ERR_COMMENT_NOT_FINISHED,
+                         "comment too long", NULL, NULL);
+            xmlFree(buf);
+            ctxt->instate = state;
+            return;
+        }
 
 	q = r;
 	ql = rl;
@@ -3556,6 +3559,10 @@
     }
 finished:
     buf[len] = 0;
+    if (ctxt->instate == XML_PARSER_EOF) {
+        xmlFree(buf);
+        return;
+    }
     if (cur == '>') {
         NEXT;
 	if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) &&
@@ -3844,7 +3851,7 @@
 	    (ctxt->input->buf->raw != NULL) &&
 	    (ctxt->input->buf->buffer != NULL)) {
 	    int nbchars;
-	    int processed;
+	    size_t processed;
 
 	    /*
 	     * convert as much as possible to the parser reading buffer.
@@ -4469,7 +4476,9 @@
         else {
             htmlParseCharData(ctxt);
         }
+
         GROW;
+        SHRINK;
     }
     if (currentNode != NULL) xmlFree(currentNode);
 }
@@ -4910,7 +4919,9 @@
         else {
             htmlParseCharData(ctxt);
         }
+
         GROW;
+        SHRINK;
     }
     if (currentNode != NULL) xmlFree(currentNode);
 }
@@ -5367,7 +5378,7 @@
 htmlParseLookupSequence(htmlParserCtxtPtr ctxt, xmlChar first,
                         xmlChar next, xmlChar third, int ignoreattrval)
 {
-    int base, len;
+    size_t base, len;
     htmlParserInputPtr in;
     const xmlChar *buf;
     int quote;
@@ -5388,6 +5399,11 @@
     else if (next)
         len--;
     for (; base < len; base++) {
+        if (base >= INT_MAX / 2) {
+            ctxt->checkIndex = 0;
+            ctxt->endCheckState = 0;
+            return (base - 2);
+        }
         if (ignoreattrval) {
             if (quote) {
                 if (buf[base] == quote)
@@ -5544,11 +5560,7 @@
 
 	in = ctxt->input;
 	if (in == NULL) break;
-	if (in->buf == NULL)
-	    avail = in->length - (in->cur - in->base);
-	else
-	    avail = (ptrdiff_t)xmlBufUse(in->buf->buffer) -
-                    (in->cur - in->base);
+	avail = in->end - in->cur;
 	if ((avail == 0) && (terminate)) {
 	    htmlAutoCloseOnEnd(ctxt);
 	    if ((ctxt->nameNr == 0) && (ctxt->instate != XML_PARSER_EOF)) {
@@ -5587,11 +5599,7 @@
 		cur = in->cur[0];
 		if (IS_BLANK_CH(cur)) {
 		    SKIP_BLANKS;
-		    if (in->buf == NULL)
-			avail = in->length - (in->cur - in->base);
-		    else
-			avail = (ptrdiff_t)xmlBufUse(in->buf->buffer) -
-                                (in->cur - in->base);
+                    avail = in->end - in->cur;
 		}
 		if ((ctxt->sax) && (ctxt->sax->setDocumentLocator))
 		    ctxt->sax->setDocumentLocator(ctxt->userData,
@@ -5630,11 +5638,7 @@
 		break;
             case XML_PARSER_MISC:
 		SKIP_BLANKS;
-		if (in->buf == NULL)
-		    avail = in->length - (in->cur - in->base);
-		else
-		    avail = (ptrdiff_t)xmlBufUse(in->buf->buffer) -
-                            (in->cur - in->base);
+                avail = in->end - in->cur;
 		/*
 		 * no chars in buffer
 		 */
@@ -5703,11 +5707,7 @@
 		break;
             case XML_PARSER_PROLOG:
 		SKIP_BLANKS;
-		if (in->buf == NULL)
-		    avail = in->length - (in->cur - in->base);
-		else
-		    avail = (ptrdiff_t)xmlBufUse(in->buf->buffer) -
-                            (in->cur - in->base);
+                avail = in->end - in->cur;
 		if (avail < 2)
 		    goto done;
 		cur = in->cur[0];
@@ -5744,11 +5744,7 @@
 		}
 		break;
             case XML_PARSER_EPILOG:
-		if (in->buf == NULL)
-		    avail = in->length - (in->cur - in->base);
-		else
-		    avail = (ptrdiff_t)xmlBufUse(in->buf->buffer) -
-                            (in->cur - in->base);
+                avail = in->end - in->cur;
 		if (avail < 1)
 		    goto done;
 		cur = in->cur[0];
@@ -5984,8 +5980,14 @@
 			if (idx < 0)
 			    goto done;
 		        val = in->cur[idx + 2];
-			if (val == 0) /* bad cut of input */
+			if (val == 0) { /* bad cut of input */
+                            /*
+                             * FIXME: htmlParseScript checks for additional
+                             * characters after '</'.
+                             */
+                            ctxt->checkIndex = idx;
 			    goto done;
+                        }
 		    }
 		    htmlParseScript(ctxt);
 		    if ((cur == '<') && (next == '/')) {
diff --git a/third_party/libxml/src/dict.c b/third_party/libxml/src/dict.c
index 13353872..86c3f6d 100644
--- a/third_party/libxml/src/dict.c
+++ b/third_party/libxml/src/dict.c
@@ -354,6 +354,7 @@
 
 #ifdef __clang__
 ATTRIBUTE_NO_SANITIZE("unsigned-integer-overflow")
+ATTRIBUTE_NO_SANITIZE("unsigned-shift-base")
 #endif
 static uint32_t
 xmlDictComputeBigKey(const xmlChar* data, int namelen, int seed) {
@@ -389,6 +390,7 @@
  */
 #ifdef __clang__
 ATTRIBUTE_NO_SANITIZE("unsigned-integer-overflow")
+ATTRIBUTE_NO_SANITIZE("unsigned-shift-base")
 #endif
 static unsigned long
 xmlDictComputeBigQKey(const xmlChar *prefix, int plen,
diff --git a/third_party/libxml/src/fuzz/Makefile.am b/third_party/libxml/src/fuzz/Makefile.am
index f9f3e98..8e24b59 100644
--- a/third_party/libxml/src/fuzz/Makefile.am
+++ b/third_party/libxml/src/fuzz/Makefile.am
@@ -1,5 +1,5 @@
 AUTOMAKE_OPTIONS = -Wno-syntax
-EXTRA_PROGRAMS = genSeed html regexp schema uri xinclude xml xpath
+EXTRA_PROGRAMS = genSeed html regexp schema uri valid xinclude xml xpath
 check_PROGRAMS = testFuzzer
 EXTRA_DIST = html.dict regexp.dict schema.dict xml.dict xpath.dict \
 	     static_seed/uri static_seed/regexp fuzz.h
@@ -27,7 +27,7 @@
 .PHONY: corpus clean-corpus
 
 corpus: seed/html.stamp seed/regexp.stamp seed/schema.stamp seed/uri.stamp \
-    seed/xinclude.stamp seed/xml.stamp seed/xpath.stamp
+    seed/valid.stamp seed/xinclude.stamp seed/xml.stamp seed/xpath.stamp
 
 check-local: corpus
 	./testFuzzer$(EXEEXT)
@@ -59,6 +59,24 @@
 	    -timeout=20 \
 	    corpus/xml seed/xml
 
+# DTD validation fuzzer
+
+seed/valid.stamp: genSeed$(EXEEXT)
+	@mkdir -p seed/valid
+	./genSeed$(EXEEXT) valid $(XML_SEED_CORPUS_SRC)
+	@touch seed/valid.stamp
+
+valid_SOURCES = valid.c fuzz.c
+valid_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
+
+fuzz-valid: valid$(EXEEXT) seed/valid.stamp
+	@mkdir -p corpus/valid
+	./valid$(EXEEXT) \
+	    -dict=xml.dict \
+	    -max_len=$(XML_MAX_LEN) \
+	    -timeout=20 \
+	    corpus/valid seed/valid
+
 # XInclude fuzzer
 
 seed/xinclude.stamp: genSeed$(EXEEXT)
@@ -107,7 +125,7 @@
 regexp_SOURCES = regexp.c fuzz.c
 regexp_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
 
-fuzz-regexp: regexp$(EXEEXT)
+fuzz-regexp: regexp$(EXEEXT) seed/regexp.stamp
 	@mkdir -p corpus/regexp
 	./regexp$(EXEEXT) \
 	    -dict=regexp.dict \
@@ -125,7 +143,7 @@
 uri_SOURCES = uri.c fuzz.c
 uri_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
 
-fuzz-uri: uri$(EXEEXT)
+fuzz-uri: uri$(EXEEXT) seed/uri.stamp
 	@mkdir -p corpus/uri
 	./uri$(EXEEXT) \
 	    -max_len=10000 \
diff --git a/third_party/libxml/src/fuzz/Makefile.in b/third_party/libxml/src/fuzz/Makefile.in
index 7a3ca65f..3c5ee972 100644
--- a/third_party/libxml/src/fuzz/Makefile.in
+++ b/third_party/libxml/src/fuzz/Makefile.in
@@ -88,8 +88,8 @@
 build_triplet = @build@
 host_triplet = @host@
 EXTRA_PROGRAMS = genSeed$(EXEEXT) html$(EXEEXT) regexp$(EXEEXT) \
-	schema$(EXEEXT) uri$(EXEEXT) xinclude$(EXEEXT) xml$(EXEEXT) \
-	xpath$(EXEEXT)
+	schema$(EXEEXT) uri$(EXEEXT) valid$(EXEEXT) xinclude$(EXEEXT) \
+	xml$(EXEEXT) xpath$(EXEEXT)
 check_PROGRAMS = testFuzzer$(EXEEXT)
 subdir = fuzz
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -144,6 +144,13 @@
 uri_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
 	$(uri_LDFLAGS) $(LDFLAGS) -o $@
+am_valid_OBJECTS = valid.$(OBJEXT) fuzz.$(OBJEXT)
+valid_OBJECTS = $(am_valid_OBJECTS)
+valid_LDADD = $(LDADD)
+valid_DEPENDENCIES = $(top_builddir)/libxml2.la
+valid_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(valid_LDFLAGS) $(LDFLAGS) -o $@
 am_xinclude_OBJECTS = xinclude.$(OBJEXT) fuzz.$(OBJEXT)
 xinclude_OBJECTS = $(am_xinclude_OBJECTS)
 xinclude_LDADD = $(LDADD)
@@ -183,7 +190,8 @@
 am__depfiles_remade = ./$(DEPDIR)/fuzz.Po ./$(DEPDIR)/genSeed.Po \
 	./$(DEPDIR)/html.Po ./$(DEPDIR)/regexp.Po \
 	./$(DEPDIR)/schema.Po ./$(DEPDIR)/testFuzzer.Po \
-	./$(DEPDIR)/uri.Po ./$(DEPDIR)/xinclude.Po ./$(DEPDIR)/xml.Po \
+	./$(DEPDIR)/uri.Po ./$(DEPDIR)/valid.Po \
+	./$(DEPDIR)/xinclude.Po ./$(DEPDIR)/xml.Po \
 	./$(DEPDIR)/xpath.Po
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
@@ -206,10 +214,12 @@
 am__v_CCLD_1 = 
 SOURCES = $(genSeed_SOURCES) $(html_SOURCES) $(regexp_SOURCES) \
 	$(schema_SOURCES) $(testFuzzer_SOURCES) $(uri_SOURCES) \
-	$(xinclude_SOURCES) $(xml_SOURCES) $(xpath_SOURCES)
+	$(valid_SOURCES) $(xinclude_SOURCES) $(xml_SOURCES) \
+	$(xpath_SOURCES)
 DIST_SOURCES = $(genSeed_SOURCES) $(html_SOURCES) $(regexp_SOURCES) \
 	$(schema_SOURCES) $(testFuzzer_SOURCES) $(uri_SOURCES) \
-	$(xinclude_SOURCES) $(xml_SOURCES) $(xpath_SOURCES)
+	$(valid_SOURCES) $(xinclude_SOURCES) $(xml_SOURCES) \
+	$(xpath_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -466,6 +476,8 @@
 genSeed_SOURCES = genSeed.c fuzz.c
 xml_SOURCES = xml.c fuzz.c
 xml_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
+valid_SOURCES = valid.c fuzz.c
+valid_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
 xinclude_SOURCES = xinclude.c fuzz.c
 xinclude_LDFLAGS = $(AM_LDFLAGS) -fsanitize=fuzzer
 html_SOURCES = html.c fuzz.c
@@ -545,6 +557,10 @@
 	@rm -f uri$(EXEEXT)
 	$(AM_V_CCLD)$(uri_LINK) $(uri_OBJECTS) $(uri_LDADD) $(LIBS)
 
+valid$(EXEEXT): $(valid_OBJECTS) $(valid_DEPENDENCIES) $(EXTRA_valid_DEPENDENCIES) 
+	@rm -f valid$(EXEEXT)
+	$(AM_V_CCLD)$(valid_LINK) $(valid_OBJECTS) $(valid_LDADD) $(LIBS)
+
 xinclude$(EXEEXT): $(xinclude_OBJECTS) $(xinclude_DEPENDENCIES) $(EXTRA_xinclude_DEPENDENCIES) 
 	@rm -f xinclude$(EXEEXT)
 	$(AM_V_CCLD)$(xinclude_LINK) $(xinclude_OBJECTS) $(xinclude_LDADD) $(LIBS)
@@ -570,6 +586,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/schema.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testFuzzer.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uri.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/valid.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xinclude.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xml.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xpath.Po@am__quote@ # am--include-marker
@@ -741,6 +758,7 @@
 	-rm -f ./$(DEPDIR)/schema.Po
 	-rm -f ./$(DEPDIR)/testFuzzer.Po
 	-rm -f ./$(DEPDIR)/uri.Po
+	-rm -f ./$(DEPDIR)/valid.Po
 	-rm -f ./$(DEPDIR)/xinclude.Po
 	-rm -f ./$(DEPDIR)/xml.Po
 	-rm -f ./$(DEPDIR)/xpath.Po
@@ -794,6 +812,7 @@
 	-rm -f ./$(DEPDIR)/schema.Po
 	-rm -f ./$(DEPDIR)/testFuzzer.Po
 	-rm -f ./$(DEPDIR)/uri.Po
+	-rm -f ./$(DEPDIR)/valid.Po
 	-rm -f ./$(DEPDIR)/xinclude.Po
 	-rm -f ./$(DEPDIR)/xml.Po
 	-rm -f ./$(DEPDIR)/xpath.Po
@@ -838,7 +857,7 @@
 .PHONY: corpus clean-corpus
 
 corpus: seed/html.stamp seed/regexp.stamp seed/schema.stamp seed/uri.stamp \
-    seed/xinclude.stamp seed/xml.stamp seed/xpath.stamp
+    seed/valid.stamp seed/xinclude.stamp seed/xml.stamp seed/xpath.stamp
 
 check-local: corpus
 	./testFuzzer$(EXEEXT)
@@ -863,6 +882,21 @@
 	    -timeout=20 \
 	    corpus/xml seed/xml
 
+# DTD validation fuzzer
+
+seed/valid.stamp: genSeed$(EXEEXT)
+	@mkdir -p seed/valid
+	./genSeed$(EXEEXT) valid $(XML_SEED_CORPUS_SRC)
+	@touch seed/valid.stamp
+
+fuzz-valid: valid$(EXEEXT) seed/valid.stamp
+	@mkdir -p corpus/valid
+	./valid$(EXEEXT) \
+	    -dict=xml.dict \
+	    -max_len=$(XML_MAX_LEN) \
+	    -timeout=20 \
+	    corpus/valid seed/valid
+
 # XInclude fuzzer
 
 seed/xinclude.stamp: genSeed$(EXEEXT)
@@ -902,7 +936,7 @@
 	cp -r $(srcdir)/static_seed/regexp seed
 	@touch seed/regexp.stamp
 
-fuzz-regexp: regexp$(EXEEXT)
+fuzz-regexp: regexp$(EXEEXT) seed/regexp.stamp
 	@mkdir -p corpus/regexp
 	./regexp$(EXEEXT) \
 	    -dict=regexp.dict \
@@ -917,7 +951,7 @@
 	cp -r $(srcdir)/static_seed/uri seed
 	@touch seed/uri.stamp
 
-fuzz-uri: uri$(EXEEXT)
+fuzz-uri: uri$(EXEEXT) seed/uri.stamp
 	@mkdir -p corpus/uri
 	./uri$(EXEEXT) \
 	    -max_len=10000 \
diff --git a/third_party/libxml/src/fuzz/fuzz.c b/third_party/libxml/src/fuzz/fuzz.c
index 0ac3319..7625131 100644
--- a/third_party/libxml/src/fuzz/fuzz.c
+++ b/third_party/libxml/src/fuzz/fuzz.c
@@ -42,6 +42,9 @@
     xmlFuzzEntityInfo *mainEntity;
 } fuzzData;
 
+size_t fuzzNumAllocs;
+size_t fuzzMaxAllocs;
+
 /**
  * xmlFuzzErrorFunc:
  *
@@ -52,6 +55,58 @@
                  ...) {
 }
 
+/*
+ * Malloc failure injection.
+ *
+ * Quick tip to debug complicated issues: Increase MALLOC_OFFSET until
+ * the crash disappears (or a different issue is triggered). Then set
+ * the offset to the highest value that produces a crash and set
+ * MALLOC_ABORT to 1 to see which failed memory allocation causes the
+ * issue.
+ */
+
+#define XML_FUZZ_MALLOC_OFFSET  0
+#define XML_FUZZ_MALLOC_ABORT   0
+
+static void *
+xmlFuzzMalloc(size_t size) {
+    if (fuzzMaxAllocs > 0) {
+        if (fuzzNumAllocs >= fuzzMaxAllocs - 1)
+#if XML_FUZZ_MALLOC_ABORT
+            abort();
+#else
+            return(NULL);
+#endif
+        fuzzNumAllocs += 1;
+    }
+    return malloc(size);
+}
+
+static void *
+xmlFuzzRealloc(void *ptr, size_t size) {
+    if (fuzzMaxAllocs > 0) {
+        if (fuzzNumAllocs >= fuzzMaxAllocs - 1)
+#if XML_FUZZ_MALLOC_ABORT
+            abort();
+#else
+            return(NULL);
+#endif
+        fuzzNumAllocs += 1;
+    }
+    return realloc(ptr, size);
+}
+
+void
+xmlFuzzMemSetup(void) {
+    xmlMemSetup(free, xmlFuzzMalloc, xmlFuzzRealloc, xmlMemStrdup);
+}
+
+void
+xmlFuzzMemSetLimit(size_t limit) {
+    fuzzNumAllocs = 0;
+    fuzzMaxAllocs = limit ? limit + XML_FUZZ_MALLOC_OFFSET : 0;
+}
+
 /**
  * xmlFuzzDataInit:
  *
@@ -84,20 +139,45 @@
 }
 
 /**
+ * xmlFuzzWriteInt:
+ * @out:  output file
+ * @v:  integer to write
+ * @size:  size of integer in bytes
+ *
+ * Write an integer to the fuzz data.
+ */
+void
+xmlFuzzWriteInt(FILE *out, size_t v, int size) {
+    int shift;
+
+    while (size > (int) sizeof(size_t)) {
+        putc(0, out);
+        size--;
+    }
+
+    shift = size * 8;
+    while (shift > 0) {
+        shift -= 8;
+        putc((v >> shift) & 255, out);
+    }
+}
+
+/**
  * xmlFuzzReadInt:
- * @size:  size of string in bytes
+ * @size:  size of integer in bytes
  *
  * Read an integer from the fuzz data.
  */
-int
-xmlFuzzReadInt(void) {
-    int ret;
+size_t
+xmlFuzzReadInt(int size) {
+    size_t ret = 0;
 
-    if (fuzzData.remaining < sizeof(int))
-        return(0);
-    memcpy(&ret, fuzzData.ptr, sizeof(int));
-    fuzzData.ptr += sizeof(int);
-    fuzzData.remaining -= sizeof(int);
+    while ((size > 0) && (fuzzData.remaining > 0)) {
+        unsigned char c = (unsigned char) *fuzzData.ptr++;
+        fuzzData.remaining--;
+        ret = (ret << 8) | c;
+        size--;
+    }
 
     return ret;
 }
@@ -166,7 +246,8 @@
             if (c2 == '\n') {
                 fuzzData.ptr++;
                 fuzzData.remaining--;
-                *size = fuzzData.outPtr - out;
+                if (size != NULL)
+                    *size = fuzzData.outPtr - out;
                 *fuzzData.outPtr++ = '\0';
                 return(out);
             }
@@ -180,12 +261,14 @@
     }
 
     if (fuzzData.outPtr > out) {
-        *size = fuzzData.outPtr - out;
+        if (size != NULL)
+            *size = fuzzData.outPtr - out;
         *fuzzData.outPtr++ = '\0';
         return(out);
     }
 
-    *size = 0;
+    if (size != NULL)
+        *size = 0;
     return(NULL);
 }
 
@@ -201,10 +284,10 @@
 
     while (1) {
         const char *url, *entity;
-        size_t urlSize, entitySize;
+        size_t entitySize;
         xmlFuzzEntityInfo *entityInfo;
-        
-        url = xmlFuzzReadString(&urlSize);
+
+        url = xmlFuzzReadString(NULL);
         if (url == NULL) break;
 
         entity = xmlFuzzReadString(&entitySize);
@@ -271,7 +354,9 @@
         return(NULL);
 
     input = xmlNewInputStream(ctxt);
-    input->filename = NULL;
+    if (input == NULL)
+        return(NULL);
+    input->filename = (char *) xmlCharStrdup(URL);
     input->buf = xmlParserInputBufferCreateMem(entity->data, entity->size,
                                                XML_CHAR_ENCODING_NONE);
     if (input->buf == NULL) {
@@ -284,47 +369,6 @@
     return input;
 }
 
-/**
- * xmlFuzzExtractStrings:
- *
- * Extract C strings from input data. Use exact-size allocations to detect
- * potential memory errors.
- */
-size_t
-xmlFuzzExtractStrings(const char *data, size_t size, char **strings,
-                      size_t numStrings) {
-    const char *start = data;
-    const char *end = data + size;
-    size_t i = 0, ret;
-
-    while (i < numStrings) {
-        size_t strSize = end - start;
-        const char *zero = memchr(start, 0, strSize);
-
-        if (zero != NULL)
-            strSize = zero - start;
-
-        strings[i] = xmlMalloc(strSize + 1);
-        memcpy(strings[i], start, strSize);
-        strings[i][strSize] = '\0';
-
-        i++;
-        if (zero != NULL)
-            start = zero + 1;
-        else
-            break;
-    }
-
-    ret = i;
-
-    while (i < numStrings) {
-        strings[i] = NULL;
-        i++;
-    }
-
-    return(ret);
-}
-
 char *
 xmlSlurpFile(const char *path, size_t *sizeRet) {
     FILE *file;
diff --git a/third_party/libxml/src/fuzz/fuzz.h b/third_party/libxml/src/fuzz/fuzz.h
index e51dc7a9..0668b2f 100644
--- a/third_party/libxml/src/fuzz/fuzz.h
+++ b/third_party/libxml/src/fuzz/fuzz.h
@@ -27,6 +27,10 @@
 #if 1
   #define HAVE_URI_FUZZER
 #endif
+#if defined(LIBXML_VALID_ENABLED) && \
+    defined(LIBXML_READER_ENABLED)
+  #define HAVE_VALID_FUZZER
+#endif
 #if defined(LIBXML_XINCLUDE_ENABLED) && \
     defined(LIBXML_READER_ENABLED)
   #define HAVE_XINCLUDE_FUZZER
@@ -50,13 +54,22 @@
                  ...);
 
 void
+xmlFuzzMemSetup(void);
+
+void
+xmlFuzzMemSetLimit(size_t limit);
+
+void
 xmlFuzzDataInit(const char *data, size_t size);
 
 void
 xmlFuzzDataCleanup(void);
 
-int
-xmlFuzzReadInt(void);
+void
+xmlFuzzWriteInt(FILE *out, size_t v, int size);
+
+size_t
+xmlFuzzReadInt(int size);
 
 const char *
 xmlFuzzReadRemaining(size_t *size);
@@ -79,10 +92,6 @@
 xmlParserInputPtr
 xmlFuzzEntityLoader(const char *URL, const char *ID, xmlParserCtxtPtr ctxt);
 
-size_t
-xmlFuzzExtractStrings(const char *data, size_t size, char **strings,
-                      size_t numStrings);
-
 char *
 xmlSlurpFile(const char *path, size_t *size);
 
diff --git a/third_party/libxml/src/fuzz/genSeed.c b/third_party/libxml/src/fuzz/genSeed.c
index 0a78fdf5..d08d135e 100644
--- a/third_party/libxml/src/fuzz/genSeed.c
+++ b/third_party/libxml/src/fuzz/genSeed.c
@@ -82,7 +82,8 @@
 
     xmlFreeInputStream(in);
 
-    xmlHashAddEntry(globalData.entities, (const xmlChar *) URL, NULL);
+    xmlHashAddEntry(globalData.entities, (const xmlChar *) URL,
+                    globalData.entities);
 
     return(xmlNoNetExternalEntityLoader(URL, ID, ctxt));
 }
@@ -98,7 +99,7 @@
 static void
 fuzzRecorderCleanup(void) {
     xmlSetExternalEntityLoader(globalData.oldLoader);
-    xmlHashFree(globalData.entities, xmlHashDefaultDeallocator);
+    xmlHashFree(globalData.entities, NULL);
     globalData.out = NULL;
     globalData.entities = NULL;
     globalData.oldLoader = NULL;
@@ -111,7 +112,10 @@
     int opts = XML_PARSE_NOENT | XML_PARSE_DTDLOAD;
     xmlDocPtr doc;
 
-    fwrite(&opts, sizeof(opts), 1, out);
+    /* Parser options. */
+    xmlFuzzWriteInt(out, opts, 4);
+    /* Max allocations. */
+    xmlFuzzWriteInt(out, 0, 4);
 
     fuzzRecorderInit(out);
 
@@ -131,9 +135,11 @@
     char buf[SEED_BUF_SIZE];
     FILE *file;
     size_t size;
-    int opts = 0;
 
-    fwrite(&opts, sizeof(opts), 1, out);
+    /* Parser options. */
+    xmlFuzzWriteInt(out, 0, 4);
+    /* Max allocations. */
+    xmlFuzzWriteInt(out, 0, 4);
 
     /* Copy file */
     file = fopen(docFile, "rb");
@@ -158,6 +164,9 @@
     xmlSchemaPtr schema;
     xmlSchemaParserCtxtPtr pctxt;
 
+    /* Max allocations. */
+    xmlFuzzWriteInt(out, 0, 4);
+
     fuzzRecorderInit(out);
 
     pctxt = xmlSchemaNewParserCtxt(docFile);
@@ -312,6 +321,9 @@
                 continue;
             }
 
+            /* Max allocations. */
+            xmlFuzzWriteInt(out, 0, 4);
+
             if (xptr) {
                 xmlFuzzWriteString(out, expr);
             } else {
@@ -407,6 +419,11 @@
         processArg = processPattern;
         globalData.processFile = processSchema;
 #endif
+    } else if (strcmp(fuzzer, "valid") == 0) {
+#ifdef HAVE_XINCLUDE_FUZZER
+        processArg = processPattern;
+        globalData.processFile = processXml;
+#endif
     } else if (strcmp(fuzzer, "xinclude") == 0) {
 #ifdef HAVE_XINCLUDE_FUZZER
         processArg = processPattern;
diff --git a/third_party/libxml/src/fuzz/html.c b/third_party/libxml/src/fuzz/html.c
index ecc6f7a..a2bd97a 100644
--- a/third_party/libxml/src/fuzz/html.c
+++ b/third_party/libxml/src/fuzz/html.c
@@ -12,6 +12,7 @@
 int
 LLVMFuzzerInitialize(int *argc ATTRIBUTE_UNUSED,
                      char ***argv ATTRIBUTE_UNUSED) {
+    xmlFuzzMemSetup();
     xmlInitParser();
 #ifdef LIBXML_CATALOG_ENABLED
     xmlInitializeCatalog();
@@ -28,11 +29,12 @@
     htmlParserCtxtPtr ctxt;
     xmlOutputBufferPtr out;
     const char *docBuffer;
-    size_t docSize, consumed, chunkSize;
+    size_t maxAlloc, docSize, consumed, chunkSize;
     int opts;
 
     xmlFuzzDataInit(data, size);
-    opts = xmlFuzzReadInt();
+    opts = (int) xmlFuzzReadInt(4);
+    maxAlloc = xmlFuzzReadInt(4) % (size + 1);
 
     docBuffer = xmlFuzzReadRemaining(&docSize);
     if (docBuffer == NULL) {
@@ -42,6 +44,7 @@
 
     /* Pull parser */
 
+    xmlFuzzMemSetLimit(maxAlloc);
     doc = htmlReadMemory(docBuffer, docSize, NULL, NULL, opts);
 
     /*
@@ -57,23 +60,28 @@
 
     /* Push parser */
 
+    xmlFuzzMemSetLimit(maxAlloc);
     ctxt = htmlCreatePushParserCtxt(NULL, NULL, NULL, 0, NULL,
                                     XML_CHAR_ENCODING_NONE);
-    htmlCtxtUseOptions(ctxt, opts);
 
-    for (consumed = 0; consumed < docSize; consumed += chunkSize) {
-        chunkSize = docSize - consumed;
-        if (chunkSize > maxChunkSize)
-            chunkSize = maxChunkSize;
-        htmlParseChunk(ctxt, docBuffer + consumed, chunkSize, 0);
+    if (ctxt != NULL) {
+        htmlCtxtUseOptions(ctxt, opts);
+
+        for (consumed = 0; consumed < docSize; consumed += chunkSize) {
+            chunkSize = docSize - consumed;
+            if (chunkSize > maxChunkSize)
+                chunkSize = maxChunkSize;
+            htmlParseChunk(ctxt, docBuffer + consumed, chunkSize, 0);
+        }
+
+        htmlParseChunk(ctxt, NULL, 0, 1);
+        xmlFreeDoc(ctxt->myDoc);
+        htmlFreeParserCtxt(ctxt);
     }
 
-    htmlParseChunk(ctxt, NULL, 0, 1);
-    xmlFreeDoc(ctxt->myDoc);
-    htmlFreeParserCtxt(ctxt);
-
     /* Cleanup */
 
+    xmlFuzzMemSetLimit(0);
     xmlFuzzDataCleanup();
     xmlResetLastError();
 
diff --git a/third_party/libxml/src/fuzz/regexp.c b/third_party/libxml/src/fuzz/regexp.c
index a0b084a..0514059 100644
--- a/third_party/libxml/src/fuzz/regexp.c
+++ b/third_party/libxml/src/fuzz/regexp.c
@@ -10,6 +10,7 @@
 int
 LLVMFuzzerInitialize(int *argc ATTRIBUTE_UNUSED,
                      char ***argv ATTRIBUTE_UNUSED) {
+    xmlFuzzMemSetup();
     xmlSetGenericErrorFunc(NULL, xmlFuzzErrorFunc);
 
     return 0;
@@ -18,27 +19,29 @@
 int
 LLVMFuzzerTestOneInput(const char *data, size_t size) {
     xmlRegexpPtr regexp;
-    char *str[2] = { NULL, NULL };
+    size_t maxAlloc;
+    const char *str1;
 
     if (size > 200)
         return(0);
 
-    xmlFuzzExtractStrings(data, size, str, 2);
+    xmlFuzzDataInit(data, size);
+    maxAlloc = xmlFuzzReadInt(4) % (size * 8 + 1);
+    str1 = xmlFuzzReadString(NULL);
 
     /* CUR_SCHAR doesn't handle invalid UTF-8 and may cause infinite loops. */
-    if (xmlCheckUTF8(BAD_CAST str[0]) != 0) {
-        regexp = xmlRegexpCompile(BAD_CAST str[0]);
+    if (xmlCheckUTF8(BAD_CAST str1) != 0) {
+        xmlFuzzMemSetLimit(maxAlloc);
+        regexp = xmlRegexpCompile(BAD_CAST str1);
         /* xmlRegexpExec has pathological performance in too many cases. */
 #if 0
-        if ((regexp != NULL) && (numStrings >= 2)) {
-            xmlRegexpExec(regexp, BAD_CAST str[1]);
-        }
+        xmlRegexpExec(regexp, BAD_CAST str2);
 #endif
         xmlRegFreeRegexp(regexp);
     }
 
-    xmlFree(str[0]);
-    xmlFree(str[1]);
+    xmlFuzzMemSetLimit(0);
+    xmlFuzzDataCleanup();
     xmlResetLastError();
 
     return 0;
diff --git a/third_party/libxml/src/fuzz/schema.c b/third_party/libxml/src/fuzz/schema.c
index 689bffe..04e92f9 100644
--- a/third_party/libxml/src/fuzz/schema.c
+++ b/third_party/libxml/src/fuzz/schema.c
@@ -11,6 +11,7 @@
 int
 LLVMFuzzerInitialize(int *argc ATTRIBUTE_UNUSED,
                      char ***argv ATTRIBUTE_UNUSED) {
+    xmlFuzzMemSetup();
     xmlInitParser();
 #ifdef LIBXML_CATALOG_ENABLED
     xmlInitializeCatalog();
@@ -24,18 +25,23 @@
 int
 LLVMFuzzerTestOneInput(const char *data, size_t size) {
     xmlSchemaParserCtxtPtr pctxt;
+    size_t maxAlloc;
 
     if (size > 50000)
         return(0);
 
+    maxAlloc = xmlFuzzReadInt(4) % (size + 1);
+
     xmlFuzzDataInit(data, size);
     xmlFuzzReadEntities();
 
+    xmlFuzzMemSetLimit(maxAlloc);
     pctxt = xmlSchemaNewParserCtxt(xmlFuzzMainUrl());
     xmlSchemaSetParserErrors(pctxt, xmlFuzzErrorFunc, xmlFuzzErrorFunc, NULL);
     xmlSchemaFree(xmlSchemaParse(pctxt));
     xmlSchemaFreeParserCtxt(pctxt);
 
+    xmlFuzzMemSetLimit(0);
     xmlFuzzDataCleanup();
     xmlResetLastError();
 
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/branch-1 b/third_party/libxml/src/fuzz/static_seed/regexp/branch-1
index ded775e..2a61d0d 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/branch-1
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/branch-1
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/branch-10 b/third_party/libxml/src/fuzz/static_seed/regexp/branch-10
index 6700d775..a867afe 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/branch-10
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/branch-10
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/branch-11 b/third_party/libxml/src/fuzz/static_seed/regexp/branch-11
index d83f918..cf22034 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/branch-11
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/branch-11
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/branch-12 b/third_party/libxml/src/fuzz/static_seed/regexp/branch-12
index b44dba5..1dd06d5f 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/branch-12
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/branch-12
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/branch-13 b/third_party/libxml/src/fuzz/static_seed/regexp/branch-13
index 64e50a0..d3033d2 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/branch-13
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/branch-13
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/branch-2 b/third_party/libxml/src/fuzz/static_seed/regexp/branch-2
index 8293d81..cd27911 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/branch-2
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/branch-2
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/branch-3 b/third_party/libxml/src/fuzz/static_seed/regexp/branch-3
index 696af9b..64437c82 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/branch-3
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/branch-3
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/branch-4 b/third_party/libxml/src/fuzz/static_seed/regexp/branch-4
index 8317998..556bba2 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/branch-4
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/branch-4
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/branch-5 b/third_party/libxml/src/fuzz/static_seed/regexp/branch-5
index 6b6db8b..cdf9098 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/branch-5
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/branch-5
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/branch-6 b/third_party/libxml/src/fuzz/static_seed/regexp/branch-6
index 4f477902..f68f552 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/branch-6
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/branch-6
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/branch-7 b/third_party/libxml/src/fuzz/static_seed/regexp/branch-7
index 6334f72..a7e8e91 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/branch-7
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/branch-7
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/branch-8 b/third_party/libxml/src/fuzz/static_seed/regexp/branch-8
index f77a8f4d..0637a69 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/branch-8
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/branch-8
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/branch-9 b/third_party/libxml/src/fuzz/static_seed/regexp/branch-9
index acd0eec..6cbd35e 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/branch-9
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/branch-9
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-1 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-1
index 9f0a504..742782c 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-1
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-1
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-10 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-10
index 60685bbe..09eaccc 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-10
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-10
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-11 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-11
index 72a7956..991d19a 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-11
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-11
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-12 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-12
index 85416ee..dd43da8 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-12
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-12
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-13 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-13
index c91d4fe..8b7bc0c 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-13
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-13
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-14 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-14
index a164b42..4cd8318ebc 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-14
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-14
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-15 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-15
index 750c76de..456dda7 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-15
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-15
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-16 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-16
index 23c5d23..94a4810 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-16
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-16
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-2 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-2
index 5468d06..6dd04e33 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-2
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-2
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-3 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-3
index 76e1e0bc..5be0b2d 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-3
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-3
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-4 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-4
index e0f65a4..e7d786c0 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-4
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-4
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-5 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-5
index fcfaa97..e06cf23 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-5
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-5
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-6 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-6
index ce00a15..c65a26e7 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-6
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-6
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-7 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-7
index 127fe1f..8d0ec0f 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-7
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-7
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-8 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-8
index fe8bb8b..a17aac4 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-8
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-8
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-9 b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-9
index 3d56e5d..3c37fb4 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-9
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug316338-9
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-1 b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-1
index 4426933e..9b6a838 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-1
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-1
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-2 b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-2
index 474d2b6..f3ee539 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-2
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-2
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-3 b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-3
index 09c75cb..590bad9 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-3
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-3
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-4 b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-4
index 65d561e..233a92b 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-4
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-4
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-5 b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-5
index b678580..ca35ec2 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-5
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-5
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-6 b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-6
index 3a05d82f..d433d914 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-6
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-6
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-7 b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-7
index 88e1660..80d821e 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-7
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-7
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-8 b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-8
index 4575a92..17456c9 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-8
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/bug420596-8
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/content-1 b/third_party/libxml/src/fuzz/static_seed/regexp/content-1
index 5acbf86..edcb943b 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/content-1
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/content-1
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/content-10 b/third_party/libxml/src/fuzz/static_seed/regexp/content-10
index f131454..f0cd363 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/content-10
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/content-10
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/content-2 b/third_party/libxml/src/fuzz/static_seed/regexp/content-2
index 4e6b663e..d9f4a93 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/content-2
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/content-2
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/content-3 b/third_party/libxml/src/fuzz/static_seed/regexp/content-3
index b13fc8d..309c9204 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/content-3
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/content-3
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/content-4 b/third_party/libxml/src/fuzz/static_seed/regexp/content-4
index 47c5d6d..20ffbb7 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/content-4
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/content-4
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/content-5 b/third_party/libxml/src/fuzz/static_seed/regexp/content-5
index f93860e..faa7b53 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/content-5
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/content-5
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/content-6 b/third_party/libxml/src/fuzz/static_seed/regexp/content-6
index e5c6e14..98ef3aa8e 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/content-6
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/content-6
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/content-7 b/third_party/libxml/src/fuzz/static_seed/regexp/content-7
index 4868dd2..b0d17afe 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/content-7
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/content-7
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/content-8 b/third_party/libxml/src/fuzz/static_seed/regexp/content-8
index a3a87d0bd..51aeb7b 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/content-8
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/content-8
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/content-9 b/third_party/libxml/src/fuzz/static_seed/regexp/content-9
index 91f0d9e..589d928 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/content-9
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/content-9
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/hard-1 b/third_party/libxml/src/fuzz/static_seed/regexp/hard-1
index ba00382..9959fb4 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/hard-1
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/hard-1
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/hard-10 b/third_party/libxml/src/fuzz/static_seed/regexp/hard-10
index 7db28fa..36db287 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/hard-10
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/hard-10
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/hard-2 b/third_party/libxml/src/fuzz/static_seed/regexp/hard-2
index ed38b91..17016bd 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/hard-2
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/hard-2
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/hard-3 b/third_party/libxml/src/fuzz/static_seed/regexp/hard-3
index 7b16da0..f3f1c0b 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/hard-3
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/hard-3
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/hard-4 b/third_party/libxml/src/fuzz/static_seed/regexp/hard-4
index 2ece886..13bcd77 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/hard-4
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/hard-4
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/hard-5 b/third_party/libxml/src/fuzz/static_seed/regexp/hard-5
index 870a3ec5..41e5310 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/hard-5
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/hard-5
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/hard-6 b/third_party/libxml/src/fuzz/static_seed/regexp/hard-6
index 06aa7d0..d55d808b 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/hard-6
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/hard-6
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/hard-7 b/third_party/libxml/src/fuzz/static_seed/regexp/hard-7
index 50a9ec39..0dfd684 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/hard-7
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/hard-7
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/hard-8 b/third_party/libxml/src/fuzz/static_seed/regexp/hard-8
index 0991129..8159843 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/hard-8
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/hard-8
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/hard-9 b/third_party/libxml/src/fuzz/static_seed/regexp/hard-9
index 5bd1d89..a4e9ece42 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/hard-9
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/hard-9
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ncname-1 b/third_party/libxml/src/fuzz/static_seed/regexp/ncname-1
index 608eb9a..6d43f81 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ncname-1
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ncname-1
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ncname-2 b/third_party/libxml/src/fuzz/static_seed/regexp/ncname-2
index cfb9b96..bb9ff54 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ncname-2
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ncname-2
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ncname-3 b/third_party/libxml/src/fuzz/static_seed/regexp/ncname-3
index 07a6a08..605ccc58 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ncname-3
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ncname-3
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ncname-4 b/third_party/libxml/src/fuzz/static_seed/regexp/ncname-4
index 87e937f..facf97d 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ncname-4
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ncname-4
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ncname-5 b/third_party/libxml/src/fuzz/static_seed/regexp/ncname-5
index ad294560..ad223348 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ncname-5
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ncname-5
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-1 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-1
index 71448f23..2c4bb3d 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-1
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-1
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-10 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-10
index 91aed3c..61c3d3d 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-10
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-10
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-11 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-11
index 76eb5de..6133262 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-11
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-11
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-12 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-12
index 9c3bc66..4b6be37 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-12
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-12
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-2 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-2
index 9369f7a5..f766e22 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-2
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-2
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-3 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-3
index 58a3a081..7c03f87 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-3
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-3
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-4 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-4
index da7e9dab..08a0a9a6 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-4
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-4
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-5 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-5
index 83ad4a82..ce3f25a 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-5
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-5
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-6 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-6
index 3bc9758f9..523b6379 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-6
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-6
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-7 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-7
index fa89038..091ff050 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-7
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-7
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-8 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-8
index 96f0bb6..210f7091 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-8
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-8
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-9 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-9
index 8e3fc43..7da8a2a 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges-9
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges-9
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-1 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-1
index 044a8eb..003c2c5 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-1
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-1
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-10 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-10
index 19e2aa2..261bf56 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-10
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-10
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-11 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-11
index 89be181d..c6c5bd0 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-11
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-11
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-12 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-12
index 42ebdd3..0a729f2 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-12
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-12
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-2 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-2
index 026f7b8..9fc2ce1 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-2
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-2
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-3 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-3
index 83e78a9..08a3963 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-3
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-3
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-4 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-4
index 847b4e84..c965555a 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-4
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-4
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-5 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-5
index 349168d3..2e65f5d 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-5
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-5
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-6 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-6
index 5d2a407..4990264 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-6
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-6
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-7 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-7
index 74fbafb..5f3e2c3 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-7
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-7
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-8 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-8
index 125bfa91..9b384e589 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-8
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-8
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-9 b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-9
index f2cf12883..e08ad99 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-9
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/ranges2-9
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-1 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-1
index 3bc17926..20e37e0b 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-1
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-1
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-10 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-10
index e4f4b0cd..1bdb0a8 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-10
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-10
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-11 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-11
index 318e0cc..5e26ec256 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-11
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-11
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-12 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-12
index f204295..e044486 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-12
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-12
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-13 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-13
index 70fccd5..9cb2874 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-13
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-13
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-14 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-14
index 357ce2b..3b9003f 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-14
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-14
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-15 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-15
index 2a10a837..64b071e5 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-15
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-15
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-16 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-16
index 1f3089fb..44b612b 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-16
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-16
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-17 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-17
index a9d542fb..0370668 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-17
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-17
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-18 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-18
index 651eb9d4..03519119 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-18
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-18
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-19 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-19
index fefea8f..f4a153c 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-19
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-19
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-2 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-2
index 81e5fba0..0a8bae7 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-2
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-2
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-20 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-20
index 1f3089fb..44b612b 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-20
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-20
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-21 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-21
index 706a702..2d6c7df 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-21
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-21
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-22 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-22
index a246f84..1e8db88 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-22
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-22
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-23 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-23
index 02753be..233f27ee 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-23
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-23
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-24 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-24
index 331105c..c970a5e 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-24
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-24
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-25 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-25
index ce3da443..649e8f49 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-25
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-25
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-26 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-26
index b3bf8c23..13f6f24f 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-26
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-26
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-27 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-27
index 74bbe46..3fea5c9 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-27
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-27
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-28 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-28
index b38a709..8d28581 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-28
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-28
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-29 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-29
index 104d4e5..a62aafe 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-29
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-29
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-3 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-3
index 6d7be85..40bba5a 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-3
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-3
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-30 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-30
index b681ff1..60105af 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-30
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-30
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-31 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-31
index cd87b0e8..f7d319d 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-31
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-31
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-32 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-32
index c5cac32..b3708dae 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-32
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-32
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-33 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-33
index 89e3fcd..4ad749f 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-33
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-33
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-34 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-34
index b65a3d6f..c3e184ce 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-34
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-34
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-35 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-35
index 252a70c2..41ec1090 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-35
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-35
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-4 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-4
index 30718c5..d8c875e 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-4
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-4
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-5 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-5
index 06ad88e..1e282d0 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-5
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-5
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-6 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-6
index 6678772..52405e4 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-6
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-6
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-7 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-7
index e69ad856..81ebb61 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-7
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-7
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-8 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-8
index a8120ccd..9132035e 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-8
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-8
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-9 b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-9
index c037ce7..fb88269d 100644
--- a/third_party/libxml/src/fuzz/static_seed/regexp/xpath-9
+++ b/third_party/libxml/src/fuzz/static_seed/regexp/xpath-9
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/uri/dot b/third_party/libxml/src/fuzz/static_seed/uri/dot
index 945c9b46..6cac6b0 100644
--- a/third_party/libxml/src/fuzz/static_seed/uri/dot
+++ b/third_party/libxml/src/fuzz/static_seed/uri/dot
Binary files differ
diff --git a/third_party/libxml/src/fuzz/static_seed/uri/full b/third_party/libxml/src/fuzz/static_seed/uri/full
index 808e58a1..833329f 100644
--- a/third_party/libxml/src/fuzz/static_seed/uri/full
+++ b/third_party/libxml/src/fuzz/static_seed/uri/full
Binary files differ
diff --git a/third_party/libxml/src/fuzz/testFuzzer.c b/third_party/libxml/src/fuzz/testFuzzer.c
index fb791d9..d7c775f2 100644
--- a/third_party/libxml/src/fuzz/testFuzzer.c
+++ b/third_party/libxml/src/fuzz/testFuzzer.c
@@ -52,6 +52,16 @@
 #undef LLVMFuzzerTestOneInput
 #endif
 
+#ifdef HAVE_VALID_FUZZER
+int fuzzValidInit(int *argc, char ***argv);
+int fuzzValid(const char *data, size_t size);
+#define LLVMFuzzerInitialize fuzzValidInit
+#define LLVMFuzzerTestOneInput fuzzValid
+#include "valid.c"
+#undef LLVMFuzzerInitialize
+#undef LLVMFuzzerTestOneInput
+#endif
+
 #ifdef HAVE_XINCLUDE_FUZZER
 int fuzzXIncludeInit(int *argc, char ***argv);
 int fuzzXInclude(const char *data, size_t size);
@@ -190,7 +200,11 @@
         ret = 1;
 #endif
 #ifdef HAVE_URI_FUZZER
-    if (testFuzzer(NULL, fuzzUri, "seed/uri/*") != 0)
+    if (testFuzzer(fuzzUriInit, fuzzUri, "seed/uri/*") != 0)
+        ret = 1;
+#endif
+#ifdef HAVE_VALID_FUZZER
+    if (testFuzzer(fuzzValidInit, fuzzValid, "seed/valid/*") != 0)
         ret = 1;
 #endif
 #ifdef HAVE_XINCLUDE_FUZZER
diff --git a/third_party/libxml/src/fuzz/uri.c b/third_party/libxml/src/fuzz/uri.c
index 5e4c099c..5bc279f 100644
--- a/third_party/libxml/src/fuzz/uri.c
+++ b/third_party/libxml/src/fuzz/uri.c
@@ -8,40 +8,54 @@
 #include "fuzz.h"
 
 int
+LLVMFuzzerInitialize(int *argc ATTRIBUTE_UNUSED,
+                     char ***argv ATTRIBUTE_UNUSED) {
+    xmlFuzzMemSetup();
+    xmlSetGenericErrorFunc(NULL, xmlFuzzErrorFunc);
+
+    return 0;
+}
+
+int
 LLVMFuzzerTestOneInput(const char *data, size_t size) {
     xmlURIPtr uri;
-    char *str[2] = { NULL, NULL };
-    size_t numStrings;
+    size_t maxAlloc;
+    const char *str1, *str2;
+    char *copy;
 
     if (size > 10000)
         return(0);
 
-    numStrings = xmlFuzzExtractStrings(data, size, str, 2);
+    xmlFuzzDataInit(data, size);
+    maxAlloc = xmlFuzzReadInt(4) % (size * 8 + 1);
+    str1 = xmlFuzzReadString(NULL);
+    str2 = xmlFuzzReadString(NULL);
 
-    uri = xmlParseURI(str[0]);
+    xmlFuzzMemSetLimit(maxAlloc);
+
+    uri = xmlParseURI(str1);
     xmlFree(xmlSaveUri(uri));
     xmlFreeURI(uri);
 
-    uri = xmlParseURIRaw(str[0], 1);
+    uri = xmlParseURIRaw(str1, 1);
     xmlFree(xmlSaveUri(uri));
     xmlFreeURI(uri);
 
-    xmlFree(xmlURIUnescapeString(str[0], -1, NULL));
-    xmlFree(xmlURIEscape(BAD_CAST str[0]));
-    xmlFree(xmlCanonicPath(BAD_CAST str[0]));
-    xmlFree(xmlPathToURI(BAD_CAST str[0]));
+    xmlFree(xmlURIUnescapeString(str1, -1, NULL));
+    xmlFree(xmlURIEscape(BAD_CAST str1));
+    xmlFree(xmlCanonicPath(BAD_CAST str1));
+    xmlFree(xmlPathToURI(BAD_CAST str1));
 
-    if (numStrings >= 2) {
-        xmlFree(xmlBuildURI(BAD_CAST str[1], BAD_CAST str[0]));
-        xmlFree(xmlBuildRelativeURI(BAD_CAST str[1], BAD_CAST str[0]));
-        xmlFree(xmlURIEscapeStr(BAD_CAST str[0], BAD_CAST str[1]));
-    }
+    xmlFree(xmlBuildURI(BAD_CAST str2, BAD_CAST str1));
+    xmlFree(xmlBuildRelativeURI(BAD_CAST str2, BAD_CAST str1));
+    xmlFree(xmlURIEscapeStr(BAD_CAST str1, BAD_CAST str2));
 
-    /* Modifies string, so must come last. */
-    xmlNormalizeURIPath(str[0]);
+    copy = (char *) xmlCharStrdup(str1);
+    xmlNormalizeURIPath(copy);
+    xmlFree(copy);
 
-    xmlFree(str[0]);
-    xmlFree(str[1]);
+    xmlFuzzMemSetLimit(0);
+    xmlFuzzDataCleanup();
 
     return 0;
 }
diff --git a/third_party/libxml/src/fuzz/valid.c b/third_party/libxml/src/fuzz/valid.c
new file mode 100644
index 0000000..9d4a904
--- /dev/null
+++ b/third_party/libxml/src/fuzz/valid.c
@@ -0,0 +1,108 @@
+/*
+ * valid.c: a libFuzzer target to test DTD validation.
+ *
+ * See Copyright for the status of this software.
+ */
+
+#include <libxml/catalog.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <libxml/xmlerror.h>
+#include <libxml/xmlreader.h>
+#include "fuzz.h"
+
+int
+LLVMFuzzerInitialize(int *argc ATTRIBUTE_UNUSED,
+                     char ***argv ATTRIBUTE_UNUSED) {
+    xmlFuzzMemSetup();
+    xmlInitParser();
+#ifdef LIBXML_CATALOG_ENABLED
+    xmlInitializeCatalog();
+#endif
+    xmlSetGenericErrorFunc(NULL, xmlFuzzErrorFunc);
+    xmlSetExternalEntityLoader(xmlFuzzEntityLoader);
+
+    return 0;
+}
+
+int
+LLVMFuzzerTestOneInput(const char *data, size_t size) {
+    static const size_t maxChunkSize = 128;
+    xmlDocPtr doc;
+    xmlParserCtxtPtr ctxt;
+    xmlValidCtxtPtr vctxt;
+    xmlTextReaderPtr reader;
+    const char *docBuffer, *docUrl;
+    size_t maxAlloc, docSize, consumed, chunkSize;
+    int opts;
+
+    xmlFuzzDataInit(data, size);
+    opts = (int) xmlFuzzReadInt(4);
+    opts &= ~XML_PARSE_XINCLUDE;
+    opts |= XML_PARSE_DTDVALID;
+    maxAlloc = xmlFuzzReadInt(4) % (size + 1);
+
+    xmlFuzzReadEntities();
+    docBuffer = xmlFuzzMainEntity(&docSize);
+    docUrl = xmlFuzzMainUrl();
+    if (docBuffer == NULL)
+        goto exit;
+
+    /* Pull parser */
+
+    xmlFuzzMemSetLimit(maxAlloc);
+    doc = xmlReadMemory(docBuffer, docSize, docUrl, NULL, opts);
+    xmlFreeDoc(doc);
+
+    /* Post validation */
+
+    xmlFuzzMemSetLimit(maxAlloc);
+    doc = xmlReadMemory(docBuffer, docSize, docUrl, NULL, opts & ~XML_PARSE_DTDVALID);
+    vctxt = xmlNewValidCtxt();
+    xmlValidateDocument(vctxt, doc);
+    xmlFreeValidCtxt(vctxt);
+    xmlFreeDoc(doc);
+
+    /* Push parser */
+
+    xmlFuzzMemSetLimit(maxAlloc);
+    ctxt = xmlCreatePushParserCtxt(NULL, NULL, NULL, 0, docUrl);
+    if (ctxt == NULL)
+        goto exit;
+    xmlCtxtUseOptions(ctxt, opts);
+
+    for (consumed = 0; consumed < docSize; consumed += chunkSize) {
+        chunkSize = docSize - consumed;
+        if (chunkSize > maxChunkSize)
+            chunkSize = maxChunkSize;
+        xmlParseChunk(ctxt, docBuffer + consumed, chunkSize, 0);
+    }
+
+    xmlParseChunk(ctxt, NULL, 0, 1);
+    xmlFreeDoc(ctxt->myDoc);
+    xmlFreeParserCtxt(ctxt);
+
+    /* Reader */
+
+    xmlFuzzMemSetLimit(maxAlloc);
+    reader = xmlReaderForMemory(docBuffer, docSize, NULL, NULL, opts);
+    if (reader == NULL)
+        goto exit;
+    while (xmlTextReaderRead(reader) == 1) {
+        if (xmlTextReaderNodeType(reader) == XML_ELEMENT_NODE) {
+            int i, n = xmlTextReaderAttributeCount(reader);
+            for (i=0; i<n; i++) {
+                xmlTextReaderMoveToAttributeNo(reader, i);
+                while (xmlTextReaderReadAttributeValue(reader) == 1);
+            }
+        }
+    }
+    xmlFreeTextReader(reader);
+
+exit:
+    xmlFuzzMemSetLimit(0);
+    xmlFuzzDataCleanup();
+    xmlResetLastError();
+    return(0);
+}
+
diff --git a/third_party/libxml/src/fuzz/xinclude.c b/third_party/libxml/src/fuzz/xinclude.c
index b86e21b..18de3f4 100644
--- a/third_party/libxml/src/fuzz/xinclude.c
+++ b/third_party/libxml/src/fuzz/xinclude.c
@@ -15,6 +15,7 @@
 int
 LLVMFuzzerInitialize(int *argc ATTRIBUTE_UNUSED,
                      char ***argv ATTRIBUTE_UNUSED) {
+    xmlFuzzMemSetup();
     xmlInitParser();
 #ifdef LIBXML_CATALOG_ENABLED
     xmlInitializeCatalog();
@@ -30,12 +31,14 @@
     xmlDocPtr doc;
     xmlTextReaderPtr reader;
     const char *docBuffer, *docUrl;
-    size_t docSize;
+    size_t maxAlloc, docSize;
     int opts;
 
     xmlFuzzDataInit(data, size);
-    opts = xmlFuzzReadInt();
+    opts = (int) xmlFuzzReadInt(4);
+    opts &= ~XML_PARSE_DTDVALID;
     opts |= XML_PARSE_XINCLUDE;
+    maxAlloc = xmlFuzzReadInt(4) % (size + 1);
 
     xmlFuzzReadEntities();
     docBuffer = xmlFuzzMainEntity(&docSize);
@@ -45,12 +48,14 @@
 
     /* Pull parser */
 
+    xmlFuzzMemSetLimit(maxAlloc);
     doc = xmlReadMemory(docBuffer, docSize, docUrl, NULL, opts);
     xmlXIncludeProcessFlags(doc, opts);
     xmlFreeDoc(doc);
 
     /* Reader */
 
+    xmlFuzzMemSetLimit(maxAlloc);
     reader = xmlReaderForMemory(docBuffer, docSize, NULL, NULL, opts);
     if (reader == NULL)
         goto exit;
@@ -66,6 +71,7 @@
     xmlFreeTextReader(reader);
 
 exit:
+    xmlFuzzMemSetLimit(0);
     xmlFuzzDataCleanup();
     xmlResetLastError();
     return(0);
diff --git a/third_party/libxml/src/fuzz/xml.c b/third_party/libxml/src/fuzz/xml.c
index 7ff9bb8..0ac765d 100644
--- a/third_party/libxml/src/fuzz/xml.c
+++ b/third_party/libxml/src/fuzz/xml.c
@@ -14,6 +14,7 @@
 int
 LLVMFuzzerInitialize(int *argc ATTRIBUTE_UNUSED,
                      char ***argv ATTRIBUTE_UNUSED) {
+    xmlFuzzMemSetup();
     xmlInitParser();
 #ifdef LIBXML_CATALOG_ENABLED
     xmlInitializeCatalog();
@@ -32,12 +33,13 @@
     xmlTextReaderPtr reader;
     xmlChar *out;
     const char *docBuffer, *docUrl;
-    size_t docSize, consumed, chunkSize;
+    size_t maxAlloc, docSize, consumed, chunkSize;
     int opts, outSize;
 
     xmlFuzzDataInit(data, size);
-    opts = xmlFuzzReadInt();
-    opts &= ~XML_PARSE_XINCLUDE;
+    opts = (int) xmlFuzzReadInt(4);
+    opts &= ~XML_PARSE_XINCLUDE & ~XML_PARSE_DTDVALID;
+    maxAlloc = xmlFuzzReadInt(4) % (size + 1);
 
     xmlFuzzReadEntities();
     docBuffer = xmlFuzzMainEntity(&docSize);
@@ -47,6 +49,7 @@
 
     /* Pull parser */
 
+    xmlFuzzMemSetLimit(maxAlloc);
     doc = xmlReadMemory(docBuffer, docSize, docUrl, NULL, opts);
     /* Also test the serializer. */
     xmlDocDumpMemory(doc, &out, &outSize);
@@ -55,6 +58,7 @@
 
     /* Push parser */
 
+    xmlFuzzMemSetLimit(maxAlloc);
     ctxt = xmlCreatePushParserCtxt(NULL, NULL, NULL, 0, docUrl);
     if (ctxt == NULL)
         goto exit;
@@ -73,6 +77,7 @@
 
     /* Reader */
 
+    xmlFuzzMemSetLimit(maxAlloc);
     reader = xmlReaderForMemory(docBuffer, docSize, NULL, NULL, opts);
     if (reader == NULL)
         goto exit;
@@ -88,6 +93,7 @@
     xmlFreeTextReader(reader);
 
 exit:
+    xmlFuzzMemSetLimit(0);
     xmlFuzzDataCleanup();
     xmlResetLastError();
     return(0);
diff --git a/third_party/libxml/src/fuzz/xpath.c b/third_party/libxml/src/fuzz/xpath.c
index 47652bd5..a5eb70b2 100644
--- a/third_party/libxml/src/fuzz/xpath.c
+++ b/third_party/libxml/src/fuzz/xpath.c
@@ -11,6 +11,7 @@
 int
 LLVMFuzzerInitialize(int *argc ATTRIBUTE_UNUSED,
                      char ***argv ATTRIBUTE_UNUSED) {
+    xmlFuzzMemSetup();
     xmlInitParser();
     xmlSetGenericErrorFunc(NULL, xmlFuzzErrorFunc);
 
@@ -21,28 +22,36 @@
 LLVMFuzzerTestOneInput(const char *data, size_t size) {
     xmlDocPtr doc;
     const char *expr, *xml;
-    size_t exprSize, xmlSize;
+    size_t maxAlloc, exprSize, xmlSize;
 
     if (size > 10000)
         return(0);
 
     xmlFuzzDataInit(data, size);
 
+    maxAlloc = xmlFuzzReadInt(4) % (size + 1);
     expr = xmlFuzzReadString(&exprSize);
     xml = xmlFuzzReadString(&xmlSize);
 
     /* Recovery mode allows more input to be fuzzed. */
     doc = xmlReadMemory(xml, xmlSize, NULL, NULL, XML_PARSE_RECOVER);
     if (doc != NULL) {
-        xmlXPathContextPtr xpctxt = xmlXPathNewContext(doc);
+        xmlXPathContextPtr xpctxt;
 
-        /* Operation limit to avoid timeout */
-        xpctxt->opLimit = 500000;
+        xmlFuzzMemSetLimit(maxAlloc);
 
-        xmlXPathFreeObject(xmlXPtrEval(BAD_CAST expr, xpctxt));
-        xmlXPathFreeContext(xpctxt);
+        xpctxt = xmlXPathNewContext(doc);
+        if (xpctxt != NULL) {
+            /* Operation limit to avoid timeout */
+            xpctxt->opLimit = 500000;
+
+            xmlXPathFreeObject(xmlXPtrEval(BAD_CAST expr, xpctxt));
+            xmlXPathFreeContext(xpctxt);
+        }
+
+        xmlFuzzMemSetLimit(0);
+        xmlFreeDoc(doc);
     }
-    xmlFreeDoc(doc);
 
     xmlFuzzDataCleanup();
     xmlResetLastError();
diff --git a/third_party/libxml/src/hash.c b/third_party/libxml/src/hash.c
index bccc812..479ff46 100644
--- a/third_party/libxml/src/hash.c
+++ b/third_party/libxml/src/hash.c
@@ -78,6 +78,7 @@
  */
 #ifdef __clang__
 ATTRIBUTE_NO_SANITIZE("unsigned-integer-overflow")
+ATTRIBUTE_NO_SANITIZE("unsigned-shift-base")
 #endif
 static unsigned long
 xmlHashComputeKey(xmlHashTablePtr table, const xmlChar *name,
@@ -111,6 +112,7 @@
 
 #ifdef __clang__
 ATTRIBUTE_NO_SANITIZE("unsigned-integer-overflow")
+ATTRIBUTE_NO_SANITIZE("unsigned-shift-base")
 #endif
 static unsigned long
 xmlHashComputeQKey(xmlHashTablePtr table,
@@ -611,8 +613,24 @@
         entry->name3 = (xmlChar *) name3;
     } else {
 	entry->name = xmlStrdup(name);
-	entry->name2 = xmlStrdup(name2);
-	entry->name3 = xmlStrdup(name3);
+        if (entry->name == NULL) {
+            entry->name2 = NULL;
+            goto error;
+        }
+        if (name2 == NULL) {
+            entry->name2 = NULL;
+        } else {
+	    entry->name2 = xmlStrdup(name2);
+            if (entry->name2 == NULL)
+                goto error;
+        }
+        if (name3 == NULL) {
+            entry->name3 = NULL;
+        } else {
+	    entry->name3 = xmlStrdup(name3);
+            if (entry->name3 == NULL)
+                goto error;
+        }
     }
     entry->payload = userdata;
     entry->next = NULL;
@@ -628,6 +646,13 @@
 	xmlHashGrow(table, MAX_HASH_LEN * table->size);
 
     return(0);
+
+error:
+    xmlFree(entry->name2);
+    xmlFree(entry->name);
+    if (insert != NULL)
+        xmlFree(entry);
+    return(-1);
 }
 
 /**
@@ -741,8 +766,24 @@
         entry->name3 = (xmlChar *) name3;
     } else {
 	entry->name = xmlStrdup(name);
-	entry->name2 = xmlStrdup(name2);
-	entry->name3 = xmlStrdup(name3);
+        if (entry->name == NULL) {
+            entry->name2 = NULL;
+            goto error;
+        }
+        if (name2 == NULL) {
+            entry->name2 = NULL;
+        } else {
+	    entry->name2 = xmlStrdup(name2);
+            if (entry->name2 == NULL)
+                goto error;
+        }
+        if (name3 == NULL) {
+            entry->name3 = NULL;
+        } else {
+	    entry->name3 = xmlStrdup(name3);
+            if (entry->name3 == NULL)
+                goto error;
+        }
     }
     entry->payload = userdata;
     entry->next = NULL;
@@ -754,6 +795,13 @@
 	insert->next = entry;
     }
     return(0);
+
+error:
+    xmlFree(entry->name2);
+    xmlFree(entry->name);
+    if (insert != NULL)
+        xmlFree(entry);
+    return(-1);
 }
 
 /**
diff --git a/third_party/libxml/src/include/libxml/parser.h b/third_party/libxml/src/include/libxml/parser.h
index 0bc34691..51d71e6 100644
--- a/third_party/libxml/src/include/libxml/parser.h
+++ b/third_party/libxml/src/include/libxml/parser.h
@@ -828,9 +828,11 @@
 /*
  * Input functions
  */
+XML_DEPRECATED
 XMLPUBFUN int
 		xmlParserInputRead	(xmlParserInputPtr in,
 					 int len);
+XML_DEPRECATED
 XMLPUBFUN int
 		xmlParserInputGrow	(xmlParserInputPtr in,
 					 int len);
diff --git a/third_party/libxml/src/include/libxml/parserInternals.h b/third_party/libxml/src/include/libxml/parserInternals.h
index 55d6527..ab512499 100644
--- a/third_party/libxml/src/include/libxml/parserInternals.h
+++ b/third_party/libxml/src/include/libxml/parserInternals.h
@@ -41,6 +41,13 @@
 #define XML_MAX_TEXT_LENGTH 10000000
 
 /**
+ * XML_MAX_HUGE_LENGTH:
+ *
+ * Maximum size allowed when XML_PARSE_HUGE is set.
+ */
+#define XML_MAX_HUGE_LENGTH 1000000000
+
+/**
  * XML_MAX_NAME_LENGTH:
  *
  * Maximum size allowed for a markup identifier.
@@ -575,6 +582,7 @@
 						 xmlChar *out,
 						 int val);
 XMLPUBFUN void			xmlNextChar		(xmlParserCtxtPtr ctxt);
+XML_DEPRECATED
 XMLPUBFUN void			xmlParserInputShrink	(xmlParserInputPtr in);
 
 /*
diff --git a/third_party/libxml/src/include/libxml/xmlmemory.h b/third_party/libxml/src/include/libxml/xmlmemory.h
index 969d687..830933a7 100644
--- a/third_party/libxml/src/include/libxml/xmlmemory.h
+++ b/third_party/libxml/src/include/libxml/xmlmemory.h
@@ -139,6 +139,8 @@
 /*
  * These are specific to the XML debug memory wrapper.
  */
+XMLPUBFUN size_t
+	xmlMemSize	(void *ptr);
 XMLPUBFUN int
 	xmlMemUsed	(void);
 XMLPUBFUN int
diff --git a/third_party/libxml/src/include/libxml/xmlschemastypes.h b/third_party/libxml/src/include/libxml/xmlschemastypes.h
index eb1388d..e2cde35 100644
--- a/third_party/libxml/src/include/libxml/xmlschemastypes.h
+++ b/third_party/libxml/src/include/libxml/xmlschemastypes.h
@@ -30,7 +30,7 @@
     XML_SCHEMA_WHITESPACE_COLLAPSE = 3
 } xmlSchemaWhitespaceValueType;
 
-XMLPUBFUN void
+XMLPUBFUN int
 		xmlSchemaInitTypes		(void);
 XML_DEPRECATED
 XMLPUBFUN void
diff --git a/third_party/libxml/src/include/libxml/xpath.h b/third_party/libxml/src/include/libxml/xpath.h
index 8a70ddc..b57985a 100644
--- a/third_party/libxml/src/include/libxml/xpath.h
+++ b/third_party/libxml/src/include/libxml/xpath.h
@@ -400,7 +400,7 @@
     int xptr;				/* it this an XPointer expression */
     xmlNodePtr         ancestor;	/* used for walking preceding axis */
 
-    int              valueFrame;        /* used to limit Pop on the stack */
+    int              valueFrame;        /* unused */
 };
 
 /************************************************************************
diff --git a/third_party/libxml/src/include/libxml/xpathInternals.h b/third_party/libxml/src/include/libxml/xpathInternals.h
index 57ff7a8d..cb0991d7 100644
--- a/third_party/libxml/src/include/libxml/xpathInternals.h
+++ b/third_party/libxml/src/include/libxml/xpathInternals.h
@@ -273,8 +273,7 @@
  * type.
  */
 #define CHECK_TYPE(typeval)						\
-    if ((ctxt->error != 0) ||						\
-        (ctxt->value == NULL) || (ctxt->value->type != typeval))	\
+    if ((ctxt->value == NULL) || (ctxt->value->type != typeval))	\
         XP_ERROR(XPATH_INVALID_TYPE)
 
 /**
diff --git a/third_party/libxml/src/include/private/parser.h b/third_party/libxml/src/include/private/parser.h
index 43945f9..18036db 100644
--- a/third_party/libxml/src/include/private/parser.h
+++ b/third_party/libxml/src/include/private/parser.h
@@ -23,5 +23,11 @@
 __xmlErrEncoding(xmlParserCtxtPtr ctxt, xmlParserErrors xmlerr,
                  const char *msg, const xmlChar *str1,
                  const xmlChar *str2) LIBXML_ATTR_FORMAT(3,0);
+XML_HIDDEN void
+xmlHaltParser(xmlParserCtxtPtr ctxt);
+XML_HIDDEN int
+xmlParserGrow(xmlParserCtxtPtr ctxt);
+XML_HIDDEN int
+xmlParserShrink(xmlParserCtxtPtr ctxt);
 
 #endif /* XML_PARSER_H_PRIVATE__ */
diff --git a/third_party/libxml/src/parser.c b/third_party/libxml/src/parser.c
index f302f34c..8e548cd 100644
--- a/third_party/libxml/src/parser.c
+++ b/third_party/libxml/src/parser.c
@@ -100,8 +100,6 @@
         const xmlChar *URL, const xmlChar *ID, const xmlChar *base,
         xmlParserCtxtPtr pctx);
 
-static void xmlHaltParser(xmlParserCtxtPtr ctxt);
-
 static int
 xmlParseElementStart(xmlParserCtxtPtr ctxt);
 
@@ -114,20 +112,31 @@
  *									*
  ************************************************************************/
 
-#define XML_MAX_HUGE_LENGTH 1000000000
-
 #define XML_PARSER_BIG_ENTITY 1000
 #define XML_PARSER_LOT_ENTITY 5000
 
 /*
- * XML_PARSER_NON_LINEAR is the threshold where the ratio of parsed entity
- *    replacement over the size in byte of the input indicates that you have
- *    and exponential behaviour. A value of 10 correspond to at least 3 entity
- *    replacement per byte of input.
+ * Constants for protection against abusive entity expansion
+ * ("billion laughs").
  */
-#define XML_PARSER_NON_LINEAR 10
 
-#define XML_ENT_FIXED_COST 50
+/*
+ * XML_PARSER_NON_LINEAR is roughly the maximum allowed amplification factor
+ * of serialized output after entity expansion.
+ */
+#define XML_PARSER_NON_LINEAR 5
+
+/*
+ * A certain amount is always allowed.
+ */
+#define XML_PARSER_ALLOWED_EXPANSION 1000000
+
+/*
+ * Fixed cost for each entity reference. This crudely models processing time
+ * as well to protect, for example, against exponential expansion of empty
+ * or very short entities.
+ */
+#define XML_ENT_FIXED_COST 20
 
 /**
  * xmlParserMaxDepth:
@@ -795,7 +804,7 @@
      * entity sizes to make the size checks reliable. If "sizeentcopy"
      * overflows, we have to abort.
      */
-    if ((ctxt->sizeentcopy > XML_MAX_TEXT_LENGTH) &&
+    if ((ctxt->sizeentcopy > XML_PARSER_ALLOWED_EXPANSION) &&
         ((ctxt->sizeentcopy >= ULONG_MAX) ||
          (ctxt->sizeentcopy / XML_PARSER_NON_LINEAR > consumed))) {
         xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_LOOP,
@@ -2036,7 +2045,7 @@
 #define SKIP(val) do {							\
     ctxt->input->cur += (val),ctxt->input->col+=(val);			\
     if (*ctxt->input->cur == 0)						\
-        xmlParserInputGrow(ctxt->input, INPUT_CHUNK);			\
+        xmlParserGrow(ctxt);						\
   } while (0)
 
 #define SKIPL(val) do {							\
@@ -2048,50 +2057,17 @@
 	ctxt->input->cur++;						\
     }									\
     if (*ctxt->input->cur == 0)						\
-        xmlParserInputGrow(ctxt->input, INPUT_CHUNK);			\
+        xmlParserGrow(ctxt);						\
   } while (0)
 
 #define SHRINK if ((ctxt->progressive == 0) &&				\
 		   (ctxt->input->cur - ctxt->input->base > 2 * INPUT_CHUNK) && \
 		   (ctxt->input->end - ctxt->input->cur < 2 * INPUT_CHUNK)) \
-	xmlSHRINK (ctxt);
-
-static void xmlSHRINK (xmlParserCtxtPtr ctxt) {
-    /* Don't shrink memory buffers. */
-    if ((ctxt->input->buf) &&
-        ((ctxt->input->buf->encoder) || (ctxt->input->buf->readcallback)))
-        xmlParserInputShrink(ctxt->input);
-    if (*ctxt->input->cur == 0)
-        xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
-}
+	xmlParserShrink(ctxt);
 
 #define GROW if ((ctxt->progressive == 0) &&				\
 		 (ctxt->input->end - ctxt->input->cur < INPUT_CHUNK))	\
-	xmlGROW (ctxt);
-
-static void xmlGROW (xmlParserCtxtPtr ctxt) {
-    ptrdiff_t curEnd = ctxt->input->end - ctxt->input->cur;
-    ptrdiff_t curBase = ctxt->input->cur - ctxt->input->base;
-
-    if (((curEnd > XML_MAX_LOOKUP_LIMIT) ||
-         (curBase > XML_MAX_LOOKUP_LIMIT)) &&
-         ((ctxt->input->buf) &&
-          (ctxt->input->buf->readcallback != NULL)) &&
-        ((ctxt->options & XML_PARSE_HUGE) == 0)) {
-        xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "Huge input lookup");
-        xmlHaltParser(ctxt);
-	return;
-    }
-    xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
-    if ((ctxt->input->cur > ctxt->input->end) ||
-        (ctxt->input->cur < ctxt->input->base)) {
-        xmlHaltParser(ctxt);
-        xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "cur index out of bound");
-	return;
-    }
-    if ((ctxt->input->cur != NULL) && (*ctxt->input->cur == 0))
-        xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
-}
+	xmlParserGrow(ctxt);
 
 #define SKIP_BLANKS xmlSkipBlankChars(ctxt)
 
@@ -2101,7 +2077,7 @@
 	ctxt->input->col++;						\
 	ctxt->input->cur++;						\
 	if (*ctxt->input->cur == 0)					\
-	    xmlParserInputGrow(ctxt->input, INPUT_CHUNK);		\
+	    xmlParserGrow(ctxt);						\
     }
 
 #define NEXTL(l) do {							\
@@ -2154,7 +2130,7 @@
 		res++;
 	    if (*cur == 0) {
 		ctxt->input->cur = cur;
-		xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+		xmlParserGrow(ctxt);
 		cur = ctxt->input->cur;
 	    }
 	}
@@ -2248,7 +2224,7 @@
         input->entity->flags &= ~XML_ENT_EXPANDING;
     xmlFreeInputStream(input);
     if (*ctxt->input->cur == 0)
-        xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
+        xmlParserGrow(ctxt);
     return(CUR);
 }
 
@@ -3225,7 +3201,6 @@
 xmlParseNameComplex(xmlParserCtxtPtr ctxt) {
     int len = 0, l;
     int c;
-    int count = 0;
     int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
                     XML_MAX_TEXT_LENGTH :
                     XML_MAX_NAME_LENGTH;
@@ -3237,9 +3212,6 @@
     /*
      * Handler for more complex cases
      */
-    GROW;
-    if (ctxt->instate == XML_PARSER_EOF)
-        return(NULL);
     c = CUR_CHAR(l);
     if ((ctxt->options & XML_PARSE_OLD10) == 0) {
         /*
@@ -3288,12 +3260,6 @@
 	        ((c >= 0xFDF0) && (c <= 0xFFFD)) ||
 	        ((c >= 0x10000) && (c <= 0xEFFFF))
 		)) {
-	    if (count++ > XML_PARSER_CHUNK_SIZE) {
-		count = 0;
-		GROW;
-                if (ctxt->instate == XML_PARSER_EOF)
-                    return(NULL);
-	    }
             if (len <= INT_MAX - l)
 	        len += l;
 	    NEXTL(l);
@@ -3315,18 +3281,14 @@
 		(c == '_') || (c == ':') ||
 		(IS_COMBINING(c)) ||
 		(IS_EXTENDER(c)))) {
-	    if (count++ > XML_PARSER_CHUNK_SIZE) {
-		count = 0;
-		GROW;
-                if (ctxt->instate == XML_PARSER_EOF)
-                    return(NULL);
-	    }
             if (len <= INT_MAX - l)
 	        len += l;
 	    NEXTL(l);
 	    c = CUR_CHAR(l);
 	}
     }
+    if (ctxt->instate == XML_PARSER_EOF)
+        return(NULL);
     if (len > maxLength) {
         xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name");
         return(NULL);
@@ -3374,6 +3336,8 @@
                        XML_MAX_NAME_LENGTH;
 
     GROW;
+    if (ctxt->instate == XML_PARSER_EOF)
+        return(NULL);
 
 #ifdef DEBUG
     nbParseName++;
@@ -3415,7 +3379,6 @@
 xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) {
     int len = 0, l;
     int c;
-    int count = 0;
     int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
                     XML_MAX_TEXT_LENGTH :
                     XML_MAX_NAME_LENGTH;
@@ -3428,7 +3391,6 @@
     /*
      * Handler for more complex cases
      */
-    GROW;
     startPosition = CUR_PTR - BASE_PTR;
     c = CUR_CHAR(l);
     if ((c == ' ') || (c == '>') || (c == '/') || /* accelerators */
@@ -3438,31 +3400,13 @@
 
     while ((c != ' ') && (c != '>') && (c != '/') && /* test bigname.xml */
 	   (xmlIsNameChar(ctxt, c) && (c != ':'))) {
-	if (count++ > XML_PARSER_CHUNK_SIZE) {
-	    count = 0;
-	    GROW;
-            if (ctxt->instate == XML_PARSER_EOF)
-                return(NULL);
-	}
         if (len <= INT_MAX - l)
 	    len += l;
 	NEXTL(l);
 	c = CUR_CHAR(l);
-	if (c == 0) {
-	    count = 0;
-	    /*
-	     * when shrinking to extend the buffer we really need to preserve
-	     * the part of the name we already parsed. Hence rolling back
-	     * by current length.
-	     */
-	    ctxt->input->cur -= l;
-	    GROW;
-            if (ctxt->instate == XML_PARSER_EOF)
-                return(NULL);
-	    ctxt->input->cur += l;
-	    c = CUR_CHAR(l);
-	}
     }
+    if (ctxt->instate == XML_PARSER_EOF)
+        return(NULL);
     if (len > maxLength) {
         xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NCName");
         return(NULL);
@@ -3688,7 +3632,6 @@
     xmlChar buf[XML_MAX_NAMELEN + 5];
     int len = 0, l;
     int c;
-    int count = 0;
     int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
                     XML_MAX_TEXT_LENGTH :
                     XML_MAX_NAME_LENGTH;
@@ -3697,26 +3640,12 @@
     nbParseNmToken++;
 #endif
 
-    GROW;
-    if (ctxt->instate == XML_PARSER_EOF)
-        return(NULL);
     c = CUR_CHAR(l);
 
     while (xmlIsNameChar(ctxt, c)) {
-	if (count++ > XML_PARSER_CHUNK_SIZE) {
-	    count = 0;
-	    GROW;
-	}
 	COPY_BUF(l,buf,len,c);
 	NEXTL(l);
 	c = CUR_CHAR(l);
-	if (c == 0) {
-	    count = 0;
-	    GROW;
-	    if (ctxt->instate == XML_PARSER_EOF)
-		return(NULL);
-            c = CUR_CHAR(l);
-	}
 	if (len >= XML_MAX_NAMELEN) {
 	    /*
 	     * Okay someone managed to make a huge token, so he's ready to pay
@@ -3732,14 +3661,6 @@
 	    }
 	    memcpy(buffer, buf, len);
 	    while (xmlIsNameChar(ctxt, c)) {
-		if (count++ > XML_PARSER_CHUNK_SIZE) {
-		    count = 0;
-		    GROW;
-                    if (ctxt->instate == XML_PARSER_EOF) {
-                        xmlFree(buffer);
-                        return(NULL);
-                    }
-		}
 		if (len + 10 > max) {
 		    xmlChar *tmp;
 
@@ -3753,18 +3674,24 @@
 		    buffer = tmp;
 		}
 		COPY_BUF(l,buffer,len,c);
-		NEXTL(l);
-		c = CUR_CHAR(l);
                 if (len > maxLength) {
                     xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "NmToken");
                     xmlFree(buffer);
                     return(NULL);
                 }
+		NEXTL(l);
+		c = CUR_CHAR(l);
 	    }
 	    buffer[len] = 0;
+            if (ctxt->instate == XML_PARSER_EOF) {
+                xmlFree(buffer);
+                return(NULL);
+            }
 	    return(buffer);
 	}
     }
+    if (ctxt->instate == XML_PARSER_EOF)
+        return(NULL);
     if (len == 0)
         return(NULL);
     if (len > maxLength) {
@@ -4255,7 +4182,6 @@
                     XML_MAX_NAME_LENGTH;
     xmlChar stop;
     int state = ctxt->instate;
-    int count = 0;
 
     SHRINK;
     if (RAW == '"') {
@@ -4290,32 +4216,21 @@
 	    }
 	    buf = tmp;
 	}
-	count++;
-	if (count > 50) {
-	    SHRINK;
-	    GROW;
-	    count = 0;
-            if (ctxt->instate == XML_PARSER_EOF) {
-	        xmlFree(buf);
-		return(NULL);
-            }
-	}
 	COPY_BUF(l,buf,len,cur);
-	NEXTL(l);
-	cur = CUR_CHAR(l);
-	if (cur == 0) {
-	    GROW;
-	    SHRINK;
-	    cur = CUR_CHAR(l);
-	}
         if (len > maxLength) {
             xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "SystemLiteral");
             xmlFree(buf);
             ctxt->instate = (xmlParserInputState) state;
             return(NULL);
         }
+	NEXTL(l);
+	cur = CUR_CHAR(l);
     }
     buf[len] = 0;
+    if (ctxt->instate == XML_PARSER_EOF) {
+        xmlFree(buf);
+        return(NULL);
+    }
     ctxt->instate = (xmlParserInputState) state;
     if (!IS_CHAR(cur)) {
 	xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, NULL);
@@ -4348,7 +4263,6 @@
                     XML_MAX_NAME_LENGTH;
     xmlChar cur;
     xmlChar stop;
-    int count = 0;
     xmlParserInputState oldstate = ctxt->instate;
 
     SHRINK;
@@ -4383,34 +4297,23 @@
 	    buf = tmp;
 	}
 	buf[len++] = cur;
-	count++;
-	if (count > 50) {
-	    SHRINK;
-	    GROW;
-	    count = 0;
-            if (ctxt->instate == XML_PARSER_EOF) {
-		xmlFree(buf);
-		return(NULL);
-            }
-	}
-	NEXT;
-	cur = CUR;
-	if (cur == 0) {
-	    GROW;
-	    SHRINK;
-	    cur = CUR;
-	}
         if (len > maxLength) {
             xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Public ID");
             xmlFree(buf);
             return(NULL);
         }
+	NEXT;
+	cur = CUR;
     }
     buf[len] = 0;
+    if (ctxt->instate == XML_PARSER_EOF) {
+        xmlFree(buf);
+        return(NULL);
+    }
     if (cur != stop) {
 	xmlFatalErr(ctxt, XML_ERR_LITERAL_NOT_FINISHED, NULL);
     } else {
-	NEXT;
+	NEXTL(1);
     }
     ctxt->instate = oldstate;
     return(buf);
@@ -4629,10 +4532,8 @@
     xmlChar buf[XML_PARSER_BIG_BUFFER_SIZE + 5];
     int nbchar = 0;
     int cur, l;
-    int count = 0;
 
     SHRINK;
-    GROW;
     cur = CUR_CHAR(l);
     while ((cur != '<') && /* checked */
            (cur != '&') &&
@@ -4643,7 +4544,6 @@
 	COPY_BUF(l,buf,nbchar,cur);
 	/* move current position before possible calling of ctxt->sax->characters */
 	NEXTL(l);
-	cur = CUR_CHAR(l);
 	if (nbchar >= XML_PARSER_BIG_BUFFER_SIZE) {
 	    buf[nbchar] = 0;
 
@@ -4668,16 +4568,12 @@
             /* something really bad happened in the SAX callback */
             if (ctxt->instate != XML_PARSER_CONTENT)
                 return;
+            SHRINK;
 	}
-	count++;
-	if (count > 50) {
-	    SHRINK;
-	    GROW;
-	    count = 0;
-            if (ctxt->instate == XML_PARSER_EOF)
-		return;
-	}
+	cur = CUR_CHAR(l);
     }
+    if (ctxt->instate == XML_PARSER_EOF)
+        return;
     if (nbchar != 0) {
         buf[nbchar] = 0;
 	/*
@@ -4802,7 +4698,6 @@
     int q, ql;
     int r, rl;
     int cur, l;
-    size_t count = 0;
     size_t maxLength = (ctxt->options & XML_PARSE_HUGE) ?
                        XML_MAX_HUGE_LENGTH :
                        XML_MAX_TEXT_LENGTH;
@@ -4819,7 +4714,6 @@
 	    return;
 	}
     }
-    GROW;	/* Assure there's enough input data */
     q = CUR_CHAR(ql);
     if (q == 0)
         goto not_terminated;
@@ -4866,37 +4760,27 @@
             size = new_size;
 	}
 	COPY_BUF(ql,buf,len,q);
-	q = r;
-	ql = rl;
-	r = cur;
-	rl = l;
-
-	count++;
-	if (count > 50) {
-	    SHRINK;
-	    GROW;
-	    count = 0;
-            if (ctxt->instate == XML_PARSER_EOF) {
-		xmlFree(buf);
-		return;
-            }
-	}
-	NEXTL(l);
-	cur = CUR_CHAR(l);
-	if (cur == 0) {
-	    SHRINK;
-	    GROW;
-	    cur = CUR_CHAR(l);
-	}
-
         if (len > maxLength) {
             xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED,
                          "Comment too big found", NULL);
             xmlFree (buf);
             return;
         }
+
+	q = r;
+	ql = rl;
+	r = cur;
+	rl = l;
+
+	NEXTL(l);
+	cur = CUR_CHAR(l);
+
     }
     buf[len] = 0;
+    if (ctxt->instate == XML_PARSER_EOF) {
+        xmlFree(buf);
+        return;
+    }
     if (cur == 0) {
 	xmlFatalErrMsgStr(ctxt, XML_ERR_COMMENT_NOT_FINISHED,
 	                     "Comment not terminated \n<!--%.50s\n", buf);
@@ -5240,7 +5124,6 @@
     int cur, l;
     const xmlChar *target;
     xmlParserInputState state;
-    int count = 0;
 
     if ((RAW == '<') && (NXT(1) == '?')) {
 	int inputid = ctxt->input->id;
@@ -5303,24 +5186,7 @@
 		    buf = tmp;
                     size = new_size;
 		}
-		count++;
-		if (count > 50) {
-		    SHRINK;
-		    GROW;
-                    if (ctxt->instate == XML_PARSER_EOF) {
-                        xmlFree(buf);
-                        return;
-                    }
-		    count = 0;
-		}
 		COPY_BUF(l,buf,len,cur);
-		NEXTL(l);
-		cur = CUR_CHAR(l);
-		if (cur == 0) {
-		    SHRINK;
-		    GROW;
-		    cur = CUR_CHAR(l);
-		}
                 if (len > maxLength) {
                     xmlFatalErrMsgStr(ctxt, XML_ERR_PI_NOT_FINISHED,
                                       "PI %s too big found", target);
@@ -5328,8 +5194,14 @@
                     ctxt->instate = state;
                     return;
                 }
+		NEXTL(l);
+		cur = CUR_CHAR(l);
 	    }
 	    buf[len] = 0;
+            if (ctxt->instate == XML_PARSER_EOF) {
+                xmlFree(buf);
+                return;
+            }
 	    if (cur != '?') {
 		xmlFatalErrMsgStr(ctxt, XML_ERR_PI_NOT_FINISHED,
 		      "ParsePI: PI %s never end ...\n", target);
@@ -8161,7 +8033,6 @@
     xmlParserInputPtr input;
     xmlBufferPtr buf;
     int l, c;
-    int count = 0;
 
     if ((ctxt == NULL) || (entity == NULL) ||
         ((entity->etype != XML_EXTERNAL_PARAMETER_ENTITY) &&
@@ -8207,25 +8078,12 @@
     while ((ctxt->input == input) && (ctxt->input->cur < ctxt->input->end) &&
            (IS_CHAR(c))) {
         xmlBufferAdd(buf, ctxt->input->cur, l);
-	if (count++ > XML_PARSER_CHUNK_SIZE) {
-	    count = 0;
-	    GROW;
-            if (ctxt->instate == XML_PARSER_EOF) {
-                xmlBufferFree(buf);
-                return(-1);
-            }
-	}
 	NEXTL(l);
 	c = CUR_CHAR(l);
-	if (c == 0) {
-	    count = 0;
-	    GROW;
-            if (ctxt->instate == XML_PARSER_EOF) {
-                xmlBufferFree(buf);
-                return(-1);
-            }
-	    c = CUR_CHAR(l);
-	}
+    }
+    if (ctxt->instate == XML_PARSER_EOF) {
+	xmlBufferFree(buf);
+	return(-1);
     }
 
     if ((ctxt->input == input) && (ctxt->input->cur >= ctxt->input->end)) {
@@ -8885,6 +8743,8 @@
     const xmlChar *l, *p;
 
     GROW;
+    if (ctxt->instate == XML_PARSER_EOF)
+        return(NULL);
 
     l = xmlParseNCName(ctxt);
     if (l == NULL) {
@@ -9363,7 +9223,7 @@
     int maxatts = ctxt->maxatts;
     int nratts, nbatts, nbdef, inputid;
     int i, j, nbNs, attval;
-    unsigned long cur;
+    size_t cur;
     int nsNr = ctxt->nsNr;
 
     if (RAW != '<') return(NULL);
@@ -9866,7 +9726,6 @@
     int r, rl;
     int	s, sl;
     int cur, l;
-    int count = 0;
     int maxLength = (ctxt->options & XML_PARSE_HUGE) ?
                     XML_MAX_HUGE_LENGTH :
                     XML_MAX_TEXT_LENGTH;
@@ -9912,28 +9771,23 @@
 	    size *= 2;
 	}
 	COPY_BUF(rl,buf,len,r);
-	r = s;
-	rl = sl;
-	s = cur;
-	sl = l;
-	count++;
-	if (count > 50) {
-	    SHRINK;
-	    GROW;
-            if (ctxt->instate == XML_PARSER_EOF) {
-                goto out;
-            }
-	    count = 0;
-	}
-	NEXTL(l);
-	cur = CUR_CHAR(l);
         if (len > maxLength) {
             xmlFatalErrMsg(ctxt, XML_ERR_CDATA_NOT_FINISHED,
                            "CData section too big found\n");
             goto out;
         }
+	r = s;
+	rl = sl;
+	s = cur;
+	sl = l;
+	NEXTL(l);
+	cur = CUR_CHAR(l);
     }
     buf[len] = 0;
+    if (ctxt->instate == XML_PARSER_EOF) {
+        xmlFree(buf);
+        return;
+    }
     if (cur != '>') {
 	xmlFatalErrMsgStr(ctxt, XML_ERR_CDATA_NOT_FINISHED,
 	                     "CData section not finished\n%.50s\n", buf);
@@ -11115,7 +10969,13 @@
     }
 
     if (memchr(cur, c, ctxt->input->end - cur) == NULL) {
-        ctxt->checkIndex = ctxt->input->end - ctxt->input->cur;
+        size_t index = ctxt->input->end - ctxt->input->cur;
+
+        if (index > LONG_MAX) {
+            ctxt->checkIndex = 0;
+            return(1);
+        }
+        ctxt->checkIndex = index;
         return(0);
     } else {
         ctxt->checkIndex = 0;
@@ -11146,13 +11006,19 @@
     term = BAD_CAST strstr((const char *) cur, str);
     if (term == NULL) {
         const xmlChar *end = ctxt->input->end;
+        size_t index;
 
         /* Rescan (strLen - 1) characters. */
         if ((size_t) (end - cur) < strLen)
             end = cur;
         else
             end -= strLen - 1;
-        ctxt->checkIndex = end - ctxt->input->cur;
+        index = end - ctxt->input->cur;
+        if (index > LONG_MAX) {
+            ctxt->checkIndex = 0;
+            return(ctxt->input->end - strLen);
+        }
+        ctxt->checkIndex = index;
     } else {
         ctxt->checkIndex = 0;
     }
@@ -11170,6 +11036,7 @@
 xmlParseLookupCharData(xmlParserCtxtPtr ctxt) {
     const xmlChar *cur = ctxt->input->cur + ctxt->checkIndex;
     const xmlChar *end = ctxt->input->end;
+    size_t index;
 
     while (cur < end) {
         if ((*cur == '<') || (*cur == '&')) {
@@ -11179,7 +11046,12 @@
         cur++;
     }
 
-    ctxt->checkIndex = cur - ctxt->input->cur;
+    index = cur - ctxt->input->cur;
+    if (index > LONG_MAX) {
+        ctxt->checkIndex = 0;
+        return(1);
+    }
+    ctxt->checkIndex = index;
     return(0);
 }
 
@@ -11195,6 +11067,7 @@
     const xmlChar *cur;
     const xmlChar *end = ctxt->input->end;
     int state = ctxt->endCheckState;
+    size_t index;
 
     if (ctxt->checkIndex == 0)
         cur = ctxt->input->cur + 1;
@@ -11215,7 +11088,13 @@
         cur++;
     }
 
-    ctxt->checkIndex = cur - ctxt->input->cur;
+    index = cur - ctxt->input->cur;
+    if (index > LONG_MAX) {
+        ctxt->checkIndex = 0;
+        ctxt->endCheckState = 0;
+        return(1);
+    }
+    ctxt->checkIndex = index;
     ctxt->endCheckState = state;
     return(0);
 }
@@ -11239,6 +11118,7 @@
     const xmlChar *cur, *start;
     const xmlChar *end = ctxt->input->end;
     int state = ctxt->endCheckState;
+    size_t index;
 
     if (ctxt->checkIndex == 0) {
         cur = ctxt->input->cur + 1;
@@ -11318,7 +11198,13 @@
         else
             cur -= 3;
     }
-    ctxt->checkIndex = cur - ctxt->input->cur;
+    index = cur - ctxt->input->cur;
+    if (index > LONG_MAX) {
+        ctxt->checkIndex = 0;
+        ctxt->endCheckState = 0;
+        return(1);
+    }
+    ctxt->checkIndex = index;
     ctxt->endCheckState = state;
     return(0);
 }
@@ -11403,7 +11289,8 @@
 static int
 xmlParseTryOrFinish(xmlParserCtxtPtr ctxt, int terminate) {
     int ret = 0;
-    int avail, tlen;
+    int tlen;
+    size_t avail;
     xmlChar cur, next;
 
     if (ctxt->input == NULL)
@@ -11464,7 +11351,7 @@
 
     if ((ctxt->input != NULL) &&
         (ctxt->input->cur - ctxt->input->base > 4096)) {
-        xmlParserInputShrink(ctxt->input);
+        xmlParserShrink(ctxt);
     }
 
     while (ctxt->instate != XML_PARSER_EOF) {
@@ -11472,10 +11359,7 @@
 	    return(0);
 
 	if (ctxt->input == NULL) break;
-	if (ctxt->input->buf == NULL)
-	    avail = ctxt->input->length -
-	            (ctxt->input->cur - ctxt->input->base);
-	else {
+	if (ctxt->input->buf != NULL) {
 	    /*
 	     * If we are operating on converted input, try to flush
 	     * remaining chars to avoid them stalling in the non-converted
@@ -11494,9 +11378,8 @@
                 xmlBufSetInputBaseCur(ctxt->input->buf->buffer, ctxt->input,
                                       base, current);
 	    }
-	    avail = xmlBufUse(ctxt->input->buf->buffer) -
-		    (ctxt->input->cur - ctxt->input->base);
 	}
+        avail = ctxt->input->end - ctxt->input->cur;
         if (avail < 1)
 	    goto done;
         switch (ctxt->instate) {
@@ -11905,12 +11788,7 @@
             case XML_PARSER_PROLOG:
             case XML_PARSER_EPILOG:
 		SKIP_BLANKS;
-		if (ctxt->input->buf == NULL)
-		    avail = ctxt->input->length -
-		            (ctxt->input->cur - ctxt->input->base);
-		else
-		    avail = xmlBufUse(ctxt->input->buf->buffer) -
-		            (ctxt->input->cur - ctxt->input->base);
+                avail = ctxt->input->end - ctxt->input->cur;
 		if (avail < 2)
 		    goto done;
 		cur = ctxt->input->cur[0];
@@ -12273,22 +12151,12 @@
 	/*
 	 * Check for termination
 	 */
-	int cur_avail = 0;
-
-	if (ctxt->input != NULL) {
-	    if (ctxt->input->buf == NULL)
-		cur_avail = ctxt->input->length -
-			    (ctxt->input->cur - ctxt->input->base);
-	    else
-		cur_avail = xmlBufUse(ctxt->input->buf->buffer) -
-			              (ctxt->input->cur - ctxt->input->base);
-	}
-
 	if ((ctxt->instate != XML_PARSER_EOF) &&
 	    (ctxt->instate != XML_PARSER_EPILOG)) {
 	    xmlFatalErr(ctxt, XML_ERR_DOCUMENT_END, NULL);
 	}
-	if ((ctxt->instate == XML_PARSER_EPILOG) && (cur_avail > 0)) {
+	if ((ctxt->instate == XML_PARSER_EPILOG) &&
+            (ctxt->input->cur < ctxt->input->end)) {
 	    xmlFatalErr(ctxt, XML_ERR_DOCUMENT_END, NULL);
 	}
 	if (ctxt->instate != XML_PARSER_EOF) {
@@ -12410,41 +12278,6 @@
 #endif /* LIBXML_PUSH_ENABLED */
 
 /**
- * xmlHaltParser:
- * @ctxt:  an XML parser context
- *
- * Blocks further parser processing don't override error
- * for internal use
- */
-static void
-xmlHaltParser(xmlParserCtxtPtr ctxt) {
-    if (ctxt == NULL)
-        return;
-    ctxt->instate = XML_PARSER_EOF;
-    ctxt->disableSAX = 1;
-    while (ctxt->inputNr > 1)
-        xmlFreeInputStream(inputPop(ctxt));
-    if (ctxt->input != NULL) {
-        /*
-	 * in case there was a specific allocation deallocate before
-	 * overriding base
-	 */
-        if (ctxt->input->free != NULL) {
-	    ctxt->input->free((xmlChar *) ctxt->input->base);
-	    ctxt->input->free = NULL;
-	}
-        if (ctxt->input->buf != NULL) {
-            xmlFreeParserInputBuffer(ctxt->input->buf);
-            ctxt->input->buf = NULL;
-        }
-	ctxt->input->cur = BAD_CAST"";
-        ctxt->input->length = 0;
-	ctxt->input->base = ctxt->input->cur;
-        ctxt->input->end = ctxt->input->cur;
-    }
-}
-
-/**
  * xmlStopParser:
  * @ctxt:  an XML parser context
  *
diff --git a/third_party/libxml/src/parserInternals.c b/third_party/libxml/src/parserInternals.c
index f55700e..dd16579 100644
--- a/third_party/libxml/src/parserInternals.c
+++ b/third_party/libxml/src/parserInternals.c
@@ -259,6 +259,41 @@
 
 
 /**
+ * xmlHaltParser:
+ * @ctxt:  an XML parser context
+ *
+ * Blocks further parser processing don't override error
+ * for internal use
+ */
+void
+xmlHaltParser(xmlParserCtxtPtr ctxt) {
+    if (ctxt == NULL)
+        return;
+    ctxt->instate = XML_PARSER_EOF;
+    ctxt->disableSAX = 1;
+    while (ctxt->inputNr > 1)
+        xmlFreeInputStream(inputPop(ctxt));
+    if (ctxt->input != NULL) {
+        /*
+	 * in case there was a specific allocation deallocate before
+	 * overriding base
+	 */
+        if (ctxt->input->free != NULL) {
+	    ctxt->input->free((xmlChar *) ctxt->input->base);
+	    ctxt->input->free = NULL;
+	}
+        if (ctxt->input->buf != NULL) {
+            xmlFreeParserInputBuffer(ctxt->input->buf);
+            ctxt->input->buf = NULL;
+        }
+	ctxt->input->cur = BAD_CAST"";
+        ctxt->input->length = 0;
+	ctxt->input->base = ctxt->input->cur;
+        ctxt->input->end = ctxt->input->cur;
+    }
+}
+
+/**
  * xmlParserInputRead:
  * @in:  an XML parser input
  * @len:  an indicative size for the lookahead
@@ -273,6 +308,47 @@
 }
 
 /**
+ * xmlParserGrow:
+ * @ctxt:  an XML parser context
+ */
+int
+xmlParserGrow(xmlParserCtxtPtr ctxt) {
+    xmlParserInputPtr in = ctxt->input;
+    xmlParserInputBufferPtr buf = in->buf;
+    ptrdiff_t curEnd = in->end - in->cur;
+    ptrdiff_t curBase = in->cur - in->base;
+    int ret;
+
+    if (buf == NULL)
+        return(0);
+    /* Don't grow memory buffers. */
+    if ((buf->encoder == NULL) && (buf->readcallback == NULL))
+        return(0);
+
+    if (((curEnd > XML_MAX_LOOKUP_LIMIT) ||
+         (curBase > XML_MAX_LOOKUP_LIMIT)) &&
+        ((ctxt->options & XML_PARSE_HUGE) == 0)) {
+        xmlErrInternal(ctxt, "Huge input lookup", NULL);
+        xmlHaltParser(ctxt);
+	return(-1);
+    }
+
+    if (curEnd >= INPUT_CHUNK)
+        return(0);
+
+    ret = xmlParserInputBufferGrow(buf, INPUT_CHUNK);
+    xmlBufSetInputBaseCur(buf->buffer, in, 0, curBase);
+
+    /* TODO: Get error code from xmlParserInputBufferGrow */
+    if (ret < 0) {
+        xmlErrInternal(ctxt, "Growing input buffer", NULL);
+        xmlHaltParser(ctxt);
+    }
+
+    return(ret);
+}
+
+/**
  * xmlParserInputGrow:
  * @in:  an XML parser input
  * @len:  an indicative size for the lookahead
@@ -330,9 +406,59 @@
 }
 
 /**
+ * xmlParserShrink:
+ * @ctxt:  an XML parser context
+ */
+int
+xmlParserShrink(xmlParserCtxtPtr ctxt) {
+    xmlParserInputPtr in = ctxt->input;
+    xmlParserInputBufferPtr buf = in->buf;
+    size_t used;
+    int ret = 0;
+
+    /* Don't shrink memory buffers. */
+    if ((buf == NULL) ||
+        ((buf->encoder == NULL) && (buf->readcallback == NULL)))
+        return(0);
+
+    used = in->cur - in->base;
+    /*
+     * Do not shrink on large buffers whose only a tiny fraction
+     * was consumed
+     */
+    if (used > INPUT_CHUNK) {
+	size_t res = xmlBufShrink(buf->buffer, used - LINE_LEN);
+
+	if (res > 0) {
+            used -= res;
+            if ((res > ULONG_MAX) ||
+                (in->consumed > ULONG_MAX - (unsigned long)res))
+                in->consumed = ULONG_MAX;
+            else
+                in->consumed += res;
+	}
+    }
+
+    if (xmlBufUse(buf->buffer) < INPUT_CHUNK)
+        ret = xmlParserInputBufferGrow(buf, INPUT_CHUNK);
+
+    xmlBufSetInputBaseCur(buf->buffer, in, 0, used);
+
+    /* TODO: Get error code from xmlParserInputBufferGrow */
+    if (ret < 0) {
+        xmlErrInternal(ctxt, "Growing input buffer", NULL);
+        xmlHaltParser(ctxt);
+    }
+
+    return(ret);
+}
+
+/**
  * xmlParserInputShrink:
  * @in:  an XML parser input
  *
+ * DEPRECATED: Don't use.
+ *
  * This function removes used input for the parser.
  */
 void
@@ -373,6 +499,13 @@
     }
 
     in->base = xmlBufContent(in->buf->buffer);
+    if (in->base == NULL) {
+        /* TODO: raise error */
+        in->base = BAD_CAST "";
+        in->cur = in->base;
+        in->end = in->base;
+        return;
+    }
     in->cur = in->base + used;
     in->end = xmlBufEnd(in->buf->buffer);
 
@@ -406,9 +539,11 @@
 	return;
     }
 
-    if ((ctxt->input->cur >= ctxt->input->end) &&
-        (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0)) {
-        return;
+    if (ctxt->input->end - ctxt->input->cur < 4) {
+        if (xmlParserGrow(ctxt) < 0)
+            return;
+        if (ctxt->input->cur >= ctxt->input->end)
+            return;
     }
 
     if (ctxt->charset == XML_CHAR_ENCODING_UTF8) {
@@ -441,30 +576,23 @@
 
         c = *cur;
         if (c & 0x80) {
+            size_t avail;
+
             if (c == 0xC0)
 	        goto encoding_error;
-            if (cur[1] == 0) {
-                xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
-                cur = ctxt->input->cur;
-            }
-            if ((cur[1] & 0xc0) != 0x80)
+
+            avail = ctxt->input->end - ctxt->input->cur;
+
+            if ((avail < 2) || (cur[1] & 0xc0) != 0x80)
                 goto encoding_error;
             if ((c & 0xe0) == 0xe0) {
                 unsigned int val;
 
-                if (cur[2] == 0) {
-                    xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
-                    cur = ctxt->input->cur;
-                }
-                if ((cur[2] & 0xc0) != 0x80)
+                if ((avail < 3) || (cur[2] & 0xc0) != 0x80)
                     goto encoding_error;
                 if ((c & 0xf0) == 0xf0) {
-                    if (cur[3] == 0) {
-                        xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
-                        cur = ctxt->input->cur;
-                    }
                     if (((c & 0xf8) != 0xf0) ||
-                        ((cur[3] & 0xc0) != 0x80))
+                        (avail < 4) || ((cur[3] & 0xc0) != 0x80))
                         goto encoding_error;
                     /* 4-byte code */
                     ctxt->input->cur += 4;
@@ -505,8 +633,6 @@
             ctxt->input->col++;
         ctxt->input->cur++;
     }
-    if (*ctxt->input->cur == 0)
-        xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
     return;
 encoding_error:
     /*
@@ -560,6 +686,10 @@
     if (ctxt->instate == XML_PARSER_EOF)
 	return(0);
 
+    if ((ctxt->input->end - ctxt->input->cur < 4) &&
+        (xmlParserGrow(ctxt) < 0))
+        return(0);
+
     if ((*ctxt->input->cur >= 0x20) && (*ctxt->input->cur <= 0x7F)) {
 	    *len = 1;
 	    return(*ctxt->input->cur);
@@ -582,28 +712,21 @@
 
 	c = *cur;
 	if (c & 0x80) {
+            size_t avail;
+
 	    if (((c & 0x40) == 0) || (c == 0xC0))
 		goto encoding_error;
-	    if (cur[1] == 0) {
-		xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
-                cur = ctxt->input->cur;
-            }
-	    if ((cur[1] & 0xc0) != 0x80)
+
+            avail = ctxt->input->end - ctxt->input->cur;
+
+	    if ((avail < 2) || (cur[1] & 0xc0) != 0x80)
 		goto encoding_error;
 	    if ((c & 0xe0) == 0xe0) {
-		if (cur[2] == 0) {
-		    xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
-                    cur = ctxt->input->cur;
-                }
-		if ((cur[2] & 0xc0) != 0x80)
+		if ((avail < 3) || (cur[2] & 0xc0) != 0x80)
 		    goto encoding_error;
 		if ((c & 0xf0) == 0xf0) {
-		    if (cur[3] == 0) {
-			xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
-                        cur = ctxt->input->cur;
-                    }
 		    if (((c & 0xf8) != 0xf0) ||
-			((cur[3] & 0xc0) != 0x80))
+			(avail < 4) || ((cur[3] & 0xc0) != 0x80))
 			goto encoding_error;
 		    /* 4-byte code */
 		    *len = 4;
@@ -638,8 +761,6 @@
 	} else {
 	    /* 1-byte code */
 	    *len = 1;
-	    if (*ctxt->input->cur == 0)
-		xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
 	    if ((*ctxt->input->cur == 0) &&
 	        (ctxt->input->end > ctxt->input->cur)) {
 	        xmlErrEncodingInt(ctxt, XML_ERR_INVALID_CHAR,
diff --git a/third_party/libxml/src/testrecurse.c b/third_party/libxml/src/testrecurse.c
index acfe08b7..a70ca34a 100644
--- a/third_party/libxml/src/testrecurse.c
+++ b/third_party/libxml/src/testrecurse.c
@@ -180,6 +180,7 @@
         "  <bar attr='&e; &f; &d;'>&a; &b; &c; &e; &f; &d;</bar>\n"
         "  <bar>_123456789_123456789_123456789_123456789</bar>\n"
         "  <bar>_123456789_123456789_123456789_123456789</bar>\n"
+        "  <bar>_123456789_123456789_123456789_123456789</bar>\n"
         "  <bar>_123456789_123456789_123456789_123456789</bar>\n",
 
         "</foo>"
@@ -278,7 +279,7 @@
     return(0);
 }
 
-#define MAX_NODES 10000
+#define MAX_NODES 1000
 
 /**
  * hugeRead:
@@ -851,7 +852,8 @@
 	res = 1;
     } else {
         xmlEntityPtr ent;
-        unsigned long fixed_cost = 50;
+        unsigned long fixed_cost = 20;
+        unsigned long allowed_expansion = 1000000;
         unsigned long f_size = xmlStrlen(BAD_CAST "some internal data");
         unsigned long e_size;
         unsigned long d_size;
@@ -891,7 +893,7 @@
             res = 1;
         }
 
-        if (ctxt->sizeentcopy < XML_MAX_TEXT_LENGTH) {
+        if (ctxt->sizeentcopy < allowed_expansion) {
             fprintf(stderr, "Total entity size too small: %lu\n",
                     ctxt->sizeentcopy);
             res = 1;
@@ -952,7 +954,8 @@
         fprintf(stderr, "Failed to parse huge_dtd.xml\n");
 	res = 1;
     } else {
-        unsigned long fixed_cost = 50;
+        unsigned long fixed_cost = 20;
+        unsigned long allowed_expansion = 1000000;
         unsigned long a_size = xmlStrlen(BAD_CAST "<!-- comment -->");
         unsigned long b_size;
         unsigned long c_size;
@@ -960,7 +963,7 @@
         unsigned long f_size;
         unsigned long total_size;
 
-        if (ctxt->sizeentcopy < XML_MAX_TEXT_LENGTH) {
+        if (ctxt->sizeentcopy < allowed_expansion) {
             fprintf(stderr, "Total entity size too small: %lu\n",
                     ctxt->sizeentcopy);
             res = 1;
diff --git a/third_party/libxml/src/tree.c b/third_party/libxml/src/tree.c
index e0545c1..eae778d 100644
--- a/third_party/libxml/src/tree.c
+++ b/third_party/libxml/src/tree.c
@@ -4090,6 +4090,10 @@
 
     while (cur != NULL) {
         q = xmlCopyNamespace(cur);
+        if (q == NULL) {
+            xmlFreeNsList(ret);
+            return(NULL);
+        }
 	if (p == NULL) {
 	    ret = p = q;
 	} else {
@@ -6034,7 +6038,7 @@
     xmlNsPtr cur;
     xmlNsPtr *ret = NULL;
     int nbns = 0;
-    int maxns = 10;
+    int maxns = 0;
     int i;
 
     if ((node == NULL) || (node->type == XML_NAMESPACE_DECL))
@@ -6044,16 +6048,6 @@
         if (node->type == XML_ELEMENT_NODE) {
             cur = node->nsDef;
             while (cur != NULL) {
-                if (ret == NULL) {
-                    ret =
-                        (xmlNsPtr *) xmlMalloc((maxns + 1) *
-                                               sizeof(xmlNsPtr));
-                    if (ret == NULL) {
-			xmlTreeErrMemory("getting namespace list");
-                        return (NULL);
-                    }
-                    ret[nbns] = NULL;
-                }
                 for (i = 0; i < nbns; i++) {
                     if ((cur->prefix == ret[i]->prefix) ||
                         (xmlStrEqual(cur->prefix, ret[i]->prefix)))
@@ -6061,15 +6055,18 @@
                 }
                 if (i >= nbns) {
                     if (nbns >= maxns) {
-                        maxns *= 2;
-                        ret = (xmlNsPtr *) xmlRealloc(ret,
-                                                      (maxns +
-                                                       1) *
+                        xmlNsPtr *tmp;
+
+                        maxns = maxns ? maxns * 2 : 10;
+                        tmp = (xmlNsPtr *) xmlRealloc(ret,
+                                                      (maxns + 1) *
                                                       sizeof(xmlNsPtr));
-                        if (ret == NULL) {
+                        if (tmp == NULL) {
 			    xmlTreeErrMemory("getting namespace list");
+                            xmlFree(ret);
                             return (NULL);
                         }
+                        ret = tmp;
                     }
                     ret[nbns++] = cur;
                     ret[nbns] = NULL;
diff --git a/third_party/libxml/src/valid.c b/third_party/libxml/src/valid.c
index 120627c..773f125e 100644
--- a/third_party/libxml/src/valid.c
+++ b/third_party/libxml/src/valid.c
@@ -879,6 +879,8 @@
  */
 void
 xmlFreeValidCtxt(xmlValidCtxtPtr cur) {
+    if (cur == NULL)
+        return;
     if (cur->vstateTab != NULL)
         xmlFree(cur->vstateTab);
     if (cur->nodeTab != NULL)
@@ -6465,60 +6467,60 @@
  */
 
 int
-xmlValidateElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr elem) {
-    xmlNodePtr child;
+xmlValidateElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc, xmlNodePtr root) {
+    xmlNodePtr elem;
     xmlAttrPtr attr;
     xmlNsPtr ns;
     const xmlChar *value;
     int ret = 1;
 
-    if (elem == NULL) return(0);
-
-    /*
-     * XInclude elements were added after parsing in the infoset,
-     * they don't really mean anything validation wise.
-     */
-    if ((elem->type == XML_XINCLUDE_START) ||
-	(elem->type == XML_XINCLUDE_END) ||
-	(elem->type == XML_NAMESPACE_DECL))
-	return(1);
+    if (root == NULL) return(0);
 
     CHECK_DTD;
 
-    /*
-     * Entities references have to be handled separately
-     */
-    if (elem->type == XML_ENTITY_REF_NODE) {
-	return(1);
+    elem = root;
+    while (1) {
+        ret &= xmlValidateOneElement(ctxt, doc, elem);
+
+        if (elem->type == XML_ELEMENT_NODE) {
+            attr = elem->properties;
+            while (attr != NULL) {
+                value = xmlNodeListGetString(doc, attr->children, 0);
+                ret &= xmlValidateOneAttribute(ctxt, doc, elem, attr, value);
+                if (value != NULL)
+                    xmlFree((char *)value);
+                attr= attr->next;
+            }
+
+            ns = elem->nsDef;
+            while (ns != NULL) {
+                if (elem->ns == NULL)
+                    ret &= xmlValidateOneNamespace(ctxt, doc, elem, NULL,
+                                                   ns, ns->href);
+                else
+                    ret &= xmlValidateOneNamespace(ctxt, doc, elem,
+                                                   elem->ns->prefix, ns,
+                                                   ns->href);
+                ns = ns->next;
+            }
+
+            if (elem->children != NULL) {
+                elem = elem->children;
+                continue;
+            }
+        }
+
+        while (1) {
+            if (elem == root)
+                goto done;
+            if (elem->next != NULL)
+                break;
+            elem = elem->parent;
+        }
+        elem = elem->next;
     }
 
-    ret &= xmlValidateOneElement(ctxt, doc, elem);
-    if (elem->type == XML_ELEMENT_NODE) {
-	attr = elem->properties;
-	while (attr != NULL) {
-	    value = xmlNodeListGetString(doc, attr->children, 0);
-	    ret &= xmlValidateOneAttribute(ctxt, doc, elem, attr, value);
-	    if (value != NULL)
-		xmlFree((char *)value);
-	    attr= attr->next;
-	}
-	ns = elem->nsDef;
-	while (ns != NULL) {
-	    if (elem->ns == NULL)
-		ret &= xmlValidateOneNamespace(ctxt, doc, elem, NULL,
-					       ns, ns->href);
-	    else
-		ret &= xmlValidateOneNamespace(ctxt, doc, elem,
-		                               elem->ns->prefix, ns, ns->href);
-	    ns = ns->next;
-	}
-    }
-    child = elem->children;
-    while (child != NULL) {
-        ret &= xmlValidateElement(ctxt, doc, child);
-        child = child->next;
-    }
-
+done:
     return(ret);
 }
 
diff --git a/third_party/libxml/src/win32/defgen.xsl b/third_party/libxml/src/win32/defgen.xsl
deleted file mode 100644
index 423a231..0000000
--- a/third_party/libxml/src/win32/defgen.xsl
+++ /dev/null
@@ -1,261 +0,0 @@
-<?xml version="1.0"?>
-<!-- 
-	win32/defgen.xsl
-	This stylesheet is used to transform doc/libxml2-api.xml into a pseudo-source,
-	which can then be preprocessed to get the .DEF file for the Microsoft's linker.
-	
-	Use any XSLT processor to produce a file called libxml2.def.src in the win32
-	subdirectory, for example, run xsltproc from the win32 subdirectory:
-	
-	  xsltproc -o libxml2.def.src defgen.xsl ../doc/libxml2-api.xml
-	  
-	Once that finishes, rest assured, the Makefile will know what to do with the
-	generated file. 
-
-	April 2003, Igor Zlatkovic <igor@zlatkovic.com>
--->
-<!DOCTYPE xsl:stylesheet [ <!ENTITY nl '&#xd;&#xa;'> ]>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-	<xsl:strip-space elements="*"/>
-	<xsl:output method="text"/>
-	<xsl:template match="/">
-		<xsl:text>#define LIBXML2_COMPILING_MSCCDEF&nl;</xsl:text>
-		<xsl:text>#include "../include/libxml/xmlversion.h"&nl;</xsl:text>
-		<xsl:text>LIBRARY libxml2&nl;</xsl:text>
-		<xsl:text>EXPORTS&nl;</xsl:text>
-		<xsl:for-each select="/api/symbols/*[self::variable or self::function]">
-			<!-- Basic tests -->
-			<xsl:if test="@file = 'c14n'">
-				<xsl:text>#ifdef LIBXML_C14N_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'catalog'">
-				<xsl:text>#ifdef LIBXML_CATALOG_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'debugXML'">
-				<xsl:text>#ifdef LIBXML_DEBUG_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@file = 'HTMLparser') 
-					or (@file = 'HTMLtree')">
-				<xsl:text>#ifdef LIBXML_HTML_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'nanohttp'">
-				<xsl:text>#ifdef LIBXML_HTTP_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'nanoftp'">
-				<xsl:text>#ifdef LIBXML_FTP_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@file = 'relaxng') 
-					or (@file = 'xmlschemas') 
-					or (@file = 'xmlschemastypes')">
-				<xsl:text>#ifdef LIBXML_SCHEMAS_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'xinclude'">
-				<xsl:text>#ifdef LIBXML_XINCLUDE_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'xlink'">
-				<xsl:text>#ifdef LIBXML_XLINK_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'xmlautomata'">
-				<xsl:text>#ifdef LIBXML_AUTOMATA_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@file = 'xmlregexp') 
-					or (@file = 'xmlunicode')">
-				<xsl:text>#ifdef LIBXML_REGEXP_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@file = 'xpath') 
-					or (@file = 'xpathInternals')">
-				<xsl:text>#ifdef LIBXML_XPATH_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'xpointer'">
-				<xsl:text>#ifdef LIBXML_XPTR_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<!-- Extended tests -->
-			<xsl:if test="(@name = 'htmlDefaultSAXHandlerInit') 
-					or (@name = 'htmlInitAutoClose') 
-					or (@name = 'htmlCreateFileParserCtxt') 
-					or (@name = 'inithtmlDefaultSAXHandler')
-					or (@name = 'xmlIsXHTML') 
-					or (@name = 'xmlIOHTTPOpenW') 
-					or (@name = 'xmlRegisterHTTPPostCallbacks') 
-					or (@name = 'xmlIOHTTPMatch')
-					or (@name = 'xmlIOHTTPOpen') 
-					or (@name = 'xmlIOHTTPRead') 
-					or (@name = 'xmlIOHTTPClose')">
-				<xsl:text>#ifdef LIBXML_HTML_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@name = 'xmlValidBuildContentModel'">
-				<xsl:text>#ifdef LIBXML_REGEXP_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@name = 'xmlIOFTPMatch') 
-					or (@name = 'xmlIOFTPOpen') 
-					or (@name = 'xmlIOFTPRead') 
-					or (@name = 'xmlIOFTPClose')">
-				<xsl:text>#ifdef LIBXML_FTP_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@name = 'xmlTextReaderRelaxNGValidate') 
-					or (@name = 'xmlTextReaderRelaxNGSetSchema')">
-				<xsl:text>#ifdef LIBXML_SCHEMAS_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@name = 'xmlXPathDebugDumpObject') 
-					or (@name = 'xmlXPathDebugDumpCompExpr')">
-				<xsl:text>#ifdef LIBXML_DEBUG_ENABLED&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@name = 'xmlMallocLoc') 
-					or (@name = 'xmlMallocAtomicLoc') 
-					or (@name = 'xmlReallocLoc') 
-					or (@name = 'xmlMemStrdupLoc')">
-				<xsl:text>#ifdef DEBUG_MEMORY_LOCATION&nl;</xsl:text>
-			</xsl:if>
-			<!-- Symbol -->
-			<xsl:choose>
-				<xsl:when test="(@name = 'xmlMalloc') 
-						or (@name = 'xmlMallocAtomic') 
-						or (@name = 'xmlRealloc') 
-						or (@name = 'xmlFree') 
-						or (@name = 'xmlMemStrdup')">
-					<xsl:text>#ifdef LIBXML_THREAD_ALLOC_ENABLED&nl;</xsl:text>
-					<xsl:text>__</xsl:text>
-					<xsl:value-of select="@name"/>
-					<xsl:text>&nl;</xsl:text>
-					<xsl:text>#else&nl;</xsl:text>
-					<xsl:value-of select="@name"/>
-					<xsl:text> DATA&nl;</xsl:text>
-					<xsl:text>#endif&nl;</xsl:text>
-				</xsl:when>
-				<xsl:when test="(@name = 'htmlDefaultSAXHandler') 
-						or (@name = 'oldXMLWDcompatibility') 
-						or (@name = 'xmlBufferAllocScheme') 
-						or (@name = 'xmlDefaultBufferSize') 
-						or (@name = 'xmlDefaultSAXHandler') 
-						or (@name = 'xmlDefaultSAXLocator') 
-						or (@name = 'xmlDoValidityCheckingDefaultValue') 
-						or (@name = 'xmlGenericError') 
-						or (@name = 'xmlGenericErrorContext') 
-						or (@name = 'xmlGetWarningsDefaultValue') 
-						or (@name = 'xmlIndentTreeOutput') 
-						or (@name = 'xmlTreeIndentString') 
-						or (@name = 'xmlKeepBlanksDefaultValue') 
-						or (@name = 'xmlLineNumbersDefaultValue') 
-						or (@name = 'xmlLoadExtDtdDefaultValue') 
-						or (@name = 'xmlParserDebugEntities') 
-						or (@name = 'xmlParserVersion') 
-						or (@name = 'xmlPedanticParserDefaultValue') 
-						or (@name = 'xmlSaveNoEmptyTags') 
-						or (@name = 'xmlSubstituteEntitiesDefaultValue') 
-						or (@name = 'xmlRegisterNodeDefaultValue') 
-						or (@name = 'xmlDeregisterNodeDefaultValue')">
-					<xsl:text>#ifdef LIBXML_THREAD_ENABLED&nl;</xsl:text>
-					<xsl:if test="@name = 'htmlDefaultSAXHandler'">
-						<xsl:text>#ifdef LIBXML_HTML_ENABLED&nl;</xsl:text>
-					</xsl:if>
-					<xsl:text>__</xsl:text>
-					<xsl:value-of select="@name"/>
-					<xsl:text>&nl;</xsl:text>
-					<xsl:if test="@name = 'htmlDefaultSAXHandler'">
-						<xsl:text>#endif&nl;</xsl:text>
-					</xsl:if>
-					<xsl:text>#else&nl;</xsl:text>
-					<xsl:if test="@name = 'htmlDefaultSAXHandler'">
-						<xsl:text>#ifdef LIBXML_HTML_ENABLED&nl;</xsl:text>
-					</xsl:if>
-					<xsl:value-of select="@name"/>
-					<xsl:text> DATA&nl;</xsl:text>
-					<xsl:if test="@name = 'htmlDefaultSAXHandler'">
-						<xsl:text>#endif&nl;</xsl:text>
-					</xsl:if>
-					<xsl:text>#endif&nl;</xsl:text>
-				</xsl:when>
-				<xsl:otherwise>
-					<xsl:value-of select="@name"/>
-					<xsl:if test="self::variable">
-						<xsl:text> DATA</xsl:text>
-					</xsl:if>
-					<xsl:text>&nl;</xsl:text>
-				</xsl:otherwise>
-			</xsl:choose>
-			<!-- Basic tests (close) -->
-			<xsl:if test="@file = 'c14n'">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'catalog'">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'debugXML'">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@file = 'HTMLparser') 
-					or (@file = 'HTMLtree')">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'nanohttp'">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'nanoftp'">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@file = 'relaxng') 
-					or (@file = 'xmlschemas') 
-					or (@file = 'xmlschemastypes')">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'xinclude'">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'xlink'">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'xmlautomata'">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@file = 'xmlregexp') 
-					or (@file = 'xmlunicode')">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@file = 'xpath') 
-					or (@file = 'xpathInternals')">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@file = 'xpointer'">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<!-- Extended tests (close) -->
-			<xsl:if test="(@name = 'htmlDefaultSAXHandlerInit') 
-					or (@name = 'htmlInitAutoClose') 
-					or (@name = 'htmlCreateFileParserCtxt') 
-					or (@name = 'inithtmlDefaultSAXHandler')
-					or (@name = 'xmlIsXHTML') 
-					or (@name = 'xmlIOHTTPOpenW') 
-					or (@name = 'xmlRegisterHTTPPostCallbacks') 
-					or (@name = 'xmlIOHTTPMatch')
-					or (@name = 'xmlIOHTTPOpen') 
-					or (@name = 'xmlIOHTTPRead') 
-					or (@name = 'xmlIOHTTPClose')">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="@name = 'xmlValidBuildContentModel'">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@name = 'xmlIOFTPMatch') 
-					or (@name = 'xmlIOFTPOpen') 
-					or (@name = 'xmlIOFTPRead') 
-					or (@name = 'xmlIOFTPClose')">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@name = 'xmlTextReaderRelaxNGValidate') 
-					or (@name = 'xmlTextReaderRelaxNGSetSchema')">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@name = 'xmlXPathDebugDumpObject') 
-					or (@name = 'xmlXPathDebugDumpCompExpr')">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-			<xsl:if test="(@name = 'xmlMallocLoc') 
-					or (@name = 'xmlMallocAtomicLoc') 
-					or (@name = 'xmlReallocLoc') 
-					or (@name = 'xmlMemStrdupLoc')">
-				<xsl:text>#endif&nl;</xsl:text>
-			</xsl:if>
-		</xsl:for-each>
-	</xsl:template>
-</xsl:stylesheet>
-
diff --git a/third_party/libxml/src/win32/libxml2.def.src b/third_party/libxml/src/win32/libxml2.def.src
deleted file mode 100644
index 4486c0e..0000000
--- a/third_party/libxml/src/win32/libxml2.def.src
+++ /dev/null
@@ -1,3152 +0,0 @@
-#define LIBXML2_COMPILING_MSCCDEF
-#include "../include/libxml/xmlversion.h"
-LIBRARY libxml2
-EXPORTS
-#ifdef LIBXML_REGEXP_ENABLED
-emptyExp DATA
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-forbiddenExp DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-#ifdef LIBXML_HTML_ENABLED
-__htmlDefaultSAXHandler
-#endif
-#else
-#ifdef LIBXML_HTML_ENABLED
-htmlDefaultSAXHandler DATA
-#endif
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__oldXMLWDcompatibility
-#else
-oldXMLWDcompatibility DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__xmlBufferAllocScheme
-#else
-xmlBufferAllocScheme DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__xmlDefaultBufferSize
-#else
-xmlDefaultBufferSize DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__xmlDefaultSAXHandler
-#else
-xmlDefaultSAXHandler DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__xmlDefaultSAXLocator
-#else
-xmlDefaultSAXLocator DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__xmlDeregisterNodeDefaultValue
-#else
-xmlDeregisterNodeDefaultValue DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__xmlDoValidityCheckingDefaultValue
-#else
-xmlDoValidityCheckingDefaultValue DATA
-#endif
-#ifdef LIBXML_THREAD_ALLOC_ENABLED
-__xmlFree
-#else
-xmlFree DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__xmlGenericError
-#else
-xmlGenericError DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__xmlGenericErrorContext
-#else
-xmlGenericErrorContext DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__xmlGetWarningsDefaultValue
-#else
-xmlGetWarningsDefaultValue DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__xmlIndentTreeOutput
-#else
-xmlIndentTreeOutput DATA
-#endif
-xmlIsBaseCharGroup DATA
-xmlIsCharGroup DATA
-xmlIsCombiningGroup DATA
-xmlIsDigitGroup DATA
-xmlIsExtenderGroup DATA
-xmlIsIdeographicGroup DATA
-xmlIsPubidChar_tab DATA
-#ifdef LIBXML_THREAD_ENABLED
-__xmlKeepBlanksDefaultValue
-#else
-xmlKeepBlanksDefaultValue DATA
-#endif
-xmlLastError DATA
-#ifdef LIBXML_THREAD_ENABLED
-__xmlLineNumbersDefaultValue
-#else
-xmlLineNumbersDefaultValue DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__xmlLoadExtDtdDefaultValue
-#else
-xmlLoadExtDtdDefaultValue DATA
-#endif
-#ifdef LIBXML_THREAD_ALLOC_ENABLED
-__xmlMalloc
-#else
-xmlMalloc DATA
-#endif
-#ifdef LIBXML_THREAD_ALLOC_ENABLED
-__xmlMallocAtomic
-#else
-xmlMallocAtomic DATA
-#endif
-#ifdef LIBXML_THREAD_ALLOC_ENABLED
-__xmlMemStrdup
-#else
-xmlMemStrdup DATA
-#endif
-xmlOutputBufferCreateFilenameValue DATA
-#ifdef LIBXML_THREAD_ENABLED
-__xmlParserDebugEntities
-#else
-xmlParserDebugEntities DATA
-#endif
-xmlParserInputBufferCreateFilenameValue DATA
-xmlParserMaxDepth DATA
-#ifdef LIBXML_THREAD_ENABLED
-__xmlParserVersion
-#else
-xmlParserVersion DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__xmlPedanticParserDefaultValue
-#else
-xmlPedanticParserDefaultValue DATA
-#endif
-#ifdef LIBXML_THREAD_ALLOC_ENABLED
-__xmlRealloc
-#else
-xmlRealloc DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__xmlRegisterNodeDefaultValue
-#else
-xmlRegisterNodeDefaultValue DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__xmlSaveNoEmptyTags
-#else
-xmlSaveNoEmptyTags DATA
-#endif
-xmlStringComment DATA
-xmlStringText DATA
-xmlStringTextNoenc DATA
-xmlStructuredError DATA
-xmlStructuredErrorContext DATA
-#ifdef LIBXML_THREAD_ENABLED
-__xmlSubstituteEntitiesDefaultValue
-#else
-xmlSubstituteEntitiesDefaultValue DATA
-#endif
-#ifdef LIBXML_THREAD_ENABLED
-__xmlTreeIndentString
-#else
-xmlTreeIndentString DATA
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNAN DATA
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNINF DATA
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathPINF DATA
-#endif
-#ifdef LIBXML_HTML_ENABLED
-UTF8ToHtml
-#endif
-UTF8Toisolat1
-attribute
-attributeDecl
-cdataBlock
-characters
-checkNamespace
-comment
-elementDecl
-endDocument
-endElement
-entityDecl
-externalSubset
-getColumnNumber
-getEntity
-getLineNumber
-getNamespace
-getParameterEntity
-getPublicId
-getSystemId
-globalNamespace
-hasExternalSubset
-hasInternalSubset
-#ifdef LIBXML_HTML_ENABLED
-htmlAttrAllowed
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlAutoCloseTag
-#endif
-#ifdef LIBXML_HTML_ENABLED
-#ifdef LIBXML_HTML_ENABLED
-htmlCreateFileParserCtxt
-#endif
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlCreateMemoryParserCtxt
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlCreatePushParserCtxt
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlCtxtReadDoc
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlCtxtReadFd
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlCtxtReadFile
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlCtxtReadIO
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlCtxtReadMemory
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlCtxtReset
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlCtxtUseOptions
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlDefaultSAXHandlerInit
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlDocContentDumpFormatOutput
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlDocContentDumpOutput
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlDocDump
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlDocDumpMemory
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlDocDumpMemoryFormat
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlElementAllowedHere
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlElementStatusHere
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlEncodeEntities
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlEntityLookup
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlEntityValueLookup
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlFreeParserCtxt
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlGetMetaEncoding
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlHandleOmittedElem
-#endif
-#ifdef LIBXML_HTML_ENABLED
-#ifdef LIBXML_HTML_ENABLED
-htmlInitAutoClose
-#endif
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlIsAutoClosed
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlIsBooleanAttr
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlIsScriptAttribute
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlNewDoc
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlNewDocNoDtD
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlNewParserCtxt
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlNewSAXParserCtxt
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlNodeDump
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlNodeDumpFile
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlNodeDumpFileFormat
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlNodeDumpFormatOutput
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlNodeDumpOutput
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlNodeStatus
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlParseCharRef
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlParseChunk
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlParseDoc
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlParseDocument
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlParseElement
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlParseEntityRef
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlParseFile
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlReadDoc
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlReadFd
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlReadFile
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlReadIO
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlReadMemory
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlSAXParseDoc
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlSAXParseFile
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlSaveFile
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlSaveFileEnc
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlSaveFileFormat
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlSetMetaEncoding
-#endif
-#ifdef LIBXML_HTML_ENABLED
-htmlTagLookup
-#endif
-ignorableWhitespace
-initGenericErrorDefaultFunc
-#ifdef LIBXML_HTML_ENABLED
-inithtmlDefaultSAXHandler
-#endif
-initxmlDefaultSAXHandler
-inputPop
-inputPush
-internalSubset
-isStandalone
-isolat1ToUTF8
-namePop
-namePush
-namespaceDecl
-nodePop
-nodePush
-notationDecl
-processingInstruction
-reference
-resolveEntity
-setDocumentLocator
-setNamespace
-startDocument
-startElement
-unparsedEntityDecl
-#ifdef LIBXML_XPATH_ENABLED
-valuePop
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-valuePush
-#endif
-#ifdef LIBXML_XLINK_ENABLED
-xlinkGetDefaultDetect
-#endif
-#ifdef LIBXML_XLINK_ENABLED
-xlinkGetDefaultHandler
-#endif
-#ifdef LIBXML_XLINK_ENABLED
-xlinkIsLink
-#endif
-#ifdef LIBXML_XLINK_ENABLED
-xlinkSetDefaultDetect
-#endif
-#ifdef LIBXML_XLINK_ENABLED
-xlinkSetDefaultHandler
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlACatalogAdd
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlACatalogDump
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlACatalogRemove
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlACatalogResolve
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlACatalogResolvePublic
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlACatalogResolveSystem
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlACatalogResolveURI
-#endif
-xmlAddAttributeDecl
-xmlAddChild
-xmlAddChildList
-xmlAddDocEntity
-xmlAddDtdEntity
-xmlAddElementDecl
-xmlAddEncodingAlias
-xmlAddID
-xmlAddNextSibling
-xmlAddNotationDecl
-xmlAddPrevSibling
-xmlAddRef
-xmlAddSibling
-xmlAllocOutputBuffer
-xmlAllocParserInputBuffer
-xmlAttrSerializeTxtContent
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataCompile
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataGetInitState
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataIsDeterminist
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataNewAllTrans
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataNewCountTrans
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataNewCountTrans2
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataNewCountedTrans
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataNewCounter
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataNewCounterTrans
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataNewEpsilon
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataNewNegTrans
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataNewOnceTrans
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataNewOnceTrans2
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataNewState
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataNewTransition
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataNewTransition2
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlAutomataSetFinalState
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlBoolToText
-#endif
-xmlBufContent
-xmlBufEnd
-xmlBufGetNodeContent
-xmlBufNodeDump
-xmlBufShrink
-xmlBufUse
-xmlBufferAdd
-xmlBufferAddHead
-xmlBufferCCat
-xmlBufferCat
-xmlBufferContent
-xmlBufferCreate
-xmlBufferCreateSize
-xmlBufferCreateStatic
-xmlBufferDetach
-xmlBufferDump
-xmlBufferEmpty
-xmlBufferFree
-xmlBufferGrow
-xmlBufferLength
-xmlBufferResize
-xmlBufferSetAllocationScheme
-xmlBufferShrink
-xmlBufferWriteCHAR
-xmlBufferWriteChar
-xmlBufferWriteQuotedString
-xmlBuildQName
-xmlBuildRelativeURI
-xmlBuildURI
-xmlByteConsumed
-#ifdef LIBXML_C14N_ENABLED
-xmlC14NDocDumpMemory
-#endif
-#ifdef LIBXML_C14N_ENABLED
-xmlC14NDocSave
-#endif
-#ifdef LIBXML_C14N_ENABLED
-xmlC14NDocSaveTo
-#endif
-#ifdef LIBXML_C14N_ENABLED
-xmlC14NExecute
-#endif
-xmlCanonicPath
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogAdd
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogAddLocal
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogCleanup
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogConvert
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogDump
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogFreeLocal
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogGetDefaults
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogGetPublic
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogGetSystem
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogIsEmpty
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogLocalResolve
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogLocalResolveURI
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogRemove
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogResolve
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogResolvePublic
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogResolveSystem
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogResolveURI
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogSetDebug
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogSetDefaultPrefer
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlCatalogSetDefaults
-#endif
-xmlCharEncCloseFunc
-xmlCharEncFirstLine
-xmlCharEncInFunc
-xmlCharEncOutFunc
-xmlCharInRange
-xmlCharStrdup
-xmlCharStrndup
-xmlCheckFilename
-xmlCheckHTTPInput
-xmlCheckLanguageID
-xmlCheckUTF8
-xmlCheckVersion
-xmlChildElementCount
-xmlCleanupCharEncodingHandlers
-xmlCleanupEncodingAliases
-xmlCleanupGlobals
-xmlCleanupInputCallbacks
-xmlCleanupMemory
-xmlCleanupOutputCallbacks
-xmlCleanupParser
-xmlCleanupPredefinedEntities
-xmlCleanupThreads
-xmlClearNodeInfoSeq
-xmlClearParserCtxt
-#ifdef LIBXML_CATALOG_ENABLED
-xmlConvertSGMLCatalog
-#endif
-xmlCopyAttributeTable
-xmlCopyChar
-xmlCopyCharMultiByte
-xmlCopyDoc
-xmlCopyDocElementContent
-xmlCopyDtd
-xmlCopyElementContent
-xmlCopyElementTable
-xmlCopyEntitiesTable
-xmlCopyEnumeration
-xmlCopyError
-xmlCopyNamespace
-xmlCopyNamespaceList
-xmlCopyNode
-xmlCopyNodeList
-xmlCopyNotationTable
-xmlCopyProp
-xmlCopyPropList
-xmlCreateDocParserCtxt
-xmlCreateEntitiesTable
-xmlCreateEntityParserCtxt
-xmlCreateEnumeration
-xmlCreateFileParserCtxt
-xmlCreateIOParserCtxt
-xmlCreateIntSubset
-xmlCreateMemoryParserCtxt
-xmlCreatePushParserCtxt
-xmlCreateURI
-xmlCreateURLParserCtxt
-xmlCtxtGetLastError
-xmlCtxtReadDoc
-xmlCtxtReadFd
-xmlCtxtReadFile
-xmlCtxtReadIO
-xmlCtxtReadMemory
-xmlCtxtReset
-xmlCtxtResetLastError
-xmlCtxtResetPush
-xmlCtxtUseOptions
-xmlCurrentChar
-xmlDOMWrapAdoptNode
-xmlDOMWrapCloneNode
-xmlDOMWrapFreeCtxt
-xmlDOMWrapNewCtxt
-xmlDOMWrapReconcileNamespaces
-xmlDOMWrapRemoveNode
-#ifdef LIBXML_DEBUG_ENABLED
-xmlDebugCheckDocument
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlDebugDumpAttr
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlDebugDumpAttrList
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlDebugDumpDTD
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlDebugDumpDocument
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlDebugDumpDocumentHead
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlDebugDumpEntities
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlDebugDumpNode
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlDebugDumpNodeList
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlDebugDumpOneNode
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlDebugDumpString
-#endif
-xmlDecodeEntities
-xmlDefaultSAXHandlerInit
-xmlDelEncodingAlias
-xmlDeregisterNodeDefault
-xmlDetectCharEncoding
-xmlDictCleanup
-xmlDictCreate
-xmlDictCreateSub
-xmlDictExists
-xmlDictFree
-xmlDictGetUsage
-xmlDictLookup
-xmlDictOwns
-xmlDictQLookup
-xmlDictReference
-xmlDictSetLimit
-xmlDictSize
-xmlDocCopyNode
-xmlDocCopyNodeList
-xmlDocDump
-xmlDocDumpFormatMemory
-xmlDocDumpFormatMemoryEnc
-xmlDocDumpMemory
-xmlDocDumpMemoryEnc
-xmlDocFormatDump
-xmlDocGetRootElement
-xmlDocSetRootElement
-xmlDumpAttributeDecl
-xmlDumpAttributeTable
-xmlDumpElementDecl
-xmlDumpElementTable
-xmlDumpEntitiesTable
-xmlDumpEntityDecl
-xmlDumpNotationDecl
-xmlDumpNotationTable
-xmlElemDump
-xmlEncodeEntities
-xmlEncodeEntitiesReentrant
-xmlEncodeSpecialChars
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpCtxtNbCons
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpCtxtNbNodes
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpDump
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpExpDerive
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpFree
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpFreeCtxt
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpGetLanguage
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpGetStart
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpIsNillable
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpMaxToken
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpNewAtom
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpNewCtxt
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpNewOr
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpNewRange
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpNewSeq
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpParse
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpRef
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpStringDerive
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlExpSubsume
-#endif
-xmlFileClose
-xmlFileMatch
-xmlFileOpen
-xmlFileRead
-xmlFindCharEncodingHandler
-xmlFirstElementChild
-xmlFreeAttributeTable
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlFreeAutomata
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlFreeCatalog
-#endif
-xmlFreeDoc
-xmlFreeDocElementContent
-xmlFreeDtd
-xmlFreeElementContent
-xmlFreeElementTable
-xmlFreeEntitiesTable
-xmlFreeEnumeration
-xmlFreeIDTable
-xmlFreeInputStream
-xmlFreeMutex
-xmlFreeNode
-xmlFreeNodeList
-xmlFreeNotationTable
-xmlFreeNs
-xmlFreeNsList
-xmlFreeParserCtxt
-xmlFreeParserInputBuffer
-xmlFreePattern
-xmlFreePatternList
-xmlFreeProp
-xmlFreePropList
-xmlFreeRMutex
-xmlFreeRefTable
-xmlFreeStreamCtxt
-xmlFreeTextReader
-xmlFreeTextWriter
-xmlFreeURI
-xmlFreeValidCtxt
-xmlGcMemGet
-xmlGcMemSetup
-xmlGetBufferAllocationScheme
-xmlGetCharEncodingHandler
-xmlGetCharEncodingName
-xmlGetCompressMode
-xmlGetDocCompressMode
-xmlGetDocEntity
-xmlGetDtdAttrDesc
-xmlGetDtdElementDesc
-xmlGetDtdEntity
-xmlGetDtdNotationDesc
-xmlGetDtdQAttrDesc
-xmlGetDtdQElementDesc
-xmlGetEncodingAlias
-xmlGetExternalEntityLoader
-xmlGetFeature
-xmlGetFeaturesList
-xmlGetGlobalState
-xmlGetID
-xmlGetIntSubset
-xmlGetLastChild
-xmlGetLastError
-xmlGetLineNo
-xmlGetNoNsProp
-xmlGetNodePath
-xmlGetNsList
-xmlGetNsProp
-xmlGetParameterEntity
-xmlGetPredefinedEntity
-xmlGetProp
-xmlGetRefs
-xmlGetThreadId
-xmlGetUTF8Char
-xmlHandleEntity
-xmlHasFeature
-xmlHasNsProp
-xmlHasProp
-xmlHashAddEntry
-xmlHashAddEntry2
-xmlHashAddEntry3
-xmlHashCopy
-xmlHashCreate
-xmlHashCreateDict
-xmlHashDefaultDeallocator
-xmlHashFree
-xmlHashLookup
-xmlHashLookup2
-xmlHashLookup3
-xmlHashQLookup
-xmlHashQLookup2
-xmlHashQLookup3
-xmlHashRemoveEntry
-xmlHashRemoveEntry2
-xmlHashRemoveEntry3
-xmlHashScan
-xmlHashScan3
-xmlHashScanFull
-xmlHashScanFull3
-xmlHashSize
-xmlHashUpdateEntry
-xmlHashUpdateEntry2
-xmlHashUpdateEntry3
-#ifdef LIBXML_FTP_ENABLED
-xmlIOFTPClose
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlIOFTPMatch
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlIOFTPOpen
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlIOFTPRead
-#endif
-#ifdef LIBXML_HTML_ENABLED
-xmlIOHTTPClose
-#endif
-#ifdef LIBXML_HTML_ENABLED
-xmlIOHTTPMatch
-#endif
-#ifdef LIBXML_HTML_ENABLED
-xmlIOHTTPOpen
-#endif
-#ifdef LIBXML_HTML_ENABLED
-xmlIOHTTPOpenW
-#endif
-#ifdef LIBXML_HTML_ENABLED
-xmlIOHTTPRead
-#endif
-xmlIOParseDTD
-xmlInitCharEncodingHandlers
-xmlInitGlobals
-xmlInitMemory
-xmlInitNodeInfoSeq
-xmlInitParser
-xmlInitParserCtxt
-xmlInitThreads
-#ifdef LIBXML_CATALOG_ENABLED
-xmlInitializeCatalog
-#endif
-xmlInitializeDict
-xmlInitializeGlobalState
-xmlInitializePredefinedEntities
-xmlIsBaseChar
-xmlIsBlank
-xmlIsBlankNode
-xmlIsChar
-xmlIsCombining
-xmlIsDigit
-xmlIsExtender
-xmlIsID
-xmlIsIdeographic
-xmlIsLetter
-xmlIsMainThread
-xmlIsMixedElement
-xmlIsPubidChar
-xmlIsRef
-#ifdef LIBXML_HTML_ENABLED
-xmlIsXHTML
-#endif
-xmlKeepBlanksDefault
-xmlLastElementChild
-xmlLineNumbersDefault
-xmlLinkGetData
-xmlListAppend
-xmlListClear
-xmlListCopy
-xmlListCreate
-xmlListDelete
-xmlListDup
-xmlListEmpty
-xmlListEnd
-xmlListFront
-xmlListInsert
-xmlListMerge
-xmlListPopBack
-xmlListPopFront
-xmlListPushBack
-xmlListPushFront
-xmlListRemoveAll
-xmlListRemoveFirst
-xmlListRemoveLast
-xmlListReverse
-xmlListReverseSearch
-xmlListReverseWalk
-xmlListSearch
-xmlListSize
-xmlListSort
-xmlListWalk
-#ifdef LIBXML_CATALOG_ENABLED
-xmlLoadACatalog
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlLoadCatalog
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-xmlLoadCatalogs
-#endif
-xmlLoadExternalEntity
-#ifdef LIBXML_CATALOG_ENABLED
-xmlLoadSGMLSuperCatalog
-#endif
-xmlLockLibrary
-#ifdef LIBXML_DEBUG_ENABLED
-xmlLsCountNode
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlLsOneNode
-#endif
-#ifdef DEBUG_MEMORY_LOCATION
-xmlMallocAtomicLoc
-#endif
-#ifdef DEBUG_MEMORY_LOCATION
-xmlMallocLoc
-#endif
-xmlMemBlocks
-xmlMemDisplay
-xmlMemDisplayLast
-xmlMemFree
-xmlMemGet
-xmlMemMalloc
-xmlMemRealloc
-xmlMemSetup
-xmlMemShow
-#ifdef DEBUG_MEMORY_LOCATION
-xmlMemStrdupLoc
-#endif
-xmlMemUsed
-xmlMemoryDump
-xmlMemoryStrdup
-xmlModuleClose
-xmlModuleFree
-xmlModuleOpen
-xmlModuleSymbol
-xmlMutexLock
-xmlMutexUnlock
-xmlNamespaceParseNCName
-xmlNamespaceParseNSDef
-xmlNamespaceParseQName
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPCheckResponse
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPCleanup
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPClose
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPCloseConnection
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPConnect
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPConnectTo
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPCwd
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPDele
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPFreeCtxt
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPGet
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPGetConnection
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPGetResponse
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPGetSocket
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPInit
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPList
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPNewCtxt
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPOpen
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPProxy
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPQuit
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPRead
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPScanProxy
-#endif
-#ifdef LIBXML_FTP_ENABLED
-xmlNanoFTPUpdateURL
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPAuthHeader
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPCleanup
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPClose
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPContentLength
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPEncoding
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPFetch
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPInit
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPMethod
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPMethodRedir
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPMimeType
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPOpen
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPOpenRedir
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPRead
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPRedir
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPReturnCode
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPSave
-#endif
-#ifdef LIBXML_HTTP_ENABLED
-xmlNanoHTTPScanProxy
-#endif
-#ifdef LIBXML_AUTOMATA_ENABLED
-xmlNewAutomata
-#endif
-xmlNewCDataBlock
-#ifdef LIBXML_CATALOG_ENABLED
-xmlNewCatalog
-#endif
-xmlNewCharEncodingHandler
-xmlNewCharRef
-xmlNewChild
-xmlNewComment
-xmlNewDoc
-xmlNewDocComment
-xmlNewDocElementContent
-xmlNewDocFragment
-xmlNewDocNode
-xmlNewDocNodeEatName
-xmlNewDocPI
-xmlNewDocProp
-xmlNewDocRawNode
-xmlNewDocText
-xmlNewDocTextLen
-xmlNewDtd
-xmlNewElementContent
-xmlNewEntity
-xmlNewEntityInputStream
-xmlNewGlobalNs
-xmlNewIOInputStream
-xmlNewInputFromFile
-xmlNewInputStream
-xmlNewMutex
-xmlNewNode
-xmlNewNodeEatName
-xmlNewNs
-xmlNewNsProp
-xmlNewNsPropEatName
-xmlNewPI
-xmlNewParserCtxt
-xmlNewProp
-xmlNewRMutex
-xmlNewReference
-xmlNewSAXParserCtxt
-xmlNewStringInputStream
-xmlNewText
-xmlNewTextChild
-xmlNewTextLen
-xmlNewTextReader
-xmlNewTextReaderFilename
-xmlNewTextWriter
-xmlNewTextWriterDoc
-xmlNewTextWriterFilename
-xmlNewTextWriterMemory
-xmlNewTextWriterPushParser
-xmlNewTextWriterTree
-xmlNewValidCtxt
-xmlNextChar
-xmlNextElementSibling
-xmlNoNetExternalEntityLoader
-xmlNodeAddContent
-xmlNodeAddContentLen
-xmlNodeBufGetContent
-xmlNodeDump
-xmlNodeDumpOutput
-xmlNodeGetBase
-xmlNodeGetContent
-xmlNodeGetLang
-xmlNodeGetSpacePreserve
-xmlNodeIsText
-xmlNodeListGetRawString
-xmlNodeListGetString
-xmlNodeSetBase
-xmlNodeSetContent
-xmlNodeSetContentLen
-xmlNodeSetLang
-xmlNodeSetName
-xmlNodeSetSpacePreserve
-xmlNormalizeURIPath
-xmlNormalizeWindowsPath
-xmlOutputBufferClose
-xmlOutputBufferCreateBuffer
-xmlOutputBufferCreateFd
-xmlOutputBufferCreateFile
-xmlOutputBufferCreateFilename
-xmlOutputBufferCreateFilenameDefault
-xmlOutputBufferCreateIO
-xmlOutputBufferFlush
-xmlOutputBufferGetContent
-xmlOutputBufferGetSize
-xmlOutputBufferWrite
-xmlOutputBufferWriteEscape
-xmlOutputBufferWriteString
-xmlParseAttValue
-xmlParseAttribute
-xmlParseAttributeListDecl
-xmlParseAttributeType
-xmlParseBalancedChunkMemory
-xmlParseBalancedChunkMemoryRecover
-xmlParseCDSect
-#ifdef LIBXML_CATALOG_ENABLED
-xmlParseCatalogFile
-#endif
-xmlParseCharData
-xmlParseCharEncoding
-xmlParseCharRef
-xmlParseChunk
-xmlParseComment
-xmlParseContent
-xmlParseCtxtExternalEntity
-xmlParseDTD
-xmlParseDefaultDecl
-xmlParseDoc
-xmlParseDocTypeDecl
-xmlParseDocument
-xmlParseElement
-xmlParseElementChildrenContentDecl
-xmlParseElementContentDecl
-xmlParseElementDecl
-xmlParseElementMixedContentDecl
-xmlParseEncName
-xmlParseEncodingDecl
-xmlParseEndTag
-xmlParseEntity
-xmlParseEntityDecl
-xmlParseEntityRef
-xmlParseEntityValue
-xmlParseEnumeratedType
-xmlParseEnumerationType
-xmlParseExtParsedEnt
-xmlParseExternalEntity
-xmlParseExternalID
-xmlParseExternalSubset
-xmlParseFile
-xmlParseInNodeContext
-xmlParseMarkupDecl
-xmlParseMemory
-xmlParseMisc
-xmlParseName
-xmlParseNamespace
-xmlParseNmtoken
-xmlParseNotationDecl
-xmlParseNotationType
-xmlParsePEReference
-xmlParsePI
-xmlParsePITarget
-xmlParsePubidLiteral
-xmlParseQuotedString
-xmlParseReference
-xmlParseSDDecl
-xmlParseStartTag
-xmlParseSystemLiteral
-xmlParseTextDecl
-xmlParseURI
-xmlParseURIRaw
-xmlParseURIReference
-xmlParseVersionInfo
-xmlParseVersionNum
-xmlParseXMLDecl
-xmlParserAddNodeInfo
-xmlParserError
-xmlParserFindNodeInfo
-xmlParserFindNodeInfoIndex
-xmlParserGetDirectory
-xmlParserHandlePEReference
-xmlParserHandleReference
-xmlParserInputBufferCreateFd
-xmlParserInputBufferCreateFile
-xmlParserInputBufferCreateFilename
-xmlParserInputBufferCreateFilenameDefault
-xmlParserInputBufferCreateIO
-xmlParserInputBufferCreateMem
-xmlParserInputBufferCreateStatic
-xmlParserInputBufferGrow
-xmlParserInputBufferPush
-xmlParserInputBufferRead
-xmlParserInputGrow
-xmlParserInputRead
-xmlParserInputShrink
-xmlParserPrintFileContext
-xmlParserPrintFileInfo
-xmlParserValidityError
-xmlParserValidityWarning
-xmlParserWarning
-xmlPathToURI
-xmlPatternFromRoot
-xmlPatternGetStreamCtxt
-xmlPatternMatch
-xmlPatternMaxDepth
-xmlPatternMinDepth
-xmlPatternStreamable
-xmlPatterncompile
-xmlPedanticParserDefault
-xmlPopInput
-xmlPopInputCallbacks
-xmlPopOutputCallbacks
-xmlPreviousElementSibling
-xmlPrintURI
-xmlPushInput
-xmlRMutexLock
-xmlRMutexUnlock
-xmlReadDoc
-xmlReadFd
-xmlReadFile
-xmlReadIO
-xmlReadMemory
-xmlReaderForDoc
-xmlReaderForFd
-xmlReaderForFile
-xmlReaderForIO
-xmlReaderForMemory
-xmlReaderNewDoc
-xmlReaderNewFd
-xmlReaderNewFile
-xmlReaderNewIO
-xmlReaderNewMemory
-xmlReaderNewWalker
-xmlReaderWalker
-#ifdef DEBUG_MEMORY_LOCATION
-xmlReallocLoc
-#endif
-xmlReconciliateNs
-xmlRecoverDoc
-xmlRecoverFile
-xmlRecoverMemory
-#ifdef LIBXML_REGEXP_ENABLED
-xmlRegExecErrInfo
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlRegExecNextValues
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlRegExecPushString
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlRegExecPushString2
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlRegFreeExecCtxt
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlRegFreeRegexp
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlRegNewExecCtxt
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlRegexpCompile
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlRegexpExec
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlRegexpIsDeterminist
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlRegexpPrint
-#endif
-xmlRegisterCharEncodingHandler
-xmlRegisterDefaultInputCallbacks
-xmlRegisterDefaultOutputCallbacks
-#ifdef LIBXML_HTML_ENABLED
-xmlRegisterHTTPPostCallbacks
-#endif
-xmlRegisterInputCallbacks
-xmlRegisterNodeDefault
-xmlRegisterOutputCallbacks
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGCleanupTypes
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGDump
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGDumpTree
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGFree
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGFreeParserCtxt
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGFreeValidCtxt
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGGetParserErrors
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGGetValidErrors
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGInitTypes
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGNewDocParserCtxt
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGNewMemParserCtxt
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGNewParserCtxt
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGNewValidCtxt
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGParse
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGSetParserErrors
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGSetParserStructuredErrors
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGSetValidErrors
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGSetValidStructuredErrors
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGValidateDoc
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGValidateFullElement
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGValidatePopElement
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGValidatePushCData
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxNGValidatePushElement
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlRelaxParserSetFlag
-#endif
-xmlRemoveID
-xmlRemoveProp
-xmlRemoveRef
-xmlReplaceNode
-xmlResetError
-xmlResetLastError
-xmlSAX2AttributeDecl
-xmlSAX2CDataBlock
-xmlSAX2Characters
-xmlSAX2Comment
-xmlSAX2ElementDecl
-xmlSAX2EndDocument
-xmlSAX2EndElement
-xmlSAX2EndElementNs
-xmlSAX2EntityDecl
-xmlSAX2ExternalSubset
-xmlSAX2GetColumnNumber
-xmlSAX2GetEntity
-xmlSAX2GetLineNumber
-xmlSAX2GetParameterEntity
-xmlSAX2GetPublicId
-xmlSAX2GetSystemId
-xmlSAX2HasExternalSubset
-xmlSAX2HasInternalSubset
-xmlSAX2IgnorableWhitespace
-xmlSAX2InitDefaultSAXHandler
-xmlSAX2InitHtmlDefaultSAXHandler
-xmlSAX2InternalSubset
-xmlSAX2IsStandalone
-xmlSAX2NotationDecl
-xmlSAX2ProcessingInstruction
-xmlSAX2Reference
-xmlSAX2ResolveEntity
-xmlSAX2SetDocumentLocator
-xmlSAX2StartDocument
-xmlSAX2StartElement
-xmlSAX2StartElementNs
-xmlSAX2UnparsedEntityDecl
-xmlSAXDefaultVersion
-xmlSAXParseDTD
-xmlSAXParseDoc
-xmlSAXParseEntity
-xmlSAXParseFile
-xmlSAXParseFileWithData
-xmlSAXParseMemory
-xmlSAXParseMemoryWithData
-xmlSAXUserParseFile
-xmlSAXUserParseMemory
-xmlSAXVersion
-xmlSaveClose
-xmlSaveDoc
-xmlSaveFile
-xmlSaveFileEnc
-xmlSaveFileTo
-xmlSaveFlush
-xmlSaveFormatFile
-xmlSaveFormatFileEnc
-xmlSaveFormatFileTo
-xmlSaveSetAttrEscape
-xmlSaveSetEscape
-xmlSaveToBuffer
-xmlSaveToFd
-xmlSaveToFilename
-xmlSaveToIO
-xmlSaveTree
-xmlSaveUri
-xmlScanName
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaCheckFacet
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaCleanupTypes
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaCollapseString
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaCompareValues
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaCompareValuesWhtsp
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaCopyValue
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaDump
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaFree
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaFreeFacet
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaFreeParserCtxt
-#endif
-xmlSchemaFreeType
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaFreeValidCtxt
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaFreeValue
-#endif
-xmlSchemaFreeWildcard
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaGetBuiltInListSimpleTypeItemType
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaGetBuiltInType
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaGetCanonValue
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaGetCanonValueWhtsp
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaGetFacetValueAsULong
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaGetParserErrors
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaGetPredefinedType
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaGetValType
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaGetValidErrors
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaInitTypes
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaIsBuiltInTypeFacet
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaIsValid
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaNewDocParserCtxt
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaNewFacet
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaNewMemParserCtxt
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaNewNOTATIONValue
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaNewParserCtxt
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaNewQNameValue
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaNewStringValue
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaNewValidCtxt
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaParse
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaSAXPlug
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaSAXUnplug
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaSetParserErrors
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaSetParserStructuredErrors
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaSetValidErrors
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaSetValidOptions
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaSetValidStructuredErrors
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValPredefTypeNode
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValPredefTypeNodeNoNorm
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValidCtxtGetOptions
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValidCtxtGetParserCtxt
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValidateDoc
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValidateFacet
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValidateFacetWhtsp
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValidateFile
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValidateLengthFacet
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValidateLengthFacetWhtsp
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValidateListSimpleTypeFacet
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValidateOneElement
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValidatePredefinedType
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValidateSetFilename
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValidateSetLocator
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValidateStream
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValueAppend
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValueGetAsBoolean
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValueGetAsString
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaValueGetNext
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlSchemaWhiteSpaceReplace
-#endif
-xmlSchematronFree
-xmlSchematronFreeParserCtxt
-xmlSchematronFreeValidCtxt
-xmlSchematronNewDocParserCtxt
-xmlSchematronNewMemParserCtxt
-xmlSchematronNewParserCtxt
-xmlSchematronNewValidCtxt
-xmlSchematronParse
-xmlSchematronSetValidStructuredErrors
-xmlSchematronValidateDoc
-xmlSearchNs
-xmlSearchNsByHref
-xmlSetBufferAllocationScheme
-xmlSetCompressMode
-xmlSetDocCompressMode
-xmlSetEntityReferenceFunc
-xmlSetExternalEntityLoader
-xmlSetFeature
-xmlSetGenericErrorFunc
-xmlSetListDoc
-xmlSetNs
-xmlSetNsProp
-xmlSetProp
-xmlSetStructuredErrorFunc
-xmlSetTreeDoc
-xmlSetupParserForBuffer
-#ifdef LIBXML_DEBUG_ENABLED
-xmlShell
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlShellBase
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlShellCat
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlShellDir
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlShellDu
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlShellList
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlShellLoad
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlShellPrintNode
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlShellPrintXPathError
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlShellPrintXPathResult
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlShellPwd
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlShellSave
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlShellValidate
-#endif
-#ifdef LIBXML_DEBUG_ENABLED
-xmlShellWrite
-#endif
-xmlSkipBlankChars
-xmlSnprintfElementContent
-xmlSplitQName
-xmlSplitQName2
-xmlSplitQName3
-xmlSprintfElementContent
-xmlStopParser
-xmlStrEqual
-xmlStrPrintf
-xmlStrQEqual
-xmlStrVPrintf
-xmlStrcasecmp
-xmlStrcasestr
-xmlStrcat
-xmlStrchr
-xmlStrcmp
-xmlStrdup
-xmlStreamPop
-xmlStreamPush
-xmlStreamPushAttr
-xmlStreamPushNode
-xmlStreamWantsAnyNode
-xmlStringCurrentChar
-xmlStringDecodeEntities
-xmlStringGetNodeList
-xmlStringLenDecodeEntities
-xmlStringLenGetNodeList
-xmlStrlen
-xmlStrncasecmp
-xmlStrncat
-xmlStrncatNew
-xmlStrncmp
-xmlStrndup
-xmlStrstr
-xmlStrsub
-xmlSubstituteEntitiesDefault
-xmlSwitchEncoding
-xmlSwitchInputEncoding
-xmlSwitchToEncoding
-xmlTextConcat
-xmlTextMerge
-xmlTextReaderAttributeCount
-xmlTextReaderBaseUri
-xmlTextReaderByteConsumed
-xmlTextReaderClose
-xmlTextReaderConstBaseUri
-xmlTextReaderConstEncoding
-xmlTextReaderConstLocalName
-xmlTextReaderConstName
-xmlTextReaderConstNamespaceUri
-xmlTextReaderConstPrefix
-xmlTextReaderConstString
-xmlTextReaderConstValue
-xmlTextReaderConstXmlLang
-xmlTextReaderConstXmlVersion
-xmlTextReaderCurrentDoc
-xmlTextReaderCurrentNode
-xmlTextReaderDepth
-xmlTextReaderExpand
-xmlTextReaderGetAttribute
-xmlTextReaderGetAttributeNo
-xmlTextReaderGetAttributeNs
-xmlTextReaderGetErrorHandler
-xmlTextReaderGetParserColumnNumber
-xmlTextReaderGetParserLineNumber
-xmlTextReaderGetParserProp
-xmlTextReaderGetRemainder
-xmlTextReaderHasAttributes
-xmlTextReaderHasValue
-xmlTextReaderIsDefault
-xmlTextReaderIsEmptyElement
-xmlTextReaderIsNamespaceDecl
-xmlTextReaderIsValid
-xmlTextReaderLocalName
-xmlTextReaderLocatorBaseURI
-xmlTextReaderLocatorLineNumber
-xmlTextReaderLookupNamespace
-xmlTextReaderMoveToAttribute
-xmlTextReaderMoveToAttributeNo
-xmlTextReaderMoveToAttributeNs
-xmlTextReaderMoveToElement
-xmlTextReaderMoveToFirstAttribute
-xmlTextReaderMoveToNextAttribute
-xmlTextReaderName
-xmlTextReaderNamespaceUri
-xmlTextReaderNext
-xmlTextReaderNextSibling
-xmlTextReaderNodeType
-xmlTextReaderNormalization
-xmlTextReaderPrefix
-xmlTextReaderPreserve
-xmlTextReaderPreservePattern
-xmlTextReaderQuoteChar
-xmlTextReaderRead
-xmlTextReaderReadAttributeValue
-xmlTextReaderReadInnerXml
-xmlTextReaderReadOuterXml
-xmlTextReaderReadState
-xmlTextReaderReadString
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlTextReaderRelaxNGSetSchema
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-xmlTextReaderRelaxNGValidate
-#endif
-xmlTextReaderRelaxNGValidateCtxt
-xmlTextReaderSchemaValidate
-xmlTextReaderSchemaValidateCtxt
-xmlTextReaderSetErrorHandler
-xmlTextReaderSetParserProp
-xmlTextReaderSetSchema
-xmlTextReaderSetStructuredErrorHandler
-xmlTextReaderSetup
-xmlTextReaderStandalone
-xmlTextReaderValue
-xmlTextReaderXmlLang
-xmlTextWriterEndAttribute
-xmlTextWriterEndCDATA
-xmlTextWriterEndComment
-xmlTextWriterEndDTD
-xmlTextWriterEndDTDAttlist
-xmlTextWriterEndDTDElement
-xmlTextWriterEndDTDEntity
-xmlTextWriterEndDocument
-xmlTextWriterEndElement
-xmlTextWriterEndPI
-xmlTextWriterFlush
-xmlTextWriterFullEndElement
-xmlTextWriterSetIndent
-xmlTextWriterSetIndentString
-xmlTextWriterSetQuoteChar
-xmlTextWriterStartAttribute
-xmlTextWriterStartAttributeNS
-xmlTextWriterStartCDATA
-xmlTextWriterStartComment
-xmlTextWriterStartDTD
-xmlTextWriterStartDTDAttlist
-xmlTextWriterStartDTDElement
-xmlTextWriterStartDTDEntity
-xmlTextWriterStartDocument
-xmlTextWriterStartElement
-xmlTextWriterStartElementNS
-xmlTextWriterStartPI
-xmlTextWriterWriteAttribute
-xmlTextWriterWriteAttributeNS
-xmlTextWriterWriteBase64
-xmlTextWriterWriteBinHex
-xmlTextWriterWriteCDATA
-xmlTextWriterWriteComment
-xmlTextWriterWriteDTD
-xmlTextWriterWriteDTDAttlist
-xmlTextWriterWriteDTDElement
-xmlTextWriterWriteDTDEntity
-xmlTextWriterWriteDTDExternalEntity
-xmlTextWriterWriteDTDExternalEntityContents
-xmlTextWriterWriteDTDInternalEntity
-xmlTextWriterWriteDTDNotation
-xmlTextWriterWriteElement
-xmlTextWriterWriteElementNS
-xmlTextWriterWriteFormatAttribute
-xmlTextWriterWriteFormatAttributeNS
-xmlTextWriterWriteFormatCDATA
-xmlTextWriterWriteFormatComment
-xmlTextWriterWriteFormatDTD
-xmlTextWriterWriteFormatDTDAttlist
-xmlTextWriterWriteFormatDTDElement
-xmlTextWriterWriteFormatDTDInternalEntity
-xmlTextWriterWriteFormatElement
-xmlTextWriterWriteFormatElementNS
-xmlTextWriterWriteFormatPI
-xmlTextWriterWriteFormatRaw
-xmlTextWriterWriteFormatString
-xmlTextWriterWritePI
-xmlTextWriterWriteRaw
-xmlTextWriterWriteRawLen
-xmlTextWriterWriteString
-xmlTextWriterWriteVFormatAttribute
-xmlTextWriterWriteVFormatAttributeNS
-xmlTextWriterWriteVFormatCDATA
-xmlTextWriterWriteVFormatComment
-xmlTextWriterWriteVFormatDTD
-xmlTextWriterWriteVFormatDTDAttlist
-xmlTextWriterWriteVFormatDTDElement
-xmlTextWriterWriteVFormatDTDInternalEntity
-xmlTextWriterWriteVFormatElement
-xmlTextWriterWriteVFormatElementNS
-xmlTextWriterWriteVFormatPI
-xmlTextWriterWriteVFormatRaw
-xmlTextWriterWriteVFormatString
-xmlThrDefBufferAllocScheme
-xmlThrDefDefaultBufferSize
-xmlThrDefDeregisterNodeDefault
-xmlThrDefDoValidityCheckingDefaultValue
-xmlThrDefGetWarningsDefaultValue
-xmlThrDefIndentTreeOutput
-xmlThrDefKeepBlanksDefaultValue
-xmlThrDefLineNumbersDefaultValue
-xmlThrDefLoadExtDtdDefaultValue
-xmlThrDefOutputBufferCreateFilenameDefault
-xmlThrDefParserDebugEntities
-xmlThrDefParserInputBufferCreateFilenameDefault
-xmlThrDefPedanticParserDefaultValue
-xmlThrDefRegisterNodeDefault
-xmlThrDefSaveNoEmptyTags
-xmlThrDefSetGenericErrorFunc
-xmlThrDefSetStructuredErrorFunc
-xmlThrDefSubstituteEntitiesDefaultValue
-xmlThrDefTreeIndentString
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsAegeanNumbers
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsAlphabeticPresentationForms
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsArabic
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsArabicPresentationFormsA
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsArabicPresentationFormsB
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsArmenian
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsArrows
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsBasicLatin
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsBengali
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsBlock
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsBlockElements
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsBopomofo
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsBopomofoExtended
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsBoxDrawing
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsBraillePatterns
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsBuhid
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsByzantineMusicalSymbols
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCJKCompatibility
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCJKCompatibilityForms
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCJKCompatibilityIdeographs
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCJKCompatibilityIdeographsSupplement
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCJKRadicalsSupplement
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCJKSymbolsandPunctuation
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCJKUnifiedIdeographs
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCJKUnifiedIdeographsExtensionA
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCJKUnifiedIdeographsExtensionB
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCat
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatC
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatCc
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatCf
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatCo
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatCs
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatL
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatLl
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatLm
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatLo
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatLt
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatLu
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatM
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatMc
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatMe
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatMn
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatN
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatNd
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatNl
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatNo
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatP
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatPc
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatPd
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatPe
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatPf
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatPi
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatPo
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatPs
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatS
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatSc
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatSk
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatSm
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatSo
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatZ
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatZl
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatZp
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCatZs
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCherokee
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCombiningDiacriticalMarks
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCombiningDiacriticalMarksforSymbols
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCombiningHalfMarks
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCombiningMarksforSymbols
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsControlPictures
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCurrencySymbols
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCypriotSyllabary
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCyrillic
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsCyrillicSupplement
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsDeseret
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsDevanagari
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsDingbats
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsEnclosedAlphanumerics
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsEnclosedCJKLettersandMonths
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsEthiopic
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsGeneralPunctuation
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsGeometricShapes
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsGeorgian
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsGothic
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsGreek
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsGreekExtended
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsGreekandCoptic
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsGujarati
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsGurmukhi
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsHalfwidthandFullwidthForms
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsHangulCompatibilityJamo
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsHangulJamo
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsHangulSyllables
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsHanunoo
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsHebrew
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsHighPrivateUseSurrogates
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsHighSurrogates
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsHiragana
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsIPAExtensions
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsIdeographicDescriptionCharacters
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsKanbun
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsKangxiRadicals
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsKannada
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsKatakana
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsKatakanaPhoneticExtensions
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsKhmer
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsKhmerSymbols
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsLao
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsLatin1Supplement
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsLatinExtendedA
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsLatinExtendedAdditional
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsLatinExtendedB
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsLetterlikeSymbols
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsLimbu
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsLinearBIdeograms
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsLinearBSyllabary
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsLowSurrogates
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsMalayalam
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsMathematicalAlphanumericSymbols
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsMathematicalOperators
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsMiscellaneousMathematicalSymbolsA
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsMiscellaneousMathematicalSymbolsB
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsMiscellaneousSymbols
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsMiscellaneousSymbolsandArrows
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsMiscellaneousTechnical
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsMongolian
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsMusicalSymbols
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsMyanmar
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsNumberForms
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsOgham
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsOldItalic
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsOpticalCharacterRecognition
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsOriya
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsOsmanya
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsPhoneticExtensions
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsPrivateUse
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsPrivateUseArea
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsRunic
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsShavian
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsSinhala
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsSmallFormVariants
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsSpacingModifierLetters
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsSpecials
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsSuperscriptsandSubscripts
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsSupplementalArrowsA
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsSupplementalArrowsB
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsSupplementalMathematicalOperators
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsSupplementaryPrivateUseAreaA
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsSupplementaryPrivateUseAreaB
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsSyriac
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsTagalog
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsTagbanwa
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsTags
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsTaiLe
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsTaiXuanJingSymbols
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsTamil
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsTelugu
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsThaana
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsThai
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsTibetan
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsUgaritic
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsUnifiedCanadianAboriginalSyllabics
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsVariationSelectors
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsVariationSelectorsSupplement
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsYiRadicals
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsYiSyllables
-#endif
-#ifdef LIBXML_REGEXP_ENABLED
-xmlUCSIsYijingHexagramSymbols
-#endif
-xmlURIEscape
-xmlURIEscapeStr
-xmlURIUnescapeString
-xmlUTF8Charcmp
-xmlUTF8Size
-xmlUTF8Strlen
-xmlUTF8Strloc
-xmlUTF8Strndup
-xmlUTF8Strpos
-xmlUTF8Strsize
-xmlUTF8Strsub
-xmlUnlinkNode
-xmlUnlockLibrary
-xmlUnsetNsProp
-xmlUnsetProp
-#ifdef LIBXML_REGEXP_ENABLED
-xmlValidBuildContentModel
-#endif
-xmlValidCtxtNormalizeAttributeValue
-xmlValidGetPotentialChildren
-xmlValidGetValidElements
-xmlValidNormalizeAttributeValue
-xmlValidateAttributeDecl
-xmlValidateAttributeValue
-xmlValidateDocument
-xmlValidateDocumentFinal
-xmlValidateDtd
-xmlValidateDtdFinal
-xmlValidateElement
-xmlValidateElementDecl
-xmlValidateNCName
-xmlValidateNMToken
-xmlValidateName
-xmlValidateNameValue
-xmlValidateNamesValue
-xmlValidateNmtokenValue
-xmlValidateNmtokensValue
-xmlValidateNotationDecl
-xmlValidateNotationUse
-xmlValidateOneAttribute
-xmlValidateOneElement
-xmlValidateOneNamespace
-xmlValidatePopElement
-xmlValidatePushCData
-xmlValidatePushElement
-xmlValidateQName
-xmlValidateRoot
-#ifdef LIBXML_XINCLUDE_ENABLED
-xmlXIncludeFreeContext
-#endif
-#ifdef LIBXML_XINCLUDE_ENABLED
-xmlXIncludeNewContext
-#endif
-#ifdef LIBXML_XINCLUDE_ENABLED
-xmlXIncludeProcess
-#endif
-#ifdef LIBXML_XINCLUDE_ENABLED
-xmlXIncludeProcessFlags
-#endif
-#ifdef LIBXML_XINCLUDE_ENABLED
-xmlXIncludeProcessFlagsData
-#endif
-#ifdef LIBXML_XINCLUDE_ENABLED
-xmlXIncludeProcessNode
-#endif
-#ifdef LIBXML_XINCLUDE_ENABLED
-xmlXIncludeProcessTree
-#endif
-#ifdef LIBXML_XINCLUDE_ENABLED
-xmlXIncludeProcessTreeFlags
-#endif
-#ifdef LIBXML_XINCLUDE_ENABLED
-xmlXIncludeProcessTreeFlagsData
-#endif
-#ifdef LIBXML_XINCLUDE_ENABLED
-xmlXIncludeSetFlags
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathAddValues
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathBooleanFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCastBooleanToNumber
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCastBooleanToString
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCastNodeSetToBoolean
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCastNodeSetToNumber
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCastNodeSetToString
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCastNodeToNumber
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCastNodeToString
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCastNumberToBoolean
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCastNumberToString
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCastStringToBoolean
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCastStringToNumber
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCastToBoolean
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCastToNumber
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCastToString
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCeilingFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCmpNodes
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCompareValues
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCompile
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCompiledEval
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCompiledEvalToBoolean
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathConcatFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathContainsFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathContextSetCache
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathConvertBoolean
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathConvertNumber
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathConvertString
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCountFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathCtxtCompile
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-#ifdef LIBXML_DEBUG_ENABLED
-xmlXPathDebugDumpCompExpr
-#endif
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-#ifdef LIBXML_DEBUG_ENABLED
-xmlXPathDebugDumpObject
-#endif
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathDifference
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathDistinct
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathDistinctSorted
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathDivValues
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathEqualValues
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathErr
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathEval
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathEvalExpr
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathEvalExpression
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathEvalPredicate
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathEvaluatePredicateResult
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathFalseFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathFloorFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathFreeCompExpr
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathFreeContext
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathFreeNodeSet
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathFreeNodeSetList
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathFreeObject
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathFreeParserContext
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathFunctionLookup
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathFunctionLookupNS
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathHasSameNodes
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathIdFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathInit
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathIntersection
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathIsInf
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathIsNaN
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathIsNodeType
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathLangFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathLastFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathLeading
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathLeadingSorted
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathLocalNameFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathModValues
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathMultValues
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNamespaceURIFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNewBoolean
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNewCString
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNewContext
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNewFloat
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNewNodeSet
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNewNodeSetList
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNewParserContext
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNewString
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNewValueTree
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNextAncestor
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNextAncestorOrSelf
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNextAttribute
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNextChild
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNextDescendant
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNextDescendantOrSelf
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNextFollowing
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNextFollowingSibling
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNextNamespace
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNextParent
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNextPreceding
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNextPrecedingSibling
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNextSelf
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNodeEval
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNodeLeading
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNodeLeadingSorted
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNodeSetAdd
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNodeSetAddNs
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNodeSetAddUnique
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNodeSetContains
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNodeSetCreate
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNodeSetDel
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNodeSetFreeNs
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNodeSetMerge
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNodeSetRemove
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNodeSetSort
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNodeTrailing
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNodeTrailingSorted
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNormalizeFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNotEqualValues
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNotFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNsLookup
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathNumberFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathObjectCopy
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathOrderDocElems
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathParseNCName
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathParseName
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathPopBoolean
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathPopExternal
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathPopNodeSet
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathPopNumber
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathPopString
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathPositionFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathRegisterAllFunctions
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathRegisterFunc
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathRegisterFuncLookup
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathRegisterFuncNS
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathRegisterNs
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathRegisterVariable
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathRegisterVariableLookup
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathRegisterVariableNS
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathRegisteredFuncsCleanup
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathRegisteredNsCleanup
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathRegisteredVariablesCleanup
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathRoot
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathRoundFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathSetContextNode
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathStartsWithFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathStringEvalNumber
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathStringFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathStringLengthFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathSubValues
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathSubstringAfterFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathSubstringBeforeFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathSubstringFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathSumFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathTrailing
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathTrailingSorted
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathTranslateFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathTrueFunction
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathValueFlipSign
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathVariableLookup
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathVariableLookupNS
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathWrapCString
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathWrapExternal
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathWrapNodeSet
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPathWrapString
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-xmlXPatherror
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrBuildNodeList
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrEval
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrEvalRangePredicate
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrFreeLocationSet
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrLocationSetAdd
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrLocationSetCreate
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrLocationSetDel
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrLocationSetMerge
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrLocationSetRemove
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrNewCollapsedRange
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrNewContext
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrNewLocationSetNodeSet
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrNewLocationSetNodes
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrNewRange
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrNewRangeNodeObject
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrNewRangeNodePoint
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrNewRangeNodes
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrNewRangePointNode
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrNewRangePoints
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrRangeToFunction
-#endif
-#ifdef LIBXML_XPTR_ENABLED
-xmlXPtrWrapLocationSet
-#endif
diff --git a/third_party/libxml/src/xmlmemory.c b/third_party/libxml/src/xmlmemory.c
index eed16669..9ec4770b 100644
--- a/third_party/libxml/src/xmlmemory.c
+++ b/third_party/libxml/src/xmlmemory.c
@@ -559,6 +559,27 @@
 }
 
 /**
+ * xmlMemSize:
+ * @ptr:  pointer to the memory allocation
+ *
+ * Returns the size of a memory allocation.
+ */
+
+size_t
+xmlMemSize(void *ptr) {
+    MEMHDR *p;
+
+    if (ptr == NULL)
+	return(0);
+
+    p = CLIENT_2_HDR(ptr);
+    if (p->mh_tag != MEMTAG)
+        return(0);
+
+    return(p->mh_size);
+}
+
+/**
  * xmlMemUsed:
  *
  * Provides the amount of memory currently allocated
diff --git a/third_party/libxml/src/xpath.c b/third_party/libxml/src/xpath.c
index 9461150..9ca8f060 100644
--- a/third_party/libxml/src/xpath.c
+++ b/third_party/libxml/src/xpath.c
@@ -823,32 +823,30 @@
 		       void *item,
 		       int initialSize)
 {
-    if (list->items == NULL) {
-	if (initialSize <= 0)
-	    initialSize = 1;
-	list->items = (void **) xmlMalloc(initialSize * sizeof(void *));
-	if (list->items == NULL) {
-	    xmlXPathErrMemory(NULL,
-		"xmlPointerListCreate: allocating item\n");
-	    return(-1);
-	}
-	list->number = 0;
-	list->size = initialSize;
-    } else if (list->size <= list->number) {
-        if (list->size > 50000000) {
-	    xmlXPathErrMemory(NULL,
-		"xmlPointerListAddSize: re-allocating item\n");
-            return(-1);
+    if (list->size <= list->number) {
+        void **tmp;
+        size_t newSize;
+
+        if (list->size == 0) {
+            if (initialSize <= 0)
+                initialSize = 1;
+            newSize = initialSize;
+        } else {
+            if (list->size > 50000000) {
+                xmlXPathErrMemory(NULL,
+                    "xmlPointerListAddSize: re-allocating item\n");
+                return(-1);
+            }
+	    newSize = list->size * 2;
         }
-	list->size *= 2;
-	list->items = (void **) xmlRealloc(list->items,
-	    list->size * sizeof(void *));
-	if (list->items == NULL) {
+	tmp = (void **) xmlRealloc(list->items, newSize * sizeof(void *));
+	if (tmp == NULL) {
 	    xmlXPathErrMemory(NULL,
 		"xmlPointerListAddSize: re-allocating item\n");
-	    list->size = 0;
 	    return(-1);
 	}
+        list->items = tmp;
+        list->size = newSize;
     }
     list->items[list->number++] = item;
     return(0);
@@ -2469,21 +2467,24 @@
 	    (cache->miscObjs->number != 0))
 	{
 	    xmlXPathObjectPtr ret;
+            xmlNodeSetPtr set;
 	    /*
 	    * Fallback to misc-cache.
 	    */
 
+	    set = xmlXPathNodeSetCreate(val);
+	    if (set == NULL) {
+		ctxt->lastError.domain = XML_FROM_XPATH;
+		ctxt->lastError.code = XML_ERR_NO_MEMORY;
+		return(NULL);
+	    }
+
 	    ret = (xmlXPathObjectPtr)
 		cache->miscObjs->items[--cache->miscObjs->number];
 
 	    ret->type = XPATH_NODESET;
 	    ret->boolval = 0;
-	    ret->nodesetval = xmlXPathNodeSetCreate(val);
-	    if (ret->nodesetval == NULL) {
-		ctxt->lastError.domain = XML_FROM_XPATH;
-		ctxt->lastError.code = XML_ERR_NO_MEMORY;
-		return(NULL);
-	    }
+	    ret->nodesetval = set;
 #ifdef XP_DEBUG_OBJ_USAGE
 	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET);
 #endif
@@ -2494,55 +2495,6 @@
 }
 
 /**
- * xmlXPathCacheNewCString:
- * @ctxt: the XPath context
- * @val:  the char * value
- *
- * This is the cached version of xmlXPathNewCString().
- * Acquire an xmlXPathObjectPtr of type string and of value @val
- *
- * Returns the created or reused object.
- */
-static xmlXPathObjectPtr
-xmlXPathCacheNewCString(xmlXPathContextPtr ctxt, const char *val)
-{
-    if ((ctxt != NULL) && (ctxt->cache)) {
-	xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache;
-
-	if ((cache->stringObjs != NULL) &&
-	    (cache->stringObjs->number != 0))
-	{
-	    xmlXPathObjectPtr ret;
-
-	    ret = (xmlXPathObjectPtr)
-		cache->stringObjs->items[--cache->stringObjs->number];
-
-	    ret->type = XPATH_STRING;
-	    ret->stringval = xmlStrdup(BAD_CAST val);
-#ifdef XP_DEBUG_OBJ_USAGE
-	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
-#endif
-	    return(ret);
-	} else if ((cache->miscObjs != NULL) &&
-	    (cache->miscObjs->number != 0))
-	{
-	    xmlXPathObjectPtr ret;
-
-	    ret = (xmlXPathObjectPtr)
-		cache->miscObjs->items[--cache->miscObjs->number];
-
-	    ret->type = XPATH_STRING;
-	    ret->stringval = xmlStrdup(BAD_CAST val);
-#ifdef XP_DEBUG_OBJ_USAGE
-	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
-#endif
-	    return(ret);
-	}
-    }
-    return(xmlXPathNewCString(val));
-}
-
-/**
  * xmlXPathCacheNewString:
  * @ctxt: the XPath context
  * @val:  the xmlChar * value
@@ -2562,14 +2514,20 @@
 	    (cache->stringObjs->number != 0))
 	{
 	    xmlXPathObjectPtr ret;
+            xmlChar *copy;
+
+            if (val == NULL)
+                val = BAD_CAST "";
+            copy = xmlStrdup(val);
+            if (copy == NULL) {
+                xmlXPathErrMemory(ctxt, NULL);
+                return(NULL);
+            }
 
 	    ret = (xmlXPathObjectPtr)
 		cache->stringObjs->items[--cache->stringObjs->number];
 	    ret->type = XPATH_STRING;
-	    if (val != NULL)
-		ret->stringval = xmlStrdup(val);
-	    else
-		ret->stringval = xmlStrdup((const xmlChar *)"");
+            ret->stringval = copy;
 #ifdef XP_DEBUG_OBJ_USAGE
 	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
 #endif
@@ -2578,15 +2536,21 @@
 	    (cache->miscObjs->number != 0))
 	{
 	    xmlXPathObjectPtr ret;
+            xmlChar *copy;
+
+            if (val == NULL)
+                val = BAD_CAST "";
+            copy = xmlStrdup(val);
+            if (copy == NULL) {
+                xmlXPathErrMemory(ctxt, NULL);
+                return(NULL);
+            }
 
 	    ret = (xmlXPathObjectPtr)
 		cache->miscObjs->items[--cache->miscObjs->number];
 
 	    ret->type = XPATH_STRING;
-	    if (val != NULL)
-		ret->stringval = xmlStrdup(val);
-	    else
-		ret->stringval = xmlStrdup((const xmlChar *)"");
+            ret->stringval = copy;
 #ifdef XP_DEBUG_OBJ_USAGE
 	    xmlXPathDebugObjUsageRequested(ctxt, XPATH_STRING);
 #endif
@@ -2597,6 +2561,22 @@
 }
 
 /**
+ * xmlXPathCacheNewCString:
+ * @ctxt: the XPath context
+ * @val:  the char * value
+ *
+ * This is the cached version of xmlXPathNewCString().
+ * Acquire an xmlXPathObjectPtr of type string and of value @val
+ *
+ * Returns the created or reused object.
+ */
+static xmlXPathObjectPtr
+xmlXPathCacheNewCString(xmlXPathContextPtr ctxt, const char *val)
+{
+    return xmlXPathCacheNewString(ctxt, BAD_CAST val);
+}
+
+/**
  * xmlXPathCacheNewBoolean:
  * @ctxt: the XPath context
  * @val:  the boolean value
@@ -2833,42 +2813,6 @@
  ************************************************************************/
 
 /**
- * xmlXPathSetFrame:
- * @ctxt: an XPath parser context
- *
- * Set the callee evaluation frame
- *
- * Returns the previous frame value to be restored once done
- */
-static int
-xmlXPathSetFrame(xmlXPathParserContextPtr ctxt) {
-    int ret;
-
-    if (ctxt == NULL)
-        return(0);
-    ret = ctxt->valueFrame;
-    ctxt->valueFrame = ctxt->valueNr;
-    return(ret);
-}
-
-/**
- * xmlXPathPopFrame:
- * @ctxt: an XPath parser context
- * @frame: the previous frame value
- *
- * Remove the callee evaluation frame
- */
-static void
-xmlXPathPopFrame(xmlXPathParserContextPtr ctxt, int frame) {
-    if (ctxt == NULL)
-        return;
-    if (ctxt->valueNr < ctxt->valueFrame) {
-        xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_STACK_ERROR);
-    }
-    ctxt->valueFrame = frame;
-}
-
-/**
  * valuePop:
  * @ctxt: an XPath evaluation context
  *
@@ -2881,22 +2825,9 @@
 {
     xmlXPathObjectPtr ret;
 
-    /*
-     * If a memory allocation failed, it can happen that valuePush doesn't
-     * push a value on the stack. If there's no error check before the
-     * corresponding valuePop call, we would pop an unrelated object which
-     * could lead to use-after-free errors later on. So we don't pop values
-     * if an error was signaled. The stack will be cleaned later in
-     * xmlXPathFreeParserContext.
-     */
-    if ((ctxt == NULL) || (ctxt->valueNr <= 0) || (ctxt->error != 0))
+    if ((ctxt == NULL) || (ctxt->valueNr <= 0))
         return (NULL);
 
-    if (ctxt->valueNr <= ctxt->valueFrame) {
-        xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_STACK_ERROR);
-        return (NULL);
-    }
-
     ctxt->valueNr--;
     if (ctxt->valueNr > 0)
         ctxt->value = ctxt->valueTab[ctxt->valueNr - 1];
@@ -3049,15 +2980,16 @@
     xmlXPathObjectPtr obj;
     xmlNodeSetPtr ret;
 
-    obj = valuePop(ctxt);
-    if (obj == NULL) {
+    if (ctxt == NULL) return(NULL);
+    if (ctxt->value == NULL) {
 	xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
 	return(NULL);
     }
-    if (obj->type != XPATH_NODESET) {
+    if (!xmlXPathStackIsNodeSet(ctxt)) {
 	xmlXPathSetTypeError(ctxt);
 	return(NULL);
     }
+    obj = valuePop(ctxt);
     ret = obj->nodesetval;
 #if 0
     /* to fix memory leak of not clearing obj->user */
@@ -3083,15 +3015,15 @@
     xmlXPathObjectPtr obj;
     void * ret;
 
-    obj = valuePop(ctxt);
-    if (obj == NULL) {
+    if ((ctxt == NULL) || (ctxt->value == NULL)) {
 	xmlXPathSetError(ctxt, XPATH_INVALID_OPERAND);
 	return(NULL);
     }
-    if (obj->type != XPATH_USERS) {
+    if (ctxt->value->type != XPATH_USERS) {
 	xmlXPathSetTypeError(ctxt);
 	return(NULL);
     }
+    obj = valuePop(ctxt);
     ret = obj->user;
     obj->user = NULL;
     xmlXPathReleaseObject(ctxt->context, obj);
@@ -4567,16 +4499,23 @@
 	cur = xmlXPathNodeSetItem(nodes, i);
 	strval = xmlXPathCastNodeToString(cur);
 	if (xmlHashLookup(hash, strval) == NULL) {
-	    xmlHashAddEntry(hash, strval, strval);
-            /* TODO: Propagate memory error. */
+	    if (xmlHashAddEntry(hash, strval, strval) < 0) {
+                xmlFree(strval);
+                goto error;
+            }
 	    if (xmlXPathNodeSetAddUnique(ret, cur) < 0)
-	        break;
+	        goto error;
 	} else {
 	    xmlFree(strval);
 	}
     }
     xmlHashFree(hash, xmlHashDefaultDeallocator);
     return(ret);
+
+error:
+    xmlHashFree(hash, xmlHashDefaultDeallocator);
+    xmlXPathFreeNodeSet(ret);
+    return(NULL);
 }
 
 /**
@@ -5153,6 +5092,8 @@
 int
 xmlXPathRegisterNs(xmlXPathContextPtr ctxt, const xmlChar *prefix,
 			   const xmlChar *ns_uri) {
+    xmlChar *copy;
+
     if (ctxt == NULL)
 	return(-1);
     if (prefix == NULL)
@@ -5167,8 +5108,17 @@
     if (ns_uri == NULL)
         return(xmlHashRemoveEntry(ctxt->nsHash, prefix,
 	                          xmlHashDefaultDeallocator));
-    return(xmlHashUpdateEntry(ctxt->nsHash, prefix, (void *) xmlStrdup(ns_uri),
-			      xmlHashDefaultDeallocator));
+
+    copy = xmlStrdup(ns_uri);
+    if (copy == NULL)
+        return(-1);
+    if (xmlHashUpdateEntry(ctxt->nsHash, prefix, copy,
+                           xmlHashDefaultDeallocator) < 0) {
+        xmlFree(copy);
+        return(-1);
+    }
+
+    return(0);
 }
 
 /**
@@ -5300,10 +5250,13 @@
     }
     memset(ret, 0 , sizeof(xmlXPathObject));
     ret->type = XPATH_STRING;
-    if (val != NULL)
-	ret->stringval = xmlStrdup(val);
-    else
-	ret->stringval = xmlStrdup((const xmlChar *)"");
+    if (val == NULL)
+        val = BAD_CAST "";
+    ret->stringval = xmlStrdup(val);
+    if (ret->stringval == NULL) {
+        xmlFree(ret);
+        return(NULL);
+    }
 #ifdef XP_DEBUG_OBJ_USAGE
     xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING);
 #endif
@@ -5349,20 +5302,7 @@
  */
 xmlXPathObjectPtr
 xmlXPathNewCString(const char *val) {
-    xmlXPathObjectPtr ret;
-
-    ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
-    if (ret == NULL) {
-        xmlXPathErrMemory(NULL, "creating string object\n");
-	return(NULL);
-    }
-    memset(ret, 0 , sizeof(xmlXPathObject));
-    ret->type = XPATH_STRING;
-    ret->stringval = xmlStrdup(BAD_CAST val);
-#ifdef XP_DEBUG_OBJ_USAGE
-    xmlXPathDebugObjUsageRequested(NULL, XPATH_STRING);
-#endif
-    return(ret);
+    return(xmlXPathNewString(BAD_CAST val));
 }
 
 /**
@@ -5438,6 +5378,10 @@
 	    break;
 	case XPATH_STRING:
 	    ret->stringval = xmlStrdup(val->stringval);
+            if (ret->stringval == NULL) {
+                xmlFree(ret);
+                return(NULL);
+            }
 	    break;
 	case XPATH_XSLT_TREE:
 #if 0
@@ -6313,7 +6257,6 @@
     ret->valueNr = 0;
     ret->valueMax = 10;
     ret->value = NULL;
-    ret->valueFrame = 0;
 
     ret->context = ctxt;
     ret->comp = comp;
@@ -6848,8 +6791,8 @@
 		valuePush(ctxt, xmlXPathCacheNewString(ctxt->context, str2));
 		xmlFree(str2);
 		xmlXPathNumberFunction(ctxt, 1);
-		val = valuePop(ctxt);
                 CHECK_ERROR0;
+		val = valuePop(ctxt);
 		v = val->floatval;
 		xmlXPathReleaseObject(ctxt->context, val);
 		if (!xmlXPathIsNaN(v)) {
@@ -8874,9 +8817,8 @@
 				     NULL, 0);
 		    if (fullname == cur->nodesetval->nodeTab[i]->name)
 			fullname = xmlStrdup(cur->nodesetval->nodeTab[i]->name);
-		    if (fullname == NULL) {
-			XP_ERROR(XPATH_MEMORY_ERROR);
-		    }
+		    if (fullname == NULL)
+                        xmlXPathPErrMemory(ctxt, NULL);
 		    valuePush(ctxt, xmlXPathCacheWrapString(
 			ctxt->context, fullname));
                 }
@@ -9368,7 +9310,7 @@
     xmlXPathObjectPtr to;
     xmlBufPtr target;
     int offset, max;
-    xmlChar ch;
+    int ch;
     const xmlChar *point;
     xmlChar *cptr;
 
@@ -12896,6 +12838,7 @@
 {
     int total = 0;
     xmlXPathCompExprPtr comp;
+    xmlXPathObjectPtr obj;
     xmlNodeSetPtr set;
 
     CHECK_ERROR0;
@@ -12963,13 +12906,20 @@
     }
 #endif /* LIBXML_XPTR_LOCS_ENABLED */
 
+    /*
+     * In case of errors, xmlXPathNodeSetFilter can pop additional nodes from
+     * the stack. We have to temporarily remove the nodeset object from the
+     * stack to avoid freeing it prematurely.
+     */
     CHECK_TYPE0(XPATH_NODESET);
-    set = ctxt->value->nodesetval;
+    obj = valuePop(ctxt);
+    set = obj->nodesetval;
     if (set != NULL) {
         xmlXPathNodeSetFilter(ctxt, set, op->ch2, 1, 1, 1);
         if (set->nodeNr > 0)
             *first = set->nodeTab[0];
     }
+    valuePush(ctxt, obj);
 
     return (total);
 }
@@ -13186,20 +13136,17 @@
 		int i;
                 int frame;
 
-                frame = xmlXPathSetFrame(ctxt);
+                frame = ctxt->valueNr;
                 if (op->ch1 != -1) {
                     total +=
                         xmlXPathCompOpEval(ctxt, &comp->steps[op->ch1]);
-                    if (ctxt->error != XPATH_EXPRESSION_OK) {
-                        xmlXPathPopFrame(ctxt, frame);
+                    if (ctxt->error != XPATH_EXPRESSION_OK)
                         break;
-                    }
                 }
-		if (ctxt->valueNr < ctxt->valueFrame + op->value) {
+		if (ctxt->valueNr < frame + op->value) {
 		    xmlGenericError(xmlGenericErrorContext,
 			    "xmlXPathCompOpEval: parameter error\n");
 		    ctxt->error = XPATH_INVALID_OPERAND;
-                    xmlXPathPopFrame(ctxt, frame);
 		    break;
 		}
 		for (i = 0; i < op->value; i++) {
@@ -13207,7 +13154,6 @@
 			xmlGenericError(xmlGenericErrorContext,
 				"xmlXPathCompOpEval: parameter error\n");
 			ctxt->error = XPATH_INVALID_OPERAND;
-                        xmlXPathPopFrame(ctxt, frame);
 			break;
 		    }
                 }
@@ -13226,7 +13172,6 @@
                             xmlGenericError(xmlGenericErrorContext,
             "xmlXPathCompOpEval: function %s bound to undefined prefix %s\n",
                                     (char *)op->value4, (char *)op->value5);
-                            xmlXPathPopFrame(ctxt, frame);
                             ctxt->error = XPATH_UNDEF_PREFIX_ERROR;
                             break;
                         }
@@ -13250,9 +13195,8 @@
                 ctxt->context->function = oldFunc;
                 ctxt->context->functionURI = oldFuncURI;
                 if ((ctxt->error == XPATH_EXPRESSION_OK) &&
-                    (ctxt->valueNr != ctxt->valueFrame + 1))
+                    (ctxt->valueNr != frame + 1))
                     XP_ERROR0(XPATH_STACK_ERROR);
-                xmlXPathPopFrame(ctxt, frame);
                 break;
             }
         case XPATH_OP_ARG:
@@ -13267,6 +13211,7 @@
             break;
         case XPATH_OP_PREDICATE:
         case XPATH_OP_FILTER:{
+                xmlXPathObjectPtr obj;
                 xmlNodeSetPtr set;
 
                 /*
@@ -13381,11 +13326,19 @@
                 }
 #endif /* LIBXML_XPTR_LOCS_ENABLED */
 
+                /*
+                 * In case of errors, xmlXPathNodeSetFilter can pop additional
+                 * nodes from the stack. We have to temporarily remove the
+                 * nodeset object from the stack to avoid freeing it
+                 * prematurely.
+                 */
                 CHECK_TYPE0(XPATH_NODESET);
-                set = ctxt->value->nodesetval;
+                obj = valuePop(ctxt);
+                set = obj->nodesetval;
                 if (set != NULL)
                     xmlXPathNodeSetFilter(ctxt, set, op->ch2,
                                           1, set->nodeNr, 1);
+                valuePush(ctxt, obj);
                 break;
             }
         case XPATH_OP_SORT:
@@ -13924,7 +13877,6 @@
 	ctxt->valueNr = 0;
 	ctxt->valueMax = 10;
 	ctxt->value = NULL;
-        ctxt->valueFrame = 0;
     }
 #ifdef XPATH_STREAMING
     if (ctxt->comp->stream) {
@@ -14361,6 +14313,8 @@
     }
 #endif
     pctxt = xmlXPathCompParserContext(comp, ctxt);
+    if (pctxt == NULL)
+        return(-1);
     res = xmlXPathRunEval(pctxt, toBool);
 
     if (pctxt->error != XPATH_EXPRESSION_OK) {
diff --git a/tools/determinism/compare_build_artifacts.py b/tools/determinism/compare_build_artifacts.py
index cd6d3399..f64fa18 100755
--- a/tools/determinism/compare_build_artifacts.py
+++ b/tools/determinism/compare_build_artifacts.py
@@ -209,7 +209,12 @@
 
   if ret and zipfile.is_zipfile(first_filepath) and zipfile.is_zipfile(
       second_filepath):
-    ret += '\n' + diff_zips(first_filepath, second_filepath)
+    try:
+      ret += '\n' + diff_zips(first_filepath, second_filepath)
+    except OSError:
+      print("https://crbug.com/1427203: error from diff_zips(%s, %s)?" %
+            (first_filepath, second_filepath))
+      raise
   return ret
 
 
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 64eeac17..12db280ae 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -2447,7 +2447,7 @@
     ],
 
     'codesearch_gen_chromium_fuchsia_bot': [
-      'codesearch_release', 'fuchsia',
+      'codesearch_release', 'fuchsia', 'cast_receiver',
     ],
 
     'codesearch_gen_chromium_ios_bot': [
diff --git a/tools/mb/mb_config_expectations/chromium.infra.codesearch.json b/tools/mb/mb_config_expectations/chromium.infra.codesearch.json
index a058e83c..42189bc3 100644
--- a/tools/mb/mb_config_expectations/chromium.infra.codesearch.json
+++ b/tools/mb/mb_config_expectations/chromium.infra.codesearch.json
@@ -31,6 +31,7 @@
       "blink_enable_generated_code_formatting": true,
       "clang_use_chrome_plugins": false,
       "dcheck_always_on": false,
+      "enable_cast_receiver": true,
       "enable_kythe_annotations": true,
       "is_component_build": false,
       "is_debug": false,
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.codesearch.json b/tools/mb/mb_config_expectations/tryserver.chromium.codesearch.json
index 2b8c58a..0bd6c23 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.codesearch.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.codesearch.json
@@ -31,6 +31,7 @@
       "blink_enable_generated_code_formatting": true,
       "clang_use_chrome_plugins": false,
       "dcheck_always_on": false,
+      "enable_cast_receiver": true,
       "enable_kythe_annotations": true,
       "is_component_build": false,
       "is_debug": false,
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index d87ff26e..ebc7904d 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -6981,6 +6981,26 @@
   </description>
 </action>
 
+<action name="ContentSuggestions.Feed.SignIn.ShowFeedSignInOnlyUIWithoutUserId">
+  <owner>sczs@google.com</owner>
+  <owner>tinazwang@chromium.org</owner>
+  <owner>feed@chromium.org</owner>
+  <description>
+    The user with no device-level identity triggered a sign-in only flow from
+    Discover feed.
+  </description>
+</action>
+
+<action name="ContentSuggestions.Feed.SignIn.ShowFeedSignInOnlyUIWithUserId">
+  <owner>sczs@google.com</owner>
+  <owner>tinazwang@chromium.org</owner>
+  <owner>feed@chromium.org</owner>
+  <description>
+    The user with one or more device-level identities triggered a sign-in only
+    flow from Discover feed.
+  </description>
+</action>
+
 <action name="ContentSuggestions.Feed.WebFeed.Selected">
   <owner>adamta@google.com</owner>
   <owner>sczs@chromium.org</owner>
@@ -27646,6 +27666,14 @@
   </description>
 </action>
 
+<action name="SafeBrowsing.AccountIntegration.DisabledDialog.OkButtonClicked">
+  <owner>jacastro@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
+  <description>
+    User clicks the OK button on the ESB disabled dialog.
+  </description>
+</action>
+
 <action
     name="SafeBrowsing.AccountIntegration.DisabledDialog.SettingsButtonClicked">
   <owner>awado@chromium.org</owner>
@@ -27655,6 +27683,21 @@
   </description>
 </action>
 
+<action name="SafeBrowsing.AccountIntegration.DisabledDialog.Shown"
+    not_user_triggered="true">
+  <owner>awado@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
+  <description>The ESB disabled dialog was shown to the user.</description>
+</action>
+
+<action name="SafeBrowsing.AccountIntegration.EnabledDialog.OkButtonClicked">
+  <owner>jacastro@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
+  <description>
+    User clicks the OK button on the ESB enabled dialog.
+  </description>
+</action>
+
 <action
     name="SafeBrowsing.AccountIntegration.EnabledDialog.SettingsButtonClicked">
   <owner>awado@chromium.org</owner>
@@ -27664,6 +27707,13 @@
   </description>
 </action>
 
+<action name="SafeBrowsing.AccountIntegration.EnabledDialog.Shown"
+    not_user_triggered="true">
+  <owner>jacastro@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
+  <description>The ESB enabled dialog was shown to the user.</description>
+</action>
+
 <action name="SafeBrowsing.Download.WarningBypassed">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 76475fb..1d04c396 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -4745,38 +4745,6 @@
       label="Error with getting OAuth token due to OperationCanceledException"/>
 </enum>
 
-<enum name="ArcProvisioningResult">
-  <obsolete>
-    Removed in Dec 2020. Replaced by ArcProvisioningStatus.
-  </obsolete>
-  <summary>Defines Arc Provisioning success and failure reasons</summary>
-  <int value="0" label="Success"/>
-  <int value="1" label="Unclassified failure"/>
-  <int value="2" label="GMS Network failure"/>
-  <int value="3" label="GMS Services are not available"/>
-  <int value="4" label="GMS Bad authentication returned by server"/>
-  <int value="5" label="GMS check-in was failed"/>
-  <int value="6" label="Cloud provision flow failed"/>
-  <int value="7" label="Mojo version mistmached"/>
-  <int value="8" label="Provisioning timeout"/>
-  <int value="9" label="GMS check-in was timed out"/>
-  <int value="10" label="GMS check-in reported internal error"/>
-  <int value="11" label="GMS core sign in procedure was failed"/>
-  <int value="12" label="GMS core sign in procedure was timed out"/>
-  <int value="13" label="GMS core sign in procedure reporeted internal error"/>
-  <int value="14" label="Cloud provision flow was timed out"/>
-  <int value="15" label="Cloud provision flow reporeted internal error"/>
-  <int value="16" label="ARC instance is stopped before complete provisioning"/>
-  <int value="17" label="Overall sign in timeout"/>
-  <int value="18" label="Chrome server communication error"/>
-  <int value="19" label="Network is unavailable"/>
-  <int value="20" label="Disabled"/>
-  <int value="21" label="Already provisioned"/>
-  <int value="22" label="Unsupported account type"/>
-  <int value="23" label="Account is not present in Chrome"/>
-  <int value="24" label="Cloud provision flow failed"/>
-</enum>
-
 <enum name="ArcProvisioningSignInError">
   <summary>Defines ARC GMS sign-in failure reasons</summary>
   <int value="1" label="Network error"/>
@@ -14105,7 +14073,7 @@
   <int value="200" label="HTTP_SUCCESS"/>
   <int value="201" label="HTTP_CREATED"/>
   <int value="204" label="HTTP_NO_CONTENT"/>
-  <int value="302" label="HTTP_NOT_FOUND"/>
+  <int value="302" label="HTTP_FOUND"/>
   <int value="304" label="HTTP_NOT_MODIFIED"/>
   <int value="308" label="HTTP_RESUME_INCOMPLETE"/>
   <int value="400" label="HTTP_BAD_REQUEST"/>
@@ -16187,7 +16155,7 @@
   <int value="90" label="No bootable storage device in system"/>
   <int value="91" label="No bootable kernel found on disk"/>
   <int value="92" label="BCB related error in RW firmware"/>
-  <int value="93" label="Secure data inititalization error"/>
+  <int value="93" label="Secure data inititalization error 0"/>
   <int value="94" label="Fastboot mode requested in firmware"/>
   <int value="95" label="Recovery hash space lock error in RO firmware"/>
   <int value="127" label="Unspecified/unknown error in rewritable firmware"/>
@@ -16295,7 +16263,7 @@
   <int value="8" label="Open in a new incognito window"/>
   <int value="20" label="Open in a tabbed window"/>
   <int value="100" label="Launch New"/>
-  <int value="101" label="Toggle Pin"/>
+  <int value="101" label="Toggle Pin."/>
   <int value="102" label="Show App Info"/>
   <int value="103" label="Options"/>
   <int value="104" label="Uninstall"/>
@@ -16303,11 +16271,11 @@
   <int value="106" label="Open in New Window"/>
   <int value="107" label="Open in New Incognito Window"/>
   <int value="108" label="Install"/>
-  <int value="200" label="Open in a pinned tab"/>
+  <int value="200" label="Open in a pinned tab."/>
   <int value="201" label="Open in a regular tab."/>
-  <int value="202" label="Open in fullscreen"/>
+  <int value="202" label="Open in fullscreen."/>
   <int value="203" label="Open in a window"/>
-  <int value="204" label="Open in a tabbed window"/>
+  <int value="204" label="Open in a tabbed window."/>
   <int value="500" label="Toggle Auto Hide"/>
   <int value="501" label="Shelf Alignment Menu"/>
   <int value="502" label="Shelf Alignment Left"/>
@@ -16359,107 +16327,6 @@
   <int value="2" label="kLocked"/>
 </enum>
 
-<enum name="ChromeOSUserImageId">
-  <obsolete>
-    Deprecated in M92 in favor of ChromeOSUserImageId2.
-  </obsolete>
-  <summary>
-    Indices of the default images as defined in
-    chrome/browser/ash/login/users/default_user_image/default_user_images.cc.
-    Value 19 is the image selected from file or photo. Value 20 is the profile
-    image.Values 0~18 and 21~40 are legacy default images that still used by
-    some users, but cannot be selected from Settings &gt; Personalization &gt;
-    Change device account image.
-  </summary>
-<!-- Please append new values to the end and do not change the order of existing value. -->
-
-  <int value="0" label="Beaker"/>
-  <int value="1" label="Bee"/>
-  <int value="2" label="Briefcase"/>
-  <int value="3" label="Circles"/>
-  <int value="4" label="Cloud"/>
-  <int value="5" label="Cupcake"/>
-  <int value="6" label="Day"/>
-  <int value="7" label="Flower"/>
-  <int value="8" label="Globe"/>
-  <int value="9" label="Hot air"/>
-  <int value="10" label="Ladybug"/>
-  <int value="11" label="Leaf"/>
-  <int value="12" label="Night"/>
-  <int value="13" label="Plane"/>
-  <int value="14" label="Robot body"/>
-  <int value="15" label="Robot head"/>
-  <int value="16" label="Toolbox"/>
-  <int value="17" label="User color"/>
-  <int value="18" label="User enterprise"/>
-  <int value="19" label="User defined"/>
-  <int value="20" label="Profile image"/>
-  <int value="21" label="Bicycle"/>
-  <int value="22" label="Bokeh"/>
-  <int value="23" label="Chess"/>
-  <int value="24" label="Coffee"/>
-  <int value="25" label="Dragonfly"/>
-  <int value="26" label="Frog"/>
-  <int value="27" label="Gazania Flower"/>
-  <int value="28" label="Jack Russell Terrier"/>
-  <int value="29" label="Jellyfish"/>
-  <int value="30" label="Kiwi"/>
-  <int value="31" label="Penguin1"/>
-  <int value="32" label="Rainbowfish"/>
-  <int value="33" label="Record player"/>
-  <int value="34" label="Upside Down"/>
-  <int value="35" label="Cat"/>
-  <int value="36" label="Penguin2"/>
-  <int value="37" label="Fox"/>
-  <int value="38" label="Snail"/>
-  <int value="39" label="Red butterfly"/>
-  <int value="40" label="Cat"/>
-  <int value="41" label="Corgi"/>
-  <int value="42" label="Rabbit"/>
-  <int value="43" label="Pink butterfly"/>
-  <int value="44" label="Monkey"/>
-  <int value="45" label="Dragon"/>
-  <int value="46" label="Elephant"/>
-  <int value="47" label="Panda"/>
-  <int value="48" label="Unicorn"/>
-  <int value="49" label="Butterflies"/>
-  <int value="50" label="Bird"/>
-  <int value="51" label="Ramen"/>
-  <int value="52" label="Tamagotchi"/>
-  <int value="53" label="Cheese"/>
-  <int value="54" label="Football"/>
-  <int value="55" label="Basketball"/>
-  <int value="56" label="Vinyl record"/>
-  <int value="57" label="Sushi"/>
-  <int value="58" label="Bike"/>
-  <int value="59" label="Sunglasses"/>
-  <int value="60" label="Pizza"/>
-  <int value="61" label="Sandwich"/>
-  <int value="62" label="Cappuccino"/>
-  <int value="63" label="Ice water"/>
-  <int value="64" label="Ice cream"/>
-  <int value="65" label="Onigiri"/>
-  <int value="66" label="Melon"/>
-  <int value="67" label="Avocado"/>
-  <int value="68" label="Landing"/>
-  <int value="69" label="Lunar"/>
-  <int value="70" label="Dots"/>
-  <int value="71" label="Spin"/>
-  <int value="72" label="Grids"/>
-  <int value="73" label="Botanist"/>
-  <int value="74" label="Burger"/>
-  <int value="75" label="Graduate"/>
-  <int value="76" label="Guitar"/>
-  <int value="77" label="Waving"/>
-  <int value="78" label="Lion"/>
-  <int value="79" label="Planet"/>
-  <int value="80" label="Instant Camera"/>
-  <int value="81" label="Robot"/>
-  <int value="82" label="Sneaker"/>
-  <int value="83" label="Van"/>
-  <int value="84" label="Watermelon"/>
-</enum>
-
 <enum name="ChromeOSUserImageId2">
   <summary>
     Special images and default images as defined in
@@ -16517,7 +16384,7 @@
   <int value="45" label="Fox (deprecated)"/>
   <int value="46" label="Snail (deprecated)"/>
   <int value="47" label="Red butterfly (deprecated)"/>
-  <int value="48" label="Cat (deprecated)"/>
+  <int value="48" label="Cat (deprecated.)"/>
   <int value="49" label="Corgi (deprecated)"/>
   <int value="50" label="Rabbit (deprecated)"/>
   <int value="51" label="Pink butterfly (deprecated)"/>
@@ -17788,7 +17655,7 @@
 <!-- Generated from net/base/net_error_list.h.
 Called by update_net_error_codes.py.-->
 
-  <int value="-1478" label="SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS"/>
+  <int value="-1478" label="SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS (old)"/>
   <int value="-808" label="DNS_SECURE_RESOLVER_HOSTNAME_RESOLUTION_FAILED"/>
   <int value="-807" label="DNS_HTTP_FAILED"/>
   <int value="-806" label="DNS_SORT_ERROR"/>
@@ -17911,7 +17778,7 @@
   <int value="-300" label="INVALID_URL"/>
   <int value="-218" label="SSL_OBSOLETE_VERSION"/>
   <int value="-217" label="CERT_KNOWN_INTERCEPTION_BLOCKED"/>
-  <int value="-216" label="QUIC_CERT_ROOT_NOT_KNOWN"/>
+  <int value="-216" label="QUIC_CERT_ROOT_NOT_KNOWN (old)"/>
   <int value="-215" label="CERT_SYMANTEC_LEGACY"/>
   <int value="-214" label="CERTIFICATE_TRANSPARENCY_REQUIRED"/>
   <int value="-213" label="CERT_VALIDITY_TOO_LONG"/>
@@ -18376,11 +18243,11 @@
   <int value="17" label="OTASP Failed"/>
   <int value="18" label="Out Of Range"/>
   <int value="19" label="PPP Auth"/>
-  <int value="20" label="Pin Missing"/>
-  <int value="21" label="Unknown"/>
-  <int value="22" label="Not Associated"/>
-  <int value="23" label="Not Authenticated"/>
-  <int value="24" label="Too Many STAs"/>
+  <int value="20" label="Pin Missing."/>
+  <int value="21" label="Unknown."/>
+  <int value="22" label="Not Associated."/>
+  <int value="23" label="Not Authenticated."/>
+  <int value="24" label="Too Many STAs."/>
   <int value="25" label="Disconnect"/>
   <int value="26" label="Sim Locked"/>
   <int value="27" label="Not Registered"/>
@@ -25319,216 +25186,6 @@
   <int value="10" label="HOME_PAGE"/>
 </enum>
 
-<enum name="DataUseServices">
-  <obsolete>
-    Replaced by DataUseServicesHash in June, 2018.
-  </obsolete>
-  <int value="0" label="Not Tagged"/>
-  <int value="1" label="Suggestions"/>
-  <int value="2" label="Translate"/>
-  <int value="3" label="Sync"/>
-  <int value="4" label="Omnibox"/>
-  <int value="5" label="Invalidation"/>
-  <int value="6" label="Rappor"/>
-  <int value="7" label="Variations"/>
-  <int value="8" label="UMA"/>
-  <int value="9" label="Domain Reliability"/>
-  <int value="10" label="Profile Downloader"/>
-  <int value="11" label="Google URL Tracker"/>
-  <int value="12" label="Autofill"/>
-  <int value="13" label="Policy"/>
-  <int value="14" label="Spell Checker"/>
-  <int value="15" label="NTPSnippets (obsolete)"/>
-  <int value="16" label="Safe Browsing"/>
-  <int value="17" label="Data Reduction Proxy"/>
-  <int value="18" label="Precache"/>
-  <int value="19" label="NTPTiles"/>
-  <int value="20" label="Feedback Uploader"/>
-  <int value="21" label="Tracing Uploader"/>
-  <int value="22" label="DOM Distiller"/>
-  <int value="23" label="Cloud Print"/>
-  <int value="24" label="Search Provider Logos"/>
-  <int value="25" label="Update Client"/>
-  <int value="26" label="GCM Driver"/>
-  <int value="27" label="Web History Service"/>
-  <int value="28" label="Network Time Tracker"/>
-  <int value="29" label="Supervised User"/>
-  <int value="30" label="Image Fetcher Untagged"/>
-  <int value="31" label="GAIA"/>
-  <int value="32" label="Captive Portal"/>
-  <int value="33" label="Web Resource Service"/>
-  <int value="34" label="Signin"/>
-  <int value="35" label="NTPSnippets suggestions"/>
-  <int value="36" label="NTPSnippets thumbnails"/>
-  <int value="37" label="Doodle"/>
-  <int value="38" label="UKM"/>
-  <int value="39" label="Payments"/>
-  <int value="40" label="LargeIconService"/>
-  <int value="41" label="MachineIntelligence"/>
-</enum>
-
-<enum name="DataUseServicesHash">
-<!-- Generated from the network annotation tag hashes in tools/traffic_annotation/summary/annotations.xml -->
-
-  <int value="485305" label="DATA_REDUCTION_PROXY"/>
-  <int value="727478" label="UKM"/>
-  <int value="727528" label="UMA"/>
-  <int value="1112842" label="GAIA"/>
-  <int value="1313982" label="SAFE_BROWSING"/>
-  <int value="3813491" label="OMNIBOX"/>
-  <int value="3989826" label="DOM_DISTILLER"/>
-  <int value="4300475" label="SIGNIN"/>
-  <int value="4598626" label="GAIA"/>
-  <int value="5021348" label="SYNC"/>
-  <int value="5492492" label="GOOGLE_URL_TRACKER"/>
-  <int value="5637379" label="GAIA"/>
-  <int value="6019475" label="SAFE_BROWSING"/>
-  <int value="7687691" label="OMNIBOX"/>
-  <int value="8250451" label="DATA_REDUCTION_PROXY"/>
-  <int value="8561691" label="SAFE_BROWSING"/>
-  <int value="9459438" label="POLICY"/>
-  <int value="10498172" label="PER_USER_TOPIC_REGISTRATION_REQUEST"/>
-  <int value="13211343" label="SUGGESTIONS"/>
-  <int value="14257952" label="SUPERVISED_USER"/>
-  <int value="15418154" label="NTP_SNIPPETS_SUGGESTIONS"/>
-  <int value="16653985" label="NTP_SNIPPETS_THUMBNAILS"/>
-  <int value="17188928" label="WEBSOCKET_STREAM"/>
-  <int value="17400350" label="WEB_HISTORY_SERVICE"/>
-  <int value="17562717" label="HISTORY_UI_FAVICON"/>
-  <int value="18300705" label="GCM_DRIVER"/>
-  <int value="18858893" label="OFFLINE_PAGES_DOWNLOAD_FILE"/>
-  <int value="19185953" label="OFFLINE_PAGES_PREFETCH"/>
-  <int value="21785164" label="INTRANET_REDIRECT_DETECTOR"/>
-  <int value="22265491" label="POLICY"/>
-  <int value="24978481" label="CLOUD_PRINT"/>
-  <int value="25790702" label="APPCACHE_UPDATE_JOB"/>
-  <int value="26216847" label="GAIA"/>
-  <int value="27071967" label="SAFE_BROWSING"/>
-  <int value="27915688" label="GAIA"/>
-  <int value="29057242" label="GCM_DRIVER"/>
-  <int value="29188932" label="GAIA"/>
-  <int value="30913825" label="SUPERVISED_USER"/>
-  <int value="31445884" label="GAIA_AUTH_MULTILOGIN"/>
-  <int value="32585152" label="GAIA"/>
-  <int value="33813109" label="PREVIEWS_LITEPAGE_PROBER"/>
-  <int value="34557599" label="HINTSFETCHER_GETHINTS"/>
-  <int value="35370363" label="SUGGESTIONS"/>
-  <int value="35380758" label="RESUMED_DOWNLOADS"/>
-  <int value="35473769" label="LOGO_SERVICE"/>
-  <int value="35565745" label="GAIA"/>
-  <int value="35725390" label="HTTPS_SERVER_PREVIEWS_NAVIGATION"/>
-  <int value="36859107" label="SEARCH_PROVIDER_LOGOS"/>
-  <int value="38670228" label="DOWNLOADS_INTERNAL_WEBUI"/>
-  <int value="39877119" label="GAIA"/>
-  <int value="39886742" label="WEB_PUSH_MESSAGE"/>
-  <int value="42848942" label="SAFE_BROWSING"/>
-  <int value="43206794" label="SUPERVISED_USER"/>
-  <int value="44494884" label="NTP_TILES"/>
-  <int value="44583172" label="OFFLINE_PAGES_PREFETCH_DOWNLOAD"/>
-  <int value="44583821" label="SAFE_BROWSING"/>
-  <int value="44606780" label="RAPPOR"/>
-  <int value="46188932" label="NETWORK_TIME_TRACKER"/>
-  <int value="47815025" label="OMNIBOX"/>
-  <int value="49544361" label="NTP_SNIPPETS_THUMBNAILS"/>
-  <int value="49601082" label="WEB_RESOURCE_SERVICE"/>
-  <int value="50755044" label="NTP_TILES"/>
-  <int value="50816767" label="LIB_ADDRESS_INPUT"/>
-  <int value="50859288" label="CLOUD_PRINT"/>
-  <int value="52821843" label="GEO_LANGUAGE_PROVIDER"/>
-  <int value="53695122" label="CREDENTIAL_AVATAR"/>
-  <int value="54845618" label="UPDATE_CLIENT"/>
-  <int value="56434025" label="NTP_SNIPPETS_SUGGESTIONS"/>
-  <int value="57144960" label="SYNC"/>
-  <int value="60071001" label="NET_ERROR_HELPER"/>
-  <int value="60946824" label="WEB_HISTORY_SERVICE"/>
-  <int value="61656965" label="GCM_DRIVER"/>
-  <int value="61684939" label="OMNIBOX"/>
-  <int value="63171670" label="NAVIGATION_URL_LOADER"/>
-  <int value="65957842" label="GCM_DRIVER"/>
-  <int value="66322287" label="SAFE_BROWSING"/>
-  <int value="66590631" label="SAFE_BROWSING"/>
-  <int value="67638271" label="CLOUD_PRINT"/>
-  <int value="68561428" label="DATA_REDUCTION_PROXY"/>
-  <int value="68745894" label="SAFE_BROWSING"/>
-  <int value="69585116" label="PASSWORD_REQUIREMENTS_SPEC_FETCH"/>
-  <int value="69881286" label="OMNIBOX_ANSWERS_IMAGE"/>
-  <int value="70126372" label="SAFE_BROWSING"/>
-  <int value="71251498" label="CLOUD_PRINT"/>
-  <int value="71578042" label="CLOUD_PRINT"/>
-  <int value="72354423" label="INVALIDATION"/>
-  <int value="73107389" label="OMNIBOX"/>
-  <int value="73772528" label="DOWNLOAD_VIA_CONTEXT_MENU"/>
-  <int value="75153841" label="SAFE_BROWSING"/>
-  <int value="76717919" label="INTEREST_FEED_SEND"/>
-  <int value="77597059" label="DOMAIN_RELIABILITY"/>
-  <int value="78544924" label="SUPERVISED_USER"/>
-  <int value="79442849" label="SIGNED_EXCHANGE_CERT_FETCHER"/>
-  <int value="79957943" label="SAFE_BROWSING"/>
-  <int value="80832574" label="HISTORY_NOTICE_UTILS_POPUP"/>
-  <int value="82167736" label="GAIA"/>
-  <int value="82462683" label="GAIA"/>
-  <int value="83476155" label="GAIA"/>
-  <int value="84045030" label="PAYMENTS"/>
-  <int value="84212388" label="OMNIBOX"/>
-  <int value="84575287" label="TRACING_UPLOADER"/>
-  <int value="88754904" label="CAPTIVE_PORTAL"/>
-  <int value="88863520" label="AUTOFILL"/>
-  <int value="91068704" label="PREFETCH_VISUALS"/>
-  <int value="91597383" label="GAIA"/>
-  <int value="95588446" label="AUTOFILL"/>
-  <int value="95682324" label="MACHINE_INTELLIGENCE"/>
-  <int value="95711309" label="NTP_SNIPPETS_SUGGESTIONS"/>
-  <int value="97978464" label="GAIA"/>
-  <int value="98658519" label="SIGNIN"/>
-  <int value="102595701" label="HISTORY_NOTICE_UTILS_NOTICE"/>
-  <int value="102935425" label="SAFE_BROWSING"/>
-  <int value="103133150" label="NTP_TILES"/>
-  <int value="104798869" label="AUTOFILL"/>
-  <int value="106980485" label="SAFE_BROWSING"/>
-  <int value="107267424" label="OPEN_SEARCH"/>
-  <int value="107881858" label="IMAGE_ANNOTATION"/>
-  <int value="108804096" label="DOMAIN_RELIABILITY"/>
-  <int value="108903331" label="PROFILE_DOWNLOADER"/>
-  <int value="109200878" label="OMNIBOX"/>
-  <int value="109891200" label="REPORTING"/>
-  <int value="109987793" label="KIDS_CHROME_MANAGEMENT_CLIENT"/>
-  <int value="110307337" label="WEB_HISTORY_SERVICE"/>
-  <int value="111712433" label="CLOUD_PRINT"/>
-  <int value="111904019" label="AFFILIATION_LOOKUP"/>
-  <int value="112189210" label="FAVICON_LOADER"/>
-  <int value="113231892" label="UPDATE_CLIENT"/>
-  <int value="113553577" label="CERTIFICATE_VERIFIER"/>
-  <int value="114468207" label="SSL_NAME_MISMATCH_LOOKUP"/>
-  <int value="115188287" label="VARIATIONS"/>
-  <int value="115907811" label="SAFE_BROWSING"/>
-  <int value="116426676" label="GAIA"/>
-  <int value="117649486" label="SPELL_CHECKER"/>
-  <int value="117782019" label="POLICY"/>
-  <int value="117963307" label="SERVICE_WORKER_WRITE_TO_CACHE_JOB"/>
-  <int value="118389509" label="URL_PROVISION_FETCHER"/>
-  <int value="119416099" label="LOAD_AUTOFILL_GSTATIC_DATA"/>
-  <int value="119542033" label="GCM_DRIVER"/>
-  <int value="119677115" label="SUPERVISED_USER"/>
-  <int value="121842329" label="WEBAPK_ICON_HASHER"/>
-  <int value="124950347" label="SAFE_BROWSING"/>
-  <int value="125522256" label="SAFE_BROWSING"/>
-  <int value="125596241" label="UPDATE_CLIENT"/>
-  <int value="126122632" label="WEB_HISTORY_SERVICE"/>
-  <int value="129872904" label="SERVICE_WORKER_NAVIGATION_PRELOAD"/>
-  <int value="130931413" label="SERVICE_WORKER_UPDATE_CHECKER"/>
-  <int value="131236802" label="DATA_REDUCTION_PROXY"/>
-  <int value="132055347" label="CLOUD_PRINT"/>
-  <int value="132553989" label="SPELL_CHECKER"/>
-  <int value="133982351" label="GAIA"/>
-  <int value="134289752" label="GAIA"/>
-  <int value="134729048" label="FEEDBACK_UPLOADER"/>
-  <int value="135967426" label="SAFE_BROWSING"/>
-  <int value="136468456" label="PROXY_CONFIG_SETTINGS"/>
-  <int value="137116619" label="TRANSLATE"/>
-  <int value="137420486" label="CLOUD_PRINT"/>
-  <int value="137457845" label="WEB_HISTORY_SERVICE"/>
-</enum>
-
 <enum name="DayOfWeek">
   <int value="0" label="Sunday"/>
   <int value="1" label="Monday"/>
@@ -28123,7 +27780,6 @@
   <int value="11" label="JSProfiling"/>
   <int value="12" label="SyncXHR"/>
   <int value="13" label="DocumentDomain"/>
-  <int value="14" label="DocumentDomain"/>
 </enum>
 
 <enum name="DocumentScanSaneBackend">
@@ -29313,405 +28969,6 @@
   <int value="9" label="Download renamed"/>
 </enum>
 
-<enum name="DownloadItem.DangerousFileType">
-  <int value="0" label="unknown"/>
-  <int value="1" label="ad"/>
-  <int value="2" label="ade"/>
-  <int value="3" label="adp"/>
-  <int value="4" label="ah"/>
-  <int value="5" label="apk"/>
-  <int value="6" label="app"/>
-  <int value="7" label="application"/>
-  <int value="8" label="asp"/>
-  <int value="9" label="asx"/>
-  <int value="10" label="bas"/>
-  <int value="11" label="bash"/>
-  <int value="12" label="bat"/>
-  <int value="13" label="cfg"/>
-  <int value="14" label="chi"/>
-  <int value="15" label="chm"/>
-  <int value="16" label="class"/>
-  <int value="17" label="cmd"/>
-  <int value="18" label="com"/>
-  <int value="19" label="command"/>
-  <int value="20" label="crt"/>
-  <int value="21" label="crx"/>
-  <int value="22" label="csh"/>
-  <int value="23" label="deb"/>
-  <int value="24" label="dex"/>
-  <int value="25" label="dll"/>
-  <int value="26" label="drv"/>
-  <int value="27" label="exe"/>
-  <int value="28" label="fxp"/>
-  <int value="29" label="grp"/>
-  <int value="30" label="hlp"/>
-  <int value="31" label="hta"/>
-  <int value="32" label="htm"/>
-  <int value="33" label="html"/>
-  <int value="34" label="htt"/>
-  <int value="35" label="inf"/>
-  <int value="36" label="ini"/>
-  <int value="37" label="ins"/>
-  <int value="38" label="isp"/>
-  <int value="39" label="jar"/>
-  <int value="40" label="jnlp"/>
-  <int value="41" label="user.js"/>
-  <int value="42" label="js"/>
-  <int value="43" label="jse"/>
-  <int value="44" label="ksh"/>
-  <int value="45" label="lnk"/>
-  <int value="46" label="local"/>
-  <int value="47" label="mad"/>
-  <int value="48" label="maf"/>
-  <int value="49" label="mag"/>
-  <int value="50" label="mam"/>
-  <int value="51" label="manifest"/>
-  <int value="52" label="maq"/>
-  <int value="53" label="mar"/>
-  <int value="54" label="mas"/>
-  <int value="55" label="mat"/>
-  <int value="56" label="mau"/>
-  <int value="57" label="mav"/>
-  <int value="58" label="maw"/>
-  <int value="59" label="mda"/>
-  <int value="60" label="mdb"/>
-  <int value="61" label="mde"/>
-  <int value="62" label="mdt"/>
-  <int value="63" label="mdw"/>
-  <int value="64" label="mdz"/>
-  <int value="65" label="mht"/>
-  <int value="66" label="mhtml"/>
-  <int value="67" label="mmc"/>
-  <int value="68" label="mof"/>
-  <int value="69" label="msc"/>
-  <int value="70" label="msh"/>
-  <int value="71" label="mshxml"/>
-  <int value="72" label="msi"/>
-  <int value="73" label="msp"/>
-  <int value="74" label="mst"/>
-  <int value="75" label="ocx"/>
-  <int value="76" label="ops"/>
-  <int value="77" label="pcd"/>
-  <int value="78" label="pif"/>
-  <int value="79" label="pkg"/>
-  <int value="80" label="pl"/>
-  <int value="81" label="plg"/>
-  <int value="82" label="prf"/>
-  <int value="83" label="prg"/>
-  <int value="84" label="pst"/>
-  <int value="85" label="py"/>
-  <int value="86" label="pyc"/>
-  <int value="87" label="pyw"/>
-  <int value="88" label="rb"/>
-  <int value="89" label="reg"/>
-  <int value="90" label="rpm"/>
-  <int value="91" label="scf"/>
-  <int value="92" label="scr"/>
-  <int value="93" label="sct"/>
-  <int value="94" label="sh"/>
-  <int value="95" label="shar"/>
-  <int value="96" label="shb"/>
-  <int value="97" label="shs"/>
-  <int value="98" label="shtm"/>
-  <int value="99" label="shtml"/>
-  <int value="100" label="spl"/>
-  <int value="101" label="svg"/>
-  <int value="102" label="swf"/>
-  <int value="103" label="sys"/>
-  <int value="104" label="tcsh"/>
-  <int value="105" label="url"/>
-  <int value="106" label="vb"/>
-  <int value="107" label="vbe"/>
-  <int value="108" label="vbs"/>
-  <int value="109" label="vsd"/>
-  <int value="110" label="vsmacros"/>
-  <int value="111" label="vss"/>
-  <int value="112" label="vst"/>
-  <int value="113" label="vsw"/>
-  <int value="114" label="ws"/>
-  <int value="115" label="wsc"/>
-  <int value="116" label="wsf"/>
-  <int value="117" label="wsh"/>
-  <int value="118" label="xbap"/>
-  <int value="119" label="xht"/>
-  <int value="120" label="xhtm"/>
-  <int value="121" label="xhtml"/>
-  <int value="122" label="xml"/>
-  <int value="123" label="xsl"/>
-  <int value="124" label="xslt"/>
-  <int value="125" label="website"/>
-  <int value="126" label="msh1"/>
-  <int value="127" label="msh2"/>
-  <int value="128" label="msh1xml"/>
-  <int value="129" label="msh2xml"/>
-  <int value="130" label="ps1"/>
-  <int value="131" label="ps1xml"/>
-  <int value="132" label="ps2"/>
-  <int value="133" label="ps2xml"/>
-  <int value="134" label="psc1"/>
-  <int value="135" label="psc2"/>
-  <int value="136" label="xnk"/>
-  <int value="137" label="appref-ms"/>
-  <int value="138" label="gadget"/>
-  <int value="139" label="efi"/>
-  <int value="140" label="fon"/>
-  <int value="141" label="partial"/>
-  <int value="142" label="svg"/>
-  <int value="143" label="xml"/>
-  <int value="144" label="xrm_ms"/>
-  <int value="145" label="xsl"/>
-  <int value="146" label="action"/>
-  <int value="147" label="bin"/>
-  <int value="148" label="inx"/>
-  <int value="149" label="ipa"/>
-  <int value="150" label="isu"/>
-  <int value="151" label="job"/>
-  <int value="152" label="out"/>
-  <int value="153" label="pad"/>
-  <int value="154" label="paf"/>
-  <int value="155" label="rgs"/>
-  <int value="156" label="u3p"/>
-  <int value="157" label="vbscript"/>
-  <int value="158" label="workflow"/>
-  <int value="159" label="001"/>
-  <int value="160" label="7z"/>
-  <int value="161" label="ace"/>
-  <int value="162" label="arc"/>
-  <int value="163" label="arj"/>
-  <int value="164" label="b64"/>
-  <int value="165" label="balz"/>
-  <int value="166" label="bhx"/>
-  <int value="167" label="bz"/>
-  <int value="168" label="bz2"/>
-  <int value="169" label="bzip2"/>
-  <int value="170" label="cab"/>
-  <int value="171" label="cpio"/>
-  <int value="172" label="fat"/>
-  <int value="173" label="gz"/>
-  <int value="174" label="gzip"/>
-  <int value="175" label="hfs"/>
-  <int value="176" label="hqx"/>
-  <int value="177" label="iso"/>
-  <int value="178" label="lha"/>
-  <int value="179" label="lpaq1"/>
-  <int value="180" label="lpaq5"/>
-  <int value="181" label="lpaq8"/>
-  <int value="182" label="lzh"/>
-  <int value="183" label="lzma"/>
-  <int value="184" label="mim"/>
-  <int value="185" label="ntfs"/>
-  <int value="186" label="paq8f"/>
-  <int value="187" label="paq8jd"/>
-  <int value="188" label="paq8l"/>
-  <int value="189" label="paq8o"/>
-  <int value="190" label="pea"/>
-  <int value="191" label="quad"/>
-  <int value="192" label="r00"/>
-  <int value="193" label="r01"/>
-  <int value="194" label="r02"/>
-  <int value="195" label="r03"/>
-  <int value="196" label="r04"/>
-  <int value="197" label="r05"/>
-  <int value="198" label="r06"/>
-  <int value="199" label="r07"/>
-  <int value="200" label="r08"/>
-  <int value="201" label="r09"/>
-  <int value="202" label="r10"/>
-  <int value="203" label="r11"/>
-  <int value="204" label="r12"/>
-  <int value="205" label="r13"/>
-  <int value="206" label="r14"/>
-  <int value="207" label="r15"/>
-  <int value="208" label="r16"/>
-  <int value="209" label="r17"/>
-  <int value="210" label="r18"/>
-  <int value="211" label="r19"/>
-  <int value="212" label="r20"/>
-  <int value="213" label="r21"/>
-  <int value="214" label="r22"/>
-  <int value="215" label="r23"/>
-  <int value="216" label="r24"/>
-  <int value="217" label="r25"/>
-  <int value="218" label="r26"/>
-  <int value="219" label="r27"/>
-  <int value="220" label="r28"/>
-  <int value="221" label="r29"/>
-  <int value="222" label="rar"/>
-  <int value="223" label="squashfs"/>
-  <int value="224" label="swm"/>
-  <int value="225" label="tar"/>
-  <int value="226" label="taz"/>
-  <int value="227" label="tbz"/>
-  <int value="228" label="tbz2"/>
-  <int value="229" label="tgz"/>
-  <int value="230" label="tpz"/>
-  <int value="231" label="txz"/>
-  <int value="232" label="tz"/>
-  <int value="233" label="udf"/>
-  <int value="234" label="uu"/>
-  <int value="235" label="uue"/>
-  <int value="236" label="vhd"/>
-  <int value="237" label="vmdk"/>
-  <int value="238" label="wim"/>
-  <int value="239" label="wrc"/>
-  <int value="240" label="xar"/>
-  <int value="241" label="xxe"/>
-  <int value="242" label="xz"/>
-  <int value="243" label="z"/>
-  <int value="244" label="zip"/>
-  <int value="245" label="zipx"/>
-  <int value="246" label="zpaq"/>
-  <int value="247" label="cdr"/>
-  <int value="248" label="dart"/>
-  <int value="249" label="dc42"/>
-  <int value="250" label="diskcopy42"/>
-  <int value="251" label="dmg"/>
-  <int value="252" label="dmgpart"/>
-  <int value="253" label="dvdr"/>
-  <int value="254" label="img"/>
-  <int value="255" label="imgpart"/>
-  <int value="256" label="ndif"/>
-  <int value="257" label="smi"/>
-  <int value="258" label="sparsebundle"/>
-  <int value="259" label="sparseimage"/>
-  <int value="260" label="toast"/>
-  <int value="261" label="udif"/>
-  <int value="262" label="run"/>
-  <int value="263" label="mpkg"/>
-  <int value="264" label="as"/>
-  <int value="265" label="cpgz"/>
-  <int value="266" label="pax"/>
-  <int value="267" label="xip"/>
-  <int value="268" label="docx"/>
-  <int value="269" label="docm"/>
-  <int value="270" label="dott"/>
-  <int value="271" label="dotm"/>
-  <int value="272" label="docb"/>
-  <int value="273" label="xlsx"/>
-  <int value="274" label="xlsm"/>
-  <int value="275" label="xltx"/>
-  <int value="276" label="xltm"/>
-  <int value="277" label="pptx"/>
-  <int value="278" label="pptm"/>
-  <int value="279" label="potx"/>
-  <int value="280" label="ppam"/>
-  <int value="281" label="ppsx"/>
-  <int value="282" label="sldx"/>
-  <int value="283" label="sldm"/>
-  <int value="284" label="htm"/>
-  <int value="285" label="html"/>
-  <int value="286" label="xht"/>
-  <int value="287" label="xhtm"/>
-  <int value="288" label="xhtml"/>
-  <int value="289" label="vdx"/>
-  <int value="290" label="vsx"/>
-  <int value="291" label="vtx"/>
-  <int value="292" label="vsdx"/>
-  <int value="293" label="vssx"/>
-  <int value="294" label="vstx"/>
-  <int value="295" label="vsdm"/>
-  <int value="296" label="vssm"/>
-  <int value="297" label="vstm"/>
-  <int value="298" label="btapp"/>
-  <int value="299" label="btskin"/>
-  <int value="300" label="btinstall"/>
-  <int value="301" label="btkey"/>
-  <int value="302" label="btsearch"/>
-  <int value="303" label="dhtml"/>
-  <int value="304" label="dhtm"/>
-  <int value="305" label="dht"/>
-  <int value="306" label="shtml"/>
-  <int value="307" label="shtm"/>
-  <int value="308" label="sht"/>
-  <int value="309" label="slk"/>
-  <int value="310" label="applescript"/>
-  <int value="311" label="scpt"/>
-  <int value="312" label="scptd"/>
-  <int value="313" label="seplugin"/>
-  <int value="314" label="osas"/>
-  <int value="315" label="osax"/>
-  <int value="316" label="settingcontent-ms"/>
-  <int value="317" label="oxt"/>
-  <int value="318" label="pyd"/>
-  <int value="319" label="pyo"/>
-  <int value="320" label="desktop"/>
-  <int value="321" label="cpi"/>
-  <int value="322" label="jpg"/>
-  <int value="323" label="jpeg"/>
-  <int value="324" label="mp3"/>
-  <int value="325" label="mp4"/>
-  <int value="326" label="png"/>
-  <int value="327" label="xls"/>
-  <int value="328" label="doc"/>
-  <int value="329" label="pptx"/>
-  <int value="330" label="csv"/>
-  <int value="331" label="ica"/>
-  <int value="332" label="ppt"/>
-  <int value="333" label="gif"/>
-  <int value="334" label="txt"/>
-  <int value="335" label="package"/>
-  <int value="336" label="tif"/>
-  <int value="337" label="rtf"/>
-  <int value="338" label="webp"/>
-  <int value="339" label="mkv"/>
-  <int value="340" label="wav"/>
-  <int value="341" label="mov"/>
-  <int value="342" label="dot"/>
-  <int value="343" label="dotx"/>
-  <int value="344" label="xlsb"/>
-  <int value="345" label="xlt"/>
-  <int value="346" label="xlm"/>
-  <int value="347" label="xldm"/>
-  <int value="348" label="xla"/>
-  <int value="349" label="xlam"/>
-  <int value="350" label="xll"/>
-  <int value="351" label="xlw"/>
-  <int value="352" label="pot"/>
-  <int value="353" label="potm"/>
-  <int value="354" label="ppsm"/>
-  <int value="355" label="pps"/>
-  <int value="356" label="mobileconfig"/>
-  <int value="357" label="dylib"/>
-  <int value="358" label="service"/>
-  <int value="359" label="definition"/>
-  <int value="360" label="wflow"/>
-  <int value="361" label="caction"/>
-  <int value="362" label="configprofile"/>
-  <int value="363" label="internetconnect"/>
-  <int value="364" label="networkconnect"/>
-  <int value="365" label="bmp"/>
-  <int value="366" label="css"/>
-  <int value="367" label="ehtml"/>
-  <int value="368" label="flac"/>
-  <int value="369" label="ico"/>
-  <int value="370" label="jfif"/>
-  <int value="371" label="m4a"/>
-  <int value="372" label="m4v"/>
-  <int value="373" label="mpeg"/>
-  <int value="374" label="mpg"/>
-  <int value="375" label="oga"/>
-  <int value="376" label="ogg"/>
-  <int value="377" label="ogm"/>
-  <int value="378" label="ogv"/>
-  <int value="379" label="opus"/>
-  <int value="380" label="pjp"/>
-  <int value="381" label="pjpeg"/>
-  <int value="382" label="svgz"/>
-  <int value="383" label="text"/>
-  <int value="384" label="tiff"/>
-  <int value="385" label="weba"/>
-  <int value="386" label="webm"/>
-  <int value="387" label="xbm"/>
-  <int value="388" label="accdb"/>
-  <int value="389" label="accde"/>
-  <int value="390" label="accdr"/>
-  <int value="391" label="accda"/>
-  <int value="392" label="cer"/>
-  <int value="393" label="der"/>
-  <int value="394" label="fileloc"/>
-  <int value="395" label="webloc"/>
-</enum>
-
 <enum name="DownloadItem.DangerType">
   <int value="0" label="NOT_DANGEROUS"/>
   <int value="1" label="DANGEROUS_FILE"/>
@@ -38326,7 +37583,7 @@
   <int value="435" label="MouseEventMovementY"/>
   <int value="436" label="MixedContentTextTrack"/>
   <int value="437" label="MixedContentRaw"/>
-  <int value="438" label="MixedContentImage"/>
+  <int value="438" label="MixedContentImage (old)"/>
   <int value="439" label="MixedContentMedia"/>
   <int value="440" label="DocumentFonts"/>
   <int value="441" label="MixedContentFormsSubmitted"/>
@@ -41785,7 +41042,7 @@
   <int value="3742" label="CrossOriginSubframeWithoutEmbeddingControl"/>
   <int value="3743" label="ReadableStreamWithByteSource"/>
   <int value="3744" label="ReadableStreamBYOBReader"/>
-  <int value="3745" label="EmbedElementWithoutTypeSrcChanged"/>
+  <int value="3745" label="EmbedElementWithoutTypeSrcChanged_Deleted"/>
   <int value="3746" label="SamePartyCookieAttribute"/>
   <int value="3747" label="SamePartyCookieExclusionOverruledSameSite"/>
   <int value="3748" label="SamePartyCookieInclusionOverruledSameSite"/>
@@ -42043,7 +41300,7 @@
   <int value="3988" label="FontSelectorCSSFontFamilyWebKitPrefixBody"/>
   <int value="3989" label="FontBuilderCSSFontFamilyWebKitPrefixBody"/>
   <int value="3990" label="CapabilityDelegationOfPaymentRequest"/>
-  <int value="3991" label="ConditionalFocus"/>
+  <int value="3991" label="ConditionalFocus_Deleted"/>
   <int value="3992" label="CredentialManagerGetLegacyFederatedCredential"/>
   <int value="3993" label="CredentialManagerGetPasswordCredential"/>
   <int value="3994" label="CredentialManagerStoreFederatedCredential"/>
@@ -48573,16 +47830,16 @@
   <int value="28" label="Linux/ATI/Third party drivers with 'AMD' in renderer"/>
   <int value="29" label="Linux/ATI/Third party drivers with 'ATI' in renderer"/>
   <int value="30" label="Linux/NVIDIA/Nouveau drivers"/>
-  <int value="31" label=""/>
+  <int value="31" label="31"/>
   <int value="32" label="Win/perf_overall less than 3.5/2d-canvas"/>
   <int value="33" label="Linux/Intel/IvyBridge/multisampling"/>
   <int value="34" label="Win/S3 Trio/all"/>
   <int value="35" label="Linux/Stage3D"/>
-  <int value="36" label=""/>
+  <int value="36" label="36"/>
   <int value="37" label="Linux/Optimus/all"/>
   <int value="38" label="MacLion/NVIDIA GeForce 9400M/2d-canvas"/>
-  <int value="39" label=""/>
-  <int value="40" label=""/>
+  <int value="39" label="39"/>
+  <int value="40" label="40"/>
   <int value="41" label="WinXP/Flash3D"/>
   <int value="42" label="Mac10.6/AMD/Radeon HD 6490M/WebGL"/>
   <int value="43" label="Win/Intel/8.15.10.1749/Texture_sharing"/>
@@ -50172,8 +49429,8 @@
   <int value="0" label="kEmptyExtension"/>
   <int value="1" label="kOtherExtension"/>
   <int value="2" label="RESERVED"/>
-  <int value="3" label="RESERVED"/>
-  <int value="4" label="RESERVED"/>
+  <int value="3" label="RESERVED0"/>
+  <int value="4" label="RESERVED1"/>
   <int value="5" label=".3ga"/>
   <int value="6" label=".3gp"/>
   <int value="7" label=".aac"/>
@@ -52917,7 +52174,7 @@
   <int value="-607101895" label="zh-t-i0-pinyin"/>
   <int value="-547772150" label="xkb:ro:std:rum"/>
   <int value="-545936253" label="zh-hant-t-i0-array-1992"/>
-  <int value="-537214862" label="xkb:us:intl_pc:eng"/>
+  <int value="-537214862" label="xkb:us:intl_pc:eng (*)"/>
   <int value="-535089160" label="xkb:us::msa"/>
   <int value="-512360986" label="xkb:us:altgr-intl:eng"/>
   <int value="-496003957" label="xkb:de::ger"/>
@@ -60973,6 +60230,8 @@
   <int value="-783999903" label="FilesTrashDrive:disabled"/>
   <int value="-783890018" label="LacrosProfileMigrationForAnyUser:disabled"/>
   <int value="-783093620" label="WebViewHitTestInBlinkOnTouchStart:enabled"/>
+  <int value="-782193212"
+      label="AutofillEnablePaymentsMandatoryReauth:enabled"/>
   <int value="-781625651"
       label="DisruptiveNotificationPermissionRevocation:enabled"/>
   <int value="-780798969" label="disable-single-click-autofill"/>
@@ -62427,6 +61686,7 @@
   <int value="21641175" label="OptimizeEarlyNavigation:disabled"/>
   <int value="22142588" label="OptimizationGuidePushNotifications:disabled"/>
   <int value="22202990" label="LacrosOnly:disabled"/>
+  <int value="22322436" label="AutofillEnablePaymentsMandatoryReauth:disabled"/>
   <int value="23121136" label="MobileIdentityConsistencyVar:enabled"/>
   <int value="23556595" label="MarkHttpAs:enabled"/>
   <int value="24332306" label="ButtonARCNetworkDiagnostics:disabled"/>
@@ -64589,6 +63849,7 @@
   <int value="1230018793" label="enable-dom-distiller"/>
   <int value="1230555479"
       label="AutofillEnableUnmaskCardRequestSetInstrumentId:disabled"/>
+  <int value="1233310128" label="ExoConsumedByImeByFlag:enabled"/>
   <int value="1234601252" label="ForceUseAPDownloadProtection:enabled"/>
   <int value="1234950775" label="FileTransferEnterpriseConnector:enabled"/>
   <int value="1235197204" label="AvatarsCloudMigration:enabled"/>
@@ -65877,6 +65138,7 @@
   <int value="1933376478" label="IsolatePrerenders:enabled"/>
   <int value="1934470615" label="AppIconInIntentChip:disabled"/>
   <int value="1935405622" label="AppServiceInstanceRegistry:disabled"/>
+  <int value="1936308950" label="ExoConsumedByImeByFlag:disabled"/>
   <int value="1936774335" label="EcheSWASendStartSignaling:enabled"/>
   <int value="1936810062" label="WebVrVsyncAlign:enabled"/>
   <int value="1937357350" label="MultilingualTyping:disabled"/>
@@ -66354,53 +65616,53 @@
   <int value="2" label="HEALTHY">Healthy</int>
   <int value="3" label="RESERVED">Reserved</int>
   <int value="4" label="BAD_POLICY_R11">Key OK, policy bad, pre-R11</int>
-  <int value="5" label="UNUSED">Unused</int>
+  <int value="5" label="UNUSED0">Unused</int>
   <int value="6" label="BAD_POLICY">Key OK, policy bad</int>
-  <int value="7" label="RESERVED">Reserved</int>
+  <int value="7" label="RESERVED0">Reserved</int>
   <int value="8" label="KEY_OK_NO_POLICY_R11">
     Key OK, no policy, pre-R11 user (http://crosbug.com/24916)
   </int>
-  <int value="9" label="UNUSED">Unused</int>
+  <int value="9" label="UNUSED1">Unused</int>
   <int value="10" label="KEY_OK_NO_POLICY">Key OK, no policy</int>
-  <int value="11" label="RESERVED">Reserved</int>
-  <int value="12" label="RESERVED">Reserved</int>
-  <int value="13" label="RESERVED">Reserved</int>
-  <int value="14" label="RESERVED">Reserved</int>
-  <int value="15" label="RESERVED">Reserved</int>
+  <int value="11" label="RESERVED1">Reserved</int>
+  <int value="12" label="RESERVED2">Reserved</int>
+  <int value="13" label="RESERVED3">Reserved</int>
+  <int value="14" label="RESERVED4">Reserved</int>
+  <int value="15" label="RESERVED5">Reserved</int>
   <int value="16" label="BAD_KEY_R11">Key bad, policy OK, pre-R11</int>
-  <int value="17" label="UNUSED">Unused</int>
+  <int value="17" label="UNUSED2">Unused</int>
   <int value="18" label="BAD_KEY">Key bad, policy OK</int>
-  <int value="19" label="RESERVED">Reserved</int>
+  <int value="19" label="RESERVED6">Reserved</int>
   <int value="20" label="BAD_KEY_BAD_POLICY_R11">
     Key bad, policy bad, pre-R11
   </int>
-  <int value="21" label="UNUSED">Unused</int>
-  <int value="22" label="BAD_KEY_BAD_POLICY">Key bad, policy bad</int>
-  <int value="23" label="RESERVED">Reserved</int>
+  <int value="21" label="UNUSED3">Unused</int>
+  <int value="22" label="BAD_KEY_BAD_POLICY_0">Key bad, policy bad</int>
+  <int value="23" label="RESERVED7">Reserved</int>
   <int value="24" label="BAD_KEY_NO_POLICY_R11">
     Key bad, policy bad, pre-R11
   </int>
-  <int value="25" label="UNUSED">Unused</int>
+  <int value="25" label="UNUSED4">Unused</int>
   <int value="26" label="BAD_KEY_BAD_POLICY">Key bad, policy bad</int>
-  <int value="27" label="RESERVED">Reserved</int>
-  <int value="28" label="RESERVED">Reserved</int>
-  <int value="29" label="RESERVED">Reserved</int>
-  <int value="30" label="RESERVED">Reserved</int>
-  <int value="31" label="RESERVED">Reserved</int>
+  <int value="27" label="RESERVED8">Reserved</int>
+  <int value="28" label="RESERVED9">Reserved</int>
+  <int value="29" label="RESERVED10">Reserved</int>
+  <int value="30" label="RESERVED11">Reserved</int>
+  <int value="31" label="RESERVED12">Reserved</int>
   <int value="32" label="NO_KEY_R11">No key, policy OK, pre-R11</int>
-  <int value="33" label="UNUSED">Unused</int>
+  <int value="33" label="UNUSED5">Unused</int>
   <int value="34" label="NO_KEY">No key, policy OK</int>
-  <int value="35" label="RESERVED">RESERVED</int>
+  <int value="35" label="RESERVED13">RESERVED</int>
   <int value="36" label="NO_KEY_BAD_POLICY_R11">
     No key, policy bad, pre-R11
   </int>
-  <int value="37" label="UNUSED">Unused</int>
+  <int value="37" label="UNUSED6">Unused</int>
   <int value="38" label="NO_KEY_BAD_POLICY">No key, bad policy</int>
-  <int value="39" label="RESERVED">Reserved</int>
+  <int value="39" label="RESERVED14">Reserved</int>
   <int value="40" label="NO_KEY_NO_POLICY_R11">Un-owned, pre-R11</int>
-  <int value="41" label="UNUSED">Unused</int>
+  <int value="41" label="UNUSED7">Unused</int>
   <int value="42" label="NO_KEY_NO_POLICY">Un-owned</int>
-  <int value="43" label="RESERVED">Reserved</int>
+  <int value="43" label="RESERVED15">Reserved</int>
 </enum>
 
 <enum name="LoginReauthReasons">
@@ -67544,8 +66806,8 @@
   <int value="411" label="webkit-overflow-scrolling"/>
   <int value="412" label="alias-webkit-app-region"/>
   <int value="413" label="alias-webkit-filter"/>
-  <int value="414" label="webkit-box-decoration-break"/>
-  <int value="415" label="webkit-tap-highlight-color"/>
+  <int value="414" label="webkit-box-decoration-break-0"/>
+  <int value="415" label="webkit-tap-highlight-color-0"/>
   <int value="416" label="buffered-rendering"/>
   <int value="417" label="grid-auto-rows"/>
   <int value="418" label="grid-auto-columns"/>
@@ -67637,7 +66899,7 @@
   <int value="504" label="translate"/>
   <int value="505" label="rotate"/>
   <int value="506" label="scale"/>
-  <int value="507" label="image-orientation"/>
+  <int value="507" label="image-orientation-0"/>
   <int value="508" label="backdrop-filter"/>
   <int value="509" label="text-combine-upright"/>
   <int value="510" label="text-orientation"/>
@@ -71714,7 +70976,7 @@
   <int value="213" label="CERT_VALIDITY_TOO_LONG"/>
   <int value="214" label="CERTIFICATE_TRANSPARENCY_REQUIRED"/>
   <int value="215" label="CERT_SYMANTEC_LEGACY"/>
-  <int value="216" label="QUIC_CERT_ROOT_NOT_KNOWN"/>
+  <int value="216" label="QUIC_CERT_ROOT_NOT_KNOWN_0"/>
   <int value="217" label="CERT_KNOWN_INTERCEPTION_BLOCKED"/>
   <int value="218" label="SSL_OBSOLETE_VERSION"/>
   <int value="300" label="INVALID_URL"/>
@@ -71838,7 +71100,7 @@
   <int value="806" label="DNS_SORT_ERROR"/>
   <int value="807" label="DNS_HTTP_FAILED"/>
   <int value="808" label="DNS_SECURE_RESOLVER_HOSTNAME_RESOLUTION_FAILED"/>
-  <int value="1478" label="SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS"/>
+  <int value="1478" label="SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS_0"/>
 </enum>
 
 <enum name="NetErrorNavigationCorrectionTypes">
@@ -76492,7 +75754,7 @@
   <int value="45" label="DELFI"/>
   <int value="46" label="Fonecta 02.fi"/>
   <int value="50" label="AVG"/>
-  <int value="51" label="search.ch"/>
+  <int value="51" label="search.ch (duplicate)"/>
   <int value="54" label="in.gr"/>
   <int value="55" label="Walla!"/>
   <int value="59" label="leit.is"/>
@@ -77409,7 +76671,7 @@
   <int value="9" label="LOADING_PREDICTOR"/>
   <int value="10" label="FAST_HOST_HINTS"/>
   <int value="11" label="Deprecated"/>
-  <int value="12" label="Deprecated"/>
+  <int value="12" label="Deprecated0"/>
   <int value="13" label="LITE_VIDEO"/>
   <int value="14" label="LINK_PERFORMANCE"/>
   <int value="15" label="SHOPPING_PAGE_PREDICTOR"/>
@@ -83540,43 +82802,49 @@
 </enum>
 
 <enum name="PrefetchReuseState">
-  <int value="0">
+  <int value="0" label="0">
     Reused fresh cache: outside time window and already reused
   </int>
-  <int value="1">Reused fresh cache: outside time window</int>
-  <int value="2">Reused fresh cache: already reused</int>
-  <int value="3">
+  <int value="1" label="1">Reused fresh cache: outside time window</int>
+  <int value="2" label="2">Reused fresh cache: already reused</int>
+  <int value="3" label="3">
     Reused: first reuse within time window, cache entry is fresh
   </int>
-  <int value="4">
+  <int value="4" label="4">
     Not reused: outside time window and already reused, cache always validates
     due to headers
   </int>
-  <int value="5">
+  <int value="5" label="5">
     Not reused: outside time window and cache always validates due to headers
   </int>
-  <int value="6">
+  <int value="6" label="6">
     Not reused: already reused and cache always validates due to headers
   </int>
-  <int value="7">
+  <int value="7" label="7">
     Reused: cache headers are set to always validate, overriding since it's the
     first reuse within time window
   </int>
-  <int value="8">
+  <int value="8" label="8">
     Not reused: outside time window and already reused, cache entry expired
   </int>
-  <int value="9">Not reused: outside time window and cache entry expired</int>
-  <int value="10">Not reused: already reused and cache entry expired</int>
-  <int value="11">
+  <int value="9" label="9">
+    Not reused: outside time window and cache entry expired
+  </int>
+  <int value="10" label="10">
+    Not reused: already reused and cache entry expired
+  </int>
+  <int value="11" label="11">
     Reused: cache age expired, overriding since it's the first reuse within time
     window
   </int>
-  <int value="12">
+  <int value="12" label="12">
     Reused while revalidating: outside time window and already reused
   </int>
-  <int value="13">Reused while revalidating: outside time window</int>
-  <int value="14">Reused while revalidating: already reused</int>
-  <int value="15">
+  <int value="13" label="13">
+    Reused while revalidating: outside time window
+  </int>
+  <int value="14" label="14">Reused while revalidating: already reused</int>
+  <int value="15" label="15">
     Reused, skipped revalidation: first reuse within time window
   </int>
 </enum>
@@ -88081,31 +87349,6 @@
   <int value="514" label="QPACK_DECODER_STREAM_ERROR"/>
 </enum>
 
-<enum name="QuicInternalErrorLocation">
-  <int value="0" label="QUIC_CHROMIUM_CLIENT_SESSION"/>
-  <int value="1" label="QUIC_CONNECTION_PROTOCOL_VERSION_MISMATCH"/>
-  <int value="2" label="QUIC_CONNECTION_VERSION_NEGOTIATION_PACKET"/>
-  <int value="3" label="QUIC_CONNECTION_UNAUTHENTICATED_HEADER"/>
-  <int value="4" label="QUIC_CONNECTION_WRITE_PACKET"/>
-  <int value="5" label="QUIC_CONTROL_FRAME_MANAGER_CONTROL_FRAME_SENT"/>
-  <int value="6" label="QUIC_CONTROL_FRAME_MANAGER_CONTROL_FRAME_ACKED"/>
-  <int value="7" label="QUIC_CONTROL_FRAME_MANAGER_CONTROL_FRAME_LOST"/>
-  <int value="8" label="QUIC_CONTROL_FRAME_MANAGER_RETRANSMIT_CONTROL_FRAME"/>
-  <int value="9" label="QUIC_CRYPTO_CLIENT_HANDSHAKER_MAX_PACKET"/>
-  <int value="10" label="QUIC_CRYPTO_CLIENT_HANDSHAKER_CHLO"/>
-  <int value="11" label="QUIC_ERROR_CODES"/>
-  <int value="12" label="QUIC_FRAMER"/>
-  <int value="13" label="QUIC_HEADERS_STREAM"/>
-  <int value="14" label="QUIC_SESSION_ON_CAN_WRITE"/>
-  <int value="15" label="QUIC_SESSION_WRITEV_DATA"/>
-  <int value="16" label="QUIC_SESSION_STREAM_FRAME_RETRANSMITTED"/>
-  <int value="17" label="QUIC_SPDY_SESSION"/>
-  <int value="18" label="QUIC_STREAM_ACKED_UNSENT_FIN"/>
-  <int value="19" label="QUIC_STREAM_ACKED_UNSENT_FIN"/>
-  <int value="20" label="QUIC_STREAM_SEQUENCER_BUFFER"/>
-  <int value="21" label="QUIC_CHROMIUM_CLIENT_SESSION_CLOSE_SESSION_ON_ERROR"/>
-</enum>
-
 <enum name="QuickAnswersDictionaryIntentSource">
   <int value="0" label="kTextClassifier"/>
   <int value="1" label="kHunspell"/>
@@ -89934,7 +89177,7 @@
   <int value="75" label="NetworkingUnfreezable"/>
   <int value="76" label="WakeLock"/>
   <int value="77" label="InternalInputBlocking"/>
-  <int value="78" label="WebGL"/>
+  <int value="78" label="WebGPU"/>
   <int value="79" label="InternalPostMessageForwarding"/>
   <int value="80" label="InternalNavigationCancellation"/>
   <int value="81" label="LowPriorityScriptExecution"/>
@@ -89996,177 +89239,6 @@
   <int value="6" label="While closing the page"/>
 </enum>
 
-<enum name="RenderFrameHostImpl.InterfaceNames">
-  <summary>
-    Enumerates names of Mojo interfaces that are requests through
-    RenderFrameHostImpl::GetInterface.
-  </summary>
-  <int value="4595745" label="blink.mojom.FileSystemAccessManager"/>
-  <int value="28688772" label="snippets_internals.mojom.PageHandlerFactory"/>
-  <int value="39256405" label="device.mojom.Geolocation"/>
-  <int value="70273688" label="device.mojom.VRService"/>
-  <int value="81966276" label="blink.mojom.KeyboardLockService"/>
-  <int value="83462680" label="media.mojom.MediaMetricsProvider"/>
-  <int value="112672197" label="blink.mojom.SharedWorkerConnector"/>
-  <int value="116454628" label="blink.mojom.CacheStorage"/>
-  <int value="118314811" label="media.mojom.RemoterFactory"/>
-  <int value="127672107" label="mojom.UsbInternalsPageHandler"/>
-  <int value="141486647" label="webauth.mojom.Authenticator"/>
-  <int value="155545232" label="blink.mojom.GeolocationService"/>
-  <int value="188516542" label="content.mojom.MediaStreamDispatcherHost"/>
-  <int value="190256703" label="network.mojom.RestrictedCookieManager"/>
-  <int value="194725745" label="app_management.mojom.PageHandlerFactory"/>
-  <int value="202417688" label="resource_coordinator.mojom.WebUIGraphDump"/>
-  <int value="241045822" label="blink.mojom.DateTimeChooser"/>
-  <int value="242965667" label="blink.mojom.MediaSessionService"/>
-  <int value="250652837" label="mojom.ProcessInternalsHandler"/>
-  <int value="264532149" label="blink.mojom.LockManager"/>
-  <int value="271849582" label="performance_manager.mojom.WebUIGraphDump"/>
-  <int value="273500403" label="blink.mojom.PresentationService"/>
-  <int value="298400659" label="media.mojom.MediaMetricsProvider"/>
-  <int value="302655516" label="blink.mojom.WakeLockService"/>
-  <int value="323903839" label="feed_internals.mojom.PageHandler"/>
-  <int value="389086904" label="content.mojom.BrowserTarget"/>
-  <int value="390613312" label="autofill.mojom.AutofillDriver"/>
-  <int value="390850644" label="device.mojom.GamepadMonitor"/>
-  <int value="398982196" label="mojom.InterventionsInternalsPageHandler"/>
-  <int value="423966775" label="blink.mojom.IDBFactory"/>
-  <int value="443506227" label="blink.mojom.SpeechRecognizer"/>
-  <int value="450992839" label="blink.mojom.WebBluetoothService"/>
-  <int value="453803103" label="device.mojom.Geolocation"/>
-  <int value="465691137" label="blink.mojom.BadgeService"/>
-  <int value="470231457" label="extensions.KeepAlive"/>
-  <int value="473587909" label="autofill.mojom.AutofillDriver"/>
-  <int value="480255287" label="content.mojom.BrowserTarget"/>
-  <int value="485751698" label="blink.mojom.MediaStreamDispatcherHost"/>
-  <int value="536067486" label="ws.mojom.Gpu"/>
-  <int value="575717011" label="blink.mojom.AnchorElementMetricsHost"/>
-  <int value="583861320" label="media.mojom.InterfaceFactory"/>
-  <int value="593735191" label="blink.mojom.PresentationService"/>
-  <int value="620853817" label="media.mojom.Renderer"/>
-  <int value="660485518" label="payments.mojom.PaymentRequest"/>
-  <int value="664813603" label="blink.mojom.ShareService"/>
-  <int value="668914812" label="autofill.mojom.PasswordManagerDriver"/>
-  <int value="670026296" label="blink.mojom.CacheStorage"/>
-  <int value="738435690" label="blink.mojom.SharedWorkerConnector"/>
-  <int value="772959538"
-      label="dom_distiller.mojom.DistillerJavaScriptService"/>
-  <int value="781395216" label="dom_distiller.mojom.DistillabilityService"/>
-  <int value="833468074" label="device.mojom.VRService"/>
-  <int value="846414148" label="blink.mojom.MediaDevicesDispatcherHost"/>
-  <int value="893321775"
-      label="resource_coordinator.mojom.FrameCoordinationUnit"/>
-  <int value="902740039" label="blink.mojom.PermissionService"/>
-  <int value="917382314" label="blink.mojom.TextSuggestionHost"/>
-  <int value="917568449" label="media.mojom.ImageCapture"/>
-  <int value="948847120" label="blink.mojom.WebUsbService"/>
-  <int value="958735765" label="shape_detection.mojom.FaceDetectionProvider"/>
-  <int value="968027799" label="blink.mojom.MediaSessionService"/>
-  <int value="979421400" label="device.mojom.NFC"/>
-  <int value="982123735" label="blink.mojom.ColorChooserFactory"/>
-  <int value="994757370" label="blink.mojom.InsecureInputService"/>
-  <int value="996732224" label="autofill.mojom.PasswordManagerDriver"/>
-  <int value="1014286658" label="blink.mojom.NotificationService"/>
-  <int value="1037735345" label="extensions.mime_handler.BeforeUnloadControl"/>
-  <int value="1044427386" label="blink.mojom.SmsManager"/>
-  <int value="1048723358" label="content.mojom.InputInjector"/>
-  <int value="1049460515" label="translate.mojom.ContentTranslateDriver"/>
-  <int value="1071268620" label="blink.mojom.QuotaManagerHost"/>
-  <int value="1100311626" label="blink.mojom.TextSuggestionHost"/>
-  <int value="1102158904" label="chrome.mojom.PrerenderCanceler"/>
-  <int value="1116085333"
-      label="content.mojom.RendererAudioOutputStreamFactory"/>
-  <int value="1117840258" label="media.mojom.InterfaceFactory"/>
-  <int value="1123228604" label="blink.mojom.QuotaManagerHost"/>
-  <int value="1144764995" label="network.mojom.WebSocket"/>
-  <int value="1144778719" label="ui.mojom.Gpu"/>
-  <int value="1148580579" label="blink.mojom.LockManager"/>
-  <int value="1157068323"
-      label="resource_coordinator.mojom.DocumentCoordinationUnit"/>
-  <int value="1207132298" label="media.mojom.Renderer"/>
-  <int value="1214902026" label="device.mojom.VibrationManager"/>
-  <int value="1225155271" label="blink.mojom.DedicatedWorkerHostFactory"/>
-  <int value="1237802022" label="blink.mojom.PermissionService"/>
-  <int value="1241592573" label="media.mojom.VideoDecodePerfHistory"/>
-  <int value="1258017914" label="blink.mojom.UnhandledTapNotifier"/>
-  <int value="1293422219" label="media.mojom.ImageCapture"/>
-  <int value="1298636847" label="media.mojom.RemoterFactory"/>
-  <int value="1303034727" label="blink.mojom.PictureInPictureService"/>
-  <int value="1311956027"
-      label="discardable_memory.mojom.DiscardableSharedMemoryManager"/>
-  <int value="1321671191" label="blink.mojom.BudgetService"/>
-  <int value="1337066913"
-      label="resource_coordinator.mojom.FrameCoordinationUnit"/>
-  <int value="1363277053" label="mojom.OmniboxPageHandler"/>
-  <int value="1374541190" label="payments.mojom.PaymentManager"/>
-  <int value="1391649397" label="blink.mojom.InstalledAppProvider"/>
-  <int value="1416694600" label="payments.mojom.PaymentRequest"/>
-  <int value="1419976867" label="blink.mojom.DedicatedWorkerHostFactory"/>
-  <int value="1448556545" label="content.mojom.InputInjector"/>
-  <int value="1450167594" label="device.mojom.WakeLock"/>
-  <int value="1454720654" label="blink.mojom.ContactsManager"/>
-  <int value="1487601584" label="blink.mojom.SerialService"/>
-  <int value="1494628140" label="blink.mojom.BackgroundFetchService"/>
-  <int value="1497405510" label="blink.mojom.Portal"/>
-  <int value="1514474533" label="blink.mojom.DisplayCutoutHost"/>
-  <int value="1517562643"
-      label="content.mojom.RendererAudioInputStreamFactory"/>
-  <int value="1528642323" label="mojom.BluetoothInternalsHandler"/>
-  <int value="1548931182" label="shape_detection.mojom.FaceDetectionProvider"/>
-  <int value="1558418769" label="mojom.DiscardsDetailsProvider"/>
-  <int value="1558900994" label="device.mojom.NFC"/>
-  <int value="1566236400" label="mojom.SiteEngagementDetailsProvider"/>
-  <int value="1569949878" label="mojom.ResetPasswordHandler"/>
-  <int value="1608786055" label="network.mojom.WebSocket"/>
-  <int value="1617971260" label="blink.mojom.HidService"/>
-  <int value="1625278273"
-      label="shape_detection.mojom.BarcodeDetectionProvider"/>
-  <int value="1637627623" label="device.mojom.SensorProvider"/>
-  <int value="1658893493" label="device.mojom.WakeLock"/>
-  <int value="1659485640" label="password_manager.mojom.CredentialManager"/>
-  <int value="1664576526"
-      label="media.mojom.MediaEngagementScoreDetailsProvider"/>
-  <int value="1694940426" label="blink.mojom.KeyboardLockService"/>
-  <int value="1725898486" label="blink.mojom.UnhandledTapNotifier"/>
-  <int value="1726661029" label="blink.mojom.ColorChooserFactory"/>
-  <int value="1727086043"
-      label="content.mojom.RendererAudioInputStreamFactory"/>
-  <int value="1729889736"
-      label="discardable_memory.mojom.DiscardableSharedMemoryManager"/>
-  <int value="1736030522" label="downloads.mojom.PageHandlerFactory"/>
-  <int value="1750772802" label="blink.mojom.NotificationService"/>
-  <int value="1751386040" label="page_load_metrics.mojom.PageLoadMetrics"/>
-  <int value="1769429998" label="blink.mojom.PrefetchURLLoaderService"/>
-  <int value="1780600451" label="blink.mojom.MediaDevicesDispatcherHost"/>
-  <int value="1785235899" label="shape_detection.mojom.BarcodeDetection"/>
-  <int value="1798060917" label="blink.mojom.BackgroundFetchService"/>
-  <int value="1811548070" label="payments.mojom.PaymentManager"/>
-  <int value="1831896638"
-      label="content.mojom.RendererAudioOutputStreamFactory"/>
-  <int value="1844445757" label="image_annotation.mojom.Annotator"/>
-  <int value="1851878773" label="blink.mojom.WebBluetoothService"/>
-  <int value="1872102254" label="blink.mojom.PrefetchURLLoaderService"/>
-  <int value="1872706686"
-      label="contextual_search.mojom.ContextualSearchJsApiService"/>
-  <int value="1884536898" label="blink.mojom.FileSystemManager"/>
-  <int value="1893297160" label="network.mojom.RestrictedCookieManager"/>
-  <int value="1921948028" label="blink.mojom.GeolocationService"/>
-  <int value="1951066980" label="shape_detection.mojom.TextDetection"/>
-  <int value="1972006840" label="blink.mojom.FileChooser"/>
-  <int value="2015729329" label="extensions.mime_handler.MimeHandlerService"/>
-  <int value="2019700793" label="device.mojom.VibrationManager"/>
-  <int value="2036010684" label="chrome.mojom.OfflinePageAutoFetcher"/>
-  <int value="2051587908" label="blink.mojom.IdleManager"/>
-  <int value="2056556199" label="media_router.mojom.MediaRouter"/>
-  <int value="2060513738"
-      label="webauth.test.mojom.VirtualAuthenticatorManager"/>
-  <int value="2067597900" label="blink.mojom.InsecureInputService"/>
-  <int value="2076591855" label="viz.mojom.Gpu"/>
-  <int value="2109171099" label="device.mojom.SensorProvider"/>
-  <int value="2137870010" label="web_ui_test.mojom.TestRunner"/>
-  <int value="2147202291" label="shape_detection.mojom.TextDetection"/>
-</enum>
-
 <enum name="RenderingType">
   <int value="0" label="Hardware GPU"/>
   <int value="1" label="Software Rendering"/>
@@ -90421,7 +89493,7 @@
   <int value="4" label="kTriggerExtensionRequest">
     A new extension request is added
   </int>
-  <int value="5" label="kTriggerExtensionRequest">
+  <int value="5" label="kExtensionRequestRealTime">
     A new extension request is added and uploaded with ERP.
   </int>
   <int value="6" label="kTriggerManual">User upload report manually</int>
@@ -92255,7 +91327,7 @@
   <int value="326" label="PNG"/>
   <int value="327" label="XLS"/>
   <int value="328" label="DOC"/>
-  <int value="329" label="PPTX"/>
+  <int value="329" label="PPTX (duplicate)"/>
   <int value="330" label="CSV"/>
   <int value="331" label="ICA"/>
   <int value="332" label="PPT"/>
@@ -92263,7 +91335,7 @@
   <int value="334" label="TXT"/>
   <int value="335" label="PACKAGE"/>
   <int value="336" label="TIF"/>
-  <int value="337" label="RTF"/>
+  <int value="337" label="RTF (duplicate)"/>
   <int value="338" label="WEBP"/>
   <int value="339" label="MKV"/>
   <int value="340" label="WAV"/>
@@ -92839,7 +91911,7 @@
   <int value="36" label="defunct">
     DICTIONARY_PREVIOUSLY_SCHEDULED_TO_DOWNLOAD used instead
   </int>
-  <int value="37" label="defunct">
+  <int value="37" label="defunct0">
     DICTIONARY_PREVIOUSLY_SCHEDULED_TO_DOWNLOAD used instead
   </int>
   <int value="38" label="DICTIONARY_FETCH_READ_FAILED-defunct">
@@ -92855,13 +91927,13 @@
   <int value="53" label="UNADVERTISED_DICTIONARY_USED_CACHED"/>
   <int value="61" label="DOMAIN_BLACKLIST_INCLUDES_TARGET"/>
   <int value="70" label="META_REFRESH_RECOVERY"/>
-  <int value="71" label="defunct">
+  <int value="71" label="defunct1">
     Almost the same as META_REFRESH_UNSUPPORTED
   </int>
-  <int value="72" label="defunct">
+  <int value="72" label="defunct2">
     Almost the same as CACHED_META_REFRESH_UNSUPPORTED
   </int>
-  <int value="73" label="defunct">
+  <int value="73" label="defunct3">
     PASSING_THROUGH_NON_SDCH plus DISCARD_TENTATIVE_SDCH
   </int>
   <int value="74" label="META_REFRESH_UNSUPPORTED"/>
@@ -94785,14 +93857,14 @@
   <summary>
     Index of a third party app in the bottom row of the sharing hub on Android.
   </summary>
-  <int value="0"/>
-  <int value="1"/>
-  <int value="2"/>
-  <int value="3"/>
-  <int value="4"/>
-  <int value="5"/>
-  <int value="6"/>
-  <int value="7"/>
+  <int value="0" label="0"/>
+  <int value="1" label="1"/>
+  <int value="2" label="2"/>
+  <int value="3" label="3"/>
+  <int value="4" label="4"/>
+  <int value="5" label="5"/>
+  <int value="6" label="6"/>
+  <int value="7" label="7"/>
 </enum>
 
 <enum name="SharingHubSharesheetResult">
@@ -97183,41 +96255,6 @@
   <int value="1" label="match"/>
 </enum>
 
-<!-- Replaced by SpdyProtocolErrorDetails2 on 2013-04-19. -->
-
-<enum name="SpdyProtocolErrorDetails">
-  <int value="0" label="No error"/>
-  <int value="1" label="Invalid Control Frame"/>
-  <int value="2" label="Control Frame Payload Too Large"/>
-  <int value="3" label="Zlib Init Failure"/>
-  <int value="4" label="Unsupported Version"/>
-  <int value="5" label="Decompress Failure"/>
-  <int value="6" label="Compress Failure"/>
-  <int value="7" label="Credential Frame Corrupt"/>
-  <int value="8" label="Invalid Data Frame Flags"/>
-<!-- r181910 added an enum value here, so don't trust the counts for
-     the values below for Chrome builds after that revision. -->
-
-  <int value="9" label="Invalid Status Code"/>
-  <int value="10" label="Protocol Error"/>
-  <int value="11" label="Invalid Stream"/>
-  <int value="12" label="Refused Stream"/>
-  <int value="13" label="Unsupported Version"/>
-  <int value="14" label="Cancel"/>
-  <int value="15" label="Internal Error"/>
-  <int value="16" label="Flow Control Error"/>
-  <int value="17" label="Stream In Use"/>
-  <int value="18" label="Stream Already Closed"/>
-  <int value="19" label="Invalid Credentials"/>
-  <int value="20" label="Frame Too Large"/>
-  <int value="21" label="Unexpected Ping"/>
-  <int value="22" label="Rst Stream For Non Active Stream"/>
-  <int value="23" label="Spdy Compression Failure"/>
-  <int value="24" label="Request For Secure Content Over Insecure Session"/>
-  <int value="25" label="Protocol Error Syn Reply Not Received"/>
-  <int value="26" label="Num Spdy Protocol Error Details"/>
-</enum>
-
 <enum name="SpdyProtocolErrorDetails2">
 <!-- SpdyFramer::SpdyErrors -->
 
@@ -97237,7 +96274,7 @@
   <int value="11" label="Protocol Error"/>
   <int value="12" label="Closed Stream"/>
   <int value="13" label="Refused Stream"/>
-  <int value="14" label="Unsupported Version"/>
+  <int value="14" label="Unsupported Version (SpdyRstStreamStatus)"/>
   <int value="15" label="Cancel"/>
   <int value="16" label="Internal Error"/>
   <int value="17" label="Flow Control Error"/>
@@ -98922,29 +97959,6 @@
   <int value="3" label="Provider missing"/>
 </enum>
 
-<enum name="StructuredMetricsInternalError">
-  <obsolete>
-    Deprecated as of 10/08/2021. Histogram using this enum had a recording bug
-    that grouped failed key errors with failed event erorrs. Prefer to use
-    StructuredMetrcsInternalError2.
-  </obsolete>
-  <int value="0" label="Missing key (deprecated)"/>
-  <int value="1" label="Wrong key length"/>
-  <int value="2" label="Missing last rotation"/>
-  <int value="3" label="Missing rotation period"/>
-  <int value="4" label="Failed uint conversion"/>
-  <int value="5" label="Failed key or event read error"/>
-  <int value="6" label="Failed key or event parse error"/>
-  <int value="7" label="Failed key or event write error"/>
-  <int value="8" label="Failed key or event serialization"/>
-  <int value="9" label="Unused"/>
-  <int value="10" label="Unused"/>
-  <int value="11" label="Unused"/>
-  <int value="12" label="Unused"/>
-  <int value="13" label="Uninitialized recorder"/>
-  <int value="14" label="Invalid event parsed"/>
-</enum>
-
 <enum name="StructuredMetricsInternalError2">
   <int value="0" label="Missing key (deprecated)"/>
   <int value="1" label="Wrong key length"/>
@@ -103297,7 +102311,7 @@
   <int value="1065916186" label="CROS Cr50 0.0.19"/>
   <int value="1069046756" label="CROS Cr50 0.5.51"/>
   <int value="1080347583" label="CROS Cr50 0.6.2"/>
-  <int value="1123680979" label="CROS Cr50 0.3.4"/>
+  <int value="1123680979" label="CROS Cr50 0.3.4 (duplicate)"/>
   <int value="1184698907" label="CROS Cr50 0.3.23"/>
   <int value="1190683265" label="CROS Cr50 0.0.14"/>
   <int value="1204349964" label="CROS Cr50 0.6.3"/>
@@ -106396,19 +105410,21 @@
 </enum>
 
 <enum name="VideoCaptureApi">
-  <int value="0">UNKNOWN</int>
-  <int value="1">LINUX_V4L2_SINGLE_PLANE</int>
-  <int value="2">WIN_MEDIA_FOUNDATION</int>
-  <int value="3">WIN_MEDIA_FOUNDATION_SENSOR</int>
-  <int value="4">WIN_DIRECT_SHOW</int>
-  <int value="5">MACOSX_AVFOUNDATION</int>
-  <int value="6">MACOSX_DECKLINK</int>
-  <int value="7">ANDROID_API1</int>
-  <int value="8">ANDROID_API2_LEGACY</int>
-  <int value="9">ANDROID_API2_FULL</int>
-  <int value="10">ANDROID_API2_LIMITED</int>
-  <int value="11">FUCHSIA_CAMERA3</int>
-  <int value="12">VIRTUAL_DEVICE</int>
+  <int value="0" label="UNKNOWN">UNKNOWN</int>
+  <int value="1" label="LINUX_V4L2_SINGLE_PLANE">LINUX_V4L2_SINGLE_PLANE</int>
+  <int value="2" label="WIN_MEDIA_FOUNDATION">WIN_MEDIA_FOUNDATION</int>
+  <int value="3" label="WIN_MEDIA_FOUNDATION_SENSOR">
+    WIN_MEDIA_FOUNDATION_SENSOR
+  </int>
+  <int value="4" label="WIN_DIRECT_SHOW">WIN_DIRECT_SHOW</int>
+  <int value="5" label="MACOSX_AVFOUNDATION">MACOSX_AVFOUNDATION</int>
+  <int value="6" label="MACOSX_DECKLINK">MACOSX_DECKLINK</int>
+  <int value="7" label="ANDROID_API1">ANDROID_API1</int>
+  <int value="8" label="ANDROID_API2_LEGACY">ANDROID_API2_LEGACY</int>
+  <int value="9" label="ANDROID_API2_FULL">ANDROID_API2_FULL</int>
+  <int value="10" label="ANDROID_API2_LIMITED">ANDROID_API2_LIMITED</int>
+  <int value="11" label="FUCHSIA_CAMERA3">FUCHSIA_CAMERA3</int>
+  <int value="12" label="VIRTUAL_DEVICE">VIRTUAL_DEVICE</int>
 </enum>
 
 <enum name="VideoCaptureError">
@@ -108412,14 +107428,14 @@
   <int value="492" label="STATUS_FILE_ERROR"/>
   <int value="495" label="STATUS_HTTP_DATA_ERROR"/>
   <int value="907" label="ERROR_DOWNLOAD_INTERNAL_CONDITION_5"/>
-  <int value="908" label="ERROR_DOWNLOAD_INTERNAL_FREE_SPACE"/>
+  <int value="908" label="ERROR_DOWNLOAD_INTERNAL_FREE_SPACE_0"/>
   <int value="910" label="ERROR_INSTALL_INCOMPLETE"/>
   <int value="919" label="ERROR_INSTALL_APK_VERIFICATION_SIZE"/>
   <int value="920" label="ERROR_VOLLEY_AUTH_FAILURE"/>
-  <int value="922" label="ERROR_VOLLEY_DFE_SERVER"/>
+  <int value="922" label="ERROR_VOLLEY_DFE_SERVER_0"/>
   <int value="923" label="ERROR_VOLLEY_NETWORK"/>
-  <int value="924" label="ERROR_VOLLEY_NO_CONNECTION"/>
-  <int value="927" label="ERROR_VOLLEY_TIMEOUT"/>
+  <int value="924" label="ERROR_VOLLEY_NO_CONNECTION_0"/>
+  <int value="927" label="ERROR_VOLLEY_TIMEOUT_0"/>
   <int value="961" label="ERROR_INSTALL_APK_VERIFICATION_OTHER"/>
   <int value="963" label="ERROR_INSTALL_APK_COPY_FAILURE"/>
   <int value="1008" label="ERROR_DOWNLOAD_INTERNAL_FREE_SPACE"/>
@@ -109819,9 +108835,11 @@
   <int value="36006" label="Data, Stun, priv IPv4 local, IPv6 remote"/>
   <int value="156898" label="No media, Stun, SLD/SRD, local IPv6, remote MDNS"/>
   <int value="157154" label="Connected, Data, Stun, local IPv6, remote MDNS"/>
-  <int value="157158" label="Connected, Data, Stun, local IPv6, remote MDNS"/>
+  <int value="157158"
+      label="Connected, Data, Stun, local IPv6, remote MDNS (duplicate)"/>
   <int value="157414" label="Data, Stun, SLD/SRD, local IPv6, remote MDNS"/>
-  <int value="157670" label="Connected, Data, Stun, local IPv6, remote MDNS"/>
+  <int value="157670"
+      label="Connected, Data, Stun, local IPv6, remote MDNS (triplicate)"/>
 </enum>
 
 <enum name="WebRtcScalabilityMode">
@@ -110343,49 +109361,24 @@
   <int value="2136345292" label="/privacy"/>
   <int value="2236117233" label="/cursorAndTouchpad"/>
   <int value="2292642563" label="/androidAppsDetails"/>
-  <int value="2344894009" label="/crostini/details"/>
-  <int value="2370455991" label="/help"/>
-  <int value="2474569398" label="/manageAccessibility"/>
   <int value="2583527907" label="/manageAccessibility/captions"/>
   <int value="2584045321" label="/app-notifications"/>
-  <int value="2705666388" label="/app-management/pluginVm/sharedPaths"/>
-  <int value="2725194796" label="/manageAccessibility/tts"/>
-  <int value="2810037793" label="/manageAccessibility/switchAccess"/>
   <int value="2827754479" label="/osPrivacy/lockScreen"/>
   <int value="2831082225" label="/bluetoothDeviceDetail"/>
-  <int value="2982222690" label="/knownNetworks"/>
-  <int value="3015629864" label="/power"/>
-  <int value="3088443552" label="/app-management/detail"/>
-  <int value="3090186306" label="/dateTime/timeZone"/>
   <int value="3174617532" label="/osLanguages/smartInputs"/>
-  <int value="3175327472" label="/display"/>
-  <int value="3226551256" label="/multidevice/features/smartLock"/>
-  <int value="3246951466" label="/"/>
-  <int value="3322449366" label="/googleAssistant"/>
-  <int value="3378793001" label="/internet"/>
-  <int value="3396486028" label="/multidevice/features"/>
   <int value="3447116306" label="/osSearch/search"/>
   <int value="3452400691" label="/kerberos"/>
-  <int value="3452418917" label="/apps"/>
   <int value="3453079661" label="/osSync"/>
   <int value="3514732098" label="/keyboardAndTextInput"/>
   <int value="3531919210" label="/osLanguages/editDictionary"/>
   <int value="3561556862" label="/app-management/pluginVm/sharedUsbDevices"/>
-  <int value="3584610247" label="/bluetooth"/>
   <int value="3585870839" label="/crostini/androidAdb"/>
-  <int value="3724010310" label="/personalization"/>
   <int value="3869947881" label="/crostini/portForwarding"/>
-  <int value="3916101162" label="/networkDetail"/>
   <int value="3958116773" label="/osPrivacy/smartPrivacy"/>
-  <int value="3975673829" label="/multidevice"/>
-  <int value="3999264766" label="/smbShares"/>
   <int value="4060403967" label="/osPrivacy"/>
   <int value="4083684424" label="/bruschetta/details"/>
-  <int value="4105652989" label="/crostini/exportImport"/>
   <int value="4171209718" label="/app-management"/>
   <int value="4174275430" label="/androidAppsDetails/sharedUsbDevices"/>
-  <int value="4235634477" label="/accountManager"/>
-  <int value="4250700256" label="/bluetoothDevices"/>
 </enum>
 
 <enum name="WebUISettingsPathHashes">
@@ -110731,7 +109724,7 @@
   <int value="1396129399" label="chrome://flash/"/>
   <int value="1397728473" label="chrome://crostini-installer/"/>
   <int value="1399992914" label="chrome://java-crash/"/>
-  <int value="1403605293" label="chrome://internet-detail-dialog/"/>
+  <int value="1403605293" label="chrome://internet-detail-dialog/ (duplicate)"/>
   <int value="1411665301" label="chrome://lock-network/"/>
   <int value="1427179406" label="chrome://gcm-internals/"/>
   <int value="1454088830" label="chrome://uber-frame/"/>
diff --git a/tools/metrics/histograms/extract_histograms.py b/tools/metrics/histograms/extract_histograms.py
index c3f3e48..ae0408e6 100644
--- a/tools/metrics/histograms/extract_histograms.py
+++ b/tools/metrics/histograms/extract_histograms.py
@@ -297,6 +297,7 @@
     enum_dict = {}
     enum_dict['name'] = name
     enum_dict['values'] = {}
+    labels = set()
 
     nodes = list(IterElementsWithTag(enum, 'int'))
 
@@ -313,7 +314,13 @@
         logging.error('Duplicate enum value %d for enum %s', int_value, name)
         have_errors = True
         continue
-      value_dict['label'] = int_tag.getAttribute('label')
+      label = int_tag.getAttribute('label')
+      if label in labels:
+        logging.error('Duplicate enum label "%s" for enum %s', label, name)
+        have_errors = True
+        continue
+      labels.add(label)
+      value_dict['label'] = label
       value_dict['summary'] = _GetTextFromChildNodes(int_tag)
       enum_dict['values'][int_value] = value_dict
 
diff --git a/tools/metrics/histograms/extract_histograms_test.py b/tools/metrics/histograms/extract_histograms_test.py
index d3474a7..4ce9dfc 100644
--- a/tools/metrics/histograms/extract_histograms_test.py
+++ b/tools/metrics/histograms/extract_histograms_test.py
@@ -607,6 +607,34 @@
         histogram_with_enum)
     self.assertFalse(have_errors)
 
+  def testEnumWithDuplicateValues(self):
+    bad_enum = xml.dom.minidom.parseString("""
+<histogram-configuration>
+<enums>
+  <enum name="MyEnumType">
+    <int value="1" label="FIRST_VALUE">This is the first value.</int>
+    <int value="1" label="SECOND_VALUE">This is the second value.</int>
+  </enum>
+</enums>
+</histogram-configuration>
+""")
+    _, have_errors = extract_histograms.ExtractEnumsFromXmlTree(bad_enum)
+    self.assertTrue(have_errors)
+
+  def testEnumWithDuplicateLabels(self):
+    bad_enum = xml.dom.minidom.parseString("""
+<histogram-configuration>
+<enums>
+  <enum name="MyEnumType">
+    <int value="1" label="FIRST_VALUE">This is the first value.</int>
+    <int value="2" label="FIRST_VALUE">This is the second value.</int>
+  </enum>
+</enums>
+</histogram-configuration>
+""")
+    _, have_errors = extract_histograms.ExtractEnumsFromXmlTree(bad_enum)
+    self.assertTrue(have_errors)
+
   def testNewHistogramWithUnits(self):
     histogram_with_units = xml.dom.minidom.parseString("""
 <histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml
index 90ea528b..5e8ddfee 100644
--- a/tools/metrics/histograms/metadata/chromeos/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -2314,6 +2314,40 @@
   </summary>
 </histogram>
 
+<histogram
+    name="ChromeOS.Settings.Device.Keyboard.{KeyboardType}.BlockMetaFKeyRewrites.Initial"
+    enum="Boolean" expires_after="2024-03-22">
+  <owner>dpad@google.com</owner>
+  <owner>yyhyyh@google.com</owner>
+  <owner>cros-peripherals@google.com</owner>
+  <summary>
+    Records the initial value of the Block Meta and Function Key rewrites
+    settings when a keyboard's settings are first initialized.
+  </summary>
+  <token key="KeyboardType">
+    <variant name="External"/>
+    <variant name="ExternalChromeOs"/>
+    <variant name="Internal"/>
+  </token>
+</histogram>
+
+<histogram
+    name="ChromeOS.Settings.Device.Keyboard.{KeyboardType}.TopRowAreFKeys.Initial"
+    enum="Boolean" expires_after="2024-03-22">
+  <owner>dpad@google.com</owner>
+  <owner>yyhyyh@google.com</owner>
+  <owner>cros-peripherals@google.com</owner>
+  <summary>
+    Records the initial value of the top-row keys are used as Function Keys when
+    a keyboard's settings are first initialized.
+  </summary>
+  <token key="KeyboardType">
+    <variant name="External"/>
+    <variant name="ExternalChromeOs"/>
+    <variant name="Internal"/>
+  </token>
+</histogram>
+
 <histogram name="ChromeOS.Sharesheet.AppCount2.{AppType}" units="apps"
     expires_after="2023-08-19">
   <owner>dominickn@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/data/histograms.xml b/tools/metrics/histograms/metadata/data/histograms.xml
index eb1bd9f7..02487a4 100644
--- a/tools/metrics/histograms/metadata/data/histograms.xml
+++ b/tools/metrics/histograms/metadata/data/histograms.xml
@@ -144,25 +144,6 @@
   </summary>
 </histogram>
 
-<histogram name="DataUse.AllServicesKB" enum="DataUseServicesHash"
-    expires_after="2022-08-28">
-  <obsolete>
-    Obsoleted.
-  </obsolete>
-  <owner>rajendrant@chromium.org</owner>
-  <owner>mcrouse@chromium.org</owner>
-  <summary>
-    The request and response size of the messages exchanged by all the services.
-    Whenever a URLRequest of a service is completed, the number of exchanged
-    bytes is logged in this histogram. The buckets in this histogram are
-    services recorded by the corresponding network traffic annotation tag
-    hashes, so it makes it possible to compare the use of different services in
-    different conditions. Different conditions are added as suffixes to this
-    histogram. If the OS is not Android all the requests are considered
-    foreground.
-  </summary>
-</histogram>
-
 <histogram name="DataUse.AppTabState" units="bytes" expires_after="2023-05-07">
   <owner>rajendrant@chromium.org</owner>
   <owner>mcrouse@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
index a62f889c..c5284714 100644
--- a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
+++ b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
@@ -1516,14 +1516,6 @@
   <affected-histogram name="DataUse.TrafficSize.User"/>
 </histogram_suffixes>
 
-<histogram_suffixes name="DataUse_Dimensions_AllServicesKB" separator=".">
-  <suffix name="Downstream.Background" label=""/>
-  <suffix name="Downstream.Foreground" label=""/>
-  <suffix name="Upstream.Background" label=""/>
-  <suffix name="Upstream.Foreground" label=""/>
-  <affected-histogram name="DataUse.AllServicesKB"/>
-</histogram_suffixes>
-
 <histogram_suffixes name="DataUse_TrafficSource" separator=".">
   <suffix name="System" label=""/>
   <suffix name="User" label=""/>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index ba47cbd..c10ffca 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -10933,28 +10933,6 @@
   </summary>
 </histogram>
 
-<histogram name="RenderFrameHostImpl.DroppedInterfaceRequestName"
-    enum="RenderFrameHostImpl.InterfaceNames" expires_after="M85">
-  <obsolete>
-    Removed in January 2022.
-  </obsolete>
-  <owner>engedy@chromium.org</owner>
-  <summary>
-    For each load and dropped Mojo interface request in a frame, records a
-    sample with a value corresponding to the hash of the interface name,
-    calculated as the lower 31 bits of the interface name's metric name hash.
-
-    Interface requests to RenderFrame::GetRemoteInterfaces are dropped when they
-    arrive to the RenderFrameHostImpl after the RenderFrameHostImpl had already
-    committed the next cross-document navigation.
-
-    This means that |document_scoped_interface_provider_binding_| was already
-    unbound at the time from the interface connection that had been used to
-    service RenderFrame::GetRemoteInterface for the previous load, so those
-    interface requests are dropped.
-  </summary>
-</histogram>
-
 <histogram name="RenderFrameHostImpl.DroppedInterfaceRequests" units="count"
     expires_after="M85">
   <obsolete>
@@ -14212,21 +14190,6 @@
   </summary>
 </histogram>
 
-<histogram name="UserImage.Changed" enum="ChromeOSUserImageId"
-    expires_after="M92">
-  <obsolete>
-    Removed in M92. Replaced by UserImage.Changed2, with the enum
-    ChromeOSUserImageId2.
-  </obsolete>
-  <owner>jasontt@chromium.org</owner>
-  <owner>assistive-eng@google.com</owner>
-  <summary>
-    Distribution of the device images that users changed (Chrome OS). The
-    statistic is recorded each time the user changes their device image to a
-    different one in Settings.
-  </summary>
-</histogram>
-
 <histogram name="UserImage.Changed2" enum="ChromeOSUserImageId2"
     expires_after="2023-09-17">
   <owner>jasontt@chromium.org</owner>
@@ -14243,34 +14206,6 @@
   </summary>
 </histogram>
 
-<histogram name="UserImage.LoggedIn" enum="ChromeOSUserImageId"
-    expires_after="M82">
-  <obsolete>
-    Removed in M92. Replaced by UserImage.LoggedIn2, with the enum
-    ChromeOSUserImageId updated.
-  </obsolete>
-  <owner>achuith@chromium.org</owner>
-  <summary>
-    Distribution of the default images that existing users login with (Chrome
-    OS). One sample is taken each time the user logs in.
-  </summary>
-</histogram>
-
-<histogram name="UserImage.LoggedIn2" enum="ChromeOSUserImageId"
-    expires_after="M92">
-  <obsolete>
-    Removed in M92. Replaced by UserImage.LoggedIn3, with new enum
-    ChromeOSUserImageId2.
-  </obsolete>
-  <owner>achuith@chromium.org</owner>
-  <owner>alemate@chromium.org</owner>
-  <owner>cros-oac@google.com</owner>
-  <summary>
-    Distribution of the default images that existing users login with (Chrome
-    OS). One sample is taken each time the user logs in.
-  </summary>
-</histogram>
-
 <histogram name="UserImage.LoggedIn3" enum="ChromeOSUserImageId2"
     expires_after="never">
 <!-- expires-never: Core metric for monitoring user image selections. -->
diff --git a/tools/metrics/histograms/update_histogram_enum.py b/tools/metrics/histograms/update_histogram_enum.py
index 357b2e8..057aac1 100644
--- a/tools/metrics/histograms/update_histogram_enum.py
+++ b/tools/metrics/histograms/update_histogram_enum.py
@@ -44,10 +44,31 @@
     self.second_label = second_label
 
 
+class DuplicatedLabel(Exception):
+  """Exception raised for duplicated enum labels.
+
+  Attributes:
+      first_value: First enum value that shares the duplicated enum label.
+      second_value: Second enum value that shares the duplicated enum label.
+  """
+  def __init__(self, first_value, second_value):
+    self.first_value = first_value
+    self.second_value = second_value
+
+
 def Log(message):
   logging.info(message)
 
 
+def _CheckForDuplicates(enum_value, label, result):
+  """Checks if an enum value or label already exists in the results."""
+  if enum_value in result:
+    raise DuplicatedValue(result[enum_value], label)
+  if label in result.values():
+    (dup_value, ) = (k for k, v in result.items() if v == 'label')
+    raise DuplicatedLabel(enum_value, dup_value)
+
+
 def ReadHistogramValues(filename, start_marker, end_marker, strip_k_prefix):
   """Creates a dictionary of enum values, read from a C++ file.
 
@@ -63,6 +84,7 @@
 
   Raises:
       DuplicatedValue: An error when two enum labels share the same value.
+      DuplicatedLabel: An error when two enum values share the same label.
   """
   # Read the file as a list of lines
   with io.open(path_util.GetInputFile(filename)) as f:
@@ -106,9 +128,7 @@
     if strip_k_prefix:
       assert label.startswith('k'), "Enum " + label + " should start with 'k'."
       label = label[1:]
-    # If two enum labels have the same value
-    if enum_value in result:
-      raise DuplicatedValue(result[enum_value], label)
+    _CheckForDuplicates(enum_value, label, result)
     result[enum_value] = label
     enum_value += 1
   return result
@@ -132,15 +152,14 @@
 
   Raises:
       DuplicatedValue: An error when two enum labels share the same value.
+      DuplicatedLabel: An error when two enum values share the same label.
   """
   source_xml = minidom.parse(path_util.GetInputFile(filename))
   result = {}
   for row in source_xml.getElementsByTagName(element_name):
     enum_value = int(row.getAttribute(value_attribute))
     label = row.getAttribute(label_attribute)
-    # If two enum labels have the same value
-    if enum_value in result:
-      raise DuplicatedValue(result[enum_value], label)
+    _CheckForDuplicates(enum_value, label, result)
     result[enum_value] = label
   return result
 
@@ -276,6 +295,11 @@
             'duplicated values between (%s) and (%s)' %
             (histogram_enum_name, duplicated_values.first_label,
              duplicated_values.second_label))
+  except DuplicatedLabel as duplicated_labels:
+    return ('%s enum has been updated and there exist '
+            'duplicated labels between (%s) and (%s)' %
+            (histogram_enum_name, duplicated_labels.first_value,
+             duplicated_labels.second_value))
 
   (xml, new_xml) = _GetOldAndUpdatedXml(histogram_enum_name, source_enum_values,
                                         source_enum_path, update_script_name)
diff --git a/ui/aura/test/ui_controls_ozone.cc b/ui/aura/test/ui_controls_ozone.cc
index 691856ab..df803e2 100644
--- a/ui/aura/test/ui_controls_ozone.cc
+++ b/ui/aura/test/ui_controls_ozone.cc
@@ -11,6 +11,7 @@
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "ui/events/event_utils.h"
+#include "ui/events/ozone/events_ozone.h"
 
 namespace aura {
 namespace test {
@@ -295,10 +296,7 @@
     // Set a property as if this is a key event not consumed by IME.
     // Ozone/X11+GTK IME works so already. Ozone/wayland IME relies on this
     // flag to work properly.
-    key_event.SetProperties({{
-        ui::kPropertyKeyboardImeFlag,
-        std::vector<uint8_t>{ui::kPropertyKeyboardImeIgnoredFlag},
-    }});
+    ui::SetKeyboardImeFlags(&key_event, ui::kPropertyKeyboardImeIgnoredFlag);
   }
   SendEventToSink(&key_event, display_id, std::move(closure), optional_host);
 }
diff --git a/ui/aura/window_event_dispatcher_unittest.cc b/ui/aura/window_event_dispatcher_unittest.cc
index 6b684fe..f7203a4 100644
--- a/ui/aura/window_event_dispatcher_unittest.cc
+++ b/ui/aura/window_event_dispatcher_unittest.cc
@@ -50,6 +50,10 @@
 #include "ui/platform_window/platform_window_init_properties.h"
 #include "ui/wm/core/capture_controller.h"
 
+#if BUILDFLAG(IS_OZONE)
+#include "ui/events/ozone/events_ozone.h"
+#endif
+
 namespace aura {
 namespace {
 
@@ -401,8 +405,10 @@
 
 TEST_F(WindowEventDispatcherTest, DontIgnoreUnknownKeys) {
   ui::Event::Properties properties;
-  properties.emplace(ui::kPropertyKeyboardImeFlag,
-                     std::vector<uint8_t>{ui::kPropertyKeyboardImeIgnoredFlag});
+#if BUILDFLAG(IS_OZONE)
+  ui::SetKeyboardImeFlagProperty(&properties,
+                                 ui::kPropertyKeyboardImeIgnoredFlag);
+#endif
 
   ConsumeKeyHandler handler;
   root_window()->AddPreTargetHandler(&handler);
@@ -447,10 +453,9 @@
   ui::test::TestEventHandler handler;
   w1->AddPreTargetHandler(&handler);
   ui::KeyEvent key_press(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE);
-  ui::Event::Properties properties;
-  properties.emplace(ui::kPropertyKeyboardImeFlag,
-                     std::vector<uint8_t>{ui::kPropertyKeyboardImeIgnoredFlag});
-  key_press.SetProperties(properties);
+#if BUILDFLAG(IS_OZONE)
+  ui::SetKeyboardImeFlags(&key_press, ui::kPropertyKeyboardImeIgnoredFlag);
+#endif
 
   DispatchEventUsingWindowDispatcher(&key_press);
   EXPECT_TRUE(key_press.handled());
diff --git a/ui/base/ime/ash/input_method_ash.cc b/ui/base/ime/ash/input_method_ash.cc
index 9ea56d46..e249edf6 100644
--- a/ui/base/ime/ash/input_method_ash.cc
+++ b/ui/base/ime/ash/input_method_ash.cc
@@ -31,6 +31,7 @@
 #include "ui/base/ime/text_input_flags.h"
 #include "ui/events/event.h"
 #include "ui/events/keycodes/dom/keycode_converter.h"
+#include "ui/events/ozone/events_ozone.h"
 #include "ui/gfx/geometry/rect.h"
 
 namespace ash {
@@ -608,6 +609,11 @@
     ui::ime::KeyEventHandledState handled_state,
     bool stopped_propagation) {
   bool handled = (handled_state != ui::ime::KeyEventHandledState::kNotHandled);
+
+  // Mark whether the key is handled by IME or not.
+  ui::SetKeyboardImeFlags(event, handled ? ui::kPropertyKeyboardImeHandledFlag
+                                         : ui::kPropertyKeyboardImeIgnoredFlag);
+
   TextInputClient* client = GetTextInputClient();
   if (!client) {
     // As ibus works asynchronously, there is a chance that the focused client
@@ -662,6 +668,9 @@
   ui::KeyEvent fabricated_event(ui::ET_KEY_PRESSED, ui::VKEY_PROCESSKEY,
                                 event->code(), event->flags(),
                                 ui::DomKey::PROCESS, event->time_stamp());
+  if (const auto* properties = event->properties()) {
+    fabricated_event.SetProperties(*properties);
+  }
   ui::EventDispatchDetails dispatch_details =
       DispatchKeyEventPostIME(&fabricated_event);
   if (fabricated_event.stopped_propagation())
@@ -1078,6 +1087,8 @@
   ui::KeyEvent evt(pressed ? ui::ET_KEY_PRESSED : ui::ET_KEY_RELEASED,
                    pressed ? ui::VKEY_PROCESSKEY : ui::VKEY_UNKNOWN,
                    ui::EF_IME_FABRICATED_KEY);
+  ui::SetKeyboardImeFlags(&evt, ui::kPropertyKeyboardImeHandledFlag);
+
   std::ignore = DispatchKeyEventPostIME(&evt);
   return evt.stopped_propagation();
 }
diff --git a/ui/base/ime/ash/input_method_ash_unittest.cc b/ui/base/ime/ash/input_method_ash_unittest.cc
index dc9c33f..a24998a 100644
--- a/ui/base/ime/ash/input_method_ash_unittest.cc
+++ b/ui/base/ime/ash/input_method_ash_unittest.cc
@@ -33,6 +33,7 @@
 #include "ui/events/event_utils.h"
 #include "ui/events/keycodes/dom/dom_code.h"
 #include "ui/events/keycodes/dom/keycode_converter.h"
+#include "ui/events/ozone/events_ozone.h"
 #include "ui/events/test/keyboard_layout.h"
 #include "ui/gfx/geometry/rect.h"
 
@@ -1213,6 +1214,34 @@
   EXPECT_EQ(eventA.time_stamp(), key_event.time_stamp());
 }
 
+TEST_F(InputMethodAshKeyEventTest, KeyboardImeFlags) {
+  // Preparation.
+  input_type_ = ui::TEXT_INPUT_TYPE_TEXT;
+  input_method_ash_->OnTextInputTypeChanged(this);
+
+  {
+    ui::KeyEvent eventA(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::US_A, 0,
+                        ui::DomKey::FromCharacter('a'), ui::EventTimeForNow());
+    input_method_ash_->ProcessKeyEventPostIME(
+        &eventA, ui::ime::KeyEventHandledState::kHandledByIME, true);
+
+    const ui::KeyEvent& key_event = dispatched_key_event_;
+    EXPECT_EQ(ui::kPropertyKeyboardImeHandledFlag,
+              ui::GetKeyboardImeFlags(key_event));
+  }
+
+  {
+    ui::KeyEvent eventA(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::DomCode::US_A, 0,
+                        ui::DomKey::FromCharacter('a'), ui::EventTimeForNow());
+    input_method_ash_->ProcessKeyEventPostIME(
+        &eventA, ui::ime::KeyEventHandledState::kNotHandled, true);
+
+    const ui::KeyEvent& key_event = dispatched_key_event_;
+    EXPECT_EQ(ui::kPropertyKeyboardImeIgnoredFlag,
+              ui::GetKeyboardImeFlags(key_event));
+  }
+}
+
 TEST_F(InputMethodAshKeyEventTest,
        SingleCharAssistiveSuggesterKeyEventDispatchesProcessKey) {
   ui::KeyEvent event(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE);
@@ -1234,6 +1263,8 @@
   EXPECT_EQ(event.flags(), key_event.flags());
   EXPECT_EQ(ui::DomKey::PROCESS, key_event.GetDomKey());
   EXPECT_EQ(event.time_stamp(), key_event.time_stamp());
+  EXPECT_EQ(ui::kPropertyKeyboardImeHandledFlag,
+            ui::GetKeyboardImeFlags(key_event));
 }
 
 TEST_F(InputMethodAshKeyEventTest, JP106KeyTest) {
diff --git a/ui/base/ime/linux/input_method_auralinux_unittest.cc b/ui/base/ime/linux/input_method_auralinux_unittest.cc
index 517b663..4526e252 100644
--- a/ui/base/ime/linux/input_method_auralinux_unittest.cc
+++ b/ui/base/ime/linux/input_method_auralinux_unittest.cc
@@ -24,8 +24,8 @@
 #include "ui/base/ime/text_input_client.h"
 #include "ui/base/ime/virtual_keyboard_controller_stub.h"
 #include "ui/events/event.h"
-#include "ui/events/event_utils.h"
 #include "ui/events/keycodes/dom/dom_code.h"
+#include "ui/events/ozone/events_ozone.h"
 
 namespace ui {
 namespace {
@@ -138,15 +138,7 @@
   }
 
   bool IsPeekKeyEvent(const ui::KeyEvent& key_event) override {
-    const auto* properties = key_event.properties();
-    // For the purposes of tests if kPropertyKeyboardImeFlag is not
-    // explicitly set assume the event is not a key event.
-    if (!properties)
-      return true;
-    auto it = properties->find(kPropertyKeyboardImeFlag);
-    if (it == properties->end())
-      return true;
-    return !(it->second[0] & kPropertyKeyboardImeIgnoredFlag);
+    return !(GetKeyboardImeFlags(key_event) & kPropertyKeyboardImeIgnoredFlag);
   }
 
   void Reset() override {}
@@ -744,10 +736,7 @@
   test_result_->Verify();
 
   KeyEvent key(ET_KEY_PRESSED, VKEY_TAB, 0);
-  ui::Event::Properties properties;
-  properties[ui::kPropertyKeyboardImeFlag] =
-      std::vector<uint8_t>({ui::kPropertyKeyboardImeIgnoredFlag});
-  key.SetProperties(properties);
+  SetKeyboardImeFlags(&key, kPropertyKeyboardImeIgnoredFlag);
   input_method_auralinux_->DispatchKeyEvent(&key);
   test_result_->ExpectAction("keydown:9");
   test_result_->Verify();
diff --git a/ui/color/ref_color_mixer.cc b/ui/color/ref_color_mixer.cc
index f333926b..7bebdd2 100644
--- a/ui/color/ref_color_mixer.cc
+++ b/ui/color/ref_color_mixer.cc
@@ -18,13 +18,116 @@
 
 namespace ui {
 
+// The baseline palette for ref colors. This should be used in the absence of a
+// defined user_color.
+void AddBaselinePalette(ColorProvider* provider) {
+  ColorMixer& mixer = provider->AddMixer();
+  mixer[kColorRefPrimary0] = {SkColorSetRGB(0x00, 0x00, 0x00)};
+  mixer[kColorRefPrimary10] = {SkColorSetRGB(0x04, 0x1E, 0x49)};
+  mixer[kColorRefPrimary20] = {SkColorSetRGB(0x06, 0x2E, 0x6F)};
+  mixer[kColorRefPrimary25] = {SkColorSetRGB(0x07, 0x38, 0x88)};
+  mixer[kColorRefPrimary30] = {SkColorSetRGB(0x08, 0x42, 0xA0)};
+  mixer[kColorRefPrimary40] = {SkColorSetRGB(0x0B, 0x57, 0xD0)};
+  mixer[kColorRefPrimary50] = {SkColorSetRGB(0x1B, 0x6E, 0xF3)};
+  mixer[kColorRefPrimary60] = {SkColorSetRGB(0x4C, 0x8D, 0xF6)};
+  mixer[kColorRefPrimary70] = {SkColorSetRGB(0x7C, 0xAC, 0xF8)};
+  mixer[kColorRefPrimary80] = {SkColorSetRGB(0xA8, 0xC7, 0xFA)};
+  mixer[kColorRefPrimary90] = {SkColorSetRGB(0xD3, 0xE3, 0xFD)};
+  mixer[kColorRefPrimary95] = {SkColorSetRGB(0xEC, 0xF3, 0xFE)};
+  mixer[kColorRefPrimary99] = {SkColorSetRGB(0xFA, 0xFB, 0xFF)};
+  mixer[kColorRefPrimary100] = {SkColorSetRGB(0xFF, 0xFF, 0xFF)};
+
+  mixer[kColorRefSecondary0] = {SkColorSetRGB(0x00, 0x00, 0x00)};
+  mixer[kColorRefSecondary10] = {SkColorSetRGB(0x00, 0x1D, 0x35)};
+  mixer[kColorRefSecondary15] = {SkColorSetRGB(0x00, 0x28, 0x45)};
+  mixer[kColorRefSecondary20] = {SkColorSetRGB(0x00, 0x33, 0x55)};
+  mixer[kColorRefSecondary25] = {SkColorSetRGB(0x00, 0x3f, 0x66)};
+  mixer[kColorRefSecondary30] = {SkColorSetRGB(0x00, 0x4A, 0x77)};
+  mixer[kColorRefSecondary35] = {SkColorSetRGB(0x00, 0x57, 0x89)};
+  mixer[kColorRefSecondary40] = {SkColorSetRGB(0x00, 0x63, 0x9B)};
+  mixer[kColorRefSecondary50] = {SkColorSetRGB(0x04, 0x7D, 0xB7)};
+  mixer[kColorRefSecondary60] = {SkColorSetRGB(0x39, 0x98, 0xD3)};
+  mixer[kColorRefSecondary70] = {SkColorSetRGB(0x5A, 0xB3, 0xF0)};
+  mixer[kColorRefSecondary80] = {SkColorSetRGB(0x7F, 0xCF, 0xFF)};
+  mixer[kColorRefSecondary90] = {SkColorSetRGB(0xC2, 0xE7, 0xFF)};
+  mixer[kColorRefSecondary95] = {SkColorSetRGB(0xDF, 0xF3, 0xFF)};
+  mixer[kColorRefSecondary99] = {SkColorSetRGB(0xF7, 0xFC, 0xFF)};
+  mixer[kColorRefSecondary100] = {SkColorSetRGB(0xFF, 0xFF, 0xFF)};
+
+  mixer[kColorRefTertiary0] = {SkColorSetRGB(0x00, 0x00, 0x00)};
+  mixer[kColorRefTertiary10] = {SkColorSetRGB(0x07, 0x27, 0x11)};
+  mixer[kColorRefTertiary20] = {SkColorSetRGB(0x0A, 0x38, 0x18)};
+  mixer[kColorRefTertiary30] = {SkColorSetRGB(0x0F, 0x52, 0x23)};
+  mixer[kColorRefTertiary40] = {SkColorSetRGB(0x14, 0x6C, 0x2E)};
+  mixer[kColorRefTertiary50] = {SkColorSetRGB(0x19, 0x86, 0x39)};
+  mixer[kColorRefTertiary60] = {SkColorSetRGB(0x1E, 0xA4, 0x46)};
+  mixer[kColorRefTertiary70] = {SkColorSetRGB(0x37, 0xBE, 0x5F)};
+  mixer[kColorRefTertiary80] = {SkColorSetRGB(0x6D, 0xD5, 0x8C)};
+  mixer[kColorRefTertiary90] = {SkColorSetRGB(0xC4, 0xEE, 0xD0)};
+  mixer[kColorRefTertiary95] = {SkColorSetRGB(0xE7, 0xF8, 0xED)};
+  mixer[kColorRefTertiary99] = {SkColorSetRGB(0xF2, 0xFF, 0xEE)};
+  mixer[kColorRefTertiary100] = {SkColorSetRGB(0xFF, 0xFF, 0xFF)};
+
+  mixer[kColorRefError0] = {SkColorSetRGB(0x00, 0x00, 0x00)};
+  mixer[kColorRefError10] = {SkColorSetRGB(0x41, 0x0E, 0x0B)};
+  mixer[kColorRefError20] = {SkColorSetRGB(0x60, 0x14, 0x10)};
+  mixer[kColorRefError30] = {SkColorSetRGB(0x8C, 0x1D, 0x18)};
+  mixer[kColorRefError40] = {SkColorSetRGB(0xB3, 0x26, 0x1E)};
+  mixer[kColorRefError50] = {SkColorSetRGB(0xDC, 0x36, 0x2E)};
+  mixer[kColorRefError60] = {SkColorSetRGB(0xE4, 0x69, 0x62)};
+  mixer[kColorRefError70] = {SkColorSetRGB(0xEC, 0x92, 0x8E)};
+  mixer[kColorRefError80] = {SkColorSetRGB(0xF2, 0xB8, 0xB5)};
+  mixer[kColorRefError90] = {SkColorSetRGB(0xF9, 0xDE, 0xDC)};
+  mixer[kColorRefError95] = {SkColorSetRGB(0xFC, 0xEE, 0xEE)};
+  mixer[kColorRefError99] = {SkColorSetRGB(0xFF, 0xFB, 0xF9)};
+  mixer[kColorRefError100] = {SkColorSetRGB(0xFF, 0xFF, 0xFF)};
+
+  mixer[kColorRefNeutral0] = {SkColorSetRGB(0x00, 0x00, 0x00)};
+  mixer[kColorRefNeutral4] = {SkColorSetRGB(0x0E, 0x0E, 0x0F)};
+  mixer[kColorRefNeutral6] = {SkColorSetRGB(0x13, 0x13, 0x14)};
+  mixer[kColorRefNeutral10] = {SkColorSetRGB(0x1F, 0x1F, 0x1F)};
+  mixer[kColorRefNeutral12] = {SkColorSetRGB(0x1F, 0x20, 0x20)};
+  mixer[kColorRefNeutral15] = {SkColorSetRGB(0x28, 0x28, 0x28)};
+  mixer[kColorRefNeutral17] = {SkColorSetRGB(0x2A, 0x2A, 0x2A)};
+  mixer[kColorRefNeutral20] = {SkColorSetRGB(0x30, 0x30, 0x30)};
+  mixer[kColorRefNeutral22] = {SkColorSetRGB(0x34, 0x35, 0x35)};
+  mixer[kColorRefNeutral24] = {SkColorSetRGB(0x39, 0x39, 0x39)};
+  mixer[kColorRefNeutral25] = {SkColorSetRGB(0x3c, 0x3c, 0x3c)};
+  mixer[kColorRefNeutral30] = {SkColorSetRGB(0x47, 0x47, 0x47)};
+  mixer[kColorRefNeutral40] = {SkColorSetRGB(0x5E, 0x5E, 0x5E)};
+  mixer[kColorRefNeutral50] = {SkColorSetRGB(0x75, 0x75, 0x75)};
+  mixer[kColorRefNeutral60] = {SkColorSetRGB(0x8F, 0x8F, 0x8F)};
+  mixer[kColorRefNeutral70] = {SkColorSetRGB(0xAB, 0xAB, 0xAB)};
+  mixer[kColorRefNeutral80] = {SkColorSetRGB(0xC7, 0xC7, 0xC7)};
+  mixer[kColorRefNeutral87] = {SkColorSetRGB(0xDA, 0xDA, 0xDA)};
+  mixer[kColorRefNeutral90] = {SkColorSetRGB(0xE3, 0xE3, 0xE3)};
+  mixer[kColorRefNeutral92] = {SkColorSetRGB(0xE9, 0xE8, 0xE8)};
+  mixer[kColorRefNeutral94] = {SkColorSetRGB(0xEF, 0xED, 0xED)};
+  mixer[kColorRefNeutral95] = {SkColorSetRGB(0xF2, 0xF2, 0xF2)};
+  mixer[kColorRefNeutral96] = {SkColorSetRGB(0xF4, 0xF3, 0xF2)};
+  mixer[kColorRefNeutral98] = {SkColorSetRGB(0xFA, 0xF9, 0xF8)};
+  mixer[kColorRefNeutral99] = {SkColorSetRGB(0xFD, 0xFC, 0xFB)};
+  mixer[kColorRefNeutral100] = {SkColorSetRGB(0xFF, 0xFF, 0xFF)};
+
+  mixer[kColorRefNeutralVariant0] = {SkColorSetRGB(0x00, 0x00, 0x00)};
+  mixer[kColorRefNeutralVariant10] = {SkColorSetRGB(0x19, 0x1D, 0x1C)};
+  mixer[kColorRefNeutralVariant15] = {SkColorSetRGB(0x23, 0x27, 0x26)};
+  mixer[kColorRefNeutralVariant20] = {SkColorSetRGB(0x2D, 0x31, 0x2F)};
+  mixer[kColorRefNeutralVariant30] = {SkColorSetRGB(0x44, 0x47, 0x46)};
+  mixer[kColorRefNeutralVariant40] = {SkColorSetRGB(0x5C, 0x5F, 0x5E)};
+  mixer[kColorRefNeutralVariant50] = {SkColorSetRGB(0x74, 0x77, 0x75)};
+  mixer[kColorRefNeutralVariant60] = {SkColorSetRGB(0x8E, 0x91, 0x8F)};
+  mixer[kColorRefNeutralVariant70] = {SkColorSetRGB(0xA9, 0xAC, 0xAA)};
+  mixer[kColorRefNeutralVariant80] = {SkColorSetRGB(0xC4, 0xC7, 0xC5)};
+  mixer[kColorRefNeutralVariant90] = {SkColorSetRGB(0xE1, 0xE3, 0xE1)};
+  mixer[kColorRefNeutralVariant95] = {SkColorSetRGB(0xEF, 0xF2, 0xEF)};
+  mixer[kColorRefNeutralVariant99] = {SkColorSetRGB(0xFA, 0xFD, 0xFB)};
+  mixer[kColorRefNeutralVariant100] = {SkColorSetRGB(0xFF, 0xFF, 0xFF)};
+}
+
 // Adds the dynamic color palette tokens based on user_color. This is the base
 // palette so it is independent of ColorMode.
-void AddRefColorMixer(ColorProvider* provider,
-                      const ColorProviderManager::Key& key) {
-  // TODO(skau): Before this launches, make sure this is always populated.
-  SkColor seed_color = key.user_color.value_or(gfx::kGoogleBlue400);
-
+void AddGeneratedPalette(ColorProvider* provider, SkColor seed_color) {
   auto palette = material_color_utilities::CorePalette::Of(seed_color);
 
   ColorMixer& mixer = provider->AddMixer();
@@ -131,4 +234,13 @@
   mixer[kColorRefNeutralVariant100] = {palette.neutral_variant().get(100)};
 }
 
+void AddRefColorMixer(ColorProvider* provider,
+                      const ColorProviderManager::Key& key) {
+  if (!key.user_color.has_value()) {
+    AddBaselinePalette(provider);
+  } else {
+    AddGeneratedPalette(provider, key.user_color.value());
+  }
+}
+
 }  // namespace ui
diff --git a/ui/events/event.cc b/ui/events/event.cc
index 569c2b65..9064a9fd 100644
--- a/ui/events/event.cc
+++ b/ui/events/event.cc
@@ -34,6 +34,7 @@
 
 #if BUILDFLAG(IS_OZONE)
 #include "ui/base/ui_base_features.h"                               // nogncheck
+#include "ui/events/ozone/events_ozone.h"                           // nogncheck
 #include "ui/events/ozone/layout/keyboard_layout_engine.h"          // nogncheck
 #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"  // nogncheck
 #endif
diff --git a/ui/events/event_utils.h b/ui/events/event_utils.h
index ad05117b..00be9cd 100644
--- a/ui/events/event_utils.h
+++ b/ui/events/event_utils.h
@@ -51,21 +51,6 @@
 // Key used to store 'hardware key code' values in Event::Properties.
 constexpr char kPropertyKeyboardHwKeyCode[] = "_keyevent_kbd_hw_keycode_";
 
-// Event::Properties constants for IBus-GTK and fcitx-GTK.
-// Both of them in async mode use gtk-specific XKeyEvent::state bits 24 and 25.
-// 24 is handled and 25 is ignored.
-// Note that they use more bits, but Chrome does not handle it now.
-// cf)
-// https://github.com/ibus/ibus/blob/dd4cc5b028c35f9bb8fa9d3bdc8f26bcdfc43d40/src/ibustypes.h#L88
-// https://github.com/fcitx/fcitx/blob/289b2f674d95651d4e0d0c77a48e3a2f0da40efe/src/lib/fcitx-utils/keysym.h#L47
-// https://mail.gnome.org/archives/gtk-devel-list/2013-June/msg00003.html
-constexpr char kPropertyKeyboardImeFlag[] = "_keyevent_kbd_ime_flags_";
-constexpr unsigned int kPropertyKeyboardImeFlagOffset = 24;
-constexpr unsigned int kPropertyKeyboardImeFlagMask = 0x03;
-// Ignored is the 25-th bit.
-constexpr unsigned int kPropertyKeyboardImeIgnoredFlag =
-    1 << (25 - kPropertyKeyboardImeFlagOffset);
-
 // Key used to store mouse event flag telling ET_MOUSE_EXITED must actually be
 // interpreted as "crossing intermediate window" in blink context.
 constexpr char kPropertyMouseCrossedIntermediateWindow[] =
diff --git a/ui/events/ozone/events_ozone.cc b/ui/events/ozone/events_ozone.cc
index 91b083b1..411e8ca 100644
--- a/ui/events/ozone/events_ozone.cc
+++ b/ui/events/ozone/events_ozone.cc
@@ -4,6 +4,7 @@
 
 #include "ui/events/ozone/events_ozone.h"
 
+#include "base/check.h"
 #include "ui/events/event.h"
 
 namespace ui {
@@ -62,4 +63,31 @@
   dispatch_disabled = true;
 }
 
+void SetKeyboardImeFlagProperty(KeyEvent::Properties* properties,
+                                uint8_t flags) {
+  properties->emplace(kPropertyKeyboardImeFlag, std::vector<uint8_t>{flags});
+}
+
+void SetKeyboardImeFlags(KeyEvent* event, uint8_t flags) {
+  Event::Properties properties;
+  if (const auto* original = event->properties()) {
+    properties = *original;
+  }
+  SetKeyboardImeFlagProperty(&properties, flags);
+  event->SetProperties(properties);
+}
+
+uint8_t GetKeyboardImeFlags(const KeyEvent& event) {
+  const auto* properties = event.properties();
+  if (!properties) {
+    return 0;
+  }
+  auto it = properties->find(kPropertyKeyboardImeFlag);
+  if (it == properties->end()) {
+    return 0;
+  }
+  DCHECK_EQ(1u, it->second.size());
+  return it->second[0];
+}
+
 }  // namespace ui
diff --git a/ui/events/ozone/events_ozone.h b/ui/events/ozone/events_ozone.h
index 5e69eee1..7e26a549 100644
--- a/ui/events/ozone/events_ozone.h
+++ b/ui/events/ozone/events_ozone.h
@@ -5,14 +5,15 @@
 #ifndef UI_EVENTS_OZONE_EVENTS_OZONE_H_
 #define UI_EVENTS_OZONE_EVENTS_OZONE_H_
 
+#include <stdint.h>
+
 #include "base/functional/callback.h"
+#include "ui/events/event.h"
 #include "ui/events/events_export.h"
 #include "ui/events/platform_event.h"
 
 namespace ui {
 
-class Event;
-
 // Wrap a "native" ui::Event in another ui::Event & dispatch it.
 //
 // This is really unfortunate, but exists for two reasons:
@@ -37,6 +38,36 @@
 
 EVENTS_EXPORT void DisableNativeUiEventDispatchForTest();
 
+// Event::Properties constants for IBus-GTK and fcitx-GTK.
+// Both of them in async mode use gtk-specific XKeyEvent::state bits 24 and 25.
+// 24 is handled and 25 is ignored.
+// Note that they use more bits, but Chrome does not handle it now.
+// cf)
+// https://github.com/ibus/ibus/blob/dd4cc5b028c35f9bb8fa9d3bdc8f26bcdfc43d40/src/ibustypes.h#L88
+// https://github.com/fcitx/fcitx/blob/289b2f674d95651d4e0d0c77a48e3a2f0da40efe/src/lib/fcitx-utils/keysym.h#L47
+// https://mail.gnome.org/archives/gtk-devel-list/2013-June/msg00003.html
+constexpr char kPropertyKeyboardImeFlag[] = "_keyevent_kbd_ime_flags_";
+constexpr size_t kPropertyKeyboardImeFlagOffset = 24;
+constexpr uint8_t kPropertyKeyboardImeFlagMask = 0x03;
+// Handled is the 24-th bit.
+constexpr uint8_t kPropertyKeyboardImeHandledFlag =
+    1 << (24 - kPropertyKeyboardImeFlagOffset);
+// Ignored is the 25-th bit.
+constexpr uint8_t kPropertyKeyboardImeIgnoredFlag =
+    1 << (25 - kPropertyKeyboardImeFlagOffset);
+
+// Sets the `flags` as keyboard ime flag property to given `properties`.
+EVENTS_EXPORT void SetKeyboardImeFlagProperty(KeyEvent::Properties* properties,
+                                              uint8_t flags);
+
+// Sets the keyboard ime flags to the given `event`'s properties.
+// `flags` should be the bitwise-or of the flags defined just above.
+EVENTS_EXPORT void SetKeyboardImeFlags(KeyEvent* event, uint8_t flags);
+
+// Returns the keyboard ime flags for the given `event`. If it does not have,
+// 0 will be returned.
+EVENTS_EXPORT uint8_t GetKeyboardImeFlags(const KeyEvent& event);
+
 }  // namespace ui
 
 #endif  // UI_EVENTS_OZONE_EVENTS_OZONE_H_
diff --git a/ui/events/test/event_generator.cc b/ui/events/test/event_generator.cc
index 141c23e..f8400aa 100644
--- a/ui/events/test/event_generator.cc
+++ b/ui/events/test/event_generator.cc
@@ -28,6 +28,10 @@
 #include "ui/events/keycodes/keyboard_code_conversion.h"
 #endif
 
+#if BUILDFLAG(IS_OZONE)
+#include "ui/events/ozone/events_ozone.h"
+#endif
+
 namespace ui {
 namespace test {
 
@@ -677,15 +681,14 @@
 #else
   ui::EventType type = is_press ? ui::ET_KEY_PRESSED : ui::ET_KEY_RELEASED;
   ui::KeyEvent keyev(type, key_code, flags);
+#if BUILDFLAG(IS_OZONE)
   if (is_press) {
     // Set a property as if this is a key event not consumed by IME.
     // Ozone/X11+GTK IME works so already. Ozone/wayland IME relies on this
     // flag to work properly.
-    keyev.SetProperties({{
-        kPropertyKeyboardImeFlag,
-        std::vector<uint8_t>{kPropertyKeyboardImeIgnoredFlag},
-    }});
+    SetKeyboardImeFlags(&keyev, kPropertyKeyboardImeIgnoredFlag);
   }
+#endif  // BUILDFLAG(IS_OZONE)
 #endif  // BUILDFLAG(IS_WIN)
   keyev.set_source_device_id(source_device_id);
   Dispatch(&keyev);
diff --git a/ui/events/x/x11_event_translation.cc b/ui/events/x/x11_event_translation.cc
index dd8c160..35d99136 100644
--- a/ui/events/x/x11_event_translation.cc
+++ b/ui/events/x/x11_event_translation.cc
@@ -16,6 +16,7 @@
 #include "ui/events/event_utils.h"
 #include "ui/events/keycodes/dom/dom_key.h"
 #include "ui/events/keycodes/keyboard_code_conversion_x.h"
+#include "ui/events/ozone/events_ozone.h"
 #include "ui/events/pointer_details.h"
 #include "ui/events/types/event_type.h"
 #include "ui/events/x/events_x_utils.h"
@@ -81,9 +82,9 @@
     // IBus-/fctix-GTK specific flags
     uint8_t ime_flags = (state >> kPropertyKeyboardImeFlagOffset) &
                         kPropertyKeyboardImeFlagMask;
-    if (ime_flags)
-      properties.emplace(kPropertyKeyboardImeFlag, Values{ime_flags});
-
+    if (ime_flags) {
+      SetKeyboardImeFlagProperty(&properties, ime_flags);
+    }
   } else if (type == ET_MOUSE_EXITED) {
     // NotifyVirtual events are created for intermediate windows that the
     // pointer crosses through. These occur when middle clicking.
diff --git a/ui/file_manager/file_manager/widgets/xf_path_display.ts b/ui/file_manager/file_manager/widgets/xf_path_display.ts
index 0917d76a..c336a5d 100644
--- a/ui/file_manager/file_manager/widgets/xf_path_display.ts
+++ b/ui/file_manager/file_manager/widgets/xf_path_display.ts
@@ -72,7 +72,7 @@
       transition: all 300ms;
       flex-shrink: 1;
       min-width: 0;
-      padding: 4px 8px;
+      padding: 4px 4px;
       border-radius: 8px;
     }
     div.mid-folder {
diff --git a/ui/ozone/platform/wayland/host/wayland_event_source.cc b/ui/ozone/platform/wayland/host/wayland_event_source.cc
index 9cf4646..a95d6cc 100644
--- a/ui/ozone/platform/wayland/host/wayland_event_source.cc
+++ b/ui/ozone/platform/wayland/host/wayland_event_source.cc
@@ -23,6 +23,7 @@
 #include "ui/events/keycodes/dom/keycode_converter.h"
 #include "ui/events/keycodes/keyboard_code_conversion.h"
 #include "ui/events/keycodes/keyboard_codes.h"
+#include "ui/events/ozone/events_ozone.h"
 #include "ui/events/ozone/layout/keyboard_layout_engine.h"
 #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
 #include "ui/events/platform/wayland/wayland_event_watcher.h"
@@ -245,8 +246,7 @@
 
   if (kind == WaylandKeyboard::KeyEventKind::kKey) {
     // Mark that this is the key event which IME did not consume.
-    properties.emplace(kPropertyKeyboardImeFlag,
-                       std::vector<uint8_t>{kPropertyKeyboardImeIgnoredFlag});
+    SetKeyboardImeFlagProperty(&properties, kPropertyKeyboardImeIgnoredFlag);
   }
   event.SetProperties(properties);
   return DispatchEvent(&event);
diff --git a/ui/ozone/platform/wayland/host/wayland_input_method_context.cc b/ui/ozone/platform/wayland/host/wayland_input_method_context.cc
index 2291423..4cee221 100644
--- a/ui/ozone/platform/wayland/host/wayland_input_method_context.cc
+++ b/ui/ozone/platform/wayland/host/wayland_input_method_context.cc
@@ -24,8 +24,8 @@
 #include "ui/base/ime/text_input_type.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/events/event.h"
-#include "ui/events/event_utils.h"
 #include "ui/events/keycodes/dom/dom_code.h"
+#include "ui/events/ozone/events_ozone.h"
 #include "ui/events/types/event_type.h"
 #include "ui/gfx/range/range.h"
 #include "ui/ozone/platform/wayland/host/wayland_connection.h"
@@ -179,13 +179,7 @@
 }
 
 bool WaylandInputMethodContext::IsPeekKeyEvent(const ui::KeyEvent& key_event) {
-  const auto* properties = key_event.properties();
-  if (!properties)
-    return true;
-  auto it = properties->find(kPropertyKeyboardImeFlag);
-  if (it == properties->end())
-    return true;
-  return !(it->second[0] & kPropertyKeyboardImeIgnoredFlag);
+  return !(GetKeyboardImeFlags(key_event) & kPropertyKeyboardImeIgnoredFlag);
 }
 
 void WaylandInputMethodContext::UpdatePreeditText(
diff --git a/ui/ozone/platform/x11/test/x11_event_translation_unittest.cc b/ui/ozone/platform/x11/test/x11_event_translation_unittest.cc
index f088919..70c0731 100644
--- a/ui/ozone/platform/x11/test/x11_event_translation_unittest.cc
+++ b/ui/ozone/platform/x11/test/x11_event_translation_unittest.cc
@@ -17,6 +17,7 @@
 #include "ui/events/keycodes/dom/dom_key.h"
 #include "ui/events/keycodes/dom/keycode_converter.h"
 #include "ui/events/keycodes/keyboard_codes_posix.h"
+#include "ui/events/ozone/events_ozone.h"
 #include "ui/events/test/events_test_utils.h"
 #include "ui/events/test/events_test_utils_x11.h"
 #include "ui/events/test/keyboard_layout.h"